2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AAP2.7】AAPとHashiCorp VaultをOIDC/JWT認証で繋ぎたい〜AppRoleのSecret ID運用からの解放~

2
Last updated at Posted at 2026-09-03

はじめに

シークレット情報を安全に参照するための手段として、Ansible Automation Platform(AAP)と HashiCorp Vault を連携させる方法があります。
しかし、従来の標準であった AppRole 認証 においては、以下のような運用課題に頭を悩ませていた方も多いのではないでしょうか?

  • Secret ID の有効期限管理や手動ローテーションの手間
  • AAP 側に Secret IDを保持することによるセキュリティリスク

2026年6月にリリースされた AAP 2.7 では、この課題の解決策として 「HashiCorp Vault とのネイティブ OIDC 統合」 機能が追加されました。

Ansible Automation Platform 2.7 の新機能

この新機能により、AAP がジョブ実行時に一時的な JWT(JSON Web Token)を動的発行して HashiCorp Vault へアクセスできるようになります。
これにより、従来のRole ID や Secret ID の事前発行・管理が不要になりました。
本記事では、この連携を実際に構築する手順を以下のステップで解説します。

  1. AAP構築時に機能フラグを有効化(※1)
  2. HashiCorp VaultにOIDC/JWT認証用の設定を追加
  3. HashiCorp Vault にシークレット情報を登録(自動化対象機器へのログインパスワード)
  4. AAPでCredentialを作成(OIDC/JWT 認証用 & ログインパスワード取得用)
  5. AAPで作成した Credential を使ってジョブテンプレートを実行
  • ※1)「HashiCorp Vault とのネイティブ OIDC 統合」 機能に関する注意点(動作確認バージョン:Automation Controller 4.8.6)
    • Automation Controller 4.8.6 時点では、本機能はフィーチャーフラグ(Feature Flag)配下に配置されているため、インストール時に機能を有効化しておく必要があります
    • フラグ管理されている最新の機能となるため、検証環境で十分に動作確認を行ってからの導入を強く推奨します

TL;DR

この記事を読めば、以下のことができるようになります

  • AAP 2.7 で追加された OIDC/JWT 認証のメリット(AppRole との違い)が理解できる
  • AAP 2.7 で新機能の「HashiCorp Vault OIDC/JWT 統合」機能を有効化できる
  • AAP と HashiCorp Vault を連携し、ジョブ実行時に安全にシークレット情報を取得できる

前提条件

  • HashiCorp Vault にルート権限(または設定変更権限)を持つトークンでアクセス可能であること

