2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS Tools for PowerShellとAWS CLIでロール切替なしのMFA認証

Last updated at Posted at 2022-10-21

AWS Tools for PowerShellやAWS CLIでロール切替時にMFAするには .config ファイル内でロールにMFAデバイスを設定しておけばいい。ロール切替用に、「サポートされるconfigファイル設定 - 設定ファイルと認証情報ファイルの設定」にある role_arn source_profile を持つ名前付きプロファイルを作ると思うのだけど、そこに mfa_serial も追加しておく。

ロール切替時に、MFAコード(6桁の数字)を聞いてくれる。ではロール切替しない、IAMユーザー認証してそのまま要MFAの作業するにはというと、この手法が使えなさそうな感じ。

注意: 永続的な IAM 認証情報で mfa_serial パラメータを使用することはできません。
AWS CLI 経由で MFA を使用してアクセスを認証する - AWS ナレッジセンター

大まかに言えば、このAWSナレッジセンターのドキュメントにある手順でセッショントークンを取得し、一時的な認証情報として設定する必要がある。

AWS CLI

上の引用文出典と同じだけど、こちらを参照。

ダイジェストで手順をまとめておくと。まず以下でセッショントークンを取得する。

aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token

こんな出力が返ってくる。

{
    "Credentials": {
        "SecretAccessKey": "secret-access-key",
        "SessionToken": "temporary-session-token",
        "Expiration": "expiration-date-time",
        "AccessKeyId": "access-key-id"
    }
}

ここに含まれている値を、環境変数 AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN に設定する。

  • Linuxでは export AWS_ACCESS_KEY_ID=secret-access-key など。削除するときは unset AWS_ACCESS_KEY_ID など。
  • Windowsでは set AWS_ACCESS_KEY_ID=secret-access-key など。削除するときは set AWS_ACCESS_KEY_ID= など。

セッショントークンが期限切れした時は再取得する。この時は設定した環境変数を削除したり、非MFAで使っているものに戻したりして、セッショントークンを再取得してから、再設定する。何回もやってると消耗するので、戻り値をsedとかjqとかで解析して環境変数に入れる何かを作るとかしておくと楽かもしれない。あるいはこれとかもよさげです。

あと環境変数は、AWS SDK for Python(boto3)とかも見てくれるので、各種SDKとかでもこの方式でイケると思う。

AWS Tools for PowerShell

同様にGet-STSSessionTokenコマンドレットでセッショントークンを取得し、Set-AWSCredentialで一時認証情報に格納する。

$sts = Get-STSSessionToken -SerialNumber arn-of-the-mfa-device -TokenCode code-from-token
Set-AWSCredential -AccessKey $sts.AccessKeyId -SecretKey $sts.SecretAccessKey -SessionToken $sts.SessionToken

セッショントークンが期限切れした時は再取得する。この時は、設定した一時認証情報を戻すのだけど、AWS Tools for PowerShellの場合これだけ。

  • 普段 Set-AWSCredential で名前付きプロファイルを指定している → Set-AWSCredential する。
  • 普段はデフォルトか環境変数の認証情報を使っている → Clear-AWSCredentialする。

Set-AWSCredential した認証情報は環境変数より優先されるし、だから環境変数を書き換える必要がなくて、書き戻す必要もない。なので、こちらを使うのがいいと思う。

終わりに

できるとは言えMFAシリアルを都度入力する時点で基本めんどくさいので、権限管理はIAMロール使う、EC2インスタンス等からの実行はIAMユーザー認証じゃなくインスタンスプロファイル(ロール付与)使う、というのがいいと思います。それができなければ、AWS CLIよりAWS Tools for PowerShellの方がまだ楽。でもセッションマネージャーでの画面転送がAWS CLIでしかできないので、ワーストめんどくさいケースはいつか来る。IAMロールとインスタンスプロファイル使うのお勧めです(というか使わせてください)。

参考情報

以下を参照してまとめています。参照先情報と本記事の情報が合致しない場合、多分参照先の情報が正しいです。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?