[Mac版]GPGとTerraformでアクセスキーがあるIAMユーザーを生成する
スポンサーリンク

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で入力した名前>

参考サイト

スポンサーリンク
おすすめの記事