Help us understand the problem. What is going on with this article?

Ansible-VaultとAWS SecretsManager で、パスワードとかを安全にAnsibleで管理する

More than 1 year has passed since last update.

Ansible-VaultとAWS SecretsManager で、パスワードとかを安全にAnsibleで管理する

Ansible-Vault と AWS SecretsManager を組み合わせて、ansibleでパスワードとかを暗号化したメモ

やりたいこと

  • パスワードとかを、ansibleにそのまま書いて、gitにcommitするのは色々とまずいのでAnsible-Vaultで暗号化する。
  • 暗号化のパスワードの管理もいろいろ考えたくないので、AWS Secrets Manager にさせる。

方針

  • 暗号化のパスワードはAWS Secrets Managerに保管して利用する
    • これでIAMだけ考えればよくなる
  • Ansible-Vaultは、ファイル単位の暗号化でなく、フィールド単位での暗号化にする
    • ファイル単位にしちゃうと、gitでみた時に超不便

やりかたのまとめ

  • AWS Secretes Manager からパスワードを標準出力するShell Scriptを作成して、それを --vault-password-file に指定する
    • --vault-password-file はパスワードが書かれたファイルを指定するが、パスワードを出力する実行ファイルを指定しても動く (inventoryとかと一緒)
    • ansible.cfg[defaults]vault_password_file に書いちゃえば、都度指定する必要なくなるので便利
  • フィールドの暗号化は、 ansible-vault encrypt_string 使って、出力されたものを変数として記載する

実行例

前提

  • AWS Secretes Manager
    • シークレットのタイプは「他の種類のシークレット」
    • シークレット名 : ansible-vault
    • シークレットキー : main
  • IAM
    • 実行する環境で、上記シークレットへのアクセス権限をつける(インスタンスロールとか、アクセスキーとかで)

AWS Secretes Manager からパスワードを標準出力するShell Script

#!/bin/bash

aws secretsmanager get-secret-value --secret-id ansible-vault --region ap-northeast-1 | jq -r .SecretString | jq -r .main

これを、vault_pass.sh で保存、実行権限つけて、、、

暗号化

-> % echo 'MY_PASSWORD' | ansible-vault encrypt_string --stdin-name "db_password" --vault-password-file ./vault_pass.sh
Reading plaintext input from stdin. (ctrl-d to end input)
db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36366633366332363266363932633930396137393639663438303663363563373565393664613734
          3435303263666164353935646632303838303363303930390a393639346130386263333239613664
          61343233316234353333363765336438303134323362323732643437336336343933346233383331
          3138343435663363390a653766353066653561316166386662363233613339363039373962656261
          3366
Encryption successful

Playbookへの記載

出力された

db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36366633366332363266363932633930396137393639663438303663363563373565393664613734
          3435303263666164353935646632303838303363303930390a393639346130386263333239613664
          61343233316234353333363765336438303134323362323732643437336336343933346233383331
          3138343435663363390a653766353066653561316166386662363233613339363039373962656261
          3366

をそのまま、variableとして書けばOK

- db_user: admusr
- db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36366633366332363266363932633930396137393639663438303663363563373565393664613734
          3435303263666164353935646632303838303363303930390a393639346130386263333239613664
          61343233316234353333363765336438303134323362323732643437336336343933346233383331
          3138343435663363390a653766353066653561316166386662363233613339363039373962656261
          3366

これでそのままgitにcommitできる

実行

ansible-playbook を実行する際に、オプションで --vault-password-file ./vault_pass.sh をつけて実行するだけでOK

おまけ

ansible.cfg に

[defaults]
vault_password_file=./vault_pass.sh

を書いておけば、--vault-password-file ./vault_pass.sh を毎回付ける必要なくなる(逆につけると変な動作になるので注意)

注意

-v で復号されたものが出力されちゃう問題

FAQ https://docs.ansible.com/ansible/2.6/reference_appendices/faq.html#how-do-i-keep-secret-data-in-my-playbook にある通り no_log: True をつければOK

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした