

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 最佳实践
<a name="auth-best-practices"></a>

本节概述了保护您的 Amazon Location Service 应用程序和优化身份验证使用的最佳实践。通过实施凭证隔离、监控和适当的限制，您可以最大限度地降低安全风险并控制成本。有关在 API 密钥、Amazon Cognito 和之间进行选择的指导 AWS Identity and Access Management，请参阅。[选择身份验证方法](auth-choose-method.md)

## 凭证管理
<a name="auth-bp-credential-management"></a>

当您需要轮换或撤消访问权限时，适当的凭据管理可以降低安全风险并简化操作。
+ **为每个应用程序使用单独的证书** — 为每个应用程序或环境（开发、暂存、生产）创建不同的 API 密钥或 IAM 角色。如果凭据遭到泄露，这将限制爆炸半径。
+ **应用最低权限原则**-仅授予每个用例所需的最低权限。限制对特定 API 和资源的访问权限，而不是使用通配符。
+ 定期@@ **轮换证书 — 定期**轮换 API 密钥并查看 IAM 策略。立即删除未使用的凭证。
+ **切勿在源代码中公开凭证** — 将 API 密钥、Amazon Cognito 身份池 ID 和其他敏感值存储在环境变量、机密管理器或安全配置存储中。不要将它们提交给版本控制。

## API 密钥优化
<a name="auth-bp-apikeys"></a>

API 密钥提供了一种简单的方法来授予对地图、地点和路线资源的未经身份验证的只读访问权限。遵循这些做法以最大限度地降低安全风险并优化使用情况。
+ **限制操作和资源**-创建 API 密钥时，仅指定应用程序所需的操作和资源。例如，仅限地图的应用程序应仅允许对地图提供者资源进行`geo-maps:*`操作。
+ **应用客户限制**-为 Web 应用程序配置域名反向链接限制，或为 Android 和 iOS 应用程序配置应用标识符限制。这样可以防止您的密钥被用于未经授权的来源。有关更多信息，请参阅 [按请求源限制 API 密钥的使用](#restrict-usage-by-origin)。
+ **设置到期时间**-使用密钥到期时间强制定期轮换。在旧密钥到期之前创建新密钥，更新您的应用程序，然后停用旧密钥。
+ **监控每个密钥的使用情况**-使用带有`ApiKeyName`维度的 CloudWatch指标来单独跟踪每个密钥的使用情况。在出现意外峰值时设置警报。`CallCount`
+ **删除未使用的密钥**-定期审核您的 API 密钥并删除任何不再使用的密钥。已停用的非活动密钥可以在 90 天后删除。

## 按请求源限制 API 密钥的使用
<a name="restrict-usage-by-origin"></a>

您可以为 API 密钥配置客户端限制，从而仅限访问特定的域或移动应用程序。按域进行限制时，只有当 HTTP Referer 标头与您提供的值相匹配时，服务才会授权请求。当受 Android 或 Apple 应用程序限制时，只有当应用程序标识符 HTTP 标头字段与您提供的值相匹配时，该服务才会授权请求。

有关 API 密钥限制的更多信息，请参阅 *Amazon Location Service API 参考[ApiKeyRestrictions](https://docs.aws.amazon.com/location/latest/APIReference/API_geoapikeys_ApiKeyRestrictions.html)*中的。

 **Android 应用程序标识符：**
+ `X-Android-Package`:

  Android 应用程序的唯一标识符，在应用程序的 `build.gradle` 文件中定义，通常采用反向域格式。

  示例：

   `com.mydomain.appname` 
+ `X-Android-Cert`:

  用于签署安卓APK的签名证书的 SHA-1 哈希值。

  示例：

   `BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75` 

 **Apple 应用程序标识符：**
+ `X-Apple-Bundle-Id`:

  Apple（iOS、macOS 等）应用程序的唯一标识符，在应用程序的 `Info.plist` 中定义，通常采用反向域格式。

  示例：

   `com.mydomain.appname` 

## 亚马逊 Cognito 优化
<a name="auth-bp-cognito"></a>

Amazon Cognito 提供了比 API 密钥更精细的访问控制，并且支持经过身份验证和未经身份验证的用户。
+ **缩小未经身份验证的角色范围** — 使用身份池进行匿名访问时，请附加 IAM 策略，这些策略仅允许应用程序所需的特定 Amazon Location 操作和资源。
+ **使用条件密钥进行 IP 筛选** — 在 IAM 策略中添加`aws:SourceIp`条件以在适当时限制对已知 IP 范围的访问。
+ **将身份池保存在同一区域 — 在**与您的 Amazon Location Service 资源相同的 AWS 区域内创建 Amazon Cognito 身份池，以避免跨区域延迟并确保正确访问。
+ **尽可能使用经过身份验证**的身份 — 如果您的应用程序有登录流程，请使用 Amazon Cognito 用户池或联合身份向经过身份验证的角色授予特定权限，而不是依赖未经身份验证的访问。

## IAM 优化
<a name="auth-bp-iam"></a>

对于服务器端应用程序和内部工具，使用 AWS Identity and Access Management 可完全控制访问权限。
+ **使用 IAM 角色代替长期证书** — 对于在 AWS 计算服务（例如 Amazon EC2、Lambda 或 Amazon ECS）上运行的应用程序，请使用 IAM 角色自动提供临时证书。
+ **应用资源级权限**-在策略中指定资源 ARN，而不是使用通配符。例如，限制对特定跟踪器或地理围栏收集资源的访问权限。
+ **使用政策条件**-添加条件，例如限制`aws:RequestedRegion`对特定区域的访问或基于属`aws:PrincipalTag`性的访问控制。
+ **启用 CloudTrail** — 用于 AWS CloudTrail 记录所有 Amazon Location Service API 调用，以进行审计和合规。定期查看日志，了解意外的访问模式。