DAX 存取控制 - Amazon DynamoDB

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

DAX 存取控制

DynamoDB Accelerator (DAX) 可與 DynamoDB 一起使用,為您的應用程式無縫新增快取層。但是,DAX 和 DynamoDB 具有不同的存取控制機制。這兩種服務都使用 AWS Identity and Access Management (IAM) 來實作各自的安全政策,但 DAX 和 DynamoDB 的安全模型不同。

我們強烈建議您了解兩種安全模型,以便為使用 DAX 的應用程式實作合適的安全措施。

本節說明 DAX 提供的存取控制機制,並提供範例 IAM 政策。您可以使用此政策來為您的需求量身打造。

使用 DynamoDB,您可以建立限制使用者在個別 DynamoDB 資源上可執行動作的 IAM 政策。例如,您可以建立使用者角色,只允許使用者對特定 DynamoDB 資料表執行唯讀動作。(如需詳細資訊,請參閱「Amazon DynamoDB 的 Identity and Access Management」。) 相較之下,DAX 安全模型著重在叢集安全,以及叢集代替您執行 DynamoDB API 動作的能力。

警告

若您目前使用 IAM 角色及政策限制對 DynamoDB 資料表資料的存取,使用 DAX 可以推翻這些政策。例如,使用者可透過 DAX 存取 DynamoDB 資料表,但無法藉由直接存取 DynamoDB 來明確存取相同的資料表。如需詳細資訊,請參閱 Amazon DynamoDB 的 Identity and Access Management

DAX 不會強制對 DynamoDB 上的資料執行使用者層級隔離。相反的,使用者會在存取該叢集時,繼承 DAX 叢集 IAM 政策的許可。因此,透過 DAX 存取 DynamoDB 資料表時,唯一有效的存取控制便是 DAX 叢集 IAM 政策的許可。其他任何許可都不會獲得承認。

若您需要隔離,我們建議您建立其他 DAX 叢集,並為每個叢集劃定 IAM 政策的範圍。例如,您可以建立多個 DAX 叢集,然後只允許每個叢集存取單一資料表。

DAX 的 IAM 服務角色

建立 DAX 叢集時,您必須為叢集與 IAM 角色建立關聯。這稱為叢集的服務角色

假設您想要建立名為 DAXCluster01 的新 DAX 叢集。您可以建立名為 DAX 的服務角色ServiceRole,並將該角色與 Dax Cluster01 產生關聯。DAX 政策ServiceRole會代表與 DaxCluster01 互動的使用者,定義 DaxCluster01 可執行的動作。

建立服務角色時,必須指定 DAX ServiceRole 與 DAX 服務本身之間的信任關係。信任關聯會判斷可取得角色及使用其許可的實體。以下是 DAX 的信任關係文件範例ServiceRole:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "dax.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

此信任關係可讓 DAX 叢集代表您執行 DAX,ServiceRole並執行 DynamoDB API 呼叫。

允許的 DynamoDB API 動作會在您附加至 DAX 的 IAM 政策文件中說明。ServiceRole以下為範例政策文件。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DaxAccessPolicy", "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:PutItem", "dynamodb:GetItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books" ] } ] }

此政策允許 DAX 在 DynamoDB 資料表上執行必要 DynamoDB API 動作。DAX 需要 dynamodb:DescribeTable 動作才能維護資料表的相關中繼資料,其他則是在表內項目上執行的讀取與寫入動作。該資料表名為 Books,位於 us-west-2 區域,由 AWS 帳戶 ID 123456789012 擁有。

注意

DAX 支援機制,以防止跨服務存取期間混淆的副問題。如需詳細資訊,請參閱《IAM 使用者指南》中的混淆代理問題

允許 DAX 叢集存取的 IAM 政策

建立 DAX 叢集後,您需要授予使用者許可,讓使用者能夠存取 DAX 叢集。

