web-dev-qa-db-ja.com

AWSコンソールログインにはMFAを適用しますが、API呼び出しには適用しません

すべてのIAMユーザー(ローカルおよびリモート)にMFAデバイスを有効にしてアクティブ化するように強制したいと考えています。それらすべてに、MFAがそれぞれのタスクを実行できるようにしてほしい。

私は次のポリシーで試しています

{
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*",
      "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
}

しかしながら;このポリシーは、コンソールまたはAPIを介してサービスにアクセスする方法に関係なく適用されます

すべてのユーザーによって多くの自動化が行われ、MFA認証が暗示されていないため、自動化が機能しなくなります。

最初のステップとして、少なくともコンソールログインでMFAを有効にすることをお勧めします。ただし、自動化で使用されるAPI呼び出しにMFAを使用するように強制するべきではありません。

これはIAMポリシーを通じて達成できますか?

ありがとう

24
user2131779

秘訣は、チェックを逆にすることです... aws:MultiFactorAuthPresentがtrueの場合にのみ許可するのではなく、falseの場合は拒否します。

セルフサービスMFA管理に関するドキュメントは次のとおりです。 http://docs.aws.Amazon.com/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html

そこに提案されている完全なポリシーは次のとおりです。

{
    "Version": "2012-10-17",
    "Statement":[
        {
            "Sid": "AllowAllUsersToListAccounts",
            "Effect": "Allow",
            "Action":[
                "iam:ListAccountAliases",
                "iam:ListUsers",
                "iam:GetAccountSummary"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowIndividualUserToSeeAndManageTheirOwnAccountInformation",
            "Effect": "Allow",
            "Action":[
                "iam:ChangePassword",
                "iam:CreateAccessKey",
                "iam:CreateLoginProfile",
                "iam:DeleteAccessKey",
                "iam:DeleteLoginProfile",
                "iam:GetAccountPasswordPolicy",
                "iam:GetLoginProfile",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey",
                "iam:UpdateLoginProfile",
                "iam:ListSigningCertificates",
                "iam:DeleteSigningCertificate",
                "iam:UpdateSigningCertificate",
                "iam:UploadSigningCertificate",
                "iam:ListSSHPublicKeys",
                "iam:GetSSHPublicKey",
                "iam:DeleteSSHPublicKey",
                "iam:UpdateSSHPublicKey",
                "iam:UploadSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::accountid:user/${aws:username}"
        },
        {
            "Sid": "AllowIndividualUserToListTheirOwnMFA",
            "Effect": "Allow",
            "Action":[
                "iam:ListVirtualMFADevices",
                "iam:ListMFADevices"
            ],
            "Resource":[
                "arn:aws:iam::accountid:mfa/*",
                "arn:aws:iam::accountid:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action":[
                "iam:CreateVirtualMFADevice",
                "iam:DeactivateMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:RequestSmsMfaRegistration",
                "iam:FinalizeSmsMfaRegistration",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice"
            ],
            "Resource":[
                "arn:aws:iam::accountid:mfa/${aws:username}",
                "arn:aws:iam::accountid:user/${aws:username}"
            ]
        },
        {
            "Sid": "BlockAnyAccessOtherThanAboveUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": "iam:*",
            "Resource": "*",
            "Condition":{
                "BoolIfExists":{ "aws:MultiFactorAuthPresent": "false"}
            }
        }
    ]
}

最も重要な部分は、拒否を行う最後のステートメントです。これに変更した場合:

{
    "Sid": "BlockAnyAccessOtherThanAboveUnlessSignedInWithMFA",
    "Effect": "Deny",
    "NotAction": "iam:*",
    "Resource": "*",
    "Condition":{
        "Bool":{ "aws:MultiFactorAuthPresent": "false"}
    }
}

(BoolIfExistsがBoolに変更されました)これにより、IAMアクセスキーがMFAの要件をバイパスできるようになりますが、AWSコンソールからログインするときにMFAを使用する必要があります。

ドキュメントからその完全なポリシーを使用することにした場合は注意してください。ユーザーがアクセスキーを作成してパスワードを変更できるようにし、deny句は非IAMアクションのみをブロックすることに注意してください...これは、MFAがアカウントで無効になった場合、ユーザーのパスワードが変更されたり、新しいアクセスキーが使用されたりする可能性があることを意味しますMFAチェックなしでプロビジョニングできます。また、Boolを変更した場合、これらの新しいアクセスキーは、MFAなしで、ユーザーがアクセス許可を持っているものすべてにアクセスできます。つまり、セキュリティで保護されていないキーのすべてのセキュリティの脆弱性と、アカウントの乗っ取りの可能性があります。

代わりに、次のようなポリシーを使用することをお勧めします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAllUsersToListAccounts",
            "Effect": "Allow",
            "Action": [
                "iam:ListAccountAliases",
                "iam:ListUsers"
            ],
            "Resource": [
                "arn:aws:iam::accountid:user/*"
            ]
        },
        {
            "Sid": "AllowIndividualUserToSeeTheirAccountInformation",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:GetAccountSummary",
                "iam:GetLoginProfile"
            ],
            "Resource": [
                "arn:aws:iam::accountid:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToListTheirMFA",
            "Effect": "Allow",
            "Action": [
                "iam:ListVirtualMFADevices",
                "iam:ListMFADevices"
            ],
            "Resource": [
                "arn:aws:iam::accountid:mfa/*",
                "arn:aws:iam::accountid:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToManageThierMFA",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeactivateMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::accountid:mfa/${aws:username}",
                "arn:aws:iam::accountid:user/${aws:username}"
            ]
        },
        {
            "Sid": "DoNotAllowAnythingOtherThanAboveUnlessMFAd",
            "Effect": "Deny",
            "NotAction": "iam:*",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
24
Josh Hancock

後世のための投稿。 Josh Hancockによって投稿されたメソッドを使用しようとしましたが、強制コンソールMFAアカウントからのapi呼び出しが、エラスティックファイルシステムや一部のs3api呼び出しなどの一部のAWSサービスで失敗します。サポートチケットを発行したとき、AWSからの応答は、「現在、コンソールのみにMFAを適用する信頼できるメカニズムがないため、この正確な問題に対する機能リクエストがあります。アカウントのリクエストリストにあなたのアカウントを追加しました。この機能のリクエスト。残念ながら、どこでもMFAを有効にするか、コンソールのみのユーザーにのみIAM MFAポリシーを適用する以外に、信頼できる回避策はありません。」

6
rchaos

別の解決策があります。私には「ForceMFA」グループがあります。これは、MFAを有効にしていない限り、(MFAの割り当て以外の)何もできません。すべてのユーザーをスキャンし、MFAのないユーザーを「ForceMFA」グループに追加する、1時間ごとに実行される小さなスクリプトがあります。同じスクリプトにより、MFAが有効になっているユーザーもグループから削除されます。このように、私は人々にMFAを有効にするように強制しますが、API呼び出しにMFAを必要としません。

これが私が使用する小さなPowershell6スクリプトです: https://Gist.github.com/kalpik/36beffd25bda2a0c38905176f7e557aa

3
Kalpik Nigam

おそらくこれに対する解決策はすでに見つかっていると思いますが、誰かがこれにも苦労している場合は、IAMユーザーのログイン時にMFAを設定するためのAWSセキュリティチームからの公式ガイドがあります:

https://blogs.aws.Amazon.com/security/post/Tx2SJJYE082KBUK/How-to-Delegate-Management-of-Multi-Factor-Authentication-to-AWS-IAM-Users

基本的に、これは、いくつかのユーザーグループを作成し、ログイン時にMFAが設定されているかどうかを確認することで実現できます。

2
jarodsmk

ユースケースでは、IAMユーザーのMFAデバイスをアクティブ化するだけで十分です。これには、ユーザーがAWSマネジメントコンソールにサインインするたびにMFAコードを提供する必要がありますが、AWSAPI呼び出しの場合は提供しません。

「MultiFactorAuthPresent」条件を使用してIAMポリシーを作成する必要があるのは、API呼び出しにMFAも適用する場合のみです。

ところで、AWSフォーラム( https://forums.aws.Amazon.com/index.jspa )にAWS関連の質問を投稿することは、回答を得るための優れた方法です。

1
user4504410