

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS：允許經過 MFA 驗證的 IAM 使用者在「安全憑證」頁面中管理其憑證。
<a name="reference_policies_examples_aws_my-sec-creds-self-manage"></a>

此範例會示範如何建立身分型政策，允許使用[多重要素驗證 (MFA)](id_credentials_mfa.md) 進行身分驗證的 IAM 使用者在**安全憑證**頁面中管理自己的憑證。此 AWS 管理主控台 頁面會顯示如帳戶 ID 和正式使用者 ID 的帳戶資訊。使用者也可以檢視和編輯其密碼、存取金鑰、MFA 裝置、X.509 憑證及 SSH 金鑰和 Git 憑證。此政策範例包括檢視和編輯頁面上所有資訊所需的許可。它還要求使用者在 中執行任何其他操作之前，使用 MFA 設定和驗證 AWS。若要允許使用者在不使用 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` 陳述式可讓使用者變更自己的密碼。此陳述式也包括檢視 **My Security Credentials** (我的安全憑證) 頁面上大部分資訊所需的 `GetUser` 動作。
+ `AllowManageOwnAccessKeys` 陳述式可讓使用者建立、更新及刪除自己的存取金鑰。使用者也能擷取關於指定之存取金鑰最後一次使用時間的資訊。
+ `AllowManageOwnSigningCertificates` 陳述式可讓使用者上傳、更新及刪除自己的簽章憑證。
+ `AllowManageOwnSSHPublicKeys` 陳述式允許使用者上傳、更新及刪除自己用於 CodeCommit 的 SSH 公有金鑰。
+ `AllowManageOwnGitCredentials` 陳述式可讓使用者建立、更新及刪除自己用於 CodeCommit 的 Git 憑證。
+ `AllowManageOwnVirtualMFADevice` 陳述式可讓使用者建立自己的虛擬 MFA 裝置。此陳述式中的資源 ARN 允許使用者以任何名稱建立 MFA 裝置，但政策中的其他陳述式僅允許使用者連接裝置到目前登入的使用者。
+ `AllowManageOwnUserMFA` 陳述式可讓使用者檢視或管理其使用者的虛擬、U2F 或硬體 MFA 裝置。此陳述式中的資源 ARN 僅允許存取使用者自己的 IAM 使用者。使用者不能檢視或管理其他使用者的 MFA 裝置。
+ `DenyAllExceptListedIfNoMFA` 陳述式拒絕存取所有 AWS 服務中的每個動作，但少數列出的動作除外，但***前提是***使用者未使用 MFA 登入。陳述式使用 `"Deny"` 和 `"NotAction"` 的組合，來明確拒絕存取未列出的每項動作。此陳述式不會拒絕或允許列出的項目。然而，政策中的其他陳述式會允許多項動作。如需有關此陳述式邏輯的詳細資訊，請參閱[使用拒絕 (Deny) 的 NotAction](reference_policies_elements_notaction.md)。如果使用者使用 MFA 登入，則不會通過 `Condition` 測試，且此陳述式不會拒絕任何動作。在此情況下，使用者的其他政策或陳述式決定使用者的許可。

  此陳述式確保在使用者未使用 MFA 登入時，他們只能執行列出的動作。此外，只有在另一條陳述式或政策允許存取這些動作時，他們才能執行列出的動作。這不允許使用者在登入時建立密碼，因為在未進行 MFA 身分驗證的情況下，並不允許 `iam:ChangePassword` 動作。

  `...IfExists` 運算子的 `Bool` 版本會確認，如果 `aws:MultiFactorAuthPresent` 索引鍵遺失，條件將返回 true。這就表示，拒絕使用長期憑證 (如存取金鑰) 存取 API 的使用者存取為非 IAM API 操作。

此政策不允許使用者檢視 IAM 主控台中的 **Users** (使用者) 頁面，或使用該頁面存取自己的使用者資訊。若要允許此操作，請將 `iam:ListUsers` 動作加入到 `AllowViewAccountInfo` 陳述式和 `DenyAllExceptListedIfNoMFA` 陳述式。它也不允許使用者在自己的使用者頁面上變更密碼。若要允許此操作，請將 `iam:GetLoginProfile` 及 `iam:UpdateLoginProfile` 動作加入 `AllowManageOwnPasswords` 陳述式。若也要允許使用者在未使用 MFA 登入的情況下，在自己的使用者頁面上變更其密碼，請將 `iam:UpdateLoginProfile` 動作加入 `DenyAllExceptListedIfNoMFA` 陳述式。

------
#### [ 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"
                }
            }
        }
    ]
}
```

------