GPGのインストール
$ brew install gnupg gnupg2
GPGの初期設定
環境変数のLANGとLC_CTYPEが以下のようになっている場合、GPGのウィザードが文字化けしてしまう。
$ env | grep -e LANG -e LC_CTYPE
LANG=ja_JP.UTF-8
LC_CTYPE=ja_JP.UTF-8
そのため、次のようにUSに変更しておく。
$ export LC_CTYPE=en_US.UTF-8
$ export LANG=en_US.UTF-8
続いて、GPGが標準入力を正しく読み込めるように、以下の環境変数を設定。
$ export GPG_TTY=$(tty)
これで準備完了。
GPGで秘密鍵を作成
あとは、アクセスキー有りのIAMユーザー作成 (Terraform) - Qiitaの手順に沿ってGPGで鍵を作ったり、base64でエンコードしていくだけ。
コマンドだけ抜粋するので、詳細は上記のリンク先を確認されたし。
鍵の作成
$ gpg --gen-key
gpg (GnuPG) 2.2.17; Copyright (C) 2019 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.
Note: Use "gpg --full-generate-key" for a full featured key generation dialog.
GnuPG needs to construct a user ID to identify your key.
Real name: <5文字以上の名前の入力>
Email address: <メールアドレスを入力
You selected this USER-ID:
"Real nameで入力した名前 <Email addressで入力したメールアドレス>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit?> O<問題なければキーボードでOを押す>
パスフレーズを決める
実行するために必要なパスフレーズを半角英数で入力する。
┌──────────────────────────────────────────────────────┐
│ Please enter the passphrase to │
│ protect your new key │
│ │
│ Passphrase: ________________________________________ │
│ │
│ <OK> <Cancel> │
└──────────────────────────────────────────────────────┘
短いパスワードを入れるとWarningが出るが、問題なけ
ればそのままTake this one anywayを洗濯して実行。
┌────────────────────────────────────────────────────────────────────┐
│ Warning: You have entered an insecure passphrase. │
│ │
│ A passphrase should be at least 8 characters long. │
│ A passphrase should contain at least 1 digit or │
│ special character. │
│ │
│ <Take this one anyway> <Enter new passphrase> │
└────────────────────────────────────────────────────────────────────┘
1回目に入力したパスフレーズの再入力を求められるので、入力する。
┌──────────────────────────────────────────────────────┐
│ Please re-enter this passphrase │
│ │
│ Passphrase: ________________________________________ │
│ │
│ <OK> <Cancel> │
└──────────────────────────────────────────────────────┘
入力してOKを選択すると、鍵が生成される。
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key C04673DFE848ABAA marked as ultimately trusted
gpg: revocation certificate stored as '/Users/yuta_ushizima/.gnupg/openpgp-revocs.d/1CCA2B215CAC1FD48869637EC04673DFE848ABAA.rev'
public and secret key created and signed.
pub rsa2048 2019-10-30 [SC] [expires: 2021-10-29]
1CCA2B215CAC1FD48869637EC04673DFE848ABAA
uid <Realnameで入力した名前> <Email addressで入力したメールアドレス>
sub rsa2048 2019-10-30 [E] [expires: 2021-10-29]
作成したGPG鍵の出力
※ <Realnameで入力した名前>の部分は適宜読み替えてください。実際に入力する際は<>は不要です。
$ gpg -o ./<Realnameで入力した名前>.public.gpg --export <Realnameで入力した名前>
$ gpg -o ./<Realnameで入力した名前>.private.gpg --export-secret-key <Realnameで入力した名前>
公開鍵をBase64でエンコード
※ <Realnameで入力した名前>の部分は適宜読み替えてください。実際に入力する際は<>は不要です。
$ cat <Realnameで入力した名前>.public.gpg | base64 | tr -d '\n' > <Realnameで入力した名前>.public.gpg.base64
エンコードした文字列のコピー
※ <Realnameで入力した名前>の部分は適宜読み替えてください。実際に入力する際は<>は不要です。
$ cat <Realnameで入力した名前>.public.gpg.base64
TerraformでIAMユーザーを作成
resourceを使ってIAMユーザーを作成します。
# IAMユーザーの定義
resource "aws_iam_user" "<Realnameで入力した名前>" {
name = var.iam_user_name
}
# アクセスキーの定義
# 同時にシークレットキーも生成される
resource "aws_iam_access_key" "of_<Realnameで入力した名前>" {
user = aws_iam_user.<Realnameで入力した名前>.name
pgp_key = var.s3_uploader_pgp_key
}
#マネジメントコンソールにログインする際のパスワードを定義
resource "aws_iam_user_login_profile" "of_<Realnameで入力した名前>" {
pgp_key = var.<Realnameで入力した名前>_pgp_key
user = aws_iam_user.s3_uploader.name
password_reset_required = true
password_length = "20"
}
# GPG鍵の名前
variable "<Realnameで入力した名前>_gpg_key" {
type = string
description = "Base64エンコードした公開鍵の文字列Base64エンコードした公開鍵の文字列"
}
# IAMユーザー名
variable "iam_user_name" {
type = string
default = "<Realnameで入力した名前>"
description = "IAMユーザーの名前"
}
# 暗号化されたIAMユーザーのコンソールログイン用パスワードの出力値
output "password" {
value = aws_iam_user_login_profile.of_<Realnameで入力した名前>.encrypted_password
description = "暗号化されたIAMユーザーのコンソールログイン用パスワードの出力値"
}
# 暗号化されたIAMユーザーのコンソールログイン用シークレットキーの出力値
output "secret" {
value = aws_iam_access_key.of_<Realnameで入力した名前>.encrypted_secret
description = "暗号化されたIAMユーザーのコンソールログイン用シークレットキーの出力値"
}
Terraformの実行
$ terraform init
$ terraform plan
$ terraform apply
暗号化されたシークレットキーとパスワードの複合化
$ terraform output password | base64 -d | gpg -r <Realnameで入力した名前>
$ terraform output secret | base64 -d | gpg -r <Realnameで入力した名前>
outputがうまく行かない時
tfstateの中から暗号化されているsecret(encrypted_secret)とpasword(encrypted_password)を見つけ出し、適当なファイル名をつけ、拡張子をgpgにして保存。
その後、複合化のコマンドを実行する。
$ cat password.gpg | base64 -d | gpg -r <Realnameで入力した名前>
$ cat secret.gpg | base64 -d | gpg -r <Realnameで入力した名前>