HashiCorp Vault×Ansible Automation Platform
お疲れ様です。
こんにちは たそ(@taso_int)です。
アドベントカレンダー2回目です。
今回はHashiCorp VaultにCiscoルータのアクセス情報(ユーザー パスワード)を保管し、
HashiCorp Vaultから接続情報を参照して、
Ansible Automation PlatformでPlaybookを実行していきたいと思います。
やりたいこと
Ansible Automation Plafromを利用する上で、
接続する機器のユーザーとパスワードを設定しておく必要があります。
例
これをVault側で接続情報を保管し、
Vaultから参照する方法を行っていきたいと思います。
これにより、Ansible側で機密情報を持たず、
Vault側で管理することでよりセキュアになります。
参考情報
Vaultドキュメント
連携について
環境
AWS EC2
Ansible Automation Platform v2.3
HashiCorp Vault v1.12.2
Ciscoルータ Cisco sandbox(https://devnetsandbox.cisco.com/RM/Diagram/Index/27d9747a-db48-4565-8d44-df318fce37ad?diagramType=Topology)を利用
お互いに疎通が取れてる前提で行います。
今回はお互い違うサーバーを用意していますが、
検証目的であれば同じサーバーで構築しても問題ないと思います。
構築方法に関しては以下参考にしてください
Ansible
Vault
Vaultの設定
Vaultでは以下の設定を行います。
- KVシークレットエンジンの設定
- Approleの設定
KVシークレットエンジンの設定
まず、Ciscoルータの情報を保管するための設定をします。
ここではKVシークレットエンジンを利用します。
KVシークレットエンジンとはシークレットエンジンの機能で、
静的シークレットの提供を行っています。
Key:Value形式で値を保管することが可能となっています。
今回はバージョン2を利用します。
参考情報
CLIとGUIどっちでも設定が可能です。 CLIはサクッと紹介します。
# 環境変数の登録 export VAULT_ADDR='http://127.0.0.1:8200' # rootトークンを利用してログイン vault login # kv(v2)シークレットエンジンの有効化 パスはデフォルト vault secrets enable -version=2 kv # ciscoというパスを作成して、各情報をkey value形式で登録する vault kv put -mount=kv cisco user=developer password=C1sco12345 # 確認 vault kv get -mount=kv cisco
GUIでも画面交えて説明します。
アクセス画面はrootトークンでログインします。
SecretsからEnable new engineをクリックして、KVシークレットエンジンを選択します。
バージョン2であることを確認できればそのまま作成してください。
次に情報を登録します。
パスはciscoで今回保管したいユーザーとパスワードを設定します。
Approleの設定
AnsibleがvaultへアクセスするためのApproleの設定を行います。
ApproleはマシンやアプリがVaultにアクセスできる認証を提供します。
また権限を付与するためのポリシーを設定します。
Vaultではデフォルトの権限だと操作する権限がありません。
参考情報
Approle
policies
GUIでは一部設定が出来ないので右上のターミナルでCLIを使用します。
CLIはサクッと紹介します。
# roleに付与するpolicyのファイルの作成 cat <<EOF > aap-policy.hcl path "kv/*" { capabilities = ["read"] } EOF # policyの作成 vault policy write aap-policy aap-policy.hcl # Approleの登録 vault auth enable approle # 名前付きroleの作成 vault write auth/approle/role/aap policies=aap-policy # RoleIDの取得(値はAAPで使うのでメモる) vault read auth/approle/role/aap/role-id # SecretIDの取得(値はAAPで使うのでメモる) vault write -f auth/approle/role/aap/secret-id # tokenの発行(値はAAPで使うのでメモる) vault write auth/approle/login \ role_id=<RoleID> \ secret_id=<SecretID>
GUIでも画面交えて説明します。
Policisesをクリックし、Create ACL policyをクリックします。
名前とポリシーを記述します。
次にAccessに移動します。
Enable new methodをクリックして、Approleを選択します。
そのまま作成へ
右上のターミナルから以下実行
# 名前付きroleの作成 vault write auth/approle/role/aap policies=aap-policy # RoleIDの取得(値はAAPで使うのでメモる) vault read auth/approle/role/aap/role-id # SecretIDの取得(値はAAPで使うのでメモる) vault write -f auth/approle/role/aap/secret-id # tokenの発行(値はAAPで使うのでメモる) vault write auth/approle/login \ role_id=<RoleID> \ secret_id=<SecretID>
これにてVault側の設定は終わりです。
RoleIDとSecretIDとtokenはAAPで使用するのでメモしておきましょう
Ansible Automation Platformの設定
Ansible Automation Platformでは以下の設定を行います。
- Vaultの登録
- 認証情報で登録
Vaultの登録
たぶん画像を見た方が早いので認証情報から追加をクリックし、
以下の画像のように設定してください。
RoleIDとSecretIDとtokenはVaultで発行したものを使います。
テストで実際に利用できるかのチェックもできます。
認証情報で登録
認証情報の作成で鍵アイコンの場所をクリックすると
外部シークレット管理システムという画面が表示され
認証情報はVaultの登録で作成したものを選択します。
メタデータに使用したいパスとkey名を設定します。
実際に使ってみる
Playbookとホストの設定を入れて実行します。
ここに関しては省略します。
念のためdebugモジュールで、ansible_userを出力させました。
ジョブテンプレートを登録する時にマシンの認証情報を忘れずに
問題なく動きましたね。
これによりAnsible側で機密情報を持たせずに運用することが出来ます。
以上で終わりとなります。ここまで読んでいただきありがとうございました。