例如,假設您希望將存取 DAXCluster01 的許可授予名為 Alice 的使用者。您必須先建立 IAM 政策 (政AliceAccess策),以定義收件者可存取的 DAX 叢集和 DAX API 動作。您接著便會藉由將此政策連接到使用者 Alice,來授予存取。

下列政策文件會給予收件人 DAXCluster01 的完整存取。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dax:*" ], "Effect": "Allow", "Resource": [ "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" ] } ] }

政策文件允許 DAX 叢集的存取,但並未授予任何 DynamoDB 許可。(DynamoDB 許可會由 DAX 服務角色授予。)

針對使用者 Alice,您首先要使用先前顯示的政策文件建立 AliceAccessPolicy。您接著會將政策連接到 Alice。

注意

除了將政策連接到使用者之外,您也可以將政策連接到 IAM 角色。透過這種方式,所有取得該角色的使用者都會擁有您在政策中定義的許可。

使用者政策結合 DAX 服務角色,會判斷收件人可透過 DAX 存取的 DynamoDB 資源和 API 動作。

使用案例:存取 DynamoDB 和 DAX

下列案例可以幫助您進一步了解用於 DAX 的 IAM 政策。(本節剩餘的部分將參考這個案例)。以下圖表顯示案例的高層級概觀。

使用 DAX 的 IAM 政策案例的高階概觀。

在此案例中,有下列實體:

  • 使用者 (Bob)。

  • IAM 角色 (BobUserRole)。Bob 會在執行時間取得此角色。

  • IAM 政策 (BobAccessPolicy)。此政策會連接到 BobUserRoleBobAccessPolicy 會定義 BobUserRole 允許存取的 DynamoDB 和 DAX 資源。

  • DAX 叢集 (DAXCluster01)。

  • IAM 服務角色 (DAXServiceRole)。此角色允許 DAXCluster01 存取 DynamoDB。

  • IAM 政策 (DAXAccessPolicy)。此政策會連接到 DAXServiceRoleDAXAccessPolicy 會定義 DAXCluster01 允許存取的 DynamoDB API 和資源。

  • DynamoDB 資料表 (Books)。

BobAccessPolicyDAXAccessPolicy 中的政策陳述式組合會決定 Bob 可以如何使用 Books 資料表。例如,Bob 可能可以直接 (使用 DynamoDB 端點)、間接 (使用 DAX 叢集) 或同時使用這兩種方式存取 Books。Bob 也可能可以從 Books 讀取資料、寫入資料到 Books,或同時具有這兩種許可。

存取 DynamoDB,但不可使用 DAX 存取

IAM 政策概觀,可讓您直接存取資料表,但使用 DAX 叢集封鎖間接存取。

您可以允許直接存取 DynamoDB 資料表,同時防止透過 DAX 叢集間接進行存取。如需直接存取 DynamoDB,BobUserRole 的許可是由 BobAccessPolicy (連接到角色) 決定。

DynamoDB 的唯讀存取 (僅限)

Bob 可以使用 BobUserRole 存取 DynamoDB。連接到此角色 (BobAccessPolicy) 的 IAM 政策會判斷 BobUserRole 可存取的 DynamoDB 資料表,以及 BobUserRole 可呼叫的 API。

考慮下列 BobAccessPolicy 的政策文件。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

當此文件連接到 BobAccessPolicy 時,它會允許 BobUserRole 存取 DynamoDB 端點,並對 Books 資料表執行唯讀操作。

DAX 沒有出現在此政策中,因此透過 DAX 進行存取會遭到拒絕。

DynamoDB 的讀取/寫入存取 (僅限)

BobUserRole 需要 DynamoDB 的讀寫存取,將適用以下政策。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

同樣的,DAX 沒有出現在此政策中,因此透過 DAX 進行存取會遭到拒絕。

存取 DynamoDB 和 DAX

一種 IAM 政策,可同時授與 DynamoDB 表格和 DAX 叢集的存取權限。

若要允許存取 DAX 叢集,您必須在 IAM 政策中包含 DAX 專屬的動作。

