0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでIAMユーザーの初期パスワードをPGPキーで安全に発行・復号する方法

0
Posted at

はじめに

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文字列を指定します。

main.tf
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 # パスワード情報を画面に直接表示させないための設定
}

💡 ポイント
outputsensitive = 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 を利用すれば、ステートファイルやコンソール画面にパスワードを平文で残すことなく安全に運用できます。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?