dshimizu/blog/alpha

とりとめのないITブログ

Terraformでパスワードやシークレットキーを設定したIAMユーザーを作成する

Terraformでパスワードを設定したIAMユーザーを作成するのにPGP公開鍵が必要だったのでやり方のメモ。

流れは以下のような形だと思う。

  1. PGPの公開鍵と秘密鍵のペアを作成する
  2. Terraformのaws_iam_user_login_profileやaws_iam_access_keyのResourceのpgp_keyへPGP公開鍵をセットする
  3. セットした公開鍵を元にAWS側で暗号化したパスワードを返されるので確認する
  4. 暗号化データをPGP秘密鍵で復号する

PGPの公開鍵と秘密鍵のペアを作成する

まず、PGPの公開鍵と秘密鍵を作成する。 PGP(GnuPG)がなければインストールする。

% brew install gpg

鍵ペアを作成する。gpg--gen-keyオプションを付与して実行する。 --full-generate-keyが利用可能な旨のメッセージが出るがお好みで使えば良いと思う。

% gpg --gen-key
gpg (GnuPG) 2.2.21; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注意: 全機能の鍵生成には "gpg --full-generate-key" を使います。

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: 

本名、メールアドレスの入力を促されるので適当に入力する。 最後に名前(N)、電子メール(E)の変更、またはOK(O)か終了(Q)?と問われるので、問題なければOを入力する。

% gpg --gen-key
gpg (GnuPG) 2.2.21; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注意: 全機能の鍵生成には "gpg --full-generate-key" を使います。

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: hogehoge
電子メール・アドレス: hogehoge@example.jp
次のユーザIDを選択しました:
    "hogeohge "

名前(N)、電子メール(E)の変更、またはOK(O)か終了(Q)?O

パスフレーズ入力画面が出るので適当に入力する。

                                                            ┌──────────────────────────────────────────────────────┐
                                                            │ Please enter the passphrase to                       │
                                                            │ protect your new key                                 │
                                                            │                                                      │
                                                            │ Passphrase: ________________________________________ │
                                                            │                                                      │
                                                            │                                          │
                                                            └──────────────────────────────────────────────────────┘

パスフレーズの再入力をする。

                                                           ┌──────────────────────────────────────────────────────┐
                                                           │ Please re-enter this passphrase                      │
                                                           │                                                      │
                                                           │ Passphrase: ________________________________________ │
                                                           │                                                      │
                                                           │                                          │
                                                           └──────────────────────────────────────────────────────┘

パスフレーズを空にした場合以下のようなメッセージが出るのでYes, protection is not neededを選択する。

                                                            ┌───────────────────────────────────────────────────────────────────────────────────────────────┐
                                                            │ You have not entered a passphrase - this is in general a bad idea!                            │
                                                            │ Please confirm that you do not want to have any protection on your key.                       │
                                                            │                                                                                               │
                                                            │                                          │
                                                            └───────────────────────────────────────────────────────────────────────────────────────────────┘

入力が終わったら以下のようなメッセージとともに鍵が作成される。

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: 鍵66A1D81A25C544B6を究極的に信用するよう記録しました
gpg: 失効証明書を '/Users/hogehoge/.gnupg/openpgp-revocs.d/8A558AEBED1F1005E593552266A1D81A25C544B6.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   rsa2048 2020-07-24 [SC] [有効期限: 2022-06-24]
      8A558AEBED1F1005E593552266A1D81A25C544B6
uid                      hogeohge 
sub   rsa2048 2020-07-24 [E] [有効期限: 2022-06-24]

鍵の一覧を確認する。

% gpg --list-keys
/Users/hogehoge/.gnupg/pubring.kbx
----------------------------------------
pub   rsa2048 2020-07-24 [SC] [有効期限: 2022-06-24]
      8A558AEBED1F1005E593552266A1D81A25C544B6
uid                      hogeohge 
sub   rsa2048 2020-07-24 [E] [有効期限: 2022-06-24]

% gpg --list-secret-keys
/Users/hogehoge/.gnupg/pubring.kbx
----------------------------------------
pub   rsa2048 2020-07-24 [SC] [有効期限: 2022-06-24]
      8A558AEBED1F1005E593552266A1D81A25C544B6
uid                      hogeohge 
sub   rsa2048 2020-07-24 [E] [有効期限: 2022-06-24]

作成したユーザの公開鍵、秘密鍵をエクスポートする。

$ gpg -o ./hogehoge.public.gpg  --export hogehoge
$ gpg -o ./hogehoge.private.gpg --export-secret-key hogehoge

公開鍵をBase64エンコードする。

% cat ./hogehoge.private.gpg | base64 | tr -d '\n' >./hogehoge.private.gpg.base64

Terraformのaws_iam_user_login_profileやaws_iam_access_keyのResourceのpgp_keyへPGP公開鍵をセットする

# GPG鍵
variable "pgp_key" {
    default = "***** ... ******"
}

# IAMユーザー
resource "aws_iam_user" "hogehoge" {
    name = "hogehoge"
}

# アクセスキー
resource "aws_iam_access_key" "hogehoge" {
    user    = "${aws_iam_user.hogehoge.name}"
    pgp_key = "${var.pgp_key}"
}

resource "aws_iam_user_login_profile" "hogehoge" {
    user = "${aws_iam_user.hogehoge.name}"
    pgp_key = var.pgp_key
    password_reset_required = false
}

resource "aws_iam_user_policy_attachment" "admin" {
    user = "${aws_iam_user.hogehoge.name}"
    policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
}

# シークレットキーを出力する
output "hogehoge_secret" {
    value = "${aws_iam_access_key.hogehoge.encrypted_secret}"
}

# パスワードを出力する
output "hogehoge_password" {
    value = "${aws_iam_user_login_profile.hogehoge.encrypted_password}"
}

セットした公開鍵を元にAWS側で暗号化したパスワードを返されるので確認する

applyするとOutputで値を取得できる。

% terraform apply
:

Apply complete! Resources: 7 added, 0 changed, 0 destroyed.

Outputs:

hogehoge_secret = ***** ... ******
hogehoge_password = ***** ... ******

暗号化データをPGP秘密鍵で復号する

Outputの値を元にgpgコマンドで復号してパスワードを取得できる。

% terraform output hogehoge_password  | base64 -d | gpg -r  hogehoge
gpg: *警告*: コマンドが指定されていません。なにを意味しているのか当ててみます ...
gpg: 2048-ビットRSA鍵, ID 0F51A1988DE59DB5, 日付2020-07-24に暗号化されました
      "hogeohge "
***************

% terraform output hogehoge_secret  | base64 -d | gpg -r  hogehoge
gpg: *警告*: コマンドが指定されていません。なにを意味しているのか当ててみます ...
gpg: 2048-ビットRSA鍵, ID 0F51A1988DE59DB5, 日付2020-07-24に暗号化されました
      "hogeohge "
******************************

PGPの鍵はどこかに安全なところに保存してローカルのものは削除しておく。

% rm *.gpg

参考