

# 保护访问密钥
<a name="securing_access-keys"></a>

拥有您的访问密钥的任何人将与您拥有相同的 AWS 资源访问权限级别。因此，AWS 全力保护您的访问密钥并确保符合我们的[分担责任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)，您也应当如此。

展开以下各节以获取有助于您保护访问密钥的指导。

**注意**  
贵组织的安全要求和策略可能与本主题中介绍的有所不同。此处提供的建议旨在用作一般准则。

## 移除（或不生成）AWS 账户根用户访问密钥
<a name="root-password"></a>

**保护账户的最佳方法之一是不为 AWS 账户根用户设置访问密钥。**除非必须具有根用户访问密钥（这种情况很少见），否则建议不要生成根用户访问密钥。而应在 AWS IAM Identity Center 中创建一个管理用户来执行日常管理任务。有关如何在 IAM Identity Center 中创建管理用户的信息，请参阅《IAM Identity Center 用户指南》中的 [Getting started](https://docs.aws.amazon.com//singlesignon/latest/userguide/getting-started.html)**。

如果您已经拥有账户的根用户访问密钥，建议您执行以下操作：找到您当前在应用程序中使用访问密钥的位置（如果有），然后使用 IAM 用户访问密钥替换根用户访问密钥。之后再禁用并移除根用户访问密钥。有关如何更新访问密钥的更多信息，请参阅 [更新访问密钥](id-credentials-access-keys-update.md)



## 使用临时安全凭证（IAM 角色）代替长期访问密钥
<a name="use-roles"></a>

在许多情况下，您并不需要永不过期的长期访问密钥（如 IAM 用户访问密钥）。相反，您可以创建 IAM 角色并生成临时安全凭证。临时安全证书包括访问密钥 ID 和秘密访问密钥，以及一个指示证书何时到期的安全令牌。

长期访问密钥在被手动撤销之前将持续有效，例如与 IAM 用户和根用户相关的访问密钥。但是，通过 IAM 角色获取的临时安全凭证和 AWS Security Token Service 的其他功能将在短时间内过期。凭证意外泄漏时，使用临时安全凭证可帮助降低您的风险。

在以下这些情况下使用 IAM 角色和临时安全凭证：
+ **您在 Amazon EC2 实例上运行一个应用程序或 AWS CLI 脚本。**请勿直接在应用程序中使用访问密钥。请勿采取以下做法：将访问密钥传递给应用程序、将访问密钥嵌入到应用程序中、让应用程序从任何源读取密钥。相反，请定义一个对您的应用程序具有适当权限的 IAM 角色，并使用 [EC2 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例。执行此操作会将 IAM 角色与 Amazon EC2 实例相关联。利用这种做法，还可让应用程序获取临时安全凭证，然后再使用临时凭证以编程方式调用 AWS。AWS 软件开发工具包和 AWS Command Line Interface (AWS CLI) 可以自动获得角色的临时证书。
+ **您需要授予跨账户访问权限。**使用 IAM 角色建立账户之间的信任，然后向用户授予有限的账户权限来访问可信账户。有关更多信息，请参阅 [IAM 教程：使用 IAM 角色委托跨 AWS 账户的访问权限](tutorial_cross-account-with-roles.md)。
+ **您拥有一个移动应用程序。**请勿将访问密钥嵌入应用程序，即使是嵌入加密存储也不允许。而应使用 [Amazon Cognito](https://aws.amazon.com/cognito/) 管理应用程序中的用户身份。此服务让您可以使用 Login with Amazon、Facebook、Google 或任何与 OpenID Connect（OIDC）兼容的身份提供商进行用户身份验证。然后，您可以使用 Amazon Cognito 凭证提供程序来管理应用程序用于向 AWS 发出请求的凭证。
+ **您希望向 AWS 进行联合身份验证且贵组织支持 SAML 2.0。**如果您所在的组织具有支持 SAML 2.0 的身份提供程序，请将提供程序配置为使用 SAML。您可以使用 SAML 与 AWS 交换身份验证信息，并获得一组临时安全证书。有关更多信息，请参阅 [SAML 2.0 联合身份验证](id_roles_providers_saml.md)。
+ **您希望向 AWS 进行联合身份验证且贵组织拥有本地身份存储。**如果用户可以在组织内部进行身份验证，您可以编写一个可向他们颁发用于访问 AWS 资源的临时安全凭证的应用程序。有关更多信息，请参阅 [使自定义身份凭证代理程序能够访问 AWS 控制台](id_roles_providers_enable-console-custom-url.md)。
+ **使用 IAM 策略中的条件仅允许来自预期网络的访问。**您可以通过实施[具有条件的 IAM 策略](reference_policies_elements_condition_operators.md)来限制访问密钥的使用位置和方式，这些条件指定并仅允许预期的网络，例如您的公有 IP 地址或虚拟私有云（VPC）。这样，您就知道访问密钥只能在预期和可接受的网络中使用。

**注意**  
您是否在将 Amazon EC2 实例与需要以编程方式访问 AWS 资源的应用程序结合使用？ 如果是，请使用 [EC2 的 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)。

## 正确管理 IAM 用户访问密钥
<a name="iam-user-access-keys"></a>

如果您必须创建访问密钥才能以编程方式访问 AWS，则应创建 IAM 用户的访问密钥，并仅向用户授予需要的权限。

请遵循以下预防措施来帮助保护 IAM 用户访问密钥：
+ **请勿直接将访问密钥嵌入到代码。**利用 [AWS SDK ](https://aws.amazon.com/tools/#sdk)和 [AWS 命令行工具](https://aws.amazon.com/tools/#cli)，您可以将访问密钥放在已知位置，从而不必将其保留在代码中。

  在以下任一位置中放置访问密钥：
  + **AWS 凭证文件。**AWS 开发工具包和 AWS CLI 自动使用您存储在 AWS 凭证文件中的凭证。

    有关使用 AWS 证书文件的信息，请参阅软件开发工具包文档。示例包括：*适用于 Java 的 AWS SDK 开发人员指南*中的[设置 AWS 凭证和区域](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-credentials.html)以及 *AWS Command Line Interface 用户指南*中的[配置和凭证文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。

    要存储适用于 适用于 .NET 的 AWS SDK 和 AWS Tools for Windows PowerShell 的凭证，建议您使用 SDK Store。有关更多信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的[使用 SDK 存储](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/sdk-store.html)。
  + **环境变量。**在多租户系统上，选择用户环境变量，而不是系统环境变量。

    有关使用环境变量存储凭证的更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[环境变量](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)。
+ **对不同应用程序使用不同的访问密钥。**这样可以在访问密钥泄露时隔离权限并撤销单个应用程序的访问密钥。为不同的应用程序设置不同的访问密钥也会在 [AWS CloudTrail](https://aws.amazon.com/cloudtrail/) 日志文件中生成不同的条目。通过此配置，您可以更轻松地确定哪个应用程序执行了特定的操作。
+ **在需要时更新访问密钥。**如果存在访问密钥泄露的风险，请更新访问密钥并删除之前的访问密钥。有关详细信息，请参阅 [更新访问密钥](id-credentials-access-keys-update.md) 
+ **删除未使用的访问密钥。**如果某个用户离开了贵组织，请删除相应的 IAM 用户，以使该用户无法再访问您的资源。要找出上次使用访问密钥的时间，请使用 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html) API（AWS CLI 命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html)）。
+ **使用临时凭证并为最敏感的 API 操作配置多重身份验证。**利用 IAM policy，可以指定用户可调用哪些 API 操作。在某些情况下，建议要求用户使用 AWS MFA 进行身份验证，然后才允许其执行特别敏感的操作，从而提高安全性。例如，您可能拥有允许用户执行 Amazon EC2 `RunInstances`、`DescribeInstances` 和 `StopInstances` 操作的策略。但您可能希望限制破坏性操作（如 `TerminateInstances`），并确保用户只能在使用 AWS MFA 设备进行身份验证后执行该操作。有关更多信息，请参阅 [使用 MFA 保护 API 访问](id_credentials_mfa_configure-api-require.md)。

## 使用 AWS 访问密钥访问移动应用程序
<a name="access-keys-mobile-app"></a>

您可以使用 AWS 移动应用程序访问一组有限的 AWS 服务和功能。该移动应用程序可帮助您在外出时支持事件响应。如需了解更多信息和下载应用程序，请参阅 [AWS Console Mobile Application](https://aws.amazon.com/console/mobile/)。

您可以使用控制台密码或访问密钥登录移动应用程序。作为最佳实践，不建议使用根用户访问密钥。相反，除在移动设备上使用密码或生物识别锁外，我们强烈建议您还应使用移动应用程序创建一个专门的 IAM 用户来管理 AWS 资源。如果您的移动设备丢失了，您可以删除 IAM 用户的访问权限。

**使用访问密钥登录（移动应用程序）**

1. 在移动设备上打开该应用程序。

1. 如果这是您第一次向设备添加身份，请选择 **Add an identity (添加身份)**，然后选择 **Access keys (访问密钥)**。

   如果您已使用其他身份登录，请选择菜单图标并选择 **Switch identity (切换身份)**。然后选择 **Sign in as a different identity (以其他身份登录)**，然后选择 **Access keys (访问密钥)**。

1. 在 **Access keys (访问密钥)** 页面上输入您的信息。
   + **Access key ID (访问密钥 ID)** – 输入您的访问密钥 ID。
   + **Secret access key (秘密访问密钥)** – 输入您的秘密访问密钥。
   + **Identity name (身份名称)** – 输入将在移动应用程序中显示的身份名称。此名称不需要与您的 IAM 用户名一致。
   + **Identity PIN (身份 PIN)** – 创建将来在登录时使用的个人身份识别码（PIN）。
**注意**  
如果您为 AWS 移动应用程序启用了生物识别技术，系统将提示您使用指纹或面部识别（而非 PIN）进行验证。如果生物识别失败，系统可能会提示您输入 PIN。

1. 选择 **Verify and add keys (验证并添加密钥)**。

   现在，您就可以使用移动应用程序访问一组选定的资源。

## 相关信息
<a name="more-resources"></a>

以下主题提供了有关设置 AWS SDK 和 AWS CLI 以使用访问密钥的指导：
+ *适用于 Java 的 AWS SDK 开发人员指南*中的[设置 AWS 凭证和区域](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-credentials.html)
+ *适用于 .NET 的 AWS SDK 开发人员指南*中的[使用 SDK Store](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/sdk-store.html)
+ *适用于 PHP 的 AWS SDK 开发人员指南*中的[为 SDK 提供凭证](https://docs.aws.amazon.com/aws-sdk-php/v2/guide/credentials.html)
+ Boto 3（AWS SDK for Python）文档中的[配置](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration)
+ *AWS Tools for Windows PowerShell 用户指南*中的[使用 AWS 凭证](https://docs.aws.amazon.com/powershell/latest/userguide/specifying-your-aws-credentials.html) 
+ *AWS Command Line Interface 用户指南*中的[配置和凭证文件](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 
+ *适用于 .NET 的 AWS SDK 开发人员指南*中的[使用 IAM 角色授予访问权限](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-hosm.html)
+ [在 *AWS SDK for Java 2.x* 中为 Amazon EC2 配置 IAM 角色](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html)

## 使用访问密钥和私有密钥凭证访问控制台
<a name="console-access-security-keys"></a>

可以使用访问密钥和私有密钥凭证进行直接访问 AWS 管理控制台，而不仅限于 AWS CLI。可以通过 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 调用来实现这一目的。只需使用 `GetFederationToken` 提供的临时凭证和令牌构建一个控制台 URL，即可让 IAM 主体访问控制台。有关更多信息，请参阅 [使自定义身份凭证代理程序能够访问 AWS 控制台](id_roles_providers_enable-console-custom-url.md)。

应注意，在启用 MFA 的情况下使用 IAM 或根用户凭证直接登录控制台时，将必须使用 MFA。而使用上述方法（将临时凭证与 `GetFederationToken` 结合使用）时，则不需要 MFA。



## 审计访问密钥
<a name="Using_access-keys-audit"></a>

您可以在代码中查看 AWS 访问密钥，以确定密钥是否来自于您拥有的账户。您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/sts/get-access-key-info.html](https://docs.aws.amazon.com/cli/latest/reference/sts/get-access-key-info.html) AWS CLI 命令或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetAccessKeyInfo.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetAccessKeyInfo.html) AWS API 操作传递访问密钥 ID。

AWS CLI 和 AWS API 操作返回访问密钥所属的 AWS 账户 的 ID。以 `AKIA` 开头的访问密钥 ID 是 IAM 用户或 AWS 账户根用户 的长期凭证。以 `ASIA` 开头的访问密钥 ID 是使用 AWS STS 操作创建的临时凭证。如果响应中的账户属于您，则您可以根用户的身份登录并查看您的根用户访问密钥。然后，您可以提取[凭证报告](id_credentials_getting-report.md)以了解哪个 IAM 用户拥有这些密钥。要了解谁请求了 `ASIA` 访问密钥的临时凭证，请查看 CloudTrail 日志中的 AWS STS 事件。

为了安全起见，您可以[查看 AWS CloudTrail 日志](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)以了解已在 AWS 中执行操作的人员。您可以在角色信任策略中使用 `sts:SourceIdentity` 条件键，以要求用户在代入角色时指定身份。例如，您可以要求 IAM 用户指定自己的用户名作为其源身份。这可以帮助您确定哪个用户在 AWS 中执行了具体的操作。有关更多信息，请参阅 [`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)。

该操作不指示访问密钥的状态。密钥可能处于活动状态、非活动状态或已删除状态 非活动密钥可能没有执行操作的权限。提供删除的访问密钥可能会返回“密钥不存在”错误。