要MFA認証AWSアカウントからスイッチロールして手動実行・actions自動実行出来るようになるまで

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の３つの環境変数を出力
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のインストール：
1. ダウンロード
まず、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
```

2. 実行権限の付与
ダウンロードしたファイルに実行権限を付与します。

```
chmod +x aws-vault
```

3. バイナリの移動
適切なディレクトリ（例えば /usr/local/bin）にバイナリを移動し、全てのユーザーがアクセスできるようにします。

```
sudo mv aws-vault /usr/local/bin/
```

4. 確認
インストールが正しく行われたかどうかを確認します。

aws-vault --version

5. 「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にアクセスするための方法として、以下のようなアプローチを取ることが可能です。

1. AWS IAM ロールの使用

AWS IAM ロールを使用して、MFA認証をバイパスすることが一般的な方法です。IAM ロールにはMFAを必要としない設定を適用し、そのロールをGitHub Actionsでスイッチロールするように設定します。IAM ロールに適切なポリシーを付与することで、セキュリティを維持しながら必要な操作を実行できます。

2. 事前に認証済みのセッショントークンの使用

もう一つの方法として、事前にAWS CLIまたは別のツールを使用してMFA認証を行い、得られた一時的な認証情報（アクセスキー、シークレットアクセスキー、セッショントークン）をGitHubのシークレットに保存する方法があります。この一時的な認証情報をGitHub Actionsで使用することで、MFA認証が必要なAWSアカウントにアクセスできます。

セキュリティ上の注意点

最小限の権限: IAM ロールには必要最小限の権限のみを付与し、原則としてリーストプリビレッジを守ってください。

シークレットの安全な管理: GitHubのシークレット機能を利用して、AWSの認証情報を安全に管理してください。

セッショントークンの有効期限: 一時的な認証情報（セッショントークン）は有効期限があります。この期限内に処理が完了するようにワークフローを設計してください。

監査とログ: AWS アカウントのアクティビティを定期的に監査し、不審な動きがないかを確認してください。