Terraformを用いたIAMユーザー作成でPGPが必要だったため、PGPに関して簡単に使い方をまとめます。
PGP
PGP: Pretty Good Privacy(たいへんよいプライバシー)
公開鍵暗号方式を使った暗号・署名の仕組みです。SSL/TLSと違い、鍵を利用者の責任で管理します。
メッセージまたはファイルは、セッション鍵と呼ばれる乱数の値を鍵として、対称暗号により暗号化され、そのセッション鍵は受信者の公開鍵で暗号化されます。
PGPが使用できるツールとして以下が挙げられます。
- GPG (GNU Private Guard)
- OpenPGP
ここではGPGを使用して試してみます。
GPG
GNU Privacy Guard (GnuPG, GPG) とは、Pretty Good Privacy (PGP) の別実装として、GPLに基づいた暗号化ソフトです。(Wikipedia)
Windowsにおいては標準で入っていませんがGit Bashが入っていれば使用できます。今回はGit Bashを使用します。
GPGのコマンドチートシート
操作 | Command |
---|---|
生成 | gpg --list-keys |
一覧 | gpg --list-keys |
gpg --list-secret-keys |
|
鍵ファイル出力 | gpg -o <KEY_FILE> --export <NAME> |
gpg -o <KEY_FILE> --export-secret-key <NAME> |
|
鍵削除 | gpg --delete-key <NAME> |
gpg --delete-secret-key <NAME> |
|
暗号・復号化 | gpg -r <NAME> --encrypt |
gpg -r <NAME> --decrypt |
暗号化・復号化に関して、標準入力からデータを入力し、暗号化されたデータはバイナリ形式になります。
GPGによる暗号・復号化
マスターキーペアの作成
マスターキーを作成します。
今回はkey_name
という名前でキーを作成します。
$ gpg --gen-key
gpg (GnuPG) 2.2.27-unknown; Copyright (C) 2021 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: key_name
Email address: key_name@sample.com
You selected this USER-ID:
"key_name <key_name@sample.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
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: /c/Users/owner/.gnupg/trustdb.gpg: trustdb created
gpg: key E8A377E6CA4FB2CF marked as ultimately trusted
gpg: directory '/c/Users/owner/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/c/Users/owner/.gnupg/openpgp-revocs.d/A66F1ECEA33996BAAC43D1B2E8A377E6CA4FB2CF.rev'
public and secret key created and signed.
pub rsa3072 2021-08-25 [SC] [expires: 2023-08-25]
A66F1ECEA33996BAAC43D1B2E8A377E6CA4FB2CF
uid key_name <key_name@sample.com>
sub rsa3072 2021-08-25 [E] [expires: 2023-08-25]
途中でパスコードの入力を求められますが、ここでは設定しないで進みました。
作成を実行する、キーが生成されます。リストコマンドで確認するとたしかにキーが作られたことを確認できます。
$ gpg --list-keys
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2023-08-25
/c/Users/owner/.gnupg/pubring.kbx
--------------------------------
pub rsa3072 2021-08-25 [SC] [expires: 2023-08-25]
A66F1ECEA33996BAAC43D1B2E8A377E6CA4FB2CF
uid [ultimate] key_name <key_name@sample.com>
sub rsa3072 2021-08-25 [E] [expires: 2023-08-25]
文字列の暗号化
作成したキーを利用して文字列を暗号化してみます。
今回はパイプで値を渡します。暗号化したものはバイナリ形式なのでbase64で文字列に起こします。
$ echo "I'm yuu999" | gpg -r key_name --encrypt | base64 -w0 > test.txt
$ cat test.txt
hQGMAw2tITT1c66FAQv+IYixhS9cCSpp7vPToHF6upSRposWv5CulHYSzXpChmcgkjxnoURYJ6Rx4fv26+KAZ/uozuGsLlmY8lDYYjlCRZ9z7aAbmJRqMlfk6AjpUf6sjJPzB8S7Ac1/0P6Yl+LzggAtYuajxMX8IH2vmlrpBB5LdOb/MZXxKc5RB+nk7ZztywXXOIRN7RLE/DjC5KQD5D+ZtRKuWH4I106U+W1yQqCqBEg4CvIW95R3JvN1/i0a5eJk/vWugWfHwzpX6Sn6Vd7QkebhhKmh3gxFoA9SwqTCJSsgVinapoAMbwF5x4kFvFk+IOqXxxxxxxxxxxxxxxxxxasdsadkfgm/gTPnSW4g9fuWcMYIvUQJ2lUxsbwdxfgWG7CcFenaPyQMpmlcL18sIuhkFr/ZAP35nmHAk9Sxz34A8AyFSYy65c3+wx4tpM71gAWwbCM/RXiko8mgUCw63cQxBOjzv7dYtpQYYrP33wCxWv2+nVzKRqKHM9/NyD99MUBNuyCAPRa0lcB0mylvscEOsjz0niYSCYyoYACDvfIjt4EnhQnq7xq+LXIjGzsA7Xv7g34kF8wj4SYLVROyyZXdDTee+xN77m+cE8PKghcKCwa0NLpYCHqiwRJIkIVcZg=
文字列が暗号化されました。
文字列の復号化
さきほど暗号化したファイルを復号化します。
$ cat test.txt | base64 -d | gpg -r key_name --decrypt
gpg: encrypted with 3072-bit RSA key, ID 0DAD2134F573AE85, created 2021-08-25
"key_name <key_name@sample.com>"
I'm yuu999
最初に入力した文字列を復元できました。
まとめ
PGPによる暗号化について簡単にまとめ、GPGにて実際に暗号化・復号化を試してみました。
使用方法は整理できたので、Terraformで利用したいと思います。