

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

# MemoryDB 中的資料保護
<a name="data-protection"></a>

 AWS [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)適用於 中的資料保護。如此模型所述， AWS 負責保護執行所有 的全域基礎設施 AWS 雲端。您負責維護在此基礎設施上託管內容的控制權。您也同時負責所使用 AWS 服務 的安全組態和管理任務。如需資料隱私權的詳細資訊，請參閱[資料隱私權常見問答集](https://aws.amazon.com/compliance/data-privacy-faq/)。如需有關歐洲資料保護的相關資訊，請參閱*AWS 安全性部落格*上的[AWS 共同責任模型和 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 部落格文章。

基於資料保護目的，我們建議您保護 AWS 帳戶 登入資料，並使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 設定個別使用者。如此一來，每個使用者都只會獲得授與完成其任務所必須的許可。我們也建議您採用下列方式保護資料：
+ 每個帳戶均要使用多重要素驗證 (MFA)。
+ 使用 SSL/TLS 與 AWS 資源通訊。我們需要 TLS 1.2 並建議使用 TLS 1.3。
+ 使用 設定 API 和使用者活動記錄 AWS CloudTrail。如需有關使用 CloudTrail 追蹤擷取 AWS 活動的資訊，請參閱*AWS CloudTrail 《 使用者指南*》中的[使用 CloudTrail 追蹤](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解決方案，以及其中的所有預設安全控制 AWS 服務。
+ 使用進階的受管安全服務 (例如 Amazon Macie)，協助探索和保護儲存在 Amazon S3 的敏感資料。
+ 如果您在 AWS 透過命令列界面或 API 存取 時需要 FIPS 140-3 驗證的密碼編譯模組，請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

我們強烈建議您絕對不要將客戶的電子郵件地址等機密或敏感資訊，放在標籤或自由格式的文字欄位中，例如**名稱**欄位。這包括當您使用 或使用主控台、API AWS CLI或其他 AWS 服務 AWS SDKs 時。您在標籤或自由格式文字欄位中輸入的任何資料都可能用於計費或診斷日誌。如果您提供外部伺服器的 URL，我們強烈建議請勿在驗證您對該伺服器請求的 URL 中包含憑證資訊。



# MemoryDB 中的資料安全性
<a name="encryption"></a>

為了協助保護您的資料安全，MemoryDB 和 Amazon EC2 提供機制以防止未經授權存取伺服器上的資料。

MemoryDB 也為叢集上的資料提供加密功能：
+ 傳輸中加密會在您的資料從一處移動到另外一處時進行加密，例如在您叢集內的節點之間，或是在您的叢集與應用程式間。
+ 靜態加密會在快照操作期間加密交易日誌和磁碟上資料。

您也可以使用 [使用存取控制清單 (ACLs) 驗證使用者](clusters.acls.md) 來控制使用者對叢集的存取。

**Topics**
+ [MemoryDB 中的資料安全性](encryption.md)
+ [MemoryDB 中的靜態加密](at-rest-encryption.md)
+ [MemoryDB 中的傳輸中加密 (TLS)](in-transit-encryption.md)
+ [使用存取控制清單 (ACLs) 驗證使用者](clusters.acls.md)
+ [以 IAM 進行身分驗證](auth-iam.md)

# MemoryDB 中的靜態加密
<a name="at-rest-encryption"></a>

為了協助保護您的資料安全，MemoryDB 和 Amazon S3 提供不同的方法來限制對叢集中資料的存取。如需詳細資訊，請參閱[MemoryDB 和 Amazon VPC](vpcs.md)及[MemoryDB 中的身分和存取管理](iam.md)。

MemoryDB 靜態加密一律會啟用，透過加密持久性資料來提高資料安全性。它會加密下列層面：
+ 交易日誌中的資料 
+ 同步、快照和交換操作期間的磁碟 
+ 存放在 Amazon S3 中的快照 

 MemoryDB 提供預設 （服務受管） 靜態加密，以及能夠在 [AWS Key Management Service (KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 中使用您自己的對稱客戶受管客戶根金鑰。

儲存在 SSD SSDs （固態硬碟） 上的資料在啟用資料分層的叢集中，預設一律會加密。

如需傳輸中加密的詳細資訊，請參閱[MemoryDB 中的傳輸中加密 (TLS)](in-transit-encryption.md) 

**Topics**
+ [從 AWS KMS 使用客戶受管金鑰](#using-customer-managed-keys-for-memorydb-security)
+ [另請參閱](#at-rest-encryption-see-also)

## 從 AWS KMS 使用客戶受管金鑰
<a name="using-customer-managed-keys-for-memorydb-security"></a>

MemoryDB 支援對稱客戶受管根金鑰 (KMS 金鑰） 進行靜態加密。客戶受管 KMS 金鑰是您在 AWS 帳戶中建立、擁有和管理的加密金鑰。如需詳細資訊，請參閱 *AWS Key Management Service 開發人員指南*中的[客戶根金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#root_keys)。金鑰必須先在 AWS KMS 中建立，才能與 MemoryDB 搭配使用。

若要了解如何建立 AWS KMS 根金鑰，請參閱 [Key Management Service 開發人員指南中的建立](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)*AWS 金鑰*。

MemoryDB 可讓您與 AWS KMS 整合。如需詳細資訊，請參閱 *AWS Key Management Service 開發人員指南*中的[使用授權](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)。不需要客戶動作即可啟用 MemoryDB 與 AWS KMS 整合。

`kms:ViaService` 條件金鑰會將 AWS KMS 金鑰的使用限制為來自指定 AWS 服務的請求。若要`kms:ViaService`搭配 MemoryDB 使用 ，請在條件索引鍵值中包含兩個 ViaService 名稱：`memorydb.amazon_region.amazonaws.com`。如需詳細資訊，請參閱 [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)。

您可以使用 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 來追蹤 MemoryDB 代表您傳送到 AWS Key Management Service 的請求。所有與客戶受管金鑰 AWS Key Management Service 相關的 API 呼叫都有對應的 CloudTrail 日誌。您也可以透過呼叫 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) KMS API 呼叫來查看 MemoryDB 建立的授予。

使用客戶受管金鑰加密叢集後，叢集的所有快照都會加密，如下所示：
+ 自動每日快照會使用與叢集相關聯的客戶受管金鑰進行加密。
+ 刪除叢集時建立的最終快照，也會使用與叢集相關聯的客戶受管金鑰加密。
+ 根據預設，手動建立的快照會加密，以使用與叢集相關聯的 KMS 金鑰。您可以透過選擇其他客戶受管金鑰來覆寫此選項。
+ 使用與來源快照相關聯的客戶受管金鑰，將快照預設複製到 。您可以透過選擇其他客戶受管金鑰來覆寫此選項。

**注意**  
匯出快照至您選取的 Amazon S3 儲存貯體時，無法使用客戶受管金鑰。不過，匯出至 Amazon S3 的所有快照都會使用[伺服器端加密進行加密。](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html)您可以選擇將快照檔案複製到新的 S3 物件，並使用客戶受管 KMS 金鑰加密、將檔案複製到使用 KMS 金鑰以預設加密設定的另一個 S3 儲存貯體，或變更檔案本身中的加密選項。
您也可以使用客戶受管金鑰來加密未使用客戶受管金鑰進行加密的手動建立快照。使用此選項時，即使資料未在原始叢集上加密，儲存在 Amazon S3 中的快照檔案仍會使用 KMS 金鑰進行加密。
從快照還原可讓您從可用的加密選項中進行選擇，類似於建立新叢集時可用的加密選項。
+ 如果您刪除金鑰或[停用](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)金鑰，並[撤銷用於加密叢集之金鑰的授予](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)，則叢集將無法復原。換句話說，它無法在硬體故障後修改或復原。 AWS KMS 只會在等待至少七天後刪除根金鑰。刪除金鑰之後，您可以使用不同的客戶受管金鑰來建立快照以供封存之用。
+ 自動金鑰輪換會保留 AWS KMS 根金鑰的屬性，因此輪換不會影響您存取 MemoryDB 資料的能力。加密的 MemoryDB 叢集不支援手動金鑰輪換，這涉及建立新的根金鑰和更新舊金鑰的任何參考。若要進一步了解，請參閱 *AWS Key Management Service 開發人員指南*中的[輪換客戶根金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)。
+ 使用 KMS 金鑰加密 MemoryDB 叢集需要每個叢集一個授權。此授予會在叢集的整個生命週期內使用。此外，在建立快照期間，每個快照會使用一個授權。此授予會在建立快照後淘汰。
+ 如需 AWS KMS 授予和限制的詳細資訊，請參閱 *AWS * [Key Management Service 開發人員指南中的配額](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)。

## 另請參閱
<a name="at-rest-encryption-see-also"></a>
+ [MemoryDB 中的傳輸中加密 (TLS)](in-transit-encryption.md)
+ [MemoryDB 和 Amazon VPC](vpcs.md)
+ [MemoryDB 中的身分和存取管理](iam.md)

# MemoryDB 中的傳輸中加密 (TLS)
<a name="in-transit-encryption"></a>

為了協助保護您的資料安全，MemoryDB 和 Amazon EC2 提供機制來防止未經授權存取伺服器上的資料。透過提供傳輸中加密功能，MemoryDB 為您提供了一個工具，可讓您在資料從一個位置移至另一個位置時協助保護資料。例如，您可以將資料從主節點移動到叢集內的僅供讀取複本節點，或在叢集和應用程式之間移動。

**Topics**
+ [傳輸中加密概觀](#in-transit-encryption-overview)
+ [另請參閱](#in-transit-encryption-see-also)

## 傳輸中加密概觀
<a name="in-transit-encryption-overview"></a>

MemoryDB 傳輸中加密功能可在資料從一個位置傳輸到另一個位置時，提高其最脆弱點上資料的安全性。

MemoryDB 傳輸中加密實作下列功能：
+ **加密的連線** — 伺服器和用戶端連線都經過 Transport Layer Security (TLS) 加密。
+ **加密複寫** - 資料在主節點和複本節點之間移動時會加密。
+ **伺服器身分驗證** - 用戶端可以驗證是否已連線至正確的伺服器。

從 07/20/2023 開始，TLS 1.2 是新叢集和現有叢集的最低支援版本。使用[此連結](https://aws.amazon.com/blogs/security/tls-1-2-required-for-aws-endpoints/)進一步了解 TLS 1.2 AWS。

如需連線至 MemoryDB 叢集的詳細資訊，請參閱 [使用 redis-cli 連線至 MemoryDB 節點](getting-started.md#connect-tls)。

## 另請參閱
<a name="in-transit-encryption-see-also"></a>
+ [MemoryDB 中的靜態加密](at-rest-encryption.md)
+ [使用存取控制清單 (ACLs使用者](https://docs.aws.amazon.com/memorydb/latest/devguide/clusters.acls.html)
+ [MemoryDB 和 Amazon VPC](vpcs.md)
+ [MemoryDB 中的身分和存取管理](iam.md)

# 使用存取控制清單 (ACLs) 驗證使用者
<a name="clusters.acls"></a>

您可以使用存取控制清單 (ACLs使用者。

ACLs 可讓您透過將使用者分組來控制叢集存取。這些存取控制清單旨在用來組織對叢集的存取。

使用 ACLs，您可以使用存取字串來建立使用者並為其指派特定許可，如下節所述。您可以將使用者指派給符合特定角色 （管理員、人力資源） 的存取控制清單，然後部署到一或多個 MemoryDB 叢集。透過這樣做，您可以在使用相同 MemoryDB 叢集的用戶端之間建立安全界限，並防止用戶端存取彼此的資料。

ACLs旨在支援在 Redis OSS 6 中引入 [ACL](https://valkey.io/docs/topics/acl/)。當您搭配 MemoryDB 叢集使用 ACLs 時，有一些限制：
+ 您無法在存取字串中指定密碼。您可以使用 [CreateUser](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_CreateUser.html) 或 [UpdateUser](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_UpdateUser.html) 呼叫來設定密碼。
+ 針對使用者權限，您需傳遞 `on` 和 `off` 作為存取字串的一部分。如果未在存取字串中指定兩者，則會指派使用者`off`，而且沒有叢集的存取權。
+ 您無法使用禁止的命令。如果您指定禁止的命令，則會擲回例外狀況。如需這些命令的清單，請參閱 [受限制的命令](restrictedcommands.md)。
+ 您無法使用 `reset` 命令作為存取字串的一部分。您可以使用 API 參數指定密碼，而 MemoryDB 會管理密碼。因此您無法使用 `reset`，因為它會刪除使用者的所有密碼。
+ Redis OSS 6 推出 [ACL LIST](https://valkey.io/commands/acl-list) 命令。此命令會傳回使用者清單，以及套用至每個使用者的 ACL 規則。MemoryDB 支援 `ACL LIST`命令，但不像 Redis OSS 一樣包含對密碼雜湊的支援。使用 MemoryDB，您可以使用 [DescribeUsers](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_DescribeUsers.html) 操作來取得類似資訊，包括存取字串中包含的規則。不過，[DescribeUsers](https://docs.aws.amazon.com/memorydb/latest/APIReference/API_DescribeUsers.html) 不會擷取使用者密碼。

  MemoryDB 支援的其他唯讀命令包括 [ACL WHOAMI](https://valkey.io/commands/acl-whoami)、[ACL USERS](https://valkey.io/commands/acl-users) 和 [ACL CAT](https://valkey.io/commands/acl-cat)。MemoryDB 不支援任何其他以寫入為基礎的 ACL 命令。

以下將詳細說明搭配 MemoryDB 使用 ACLs。

**Topics**
+ [使用存取字串指定許可](#access-string)
+ [向量搜尋功能](#access-vss)
+ [將 ACLs 套用至 MemoryDB 的叢集](#rbac-using)

## 使用存取字串指定許可
<a name="access-string"></a>

若要指定 MemoryDB 叢集的許可，您可以使用 AWS CLI 或 建立存取字串，並將其指派給使用者 AWS 管理主控台。

存取字串的定義是套用至使用者的空格分隔規則清單。用於定義使用者可以執行哪些命令，以及使用者可以操作哪些索引鍵。為了執行命令，使用者必須能存取執行中的命令以及該命令存取的所有索引鍵。規則會從左到右累加套用，如果提供的字串中有備援，則可以使用較簡單的字串，而不是提供的字串。

如需 ACL 規則語法的詳細資訊，請參閱 [ACL](https://valkey.io/topics/acl)。

在下列範例中，存取字串代表有權存取所有可用索引鍵和命令的活躍使用者。

 `on ~* &* +@all`

存取字串語法可細分以下各項：
+ `on` - 使用者是活躍使用者。
+ `~*` - 存取權限提供給所有可用的索引鍵。
+ `&*` – 存取會授予所有 pubsub 頻道。
+ `+@all` - 存取權限提供給所有可用的命令。

先前的設定受到最低限度的限制。您可以修改這些設定，提高安全性。

在下面的範例中，存取字串代表對於以「app::」keyspace 開頭的索引鍵，存取權受限於讀取存取的使用者

`on ~app::* -@all +@read`

您可以列出使用者可存取的命令，進一步精簡這些許可：

`+command1` - 使用者對命令的存取權限受限於 *`command1`*。

 `+@category` - 使用者的存取權限受限於某個命令類別。

如需將存取字串指派給使用者的相關資訊，請參閱「[使用主控台和 CLI 建立使用者和存取控制清單](#users-management)」。

如果您要將現有工作負載遷移至 MemoryDB，您可以呼叫 來擷取存取字串`ACL LIST`，但不包括使用者和任何密碼雜湊。

## 向量搜尋功能
<a name="access-vss"></a>

對於 [向量搜尋](vector-search.md)，所有搜尋命令都屬於 `@search`類別，且現有類別 `@read`、 `@write``@fast`和 `@slow`已更新為包含搜尋命令。如果使用者無法存取某個類別，則該使用者就無法存取該類別中的任何命令。例如，如果使用者無法存取 `@search`，則使用者無法執行任何搜尋相關命令。

下表指出搜尋命令與適當類別的映射。


| VSS 命令 | @read | @write | @fast | @slow | 
| --- | --- | --- | --- | --- | 
| FT.CREATE |  | Y | Y |  | 
| FT.DROPINDEX |  | Y | Y |  | 
| FT.LIST | Y |  |  | Y | 
| FT.INFO | Y |  | Y |  | 
| FT.SEARCH | Y |  |  | Y | 
| FT.AGGREGATE | Y |  |  | Y | 
| FT.PROFILE | Y |  |  | Y | 
| FT.ALIASADD |  | Y | Y |  | 
| FT.ALIASDEL |  | Y | Y |  | 
| FT.ALIASUPDATE |  | Y | Y |  | 
| FT.\$1ALIASLIST | Y |  |  | Y | 
| FT.EXPLAIN | Y |  | Y |  | 
| FT.EXPLAINCLI | Y |  | Y |  | 
| FT.CONFIG | Y |  | Y |  | 

## 將 ACLs 套用至 MemoryDB 的叢集
<a name="rbac-using"></a>

若要使用 MemoryDB ACLs，請執行下列步驟：

1. 建立一或多位使用者。

1. 建立 ACL 並將使用者新增至清單。

1. 將 ACL 指派給叢集。

以下詳細說明這些步驟。

**Topics**
+ [使用主控台和 CLI 建立使用者和存取控制清單](#users-management)
+ [使用主控台和 CLI 管理存取控制清單](#user-groups)
+ [將存取控制清單指派給叢集](#users-groups-to-clusterss)

### 使用主控台和 CLI 建立使用者和存取控制清單
<a name="users-management"></a>

ACLs 使用者的使用者資訊是使用者名稱，以及選用的密碼和存取字串。存取字串提供索引鍵和命令的許可層級。名稱對使用者是唯一的，是傳遞給引擎的內容。

請確定您提供的使用者許可符合 ACL 的預期用途。例如，如果您建立名為 的 ACL`Administrators`，則您新增至該群組的任何使用者都應將其存取字串設定為對金鑰和命令的完整存取。對於 `e-commerce` ACL 中的使用者，您可以將其存取字串設定為唯讀存取。

MemoryDB 會為每個帳戶自動設定使用者名稱為 的預設使用者`"default"`。除非明確新增至 ACL，否則它不會與任何叢集相關聯。您無法刪除或修改此使用者。此使用者旨在與先前 Redis OSS 版本的預設行為相容，並具有允許其呼叫所有命令和存取所有金鑰的存取字串。

將為每個包含預設使用者的帳戶建立不可變的「開放存取」ACL。這是預設使用者可以成為成員的唯一 ACL。建立叢集時，您必須選取要與叢集建立關聯的 ACL。雖然您可以選擇將「開放存取」ACL 套用到預設使用者，但強烈建議建立 ACL 的使用者，其許可僅限於其業務需求。

未啟用 TLS 的叢集必須使用「開放存取」ACL 來提供開放身分驗證。

無需任何使用者即可建立 ACLs。空的 ACL 將無法存取叢集，而且只能與啟用 TLS 的叢集建立關聯。

建立使用者時，最多可以設定兩個密碼。當您修改密碼時，會維護與叢集的任何現有連線。

特別是，使用適用於 MemoryDB ACLs 時，請注意這些使用者密碼限制：
+ 密碼必須為 16 - 128 個可列印字元。
+ 不允許使用以下非英數字元：`,` `""` `/` `@`。

#### 使用主控台和 CLI 管理使用者
<a name="users-console"></a>

##### 建立使用者 （主控台）
<a name="users.Createclusters.viewdetails"></a>

**在主控台上建立使用者**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**使用者**。

1. 選擇**建立使用者**

1. 在**建立使用者**頁面上，輸入**名稱**。

   叢集命名限制條件如下：
   + 必須包含 1-40 個英數字元或連字號。
   + 必須以字母開頭。
   + 不能連續包含兩個連字號。
   + 結尾不能是連字號。

1. 在**密碼**下，您最多可以輸入兩個密碼。

1. 在**存取字串**下，輸入存取字串。存取字串會為允許使用者存取的索引鍵和命令設定許可層級。

1. 對於**標籤**，您可以選擇套用標籤來搜尋和篩選使用者或追蹤 AWS 成本。

1. 選擇**建立**。

##### 使用 建立使用者 AWS CLI
<a name="users.Create.cli"></a>

**使用 CLI 建立使用者**
+ 使用 [create-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/create-user.html) 命令來建立使用者。

  針對 Linux、macOS 或 Unix：

  ```
  aws memorydb create-user \
    --user-name user-name-1 \
    --access-string "~objects:* ~items:* ~public:*" \
    --authentication-mode \
          Passwords="abc",Type=password
  ```

  針對 Windows：

  ```
  aws memorydb create-user ^
    --user-name user-name-1 ^
    --access-string "~objects:* ~items:* ~public:*" ^
    --authentication-mode \
          Passwords="abc",Type=password
  ```

##### 修改使用者 （主控台）
<a name="users.modifyclusters.viewdetails"></a>

**在主控台上修改使用者**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**使用者**。

1. 選擇您要修改的使用者旁的選項按鈕，然後選擇**動作**->**修改**

1. 如果您想要修改密碼，請選擇**修改密碼**選項按鈕。請注意，如果您有兩個密碼，您必須在修改其中一個密碼時輸入這兩個密碼。

1. 如果您要更新存取字串，請輸入新的存取字串。

1. 選擇 **Modify** (修改)。

##### 使用 修改使用者 AWS CLI
<a name="users.modify.cli"></a>

**使用 CLI 修改使用者**

1. 使用 [update-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/update-user.html) 命令來修改使用者。

1. 修改使用者時，會更新與使用者相關聯的存取控制清單，以及與 ACL 相關聯的任何叢集。所有現有的連線都會保留。範例如下。

   針對 Linux、macOS 或 Unix：

   ```
   aws memorydb update-user \
     --user-name user-name-1 \
     --access-string "~objects:* ~items:* ~public:*"
   ```

   針對 Windows：

   ```
   aws memorydb update-user ^
     --user-name user-name-1 ^
     --access-string "~objects:* ~items:* ~public:*"
   ```

##### 檢視使用者詳細資訊 （主控台）
<a name="users.viewclusters.viewdetails"></a>

**在主控台上檢視使用者詳細資訊**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**使用者**。

1. 在**使用者名稱**下選擇使用者，或使用搜尋方塊來尋找使用者。

1. 在**使用者設定**下，您可以檢閱使用者的存取字串、密碼計數、狀態和 Amazon Resource Name (ARN)。

1. 在**存取控制清單 (ACL)** 下，您可以檢閱使用者所屬的 ACL。

1. 在**標籤**下，您可以檢閱與使用者相關聯的任何標籤。

##### 使用 檢視使用者詳細資訊 AWS CLI
<a name="user.view.cli"></a>

使用 [describe-users](https://docs.aws.amazon.com/cli/latest/reference/memorydb/describe-users.html) 命令來檢視使用者的詳細資訊。

```
aws memorydb describe-users \
  --user-name my-user-name
```

##### 刪除使用者 （主控台）
<a name="users.deleteclusters"></a>

**在主控台上刪除使用者**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**使用者**。

1. 選擇您要修改的使用者旁的選項按鈕，然後選擇**動作**->**刪除**

1. 若要確認，請在確認文字方塊`delete`中輸入 ，然後選擇**刪除**。

1. 若要取消，請選擇 **Cancel (取消)**。

##### 使用 刪除使用者 AWS CLI
<a name="users.delete.cli"></a>

**使用 CLI 刪除使用者**
+ 使用 [delete-user](https://docs.aws.amazon.com/cli/latest/reference/memorydb/delete-user.html) 命令來刪除使用者。

  帳戶會從其所屬的任何存取控制清單中刪除和移除。下列是 範例。

  針對 Linux、macOS 或 Unix：

  ```
  aws memorydb delete-user \
    --user-name user-name-2
  ```

  針對 Windows：

  ```
  aws memorydb delete-user ^
    --user-name user-name-2
  ```

### 使用主控台和 CLI 管理存取控制清單
<a name="user-groups"></a>

您可以建立存取控制清單來組織和控制使用者對一或多個叢集的存取，如下所示。

使用下列程序來管理使用主控台的存取控制清單。

#### 建立存取控制清單 (ACL) （主控台）
<a name="acl.createclusters.viewdetails"></a>

**使用主控台建立存取控制清單**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**存取控制清單 (ACL)**。

1. 選擇**建立 ACL**。

1. 在**建立存取控制清單 (ACL)** 頁面上，輸入 ACL 名稱。

   叢集命名限制條件如下：
   + 必須包含 1-40 個英數字元或連字號。
   + 必須以字母開頭。
   + 不能連續包含兩個連字號。
   + 結尾不能是連字號。

1. 在**選取的使用者**下，執行下列其中一項操作：

   1. 選擇建立使用者來**建立新的使用者**

   1. 選擇**管理**，然後從管理使用者對話方塊中選取使用者，然後選擇**選擇**，以新增**使用者**。

1. 對於**標籤**，您可以選擇套用標籤來搜尋和篩選 ACLs 或追蹤 AWS 成本。

1. 選擇**建立**。

#### 使用 建立存取控制清單 (ACL) AWS CLI
<a name="acl.create.cli"></a>

使用以下程序，使用 CLI 建立存取控制清單。

**使用 CLI 建立新的 ACL 並新增使用者**
+ 使用 [create-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/create-acl.html) 命令來建立 ACL。

  針對 Linux、macOS 或 Unix：

  ```
  aws memorydb create-acl \
    --acl-name "new-acl-1" \
    --user-names "user-name-1" "user-name-2"
  ```

  針對 Windows：

  ```
  aws memorydb create-acl ^
    --acl-name "new-acl-1" ^
    --user-names "user-name-1" "user-name-2"
  ```

#### 修改存取控制清單 (ACL) （主控台）
<a name="acl.modifyclusters.viewdetails"></a>

**使用主控台修改存取控制清單**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**存取控制清單 (ACL)**。

1. 選擇您要修改的 ACL，然後選擇**修改**

1. 在**修改**頁面上，**在選取的使用者**下執行下列其中一項操作：

   1. 選擇建立使用者以新增至 ACL 來**建立新的使用者**。

   1. 選擇**管理**，然後從管理使用者對話方塊中選取或取消選取使用者，然後選取**選擇**，以新增或移除**使用者**。

1. 在**建立存取控制清單 (ACL)** 頁面上，輸入 ACL 名稱。

   叢集命名限制條件如下：
   + 必須包含 1-40 個英數字元或連字號。
   + 必須以字母開頭。
   + 不能連續包含兩個連字號。
   + 結尾不能是連字號。

1. 在**選取的使用者**下，執行下列其中一項操作：

   1. 選擇建立使用者來**建立新的使用者**

   1. 選擇**管理**，然後從管理使用者對話方塊中選取使用者，然後選擇**選擇**，以新增**使用者**。

1. 選擇**修改**以儲存變更，或選擇**取消**以捨棄變更。

#### 使用 修改存取控制清單 (ACL) AWS CLI
<a name="acl.modify.acl"></a>

**使用 CLI 透過新增使用者或移除目前成員來修改 ACL**
+ 使用 [update-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/update-acl.html) 命令來修改 ACL。

  針對 Linux、macOS 或 Unix：

  ```
  aws memorydb update-acl --acl-name new-acl-1 \
  --user-names-to-add user-name-3 \
  --user-names-to-remove user-name-2
  ```

  針對 Windows：

  ```
  aws memorydb update-acl --acl-name new-acl-1 ^
  --user-names-to-add user-name-3 ^
  --user-names-to-remove user-name-2
  ```

**注意**  
此命令會結束任何從 ACL 移除之使用者的開放連線。

#### 檢視存取控制清單 (ACL) 詳細資訊 （主控台）
<a name="acls.viewclusters.viewdetails"></a>

**在主控台上檢視 ACL 詳細資訊**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**存取控制清單 (ACL)**。

1. 選擇 ACL **名稱下的 ACL**，或使用搜尋方塊尋找 ACL。

1. 在**使用者**下，您可以檢閱與 ACL 相關聯的使用者清單。

1. 在**關聯的叢集**下，您可以檢閱 ACL 所屬的叢集。

1. 在**標籤**下，您可以檢閱與 ACL 相關聯的任何標籤。

#### 使用 檢視存取控制清單 (ACL) AWS CLI
<a name="acl.view.cli"></a>

使用 [describe-acls](https://docs.aws.amazon.com/cli/latest/reference/memorydb/describe-acls.html) 命令來檢視 ACL 的詳細資訊。

```
aws memorydb describe-acls \
  --acl-name test-group
```

#### 刪除存取控制清單 (ACL) （主控台）
<a name="acl.deleteacl"></a>

**使用主控台刪除存取控制清單**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/memorydb/](https://console.aws.amazon.com/memorydb/) 的 MemoryDB 主控台。

1. 在左側導覽窗格中，選擇**存取控制清單 (ACL)**。

1. 選擇您要修改的 ACL，然後選擇**刪除**

1. 在**刪除**頁面上，`delete`在確認方塊中輸入 ，然後選擇**刪除****或取消**以避免刪除 ACL。

會刪除 ACL 本身，而不是屬於 群組的使用者。

#### 使用 刪除存取控制清單 (ACL) AWS CLI
<a name="acl.delete.cli"></a>

**使用 CLI 刪除 ACL**
+ 使用 [delete-acl](https://docs.aws.amazon.com/cli/latest/reference/memorydb/delete-acl.html) 命令來刪除 ACL。

  針對 Linux、macOS 或 Unix：

  ```
  aws memorydb delete-acl /
     --acl-name
  ```

  針對 Windows：

  ```
  aws memorydb delete-acl ^
     --acl-name
  ```

  上述範例會傳回下列回應。

  ```
  aws memorydb delete-acl --acl-name "new-acl-1"
  {
      "ACLName": "new-acl-1",
      "Status": "deleting",
      "EngineVersion": "6.2",
      "UserNames": [
          "user-name-1", 
          "user-name-3"
      ],
      "clusters": [],
      "ARN":"arn:aws:memorydb:us-east-1:493071037918:acl/new-acl-1"
  }
  ```

### 將存取控制清單指派給叢集
<a name="users-groups-to-clusterss"></a>

在您建立 ACL 並新增使用者之後，實作 ACLs的最後一步是將 ACL 指派給叢集。

#### 使用主控台將存取控制清單指派給叢集
<a name="users-groups-to-clusters-con"></a>

若要使用 將 ACL 新增至叢集 AWS 管理主控台，請參閱 [建立 MemoryDB 叢集](getting-started.md#clusters.create)。

#### 使用 將存取控制清單指派給叢集 AWS CLI
<a name="users-groups-to-clusters-CLI"></a>

 下列 AWS CLI 操作會建立啟用傳輸中加密 (TLS) 的叢集，以及值為 的 **acl-name** 參數`my-acl-name`。將子網路群組 `subnet-group` 取代為已存在的子網路群組。

**重要參數**
+ **--engine-version** – 必須為 6.2。
+ **--tls-enabled** – 用於身分驗證和關聯 ACL。
+ **--acl-name** – 此值提供存取控制清單，由具有叢集指定存取許可的使用者組成。

針對 Linux、macOS 或 Unix：

```
aws memorydb create-cluster \
    --cluster-name "new-cluster" \
    --description "new-cluster" \
    --engine-version "6.2" \
    --node-type db.r6g.large \
    --tls-enabled \
    --acl-name "new-acl-1" \
    --subnet-group-name "subnet-group"
```

針對 Windows：

```
aws memorydb create-cluster ^
    --cluster-name "new-cluster" ^
    --cluster-description "new-cluster" ^
    --engine-version "6.2" ^
    --node-type db.r6g.large ^
    --tls-enabled ^
    --acl-name "new-acl-1" ^
    --subnet-group-name "subnet-group"
```

下列 AWS CLI 操作會修改啟用傳輸中加密 (TLS) 的叢集，以及值為 的 **acl-name** 參數`new-acl-2`。

針對 Linux、macOS 或 Unix：

```
aws memorydb update-cluster \
    --cluster-name cluster-1 \
    --acl-name "new-acl-2"
```

針對 Windows：

```
aws memorydb update-cluster ^
    --cluster-name cluster-1 ^
    --acl-name "new-acl-2"
```

# 以 IAM 進行身分驗證
<a name="auth-iam"></a>

**Topics**
+ [概觀](#auth-iam-overview)
+ [限制](#auth-iam-limits)
+ [設定](#auth-iam-setup)
+ [連接](#auth-iam-Connecting)

## 概觀
<a name="auth-iam-overview"></a>

當您的叢集設定為使用 Valkey 或 Redis OSS 第 7 版或更新版本時，您可以使用 AWS IAM 身分驗證與 MemoryDB 的連線。這可讓您強化安全模型，並簡化許多管理安全任務。透過 IAM 身分驗證，您可以為每個個別 MemoryDB 叢集和 MemoryDB 使用者設定精細存取控制，並遵循最低權限許可原則。適用於 MemoryDB 的 IAM 身分驗證的運作方式是在 `AUTH`或 `HELLO`命令中提供短期 IAM 身分驗證字符，而非長期的 MemoryDB 使用者密碼。如需 IAM 身分驗證字符的詳細資訊，請參閱《 AWS 一般參考指南》中的 [Signature 第 4 版簽署程序](https://docs.aws.amazon.com//general/latest/gr/signature-version-4.html)，以及下面的程式碼範例。

您可以使用 IAM 身分及其相關聯的政策來進一步限制 Valkey 或 Redis OSS 存取。您也可以將使用者從聯合身分提供者的存取權直接授予 MemoryDB 叢集。

若要將 AWS IAM 與 MemoryDB 搭配使用，您必須先建立身分驗證模式設為 IAM 的 MemoryDB 使用者，然後才能建立或重複使用 IAM 身分。IAM 身分需要相關聯的政策，才能將`memorydb:Connect`動作授予 MemoryDB 叢集和 MemoryDB 使用者。設定完成後，您可以使用 IAM 使用者或角色的 AWS 登入資料建立 IAM 身分驗證字符。最後，您需要在連線至 MemoryDB 叢集節點時，在 Valkey 或 Redis OSS 用戶端中提供短期 IAM 身分驗證字符做為密碼。支援登入資料的用戶端可以為每個新連線自動產生臨時登入資料。MemoryDB 將對啟用 IAM 的 MemoryDB 使用者的連線請求執行 IAM 身分驗證，並將使用 IAM 驗證連線請求。

## 限制
<a name="auth-iam-limits"></a>

使用 IAM 身分驗證，會套用以下限制：
+ 使用 Valkey 或 Redis OSS 引擎 7.0 版或更新版本時，可使用 IAM 身分驗證。
+ IAM 身分驗證字符的有效期限為 15 分鐘。對於長期連線，我們建議您使用支援登入資料提供者介面的 Redis OSS 用戶端。
+ IAM 驗證的 MemoryDB 連線會在 12 小時後自動中斷連線。可以傳送包含新 IAM 身分驗證字符的 `AUTH` 或 `HELLO` 命令，將連線再延長 12 小時。
+ `MULTI EXEC` 命令不支援 IAM 身分驗證。
+ 目前，IAM 驗證不支援所有全域條件內容金鑰。如需有關全域條件內容索引鍵的詳細資訊，請參閱《IAM 使用者指南》中的 [AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

## 設定
<a name="auth-iam-setup"></a>

設定 IAM 身分驗證：

1. 建立 叢集

   ```
   aws memorydb create-cluster \
       --cluster-name cluster-01 \
       --description "MemoryDB IAM auth application"
       --node-type db.r6g.large \
       --engine-version 7.0 \
       --acl-name open-access
   ```

1. 為您的角色建立如下所示的 IAM 信任政策文件，讓您的帳戶擔任新角色。將政策儲存到名為 *trust-policy.json* 的檔案。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
           "Action": "sts:AssumeRole"
       }
   }
   ```

------

1. 建立 IAM 政策文件，如下所示。將政策儲存到名為 *policy.json* 的檔案。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect" : "Allow",
         "Action" : [
           "memorydb:connect"
         ],
         "Resource" : [
           "arn:aws:memorydb:us-east-1:123456789012:cluster/cluster-01",
           "arn:aws:memorydb:us-east-1:123456789012:user/iam-user-01"
         ]
       }
     ]
   }
   ```

------

1. 建立 IAM 角色。

   ```
   aws iam create-role \
     --role-name "memorydb-iam-auth-app" \
     --assume-role-policy-document file://trust-policy.json
   ```

1. 建立 IAM 政策。

   ```
   aws iam create-policy \
     --policy-name "memorydb-allow-all" \
     --policy-document file://policy.json
   ```

1. 將 IAM 政策連接至角色。

   ```
   aws iam attach-role-policy \
    --role-name "memorydb-iam-auth-app" \
    --policy-arn "arn:aws:iam::123456789012:policy/memorydb-allow-all"
   ```

1. 建立已啟用 IAM 的新使用者。

   ```
   aws memorydb create-user \
     --user-name iam-user-01 \
     --authentication-mode Type=iam \
     --access-string "on ~* +@all"
   ```

1. 建立 ACL 並連接使用者。

   ```
   aws memorydb create-acl \
     --acl-name iam-acl-01 \
     --user-names iam-user-01
   
   aws memorydb update-cluster \
     --cluster-name cluster-01 \
     --acl-name iam-acl-01
   ```

## 連接
<a name="auth-iam-Connecting"></a>

**以字符做為密碼進行連線**

首先，您需要使用 [AWS SigV4 預先簽章的請求](https://docs.aws.amazon.com//general/latest/gr/sigv4-signed-request-examples.html)，產生短期 IAM 身分驗證字符。之後，您在連線至 MemoryDB 叢集時提供 IAM 身分驗證字符做為密碼，如以下範例所示。

```
String userName = "insert user name"
String clusterName = "insert cluster name"
String region = "insert region"

// Create a default AWS Credentials provider.
// This will look for AWS credentials defined in environment variables or system properties.
AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();

// Create an IAM authentication token request and signed it using the AWS credentials.
// The pre-signed request URL is used as an IAM authentication token for MemoryDB.
IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userName, clusterName, region);
String iamAuthToken = iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.getCredentials());

// Construct URL with IAM Auth credentials provider
RedisURI redisURI = RedisURI.builder()
    .withHost(host)
    .withPort(port)
    .withSsl(ssl)
    .withAuthentication(userName, iamAuthToken)
    .build();

// Create a new Lettuce client
RedisClusterClient client = RedisClusterClient.create(redisURI);
client.connect();
```

以下是 `IAMAuthTokenRequest` 的定義。

```
public class IAMAuthTokenRequest {
    private static final HttpMethodName REQUEST_METHOD = HttpMethodName.GET;
    private static final String REQUEST_PROTOCOL = "http://";
    private static final String PARAM_ACTION = "Action";
    private static final String PARAM_USER = "User";
    private static final String ACTION_NAME = "connect";
    private static final String SERVICE_NAME = "memorydb";
    private static final long TOKEN_EXPIRY_SECONDS = 900;

    private final String userName;
    private final String clusterName;
    private final String region;

    public IAMAuthTokenRequest(String userName, String clusterName, String region) {
        this.userName = userName;
        this.clusterName = clusterName;
        this.region = region;
    }

    public String toSignedRequestUri(AWSCredentials credentials) throws URISyntaxException {
        Request<Void> request = getSignableRequest();
        sign(request, credentials);
        return new URIBuilder(request.getEndpoint())
            .addParameters(toNamedValuePair(request.getParameters()))
            .build()
            .toString()
            .replace(REQUEST_PROTOCOL, "");
    }

    private <T> Request<T> getSignableRequest() {
        Request<T> request  = new DefaultRequest<>(SERVICE_NAME);
        request.setHttpMethod(REQUEST_METHOD);
        request.setEndpoint(getRequestUri());
        request.addParameters(PARAM_ACTION, Collections.singletonList(ACTION_NAME));
        request.addParameters(PARAM_USER, Collections.singletonList(userName));
        return request;
    }

    private URI getRequestUri() {
        return URI.create(String.format("%s%s/", REQUEST_PROTOCOL, clusterName));
    }

    private <T> void sign(SignableRequest<T> request, AWSCredentials credentials) {
        AWS4Signer signer = new AWS4Signer();
        signer.setRegionName(region);
        signer.setServiceName(SERVICE_NAME);

        DateTime dateTime = DateTime.now();
        dateTime = dateTime.plus(Duration.standardSeconds(TOKEN_EXPIRY_SECONDS));

        signer.presignRequest(request, credentials, dateTime.toDate());
    }

    private static List<NameValuePair> toNamedValuePair(Map<String, List<String>> in) {
        return in.entrySet().stream()
            .map(e -> new BasicNameValuePair(e.getKey(), e.getValue().get(0)))
            .collect(Collectors.toList());
    }
}
```

**使用憑證提供者進行連線**

以下程式碼說明如何使用 IAM 身分驗證憑證提供者向 MemoryDB 進行身分驗證。

```
String userName = "insert user name"
String clusterName = "insert cluster name"
String region = "insert region"

// Create a default AWS Credentials provider.
// This will look for AWS credentials defined in environment variables or system properties.
AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();

// Create an IAM authentication token request. Once this request is signed it can be used as an
// IAM authentication token for MemoryDB.
IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(userName, clusterName, region);

// Create a credentials provider using IAM credentials.
RedisCredentialsProvider redisCredentialsProvider = new RedisIAMAuthCredentialsProvider(
    userName, iamAuthTokenRequest, awsCredentialsProvider);
    
// Construct URL with IAM Auth credentials provider
RedisURI redisURI = RedisURI.builder()
    .withHost(host)
    .withPort(port)
    .withSsl(ssl)
    .withAuthentication(redisCredentialsProvider)
    .build();

// Create a new Lettuce cluster client
RedisClusterClient client = RedisClusterClient.create(redisURI);
client.connect();
```

以下是在登入資料提供者中包裝 IAMAuthTokenRequest 的 Lettuce 叢集用戶端範例，以在需要時自動產生臨時登入資料。

```
public class RedisIAMAuthCredentialsProvider implements RedisCredentialsProvider {
    private static final long TOKEN_EXPIRY_SECONDS = 900;

    private final AWSCredentialsProvider awsCredentialsProvider;
    private final String userName;
    private final IAMAuthTokenRequest iamAuthTokenRequest;
    private final Supplier<String> iamAuthTokenSupplier;

    public RedisIAMAuthCredentialsProvider(String userName,
        IAMAuthTokenRequest iamAuthTokenRequest,
        AWSCredentialsProvider awsCredentialsProvider) {
        this.userName = userName;
        this.awsCredentialsProvider = awsCredentialsProvider;
        this.iamAuthTokenRequest = iamAuthTokenRequest;      
        this.iamAuthTokenSupplier = Suppliers.memoizeWithExpiration(this::getIamAuthToken, TOKEN_EXPIRY_SECONDS, TimeUnit.SECONDS);
    }

    @Override
    public Mono<RedisCredentials> resolveCredentials() {
        return Mono.just(RedisCredentials.just(userName, iamAuthTokenSupplier.get()));
    }

    private String getIamAuthToken() {
        return iamAuthTokenRequest.toSignedRequestUri(awsCredentialsProvider.getCredentials());
    }
```