実行環境

  • Ansible Automation Platform: 2.7(インストーラー: ansible-automation-platform-containerized-setup-2.7-6.tar.gz
    • Automation Controller: 4.8.6
  • HashiCorp Vault (コンテナ版): docker.io/hashicorp/vault:latest (v2.0.4)

詳細

1. AAP構築時に機能フラグを有効化

AAPの詳細な構築手順は割愛します。(Install containerized Ansible Automation Platform
AAPのインストール時に以下のように、機能フラグ(feature_flags)にFEATURE_OIDC_WORKLOAD_IDENTITY_ENABLEDを追加します。

ansible-playbook -i inventory ansible.containerized_installer.install -e '{"feature_flags": {"FEATURE_OIDC_WORKLOAD_IDENTITY_ENABLED": true}}

機能フラグが有効化されると、下記のように設定 > Feature Flagsの画面でOIDC Workload Identityが確認できます。

feature_flag.png

また、Automation Execution > Infrastructure > Credential Types に以下のようなOIDC関連のCredential Typeが出てきます。

cred_type.png

2. HashiCorp VaultにOIDC/JWT認証用の設定を追加

  1. HashiCorp Vault サーバーへSSHログイン

  2. HashiCorp Vault環境変数を追加

    export VAULT_ADDR=http://<vault_address>:<vault_port>
    export VAULT_TOKEN=<vault_root_token>
    
  3. JWT 認証エンジンを有効化

    vault auth enable jwt
    
  4. JWT/OIDC認証の設定を追加

    • jwks_ca_pemには、AAPのPEM 形式の CA 証明書(または証明書チェーン)を設定します。ここでは、opensslコマンドで取得した内容を代入します
    vault write auth/jwt/config \
        bound_issuer="https://<aap_address>/o/" \
        jwks_url="https://<aap_address>/o/.well-known/jwks.json" \
        jwks_ca_pem="$(openssl s_client -showcerts -connect <aap_address>:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)"
    
  5. アクセスポリシーを登録

    • AAP に対してシークレットパス(secret/data/ansible/*)への読み取り権限(read)を許可するポリシーを作成
    vault policy write aap-policy - <<EOF
    path "secret/data/ansible/*" {
      capabilities = ["read"]
    }
    EOF
    
  6. JWTロールを作成

    • AAPのDefault組織から発行されたトークンのみを許可するロールを作成し、定義したポリシー(aap-policy)を紐付ける。
    vault write auth/jwt/role/aap-role - <<EOF
    {
      "role_type": "jwt",
      "bound_audiences": ["http://<vault_address>:<vault_port>"],
      "user_claim": "sub",
      "bound_claims_type": "string",
      "bound_claims": {
        "aap_controller_organization_name": "Default"
      },
      "policies": ["aap-policy"],
      "ttl": "1h"
    }
    EOF
    

3. HashiCorp Vault にシークレット情報を登録

  1. シークレットの格納

    • AAPのジョブ実行で参照する検証用のシークレット(自動化対象機器へのログインパスワード)をHashiCorp Vaultに保存
    vault kv put secret/ansible/credentials \
      password="password_from_vault"
    

4. AAPでCredential(認証情報)(OIDC/JWT 認証用 & ログインパスワード取得用)

  1. AAPにログイン

  2. Automation Execution > Infrastructure > 認証情報 を選択(以下、OIDC/JWT 認証用を作成)

  3. 以下の設定をして、[認証情報の作成]を選択

    • 名前: Test Vault Secret Lookup
    • 認証情報タイプ: HashiCorp Vault Secret Lookup(OIDC)
    • Server URL: http://<vault_address>:<vault_port>
    • Path to Auth: jwt
    • JWT Role: aap-role
      • HashiCorp Vaultで作成したRole
  4. Automation Execution > Infrastructure > 認証情報 を選択(以下、ログインパスワード取得用を作成)

  5. 先に以下の設定を入力する

    • 名前: Test Vault Machine
    • 認証情報タイプ: Machine
  6. パスワード欄にある鍵マークを選択し、以下の設定を入れてから[Test]を選択(直接文字列を入力する代わりにHashiCorp Vaultから動的取得する設定に切り替わります)

    • 認証情報: Test Vault Secret Lookup
    • Path to Secret: secret/ansible/credentials
    • Path to Auth: jwt
    • Key Name: password
      • secret/ansible/credentials配下にあるシークレットのキー
    • Controller Job Template
      • Demo Job Template
        • 今回は、JWTロール(aap-role)でDefault組織から発行されたトークンのみ許可しているので、Default組織配下のJob TemplateであればOK

    スクリーンショット 2026-09-03 115526.png

  7. 結果が成功(Test passedと表示)することを確認したら、[閉じる]を選択

  8. パスワード欄にある鍵マークを選択し、手順6の設定を入れてから[Finish]を選択

    • [Test]を選択すると入力がリセットされてしまうので、再度入力が必要
  9. [認証情報の作成]を選択

5. AAPで作成した Credential を使ってジョブテンプレートを実行

ここでは、AAPで作成した Credential を使ってジョブテンプレートを実行する場合の例を紹介します。
インベントリやプロジェクトの設定方法は割愛しますが、サンプル用インベントリファイル(hosts.yml)とサンプル用Playbook(connection_test.yml)を後述のJob Template実行例で紹介します。

  1. Automation Execution > テンプレート を選択
  2. テンプレートの作成 > ジョブテンプレートの作成 を選択
  3. 以下の設定をして、[ジョブテンプレートの作成]を選択
    • 名前: Test Job Template
    • インベントリ: 任意のインベントリ
      • 対象機器の情報が登録済みのもの
      • サンプル用インベントリファイル(hosts.yml)は後述のJob Template実行例を参照
    • プロジェクト: 任意のプロジェクト
    • Playbook: 任意のPlaybook
      • サンプル用Playbook(connection_test.yml)は後述のJob Template実行例を参照
    • 認証情報: Test Vault Machine
  4. [テンプレートの起動]を選択し、正しくログインパスワードが読み込まれることを確認する

Job Template実行例

ここでは、サンプル用インベントリファイル(hosts.yml)とサンプル用Playbook(connection_test.yml)を使用してJob Templateの実行してみます。

サンプル用インベントリファイル(hosts.yml)

インベントリには、1台分のホスト情報(linux01)を定義します。
パスワード(ansible_password)はHashiCorp Vaultから取得するので、ここでは定義しません。

all:
  hosts:
    linux01:
      ansible_host: "10.0.1.5"
      ansible_user: "testuser"

サンプル用Playbook(connection_test.yml)

Playbookでは、パスワード(ansible_password)を表示した後、実際に接続して
ファクトを収集できるか確認します。
通常、ログにパスワードが表示されないようにPlaybookを作成しますが、今回は検証のため平文表示するようにしています。

---
- name: Connection Test
  hosts: all
  gather_facts: false
  tasks:
    - name: Display inventory hostname
      ansible.builtin.debug:
        var: inventory_hostname

    - name: Display ansible password
      ansible.builtin.debug:
        msg: "The password fetched from Vault is {{ ansible_password }}"

    - name: Collect facts
      ansible.builtin.setup:
        gather_subset:
          - '!all'

Job Template実行結果

Job Templateを実行すると、パスワードが取得されファクトを収集できていることが確認できます。

PLAY [Connection Test] *********************************************************

TASK [Display inventory hostname] **********************************************
ok: [linux01] => {
"inventory_hostname": "linux01"
}

TASK [Display ansible password] ************************************************
ok: [linux01] => {
"msg": "The password fetched from Vault is password_from_vault"
}

TASK [Collect facts] ***********************************************************
ok: [linux01]

PLAY RECAP *********************************************************************
linux01 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

さいごに

本記事では、AAP 2.7から登場した「HashiCorp Vault とのネイティブ OIDC 統合」 機能の設定例を紹介しました。
Automation Controller 4.8.6 時点ではフィーチャーフラグ配下の機能となりますが、管理コスト削減に役立つ便利な機能であると感じました。
ぜひ検証環境などで試してみてください!

参考URL


2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?