Windows(PowerShell)でMFAが有効になったIAMユーザでAWS CLIを使用する方法とスクリプトを使用した自動化

5 min read

はじめに

AWSでは、MFA (Multi-Factor Authentication) が有効になっているIAMユーザーでAWS CLIを使用する場合、一時的な認証情報を取得するために GetSessionToken APIを使用する必要があります。この記事では、WindowsでMFAが有効になったIAMユーザでAWS CLIを使用する方法とPowerShellスクリプトを使用し、これらの手順を自動化する方法を紹介します。

環境

AWS CLIはすでにインストールしてあります。

機器名 バージョン
PowerShell 5.1.19041.3031
AWS CLI 2.13.11
Python 3.11.4

事前準備

MFA認証を行う前に、aws configureコマンドをしようしてアカウントを登録する必要があります。以下に手順を記述します。

AWS Management Consoleからのアクセスキーの取得

まず、AWS CLIを使用するために必要な情報を取得します。

  • AWS Management Consoleにサインインします。
  • サービスメニューから「IAM」を選択します。
  • 左側のナビゲーションペインで「ユーザー」をクリックします。
  • アクセスキーを作成したいユーザーの名前をクリックします。
  • 「セキュリティ認証情報」タブを開きます。
  • 「アクセスキー」セクションで「新しいアクセスキーの作成」をクリックします。
  • 表示されるポップアップで「アクセスキーID」と「シークレットアクセスキー」をコピーまたはダウンロードします。

AWS CLIでのmfaプロファイルの設定

PowerShellを起動し、以下のコマンドを実行して mfa プロファイルを作成します。

PS C:\Users\MuNeNiCK> aws configure --profile mfa
AWS Access Key ID [****************KGOB]: アクセスキーID
AWS Secret Access Key [****************MdNo]: シークレットアクセスキー
Default region name [ap-northeast-1]: デフォルトリージョン
Default output format [json]:json

MFAの検証

以下のコマンドを実行して、MFAによりコマンドが正常に実行できないことを確認して下さい。

PS C:\Users\MuNeNiCK> aws s3 ls --profile mfa

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

AWS CLIでMFAを利用

AWS CLI で MFA を利用するときには、aws sts get-session-tokenコマンドで一時的なアクセスキーを取得できます。

MFAの利用と一時セッションキーの登録

  • マネージメントコンソール上でARNを確認してコピーします。

  • 以下のコマンドを実行し、MFA認証を行ってください。

    • serial-number: コピーしてきたMFAデバイスののARNを指定
    • token-code: このAuthenticatorアプリが表示する6桁のコードを指定
aws sts get-session-token --serial-number arn:aws:iam::xxxxxxxx:mfa/your-mfa-device --token-code YOUR_MFA_CODE --profile mfa
  • コマンドを実行すると、以下のように出力されます。
PS C:\Users\MuNeNiCK> aws sts get-session-token --serial-number arn:aws:iam::xxxxxxxx:mfa/your-mfa-device --token-code YOUR_MFA_CODE --profile mfa
{
    "Credentials": {
        "AccessKeyId": "ASIAXXXXXXXXXXXXXX",
        "SecretAccessKey": "vFoFKlR+TaFvU3XXXXXXXXXXXXXX",
        "SessionToken": "IQoJb3JpZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx//////////ARAAGgw2OTQ1NzQyMjc5MjUiDCwKeVHXobfuNVNOkyrMAbzuKEopURC9M9ghYeQH5bstFnfFCmDlrJw9xg4wR4P9ZlwvXt+ckq+A/c7WY7yCvZPIde7VeBDcGFKemyZe24K5JUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "Expiration": "2023-08-21T20:52:56+00:00"
    }
}
  • ここで出力された、AccessKeyIdSecretAccessKeySessionTokenを以下のコマンドのように環境変数としてセットします。
PS C:\Users\MuNeNiCK> $Env:AWS_ACCESS_KEY_ID="ASIAXXXXXXXXXXXXXX"
PS C:\Users\MuNeNiCK> $Env:AWS_SECRET_ACCESS_KEY="vFoFKlR+TaFvU3XXXXXXXXXXXXXX"
PS C:\Users\MuNeNiCK> $Env:AWS_SESSION_TOKEN="IQoJb3JpZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx//////////ARAAGgw2OTQ1NzQyMjc5MjUiDCwKeVHXobfuNVNOkyrMAbzuKEopURC9M9ghYeQH5bstFnfFCmDlrJw9xg4wR4P9ZlwvXt+ckq+A/c7WY7yCvZPIde7VeBDcGFKemyZe24K5JUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