下列 DAX 專屬動作會對應到他們在 DynamoDB API 中名稱相似的動作:

  • dax:GetItem

  • dax:BatchGetItem

  • dax:Query

  • dax:Scan

  • dax:PutItem

  • dax:UpdateItem

  • dax:DeleteItem

  • dax:BatchWriteItem

  • dax:ConditionCheckItem

這同樣適用於 dax:EnclosingOperation 條件金鑰。

DynamoDB 的唯讀存取及 DAX 的唯讀存取

假設 Bob 需要透過 DynamoDB 及 DAX 對 Books 資料表進行唯讀存取。以下政策 (連接到 BobUserRole) 會授予這項存取。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

政策具有 DAX 存取的陳述式 (DAXAccessStmt) 及另一個 DynamoDBaccess 的陳述式 (DynamoDBAccessStmt)。這些陳述式會允許 Bob 向 DAXCluster01 傳送 GetItemBatchGetItemQueryScan 請求。

但是,DAXCluster01 的服務角色也需要對 DynamoDB 中 Books 資料表的唯讀存取。以下連接到 DAXServiceRole 的 IAM 政策會滿足這項需求。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

讀寫存取 DynamoDB 及使用 DAX 進行唯讀存取

針對給定的使用者角色,您可以提供 DynamoDB 資料表的讀寫存取,同時也允許透過 DAX 進行唯讀存取。

針對 Bob,BobUserRole 的 IAM 政策需要允許對 Books 資料表進行 DynamoDB 讀取及寫入動作,同時也支援透過 DAXCluster01 進行唯讀動作。

以下 BobUserRole 的範例政策文件會授予這項存取。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

此外,DAXServiceRole 將需要允許 DAXCluster01Books 資料表執行唯讀動作的 IAM 政策。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

讀寫存取 DynamoDB 及讀寫存取 DAX

現在假設 Bob 需要對 Books 資料表進行讀寫存取,無論是直接透過 DynamoDB,或間接透過 DAXCluster01。以下政策文件 (連接到 BobAccessPolicy) 會授予這項存取。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

此外,DAXServiceRole 將需要允許 DAXCluster01Books 資料表執行讀寫動作的 IAM 政策。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

透過 DAX 存取 DynamoDB,但不直接存取 DynamoDB

在此案例中,Bob 可透過 DAX 存取 Books 資料表,但無法直接存取 DynamoDB 中的 Books 資料表。因此,當 Bob 取得 DAX 的存取時,他也同時會取得透過其他方式皆無法取得的 DynamoDB 資料表的存取。當您為 DAX 服務角色設定 IAM 政策時,請記得任何透過使用者存取政策取得 DAX 叢集存取的使用者,都會取得在該政策中指定資料表的存取。在此情況下,BobAccessPolicy 可以存取 DAXAccessPolicy 中指定的資料表。

使用者可透過 DAX 叢集存取資料表而無需直接 DynamoDB 存取的案例。

若您目前使用 IAM 角色及政策限制對 DynamoDB 資料表和資料的存取,使用 DAX 可以推翻這些政策。在下列政策中,Bob 可透過 DAX 存取 DynamoDB 資料表,但無法明確的直接存取 DynamoDB 中相同的資料表。

以下連接到 BobUserRole 的政策文件 (BobAccessPolicy) 會授予這項存取。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" } ] }

在此存取政策中,沒有任何可直接存取 DynamoDB 的許可。

搭配 BobAccessPolicy,下列 DAXAccessPolicy 可讓 BobUserRole 存取 DynamoDB 資料表 Books,即使 BobUserRole 無法直接存取 Books 資料表。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

如此範例所示,當您設定使用者存取原則和 DAX 叢集存取原則的存取控制時,您必須完全瞭解 end-to-end 存取權限,以確保遵守最低權限原則。您也必須確保給予使用者存取 DAX 叢集不會推翻先前建立的存取控制政策。