LoginSignup
10
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-10

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

10
5
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
10
5