Rocky Linux8 で AWS Vault を使い awscli を実行する
AWS Vault を使うと AWS の Access Key や Secret Key を安全に保管することが出来ます。 今回は Rocky Linux8 で aws-vault を利用するまでの手順をメモしておきます。 AWS Vault のバックエンドには GnuPG と pass を利用するので、これらもセットアップします。
CloudMapper 用の IAM ユーザを作成する
GUI でも CLI でも良いのですが、CloudMapper 用の IAM ユーザを作成しておきます。 CLI から作成する場合は awscli のインストールされた環境から以下を実行します。 AccessKey と SecretKey は後の手順で必要になる為、メモしておきます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | aws iam create-user --user-name cloudmapper
aws iam put-user-policy --user-name cloudmapper --policy-name cloudmapper_readonly_policy --policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Resource": "*",
"Action": [
"ec2:DescribeRegions",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeVpcs",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DescribeVpcPeeringConnections",
"ec2:DescribeInstances",
"ec2:DescribeNetworkInterfaces",
"rds:DescribeDBInstances",
"elasticloadbalancing:DescribeLoadBalancers"
]
}
]
}'
aws iam create-access-key --user-name cloudmapper
|
awscli をインストールする
awscli をインストールしておきます。 Terraform などを利用するのであれば不要です。
| curl -O https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip
unzip awscli-exe-linux-x86_64.zip
sudo aws/install
|
今回は以下のバージョンがインストールされました。
| # aws --version
aws-cli/2.4.7 Python/3.8.8 Linux/4.18.0-348.2.1.el8_5.x86_64 exe/x86_64.rocky.8 prompt/off
|
awscli 用の設定ファイルを用意する
awscli 用の設定ファイルを用意しておきます。 デフォルトリージョンだけ、指定しておきます (認証情報は aws-valut で指定しますので、awscli の設定ファイルには記載しません)。
| mkdir ~/.aws
cat << 'EOF' > ~/.aws/config
[default]
region = ap-northeast-1
EOF
|
GnuPG の準備
Rocky Linux8 を最小インストールした場合は pinentry がインストールされていなかった為、インストールしておきます。
GnuPG で鍵を生成する際、対話的に鍵を生成しても良いのですが、今回は設定ファイルを指定して鍵を生成します。 以下の内容で設定ファイルを作成しておきます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | cat << 'EOF' > ~/.gnupg.conf
Key-Type: RSA
Key-Length: 3072
Key-Usage: sign,cert
Subkey-Type: RSA
Subkey-Length: 3072
Subkey-Usage: encrypt
Name-Real: USERNAME
Name-Email: USERNAME@example.com
Expire-Date: 0
Passphrase: PASSWORD
%commit
%echo done
EOF
|
鍵を生成します。 生成した鍵は gpg --list-keys
で確認出来ます。
| gpg --gen-key --batch ~/.gnupg.conf
|
pass のインストール
pass をインストールします。
インストールが完了したら GnuPG で指定したメールアドレスを指定して初期化しておきます。
| pass init USERNAME@example.com
|
環境変数の設定
AWS Vault のパラメータを設定しておきます。 下記の例ではバックエンドが pass であること、pass の Prefix に aws-vault
を指定すること、STS (Session Token Service) のキャッシュ時間を最長の 12 時間にすること、などを設定しています。
| cat << 'EOF' >> ~/.bash_profile
export AWS_SESSION_TOKEN_TTL=12h
export AWS_VAULT_BACKEND=pass
export AWS_VAULT_PASS_PREFIX=aws-vault
export GPG_TTY=$(tty)
EOF
|
GnuPG のキャッシュ時間も合わせて調整しておきます。 43200
は 43,200 秒 (12 時間) を指定しています。 設定が完了したら gpg-connect-agent reloadagent /bye
で設定を反映します。
| echo "default-cache-ttl 43200" >> ~/.gnupg/gpg-agent.conf
echo "max-cache-ttl 43200" >> ~/.gnupg/gpg-agent.conf
chmod 600 ~/.gnupg/gpg-agent.conf
gpg-connect-agent reloadagent /bye
|
AWS Vault のインストール
AWS Vault をインストールします。 AWS Vault は go-lang で書かれており、GitHub でコンパイル済みのバイナリが配布されている為、それをダウンロードして適切に権限設定するだけで実行可能です。
| curl -L -o /usr/local/bin/aws-vault https://github.com/99designs/aws-vault/releases/download/v6.4.0-beta1/aws-vault-linux-amd64
chmod 755 /usr/local/bin/aws-vault
|
現時点ではバージョン 6.4.0 beta1 がインストールされました。
| # aws-vault --version
v6.4.0-beta1
|
プロファイルの追加
認証情報は「プロファイル」という単位で AWS Vault へ保存します。 aws-vault add PROFILE
のように実行します。
実行例は以下の通りです。
| # aws-vault add PROFILE
Enter Access Key ID: ABCDEF0123456789ABCD
Enter Secret Access Key:
Added credentials to profile "PROFILE" in vault
|
AWS Vault を利用して awscli を実行する
AWS Vault から認証情報を呼び出し、awscli を実行する例は以下の通りです。 初回は認証情報がキャッシュされていない為、pass による認証情報の確認が行われますので GnuPG で指定した Passphrase を指定します。
| aws-vault exec PROFILE -- aws s3 ls
|
キャッシュが有効な間は同じプロファイルを利用する限り、認証情報を再確認されることなく awscli を利用することが出来ます。
参考
aws-vault add
のヘルプ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | # aws-vault add --help
usage: aws-vault add [<flags>] <profile>
Adds credentials to the secure keystore
Flags:
--help Show context-sensitive help (also try --help-long and
--help-man).
--version Show application version.
--debug Show debugging output
--backend=secret-service Secret backend to use [secret-service kwallet pass
file] ($AWS_VAULT_BACKEND)
--prompt=terminal Prompt driver to use [kdialog osascript pass terminal
ykman zenity] ($AWS_VAULT_PROMPT)
--keychain="aws-vault" Name of macOS keychain to use, if it doesn't exist it
will be created ($AWS_VAULT_KEYCHAIN_NAME)
--secret-service-collection="awsvault"
Name of secret-service collection to use, if it
doesn't exist it will be created
($AWS_VAULT_SECRET_SERVICE_COLLECTION_NAME)
--pass-dir=PASS-DIR Pass password store directory
($AWS_VAULT_PASS_PASSWORD_STORE_DIR)
--pass-cmd=PASS-CMD Name of the pass executable ($AWS_VAULT_PASS_CMD)
--pass-prefix=PASS-PREFIX Prefix to prepend to the item path stored in pass
($AWS_VAULT_PASS_PREFIX)
--env Read the credentials from the environment
(AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY)
--add-config Add a profile to ~/.aws/config if one doesn't exist
Args:
<profile> Name of the profile
|