IAM ユーザーの MFA を有効化した後、アクセスキーを使用する既存処理に影響があるか教えてください

2021.05.28

困っていた内容

IAM ユーザーのセキュリティを強化する施策を実施したいと考えています。MFA の有効化を全 IAM ユーザー必須にすることを検討しています。

アクセスキーを使用する IAM ユーザーで後から MFA を有効化した場合、既存のアクセスキーを使用する処理に影響は出ますか?

既存の処理が停止してしまうのは困りますので、影響の有無を確認したいです。

どう対応すればいいの?

アクセスキーを使用する IAM ユーザーで MFA を有効化した場合、既存のアクセスキーを使用する処理に影響は出ません。

ただし、MFA を有効化する際に、合わせて MFA を強制する IAM ポリシーを付与した場合、既存の処理に影響が出ます。

MFA を強制する IAM ポリシーの例は下記の記事を参照してください。

多要素認証(MFA)するまで使えません!なIAMユーザを作成してみた | DevelopersIO

注意点

MFA を強制する IAM ポリシーを IAM ユーザーへアタッチした場合、既存のアクセスキーを使用する処理では、MFA デバイスを使って一時的な認証情報を AWS Security Token Service (AWS STS) から取得する必要があります。

一時的な認証情報の期限は 2021/05/28 時点で最長 129,600 秒(36 時間)です。このため、バッチ処理などでアクセスキーを利用する場合は、一時的な認証情報の期限切れ後、再度一時的な認証情報を取得する処理の追加(変更)が必要です。

やってみた

S3 にアクセスキーを使用してファイルアップロードする処理を実施します。

前提として、S3 と MFA の有効化を許可した IAM ユーザーのアクセスキーを発行し、AWS CLI に設定しています。

MFA 無効

$ aws s3 cp ./blog.md  s3://<S3 バケット名>/blog.md
upload: blog.md to s3://<S3 バケット名>/blog.md

正常にアップロードできました。その後、MFA を有効化し、既存処理に影響があるか確認します。

MFA 有効

$ aws s3 cp ./blog.md  s3://<S3 バケット名>/blog.md
upload: blog.md to s3://<S3 バケット名>/blog.md

結果は変わりませんので、既存の処理に影響ないことが確認できました。

このユーザーに MFA を強制するポリシーを割り当てた後、再度ファイルをアップロードします。

MFA 有効 + IAM ポリシーで MFA 強制

$ aws s3 cp ./blog.md  s3://<S3 バケット名>/blog.md
upload failed: ./blog.md to s3://<S3 バケット名>/blog.md An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

注意点の通り失敗したので、MFA デバイスを使った一時的な認証情報を STS から取得し、その認証情報を使って再度同じ処理を実施します。

MFA デバイスを使った一時的な認証情報の取得

# MFA デバイスのシリアルナンバーを取得
$ SerialNumber=`aws iam list-mfa-devices --user-name arakawa-blog-user | jq -r '.MFADevices[].SerialNumber'`

# ワンタイムパスワードを使って一時的な認証情報を取得
$ aws sts get-session-token --serial-number ${SerialNumber} --token-code <MFA トークン(ワンタイムパスワード)>
{
    "Credentials": {
        "AccessKeyId": "ASIA...",
        "SecretAccessKey": "***",
        "SessionToken": "***",
        "Expiration": "..."
    }
}

# 環境変数に一時的な認証情報をセット
export AWS_ACCESS_KEY_ID=ASIA...
export AWS_SECRET_ACCESS_KEY=***
export AWS_SESSION_TOKEN=***

# 一時的な認証情報を使用して再度アップロード
$ aws s3 cp ./blog.md  s3://<S3 バケット名>/blog.md
upload: blog.md to s3://<S3 バケット名>/blog.md

MFA デバイスを使って一時的な認証情報を取得したので、アップロードに成功しました。

運用上の観点

AWS 環境へアクセスするためにはすべてにおいて MFA が必須とすることで、セキュアに運用できそうに見えますが、さらに IAM ポリシーで強制してしまうと、既存プログラム等の改修コストがかかります。

また、複数箇所でアクセスキーを使用している場合、影響範囲を調べることも困難となります。

基本的には、IAM でのセキュリティのベストプラクティスに則って、アクセスキーを極力使用せずに、IAM ロールが利用可能な箇所はアクセスキーと置き換えるなどの対応で、実装コストもかからずセキュアに運用できます。

とはいえ、AWS 環境外でアクセスキーを使用したいケースはありますので、その際は利用者へベストプラクティスを周知しましょう。

参考資料