この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
困っていた内容
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 環境外でアクセスキーを使用したいケースはありますので、その際は利用者へベストプラクティスを周知しましょう。