たそ@ITインフラ初心者

taso@初心者エンジニア

新卒2年目 エンジニアが適当に語るブログてす

HashiCorp Vault×Ansible Automation Platform

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ドキュメント

developer.hashicorp.com

連携について

t.co

環境

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

qiita.com

Vault

taso-int.hatenablog.com

Vaultの設定

Vaultでは以下の設定を行います。

  1. KVシークレットエンジンの設定
  2. Approleの設定

KVシークレットエンジンの設定

まず、Ciscoルータの情報を保管するための設定をします。
ここではKVシークレットエンジンを利用します。
KVシークレットエンジンとはシークレットエンジンの機能で、
静的シークレットの提供を行っています。
Key:Value形式で値を保管することが可能となっています。
今回はバージョン2を利用します。
参考情報

developer.hashicorp.com

CLIGUIどっちでも設定が可能です。 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

developer.hashicorp.com

policies

developer.hashicorp.com

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では以下の設定を行います。

  1. Vaultの登録
  2. 認証情報で登録

Vaultの登録

たぶん画像を見た方が早いので認証情報から追加をクリックし、
以下の画像のように設定してください。
RoleIDとSecretIDとtokenはVaultで発行したものを使います。
テストで実際に利用できるかのチェックもできます。

認証情報で登録

認証情報の作成で鍵アイコンの場所をクリックすると
外部シークレット管理システムという画面が表示され
認証情報はVaultの登録で作成したものを選択します。

メタデータに使用したいパスとkey名を設定します。

実際に使ってみる

Playbookとホストの設定を入れて実行します。
ここに関しては省略します。
念のためdebugモジュールで、ansible_userを出力させました。 ジョブテンプレートを登録する時にマシンの認証情報を忘れずに

問題なく動きましたね。

これによりAnsible側で機密情報を持たせずに運用することが出来ます。
以上で終わりとなります。ここまで読んでいただきありがとうございました。