Skip to content

Rocky Linux8 で AWS Vault を使い awscli を実行する

AWS Vault を使うと AWS の Access Key や Secret Key を安全に保管することが出来ます。 今回は Rocky Linux8 で aws-vault を利用するまでの手順をメモしておきます。 AWS Vault のバックエンドには GnuPGpass を利用するので、これらもセットアップします。

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 などを利用するのであれば不要です。

1
2
3
curl -O https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip
unzip awscli-exe-linux-x86_64.zip
sudo aws/install

今回は以下のバージョンがインストールされました。

1
2
# 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 の設定ファイルには記載しません)。

1
2
3
4
5
mkdir ~/.aws
cat << 'EOF' > ~/.aws/config
[default]
region = ap-northeast-1
EOF

GnuPG の準備

Rocky Linux8 を最小インストールした場合は pinentry がインストールされていなかった為、インストールしておきます。

1
dnf -y install 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 で確認出来ます。

1
gpg --gen-key --batch ~/.gnupg.conf

pass のインストール

pass をインストールします。

1
dnf -y install pass

インストールが完了したら GnuPG で指定したメールアドレスを指定して初期化しておきます。

1
pass init USERNAME@example.com

環境変数の設定

AWS Vault のパラメータを設定しておきます。 下記の例ではバックエンドが pass であること、pass の Prefix に aws-vault を指定すること、STS (Session Token Service) のキャッシュ時間を最長の 12 時間にすること、などを設定しています。

1
2
3
4
5
6
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 で設定を反映します。

1
2
3
4
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 でコンパイル済みのバイナリが配布されている為、それをダウンロードして適切に権限設定するだけで実行可能です。

1
2
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 がインストールされました。

1
2
# aws-vault --version
v6.4.0-beta1

プロファイルの追加

認証情報は「プロファイル」という単位で AWS Vault へ保存します。 aws-vault add PROFILE のように実行します。

1
aws-vault add PROFILE

実行例は以下の通りです。

1
2
3
4
# 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 を指定します。

1
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