

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

# 最佳實務
<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 角色。如果登入資料洩露，這會限制爆量半徑。
+ **套用最低權限原則** – 僅授予每個使用案例所需的最低許可。限制對特定 APIs和資源的存取，而不是使用萬用字元。
+ **定期輪換登入**資料 – 定期輪換 API 金鑰並檢閱 IAM 政策。立即移除未使用的登入資料。
+ **切勿在原始碼中公開登入**資料 – 在環境變數、秘密管理員或安全組態存放區中存放 API 金鑰、Amazon Cognito 身分集區 IDs 和其他敏感值。請勿將它們遞交至版本控制。

## API 金鑰最佳化
<a name="auth-bp-apikeys"></a>

API 金鑰提供簡單的方式來授予未經驗證、唯讀的 Maps、Places 和 Routes 資源存取權。請遵循這些實務，將安全風險降至最低並最佳化用量。
+ **限制動作和資源** – 建立 API 金鑰時，請僅指定應用程式所需的動作和資源。例如，僅限映射應用程式應僅允許對映射提供者資源執行`geo-maps:*`動作。
+ **套用用戶端限制** – 設定 Web 應用程式的網域參考者限制，或 Android 和 iOS 應用程式的應用程式識別符限制。這可防止您的金鑰用於未經授權的原始伺服器。如需詳細資訊，請參閱[依請求原始伺服器限制 API 金鑰用量](#restrict-usage-by-origin)。
+ **設定過期時間** – 使用金鑰過期來強制執行定期輪換。在舊金鑰過期之前建立新的金鑰，更新您的應用程式，然後停用舊金鑰。
+ **監控每個金鑰的用量** – 使用 CloudWatch 指標搭配 `ApiKeyName`維度，個別追蹤每個金鑰的用量。在 中設定意外尖峰警示`CallCount`。
+ **刪除未使用的金鑰** – 定期稽核您的 API 金鑰，並刪除任何不再使用的金鑰。已停用的非作用中金鑰可以在 90 天後刪除。

## 依請求原始伺服器限制 API 金鑰用量
<a name="restrict-usage-by-origin"></a>

您可以使用用戶端限制來設定 API 金鑰，以限制對特定網域或行動應用程式的存取。依網域限制時，只有在 HTTP 參考者標頭符合您提供的值時，服務才會授權請求。受 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`:

  用來簽署 Android 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` 

## Amazon Cognito 最佳化
<a name="auth-bp-cognito"></a>

Amazon Cognito 提供比 API 金鑰更精細的存取控制，並支援已驗證和未驗證的使用者。
+ **縮小未驗證角色的範圍** – 使用身分集區進行匿名存取時，請連接 IAM 政策，僅允許應用程式所需的特定 Amazon Location 動作和資源。
+ **使用條件索引鍵進行 IP 篩選** – 將`aws:SourceIp`條件新增至 IAM 政策，以在適當時限制對已知 IP 範圍的存取。
+ **將身分集區保留在相同的區域中** – 在與 Amazon Location Service 資源相同的區域中建立 Amazon Cognito 身分集區，以避免跨區域延遲並確保適當的存取。 AWS 
+ **盡可能使用已驗證的身分** – 如果您的應用程式具有登入流程，請使用 Amazon Cognito 使用者集區或聯合身分來授予具有特定許可的已驗證角色，而不是依賴未經驗證的存取。

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

對於伺服器端應用程式和內部工具，請使用 AWS Identity and Access Management 完全控制存取。
+ **使用 IAM 角色而非長期登入**資料 – 對於在 AWS 運算服務上執行的應用程式 （例如 Amazon EC2、Lambda 或 Amazon ECS)，請使用 IAM 角色自動提供臨時登入資料。
+ **套用資源層級許可** – 在政策中指定資源 ARNs，而不是使用萬用字元。例如，限制對特定追蹤器或地理圍欄集合資源的存取。
+ **使用政策條件** – 新增條件`aws:RequestedRegion`，例如限制對特定區域的存取，或對屬性型存取控制`aws:PrincipalTag`的存取。
+ **啟用 CloudTrail** – 使用 AWS CloudTrail 記錄所有 Amazon Location Service API 呼叫以進行稽核和合規。定期檢閱日誌是否有非預期的存取模式。