検証

以下のコマンドを実行し、セッション認証が正常に行われたことを確認してください。

PS C:\Users\MuNeNiCK> aws s3 ls
2023-06-21 13:44:42 XXXXXXXXXXXXXXXXX

PowerShellスクリプトを使用した自動化

上記の方法でMFAが有効なIAMユーザでAWS CLIを利用することができるのですが、この方法では12時間でセッションが無効になってしまいます。そのため、毎回aws sts get-session-tokenコマンドを実行し、環境変数としてセットする必要があります。 そこで、PowerShellスクリプトを使用して環境変数のセットを自動化できるようにしました。

PowerShellスクリプト

以下に作成したPowerShellスクリプトを記述します。9,10行目は変数となっており、ご自身のMFAデバイスのARNとリージョンを指定してください。

# AWSGetSessionToken.ps1

param (
    [Parameter(Mandatory=$true)]
    [string]$TokenCode
)

# ARNとリージョンを指定
$ARN = "arn:aws:iam::xxxxxxxx:mfa/test"
$Region = "ap-northeast-1"

# AWS CLIコマンドの実行
$OUTPUT = aws sts get-session-token `
  --serial-number $ARN `
  --token-code $TokenCode `
  --profile mfa

# JSONから値を取得
$AWS_ACCESS_KEY_ID = ($OUTPUT | ConvertFrom-Json).Credentials.AccessKeyId
$AWS_SECRET_ACCESS_KEY = ($OUTPUT | ConvertFrom-Json).Credentials.SecretAccessKey
$AWS_SESSION_TOKEN = ($OUTPUT | ConvertFrom-Json).Credentials.SessionToken

# ターミナルに取得した値を表示
Write-Host "AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID"
Write-Host "AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY"
Write-Host "AWS_SESSION_TOKEN: $AWS_SESSION_TOKEN"

# 環境変数を設定
$Env:AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID"
$Env:AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY"
$Env:AWS_SESSION_TOKEN="$AWS_SESSION_TOKEN"
$Env:AWS_DEFAULT_REGION="$Region"

使用方法

  • 上記のスクリプトをAWSGetSessionToken.ps1という名前で保存してください。

  • 9,10行目をご自身のMFAデバイスのARNとリージョンに書き換えてください。

  • PowerShellを起動し、以下のコマンドでスクリプトを実行してください。-TokenCodeはAuthenticatorアプリの6桁のMFAコードを指定してください。

PS C:\Users\MuNeNiCK> .\AWSGetSessionToken.ps1 -TokenCode XXXXXX

スクリプトの実行が無効とエラーになる場合

PowerShellスクリプトはデフォルトで実行できないようになっている場合があります。そこで、2通りの方法でスクリプトを実行する方法を紹介します。

PS C:\Users\MuNeNiCK> .\AWSGetSessionToken.ps1 -TokenCode XXXXXX
AWSGetSessionToken.ps1 : このシステムではスクリプトの実行が無効にな
っているため、ファイル AWSGetSessionToken.ps1 を読み込むことができま
せん。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ C:\Users\MuNeNiCK\AWSGetSessionToken ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

一時的にスクリプトを実行する方法

  • 以下のコマンドを使用してスクリプトを実行してください。
PS C:\Users\MuNeNiCK> powershell -ExecutionPolicy Bypass -File .\AWSGetSessionToken.ps1 -TokenCode XXXXXX

永久的にスクリプトを実行可能にする方法

  • 管理者権限でPowerShellを起動してください。

  • 以下のコマンドを実行し、スクリプトの実行を許可してください。

PS C:\Windows\system32> Set-ExecutionPolicy Unrestricted

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
PS C:\Windows\system32>
  • 再度スクリプトを実行してください。
PS C:\Users\MuNeNiCK> .\AWSGetSessionToken.ps1 -TokenCode XXXXXX
  • 設定をもとに戻す場合はSet-ExecutionPolicy Restrictedコマンドを実行してください。

検証

以下のコマンドを実行し、セッション認証が正常に行われたことを確認してください。

PS C:\Users\MuNeNiCK> aws s3 ls
2023-06-21 13:44:42 XXXXXXXXXXXXXXXXX

おわりに

今回はWindows(PowerShell)でMFAが有効なIAMユーザをAWS CLIから使用する方法とその自動化方法を紹介しました。 Linuxのシェルスクリプトを使用した自動化は見かけましたが、Windows(PowerShell)のスクリプトを使用した記事は見かけなかったため、本記事を公開する運びとなりました。 お役に立てれば光栄です。

参考にさせていただいたサイト