AWSアカウントをセキュリティのためMFA認証設定すると開発が苦しくなると思うのは私だけか。
MFA設定したアカウントをスイッチロールさせるのを試すにはまずsts asumeroleが通るか試験したい。
aws sts assume-role --role-arn "arn:aws:iam::[アカウントID]:role/[ロール名]" --role-session-name AWSCLI-Session --serial-number arn:aws:iam::[あなたのアカウントID]:mfa/[あなたのデバイス名] --token-code [MFAコード]
上のコマンドで現時点のAWSACCESSKEY、SECRET、SESSIONをJSON形式で受け取れる。
これだとスイッチしたロールの権限が使えるか解らないので以下のコマンドを用意。
#
STS=$(aws sts assume-role --role-arn "arn:aws:iam::[アカウントID]:role/[ロール名]" --role-session-name AWSCLI-Session --serial-number arn:aws:iam::[アカウントID]:mfa/[デバイス名] --token-code [MFA一時コード])
# STS変数から、AWS_ACCESS_KEY、AWS_SECRET_ACCESS_KEY、SESSIONの3つの環境変数を出力
export AWS_ACCESS_KEY_ID=$(echo $STS | jq -r .Credentials.AccessKeyId) export AWS_SECRET_ACCESS_KEY=$(echo $STS | jq -r .Credentials.SecretAccessKey) export AWS_SESSION_TOKEN=$(echo $STS | jq -r .Credentials.SessionToken)
# スイッチ先のロール権限が使えることを確認
aws s3 ls
aws-vaultを使用した場合
AWS-CLIでプロファイル指定して実行
.aws/config
[default]
region = ap-northeast-1
[profile your-profile-name]
mfa_serial = arn:aws:iam::[あなたのアカウントID]:mfa/[あなたのデバイス名]
role_arn = arn:aws:iam::[あなたのアカウントID]:role/[ロール名]
source_profile = default
ここで、[あなたのアカウントID]、[あなたのデバイス名]、[アカウントID]、[ロール名]、および [あなたのベースプロファイル] を適切な値に置き換えてください。
aws s3 ls --profile your-profile-name
Enter MFA code for arn:aws:iam::[あなたのアカウントID]:mfa/[あなたのデバイス名]:
aws-vaultを使用した場合
- aws-vaultのインストール:
- ダウンロード
まず、aws-vault の最新バージョンをダウンロードします。これは、GitHubのaws-vaultリリースページから行うことができます。wgetを使用してコマンドラインから直接ダウンロードすることができます。
以下は、Linux用のバイナリをダウンロードする例です(バージョンは適宜最新のものに置き換えてください):
wget https://github.com/99designs/aws-vault/releases/download/v6.3.1/aws-vault-linux-amd64 -O aws-vault
- 実行権限の付与
ダウンロードしたファイルに実行権限を付与します。
chmod +x aws-vault
- バイナリの移動
適切なディレクトリ(例えば /usr/local/bin)にバイナリを移動し、全てのユーザーがアクセスできるようにします。
sudo mv aws-vault /usr/local/bin/
- 確認
インストールが正しく行われたかどうかを確認します。
aws-vault --version
- 「SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. 」のエラーが出た際はgnome-keyringをインストール
sudo apt-get install gnome-keyring
- aws-vaultの設定:
aws-vault を使用する場合、~/.aws/config ファイルに適切な設定が必要です。aws-vault は assume-role コマンドを内部的に使用してロールをスイッチします。
AWS Config ファイルの設定:
例えば、以下のように設定します。
[default]
region = ap-northeast-1
[profile your-profile-name]
mfa_serial = arn:aws:iam::[あなたのアカウントID]:mfa/[あなたのデバイス名]
role_arn = arn:aws:iam::[アカウントID]:role/[ロール名]
source_profile = default
- vaultのプロファイル追加
初回に入るユーザだけ作成します。
aws-vault add default --backend=secret-service
# ACCESSKEYとSECRET_KEYを要求されるので入力します。
# keyringを要求されるので入力します。
ここで、[あなたのアカウントID]、[あなたのデバイス名]、[アカウントID]、[ロール名]、および [あなたのベースプロファイル] を適切な値に置き換えてください。
- aws-vault の実行:
aws-vault exec your-profile-name -- aws s3 ls
このコマンドは、指定されたプロファイルの権限で aws s3 ls コマンドを実行します。
actionsでのスイッチロール実行の流れ
name: Deploy with Terraform
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Assume role
run: |
STS=$(aws sts assume-role --role-arn "arn:aws:iam::[あなたのアカウントID]:role/[ロール名]" --role-session-name GitHubActions)
echo "AWS_ACCESS_KEY_ID=$(echo $STS | jq -r .Credentials.AccessKeyId)" >> $GITHUB_ENV
echo "AWS_SECRET_ACCESS_KEY=$(echo $STS | jq -r .Credentials.SecretAccessKey)" >> $GITHUB_ENV
echo "AWS_SESSION_TOKEN=$(echo $STS | jq -r .Credentials.SessionToken)" >> $GITHUB_ENV
- name: Setup Terraform
uses: hashicorp/setup-terraform@v1
- name: Terraform Init
run: terraform init
- name: Terraform Plan
run: terraform plan
このワークフローでは、以下の手順が行われます:
リポジトリのチェックアウト:ソースコードを GitHub リポジトリから取得します。
AWS クレデンシャルの設定:AWS アクセスキーとシークレットアクセスキーを設定します。
スイッチロール:AWS STS の assume-role コマンドを使用して一時的な認証情報を取得し、環境変数に設定します。
Terraform のセットアップ:hashicorp/setup-terraform アクションを使用して Terraform をセットアップします。
Terraform Init:terraform init コマンドを実行し、Terraform の初期化を行います。
Terraform Plan:terraform plan コマンドを実行し、実行計画を作成します。
セキュリティ上の注意点
機密情報の管理:AWS アクセスキーとシークレットアクセスキーは GitHub のシークレットを使用して安全に管理します。
ロールの最小限の権限:Terraform に必要な権限のみを持つ IAM ロールを使用し、不要な権限は付与しないようにします。
ワークフローの監査:GitHub Actions ワークフローの変更は慎重に行い、不正な変更がないかを常に監視します。
Terraform ステートのセキュリティ:Terraform ステートファイルには機密情報が含まれることがありますので、適切な場所(例:AWS S3 バケット)に安全に保存し、アクセス制御を行います。
MFAが必要な環境でAWSにアクセスするための方法として、以下のようなアプローチを取ることが可能です。
- AWS IAM ロールの使用
AWS IAM ロールを使用して、MFA認証をバイパスすることが一般的な方法です。IAM ロールにはMFAを必要としない設定を適用し、そのロールをGitHub Actionsでスイッチロールするように設定します。IAM ロールに適切なポリシーを付与することで、セキュリティを維持しながら必要な操作を実行できます。
- 事前に認証済みのセッショントークンの使用
もう一つの方法として、事前にAWS CLIまたは別のツールを使用してMFA認証を行い、得られた一時的な認証情報(アクセスキー、シークレットアクセスキー、セッショントークン)をGitHubのシークレットに保存する方法があります。この一時的な認証情報をGitHub Actionsで使用することで、MFA認証が必要なAWSアカウントにアクセスできます。
セキュリティ上の注意点
最小限の権限: IAM ロールには必要最小限の権限のみを付与し、原則としてリーストプリビレッジを守ってください。
シークレットの安全な管理: GitHubのシークレット機能を利用して、AWSの認証情報を安全に管理してください。
セッショントークンの有効期限: 一時的な認証情報(セッショントークン)は有効期限があります。この期限内に処理が完了するようにワークフローを設計してください。
監査とログ: AWS アカウントのアクティビティを定期的に監査し、不審な動きがないかを確認してください。