はじめに
Terraformを使ってAWS IAMユーザーとログインプロファイル(aws_iam_user_login_profile)を作成する際、初期パスワードをそのまま出力すると、Terraformのステートファイルやコンソール画面に平文でパスワードが残ってしまい、セキュリティ上のリスクになります。
この記事では、GnuPG (GPG) で生成した公開鍵を使ってパスワードを暗号化し、自分のローカル環境にある秘密鍵を使って復号(解読)する手順を解説します。
最後によくハマる Inappropriate ioctl for device エラーの解決方法も載せています。
前提条件
- Terraform がインストールされていること
- AWSのプロファイル(認証情報)が設定されていること
- GnuPG (
gpgコマンド) がインストールされていること(Macならbrew install gnupg、Ubuntuならsudo apt install gnupg)
ステップ1:GPGキーペアの生成と公開鍵のエクスポート
まずはローカル環境でGPGキーペア(公開鍵と秘密鍵)を作成し、Terraformに渡すためのBase64文字列を取得します。
1. 鍵の生成
以下のコマンドを実行し、対話形式で名前やメールアドレスを入力します。
この時に設定する「パスフレーズ」は復号時に使うので忘れないようにしてください。
gpg --gen-key
2. 公開鍵をBase64でエクスポート
生成した鍵の公開鍵をエクスポートし、Base64でエンコードします。
(your-email@example.com の部分は、先ほど入力したメールアドレスに置き換えてください)
gpg --export "your-email@example.com" | base64
実行すると、wcFMAw... のような長い文字列が出力されます。これが公開鍵のBase64文字列です。後でTerraformのコードに貼り付けるのでコピーしておきます。
ステップ2:Terraformコードの作成
Terraformのコード (main.tf) を記述します。pgp_key に先ほどコピーしたBase64文字列を指定します。
resource "aws_iam_user" "example" {
name = "example-user"
}
resource "aws_iam_user_login_profile" "example" {
user = aws_iam_user.example.name
# 先ほどエクスポートしたBase64文字列を貼り付けます
pgp_key = "ここにコピーした長いBase64文字列を貼り付ける"
}
output "encrypted_password" {
value = aws_iam_user_login_profile.example.encrypted_password
sensitive = true # パスワード情報を画面に直接表示させないための設定
}
💡 ポイント
outputにsensitive = trueを設定することで、terraform applyを実行した際に画面に値が表示されなくなります(<sensitive>と表示されます)。
ステップ3:Terraformの実行
コードが書けたらリソースを作成します。
terraform init
terraform apply
apply が完了すると、以下のように出力されます。
Outputs:
encrypted_password = <sensitive>
暗号化されたパスワードはステートファイルに保存されていますが、sensitive = true のため画面上は隠されています。
ステップ4:暗号化されたパスワードの復号(解読)
いよいよ初期パスワードを復号して平文を取得します。
terraform output -raw コマンドを使って隠された値を取得し、それを base64 でデコード後、gpg に渡して復号します。
terraform output -raw encrypted_password | base64 --decode | gpg --decrypt
⚠️ 注意:復号時にエラーが出る場合
上記のコマンドを実行すると、以下のようなエラーが出て失敗することがあります。
gpg: public key decryption failed: Inappropriate ioctl for device
gpg: decryption failed: No secret key
これは、**「パスフレーズの入力画面をターミナルに表示しようとしたが、パイプ(|)を使っているため表示先を見失った」**という、GPG特有のエラーです。
💡 解決策
以下のいずれかの方法で解決できます。
解決策A:環境変数 GPG_TTY を設定する(おすすめ)
現在のターミナル画面をGPGに明示的に教えます。
export GPG_TTY=$(tty)
terraform output -raw encrypted_password | base64 --decode | gpg --decrypt
解決策B:プロンプトの表示モードを変更する
パイプ経由でも同じ画面内でパスフレーズを受け付けるように、--pinentry-mode loopback オプションを付けます。
terraform output -raw encrypted_password | base64 --decode | gpg --pinentry-mode loopback --decrypt
パスフレーズを入力すると、コマンド出力の最後に平文のパスワードが表示されます!
このパスワードを使って、AWSマネジメントコンソールにログインできるようになります。
おわりに
TerraformでIAMユーザーを作成する際、pgp_key を利用すれば、ステートファイルやコンソール画面にパスワードを平文で残すことなく安全に運用できます。