

# AWS: MFA で認証された IAM ユーザーが [セキュリティ認証情報] ページで自分の認証情報を管理できるようにします
<a name="reference_policies_examples_aws_my-sec-creds-self-manage"></a>

この例は、[多要素認証 (MFA)](id_credentials_mfa.md) を使用して認証された IAM ユーザーが、**[セキュリティ認証情報]** ページで自分の認証情報を管理できるようにする ID ベースポリシーを作成する方法を示しています。この AWS マネジメントコンソール ページには、アカウント ID や正規ユーザー ID などのアカウント情報が表示されます。ユーザーは、自分のパスワード、アクセスキー、MFA デバイス、X.509 証明書、SSH キー、および Git 認証情報を表示および編集することもできます。この例では、必要なアクセス許可がポリシーに含まれているページ上のすべての情報を表示および編集する手順について説明します。また、AWS で他のオペレーションを実行する前に、ユーザーに MFA を使用した設定と認証を要求します。ユーザーに MFA を使用せずに自らの認証情報を管理することを許可するには、「[AWS: IAM ユーザーが [セキュリティ認証情報] ページで自分の認証情報を管理できるようにします](reference_policies_examples_aws_my-sec-creds-self-manage-no-mfa.md)」を参照してください。

ユーザーが **[セキュリティ認証情報]** ページにアクセスする方法については、「[IAM ユーザー自身によるパスワードの変更方法 (コンソール)](id_credentials_passwords_user-change-own.md#ManagingUserPwdSelf-Console)」を参照してください。

**注記**  
このポリシー例では、初めて AWS マネジメントコンソール にサインインする際のパスワードのリセットをユーザーに許可していません。新しいユーザーがサインインするまで、当該ユーザーにアクセス権を許可しないことをお勧めします。詳細については、「[IAM ユーザーを安全に作成するにはどうすればよいですか?](troubleshoot.md#troubleshoot_general_securely-create-iam-users)」を参照してください。また、これにより失効したパスワードを持つユーザーは、サインイン中にパスワードをリセットできなくなります。この操作を許可するには、`iam:ChangePassword` と `iam:GetAccountPasswordPolicy` をステートメント `DenyAllExceptListedIfNoMFA` に追加します。ただし、ユーザーが多要素認証（MFA） なしで自分のパスワードを変更できるようになると、セキュリティ上のリスクが生じる可能性があるためこれを推奨しません。
このポリシーをプログラムによるアクセスに使用する場合は、[https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) を呼び出して MFA で認証します。詳細については、[MFA を使用した安全な API アクセス](id_credentials_mfa_configure-api-require.md) を参照してください。

**このポリシーで行うこと**
+ この `AllowViewAccountInfo` ステートメントでは、ユーザーにアカウントレベルの情報を表示します。これらのアクセス許可は、リソース ARN をサポートしていないか、または指定する必要がないため、独自のステートメントに含まれている必要があります。代わりに `"Resource" : "*"` を指定するアクセス許可を使用します。このステートメントには、ユーザーが特定の情報を表示できるようにする以下のアクションが含まれています。
  + `GetAccountPasswordPolicy` – IAM ユーザーパスワードを変更しながら、アカウントのパスワード要件を表示します。
  + `ListVirtualMFADevices` – ユーザーに対して有効になっている仮想 MFA デバイスに関する詳細を表示します。
+ `AllowManageOwnPasswords` ステートメントを使用すると、ユーザーは自分のパスワードを変更できます。このステートメントには `GetUser` アクションも含まれています。これは、**[My security credentials]** (セキュリティ認証情報) ページのほとんどの情報を表示するために必要です。
+ この `AllowManageOwnAccessKeys` ステートメントにより、ユーザーは自分のアクセスキーを作成、更新、削除できます。ユーザーは指定されたアクセスキーの最後の使用時の情報を取得することもできます。
+ この `AllowManageOwnSigningCertificates` ステートメントにより、ユーザーは自分のデジタル署名用証明書をアップロード、更新、削除できます。
+ この `AllowManageOwnSSHPublicKeys` ステートメントにより、ユーザーは自分の CodeCommit の SSH パブリックキーをアップロード、更新、削除できます。
+ `AllowManageOwnGitCredentials` ステートメントにより、ユーザーは自分の CodeCommit の Git 認証情報をアップロード、更新、削除できます。
+ この `AllowManageOwnVirtualMFADevice` ステートメントにより、ユーザーは自分の仮想 MFA デバイスを作成できます。このステートメントのリソース ARN によって、ユーザーが任意の名前の MFA デバイスを作成できますが、ポリシー内の他のステートメントでは、ユーザーはデバイスを現在サインインしているユーザーにしかアタッチできません。
+ この `AllowManageOwnUserMFA` ステートメントでは、ユーザーは自分のユーザーの仮想、U2F、またはハードウェア MFA デバイスを表示または管理できます。このステートメントのリソース ARN は、ユーザー自身の IAM ユーザーにのみアクセスを許可します。ユーザーは他のユーザーの MFA デバイスを表示または管理することはできません。
+ `DenyAllExceptListedIfNoMFA` ステートメントは、ユーザーが MFA でサインインしていない***場合のみ***、いくつかのリストされたアクションを除いて、すべての AWS のサービスのすべてのアクションへのアクセスを拒否します。このステートメントでは、`"Deny"` と `"NotAction"` の組み合わせを使用して、表示されていないすべてのアクションへのアクセスを明示的に拒否しています。リストされている項目は、このステートメントによって拒否または許可されていません。ただし、アクションはポリシー内の他のステートメントによって許可されています。このステートメントのロジックの詳細については、「[Deny での NotAction の使用](reference_policies_elements_notaction.md)」を参照してください。ユーザーが MFA でサインインしている場合、`Condition` テストは失敗し、このステートメントはアクションを拒否しません。この場合、ユーザーの他のポリシーまたは文によってユーザーのアクセス許可が決まります。

  このステートメントは、ユーザーが MFA にサインインしていないときに、リストされているアクションのみを実行できることを保証します。さらに、他のステートメントまたはポリシーがそれらのアクションへのアクセスを許可している場合にのみ、リストされているアクションを実行できます。`iam:ChangePassword` アクションは MFA 認可なしには許可されないため、サインイン時にユーザーがパスワードを作成することはできません。

  `...IfExists` バージョンの `Bool` 演算子により、`aws:MultiFactorAuthPresent` キーが見つからない場合、条件は必ず true を返します。つまり､アクセスキーなどの長期認証情報を使用して API にアクセスするユーザーは IAM 以外の API オペレーションへのアクセスを拒否されます。

このポリシーでは、IAM コンソールで **[Users]** (ユーザー) ページを表示したり、そのページを使用して自分のユーザー情報にアクセスすることはできません。これを許可するには、 `iam:ListUsers` アクションを `AllowViewAccountInfo` ステートメントと `DenyAllExceptListedIfNoMFA` ステートメントに追加します。また、ユーザーが自分のユーザーページで自分のパスワードを変更することはできません。これを許可するには、`iam:GetLoginProfile` および `iam:UpdateLoginProfile` アクションを `AllowManageOwnPasswords` ステートメントに追加します。ユーザーが MFA を使用してサインインしなくても自分のユーザーページから自分のパスワードを変更できるようにするには、`DenyAllExceptListedIfNoMFA` ステートメントに`iam:UpdateLoginProfile` アクションを追加します。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowManageOwnPasswords",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:GetUser"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnAccessKeys",
            "Effect": "Allow",
            "Action": [
                "iam:CreateAccessKey",
                "iam:DeleteAccessKey",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey",
                "iam:GetAccessKeyLastUsed"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSigningCertificates",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSigningCertificate",
                "iam:ListSigningCertificates",
                "iam:UpdateSigningCertificate",
                "iam:UploadSigningCertificate"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSSHPublicKeys",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSSHPublicKey",
                "iam:GetSSHPublicKey",
                "iam:ListSSHPublicKeys",
                "iam:UpdateSSHPublicKey",
                "iam:UploadSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnGitCredentials",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceSpecificCredential",
                "iam:DeleteServiceSpecificCredential",
                "iam:ListServiceSpecificCredentials",
                "iam:ResetServiceSpecificCredential",
                "iam:UpdateServiceSpecificCredential"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/*"
        },
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:GetMFADevice",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```

------