在 AWS 資料湖的建置與管理中,許可權控管至關重要。以往仰賴 IAM 策略以 JSON 格式管理資料湖的存取許可權,設定繁瑣且不易維護。AWS Lake Formation 的出現,簡化了資料湖的許可權管理流程,讓管理員能以更直覺的方式控制資料存取。本文將探討 Lake Formation 的許可權管理機制,並提供實務操作步驟,引導讀者逐步設定 IAM 策略與 Lake Formation 許可權,以達到更精細的資料存取控管。
AWS Lake Formation許可權管理詳解與實務操作
AWS Lake Formation是一種簡化資料湖設定和管理的服務,其中一個重要的功能是能夠管理資料湖資料函式庫和表的存取許可權(授權),而無需透過IAM服務中的JSON策略檔案來管理細粒度的存取控制。
使用AWS Lake Formation管理資料湖存取許可權
Lake Formation允許資料湖管理員使用熟悉的資料函式庫概念(如授予和復原)來管理資料湖資料函式庫、表和列的細粒度許可權。例如,資料湖管理員可以將特定資料湖表的SELECT許可權(有效地讀取許可權)授予特定的IAM使用者或角色。
Lake Formation的許可權管理是另一層有用的許可權管理機制,用於管理對資料湖資源的細粒度存取,但它與IAM許可權共同工作,而不是取代IAM許可權。建議的做法是,在IAM策略中為使用者應用廣泛的許可權,然後使用Lake Formation應用細粒度的許可權。
Lake Formation之前的許可權管理
在Lake Formation服務發布之前,所有資料湖的許可權都是在Amazon S3級別使用JSON編寫的IAM策略檔案進行管理的。這些策略將控制對以下資源的存取:
- Glue資料目錄中的資料目錄物件(如存取Glue資料函式庫和表的許可權)
- Amazon S3中的底層物理儲存(如Amazon S3儲存桶中的Parquet或CSV檔案)
- 分析服務的存取(如Amazon Athena或AWS Glue)
例如,IAM策略將提供多個Glue許可權,包括讀取目錄物件(如Glue表和表分割槽)的能力以及搜尋表的能力。但是,策略的資源部分將這些許可權限制在使用者應該存取的特定資料函式庫和表上。該策略還將具有提供對底層S3資料的許可權的部分。
對於使用者需要在Glue資料目錄中存取的每個表,他們需要同時具有Glue資料目錄物件的許可權以及底層檔案的Amazon S3許可權。IAM策略的最後一部分還需要使用者具有存取相關分析工具的許可權,例如存取Amazon Athena服務的許可權。
使用AWS Lake Formation進行許可權管理
使用AWS Lake Formation,許可權管理被更改,以便可以在IAM策略中提供對Glue目錄物件的廣泛存取,並透過Lake Formation許可權控制細粒度存取。
使用Lake Formation,資料湖使用者不需要被授予對底層S3物件的直接許可權,因為Lake Formation服務可以向相容的分析服務提供臨時憑證以存取S3資料。
值得注意的是,Lake Formation許可權存取僅適用於相容的分析服務,目前包括以下AWS服務:
- Amazon Athena
- Amazon QuickSight
- 在Amazon EMR上執行的Apache Spark
- Amazon Redshift Spectrum
- AWS Glue
如果使用這些相容的服務,AWS Lake Formation是管理資料湖許可權的更簡單方法。資料湖使用者仍然需要具有關聯的IAM策略,該策略授予他們存取AWS Glue服務、Lake Formation服務和任何所需的分析引擎(如Amazon Athena)的許可權。但是,在IAM級別,使用者可以被授予存取所有AWS Glue物件的許可權。然後,可以使用Lake Formation許可權層來控制使用者可以存取哪些特定的Glue目錄物件。
由於Lake Formation服務將臨時憑證傳遞給相容的分析服務以從Amazon S3讀取資料,因此資料湖使用者不再需要在其IAM策略中提供任何直接的Amazon S3許可權。
實務操作:組態Lake Formation許可權
在這個實務操作部分,我們將使用AWS Management Console組態Lake Formation許可權。首先,我們將建立一個新的資料湖使用者,並使用IAM許可權組態他們的許可權。然後,我們將更新Glue資料函式庫和表以使用Lake Formation許可權,並將Lake Formation許可權授予我們的資料湖使用者。
建立具有IAM許可權的新使用者
首先,讓我們建立一個新的IAM使用者,該使用者將成為我們的資料湖使用者。我們最初將使用IAM授予我們的資料湖使用者以下許可權:
- 存取Glue資料目錄中特定資料函式庫和表的許可權
- 使用Amazon Athena服務對資料湖執行SQL查詢的許可權
首先,讓我們建立一個新的IAM策略,該策略授予使用Athena和Glue所需的許可權,但將這些許可權限制在Glue目錄中的CleanZoneDB上。要做到這一點,我們將複製Athena Full Access的Amazon託管策略,但我們將修改該策略以限制對特定Glue資料函式庫的存取,並將S3許可權新增到該策略中。讓我們開始吧:
登入到AWS Management Console,並使用以下連結存取IAM服務:https://console.aws.amazon.com/iam/home。
在左側,點選“策略”,然後在“篩選策略”中輸入“Athena”。
從篩選後的策略列表中,展開AmazonAthenaFullAccess策略。
點選JSON策略框內部,並將整個策略複製到您的電腦剪貼簿。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "athena:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "glue:CreateDatabase", "glue:DeleteDatabase", "glue:GetDatabase", "glue:GetDatabases", "glue:UpdateDatabase", "glue:CreateTable", "glue:DeleteTable", "glue:GetTable", "glue:GetTables", "glue:UpdateTable", "glue:CreatePartition", "glue:DeletePartition", "glue:GetPartition", "glue:GetPartitions", "glue:UpdatePartition" ], "Resource": [ "arn:aws:glue:*:*:database/CleanZoneDB", "arn:aws:glue:*:*:table/CleanZoneDB/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::your-bucket-name/CleanZoneDB/*" ] } ] }內容解密:
- 上述JSON策略檔案定義了一個IAM策略,該策略授予對Athena和Glue的特定操作的存取權,並限制對特定Glue資料函式庫(CleanZoneDB)和相關S3儲存桶的存取。
- 第一部分允許所有Athena操作在所有資源上。
- 第二部分允許特定的Glue操作,但僅限於CleanZoneDB資料函式庫及其下的表。
- 第三部分允許從S3儲存桶中檢索物件和列出儲存桶內容,但僅適用於與CleanZoneDB相關的S3路徑。
在頁面頂部,點選“建立策略”。
組態 Lake Formation 許可權的實務操作
在上一章節中,我們使用 IAM 政策來管理對資料湖的精細存取控制。本章節將引導您完成使用 Lake Formation 組態許可權的實務操作。
建立 IAM 政策以存取 Glue 資料目錄和 S3 儲存桶
首先,我們需要建立一個 IAM 政策,以提供必要的許可權給 Glue 資料目錄和 S3 儲存桶。
- 登入 AWS 管理控制檯,並導航至 IAM 儀錶板。
- 在左側導航欄中,點選「政策」,然後點選「建立政策」。
- 選擇「自訂政策」,然後點選「JSON」標籤。
- 將 Athena 完整存取政策貼入 JSON 編輯器中,取代現有的文字。
- 修改政策以限制對 Glue 資源的存取,僅允許存取
CleanZoneDB資料函式庫和其下的所有表格。
“Resource”: [ “arn:aws:glue:::catalog”, “arn:aws:glue:::database/cleanzonedb”, “arn:aws:glue:::database/cleanzonedb*”, “arn:aws:glue:::table/cleanzonedb/*” ]
此圖示顯示了更新後的政策:
此圖示
6. 在提供 Glue 許可權的區段後面,新增對 S3 儲存桶的存取許可權。
```json
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::dataeng-clean-zone-<initials>/*"
]
}
此圖示顯示了新增 S3 許可權後的政策: 此圖示
- 點選「下一步:標籤」,然後可選地新增標籤。
- 點選「下一步:檢閱」,並為政策命名(例如
AthenaAccessCleanZoneDB)。 - 點選「建立政策」。
建立新的 IAM 使用者並附加政策
接下來,我們需要建立一個新的 IAM 使用者,並將剛才建立的政策附加到該使用者。
- 在左側導航欄中,點選「使用者」,然後點選「新增使用者」。
- 輸入使用者名稱(例如
datalake-user),並選擇「AWS 管理主控台存取」。 - 設定自訂密碼,並清除「需要密碼重設」的核取方塊。
- 點選「下一步:許可權」,然後選擇「直接附加現有的政策」。
- 搜尋並選擇剛才建立的政策(
AthenaAccessCleanZoneDB)。 - 點選「下一步:標籤」,然後可選地新增標籤。
- 檢閱組態並點選「建立使用者」。
建立 S3 儲存桶以儲存 Athena 查詢結果
現在,我們需要建立一個新的 S3 儲存桶,以儲存 Athena 查詢結果。
- 在 AWS 管理控制檯中,搜尋並選擇 S3 服務。
- 點選「建立儲存桶」,並輸入儲存桶名稱(例如
aws-athena-query-results-dataengbook-<initials>)。 - 確保區域設定正確,然後點選「建立儲存桶」。
驗證 datalake-user 的許可權
最後,我們需要驗證 datalake-user 的許可權是否正確組態。
- 登出 AWS 管理控制檯,並使用
datalake-user登入。 - 搜尋並選擇 Athena 服務。
- 設定查詢結果位置為剛才建立的 S3 儲存桶。
- 執行 SQL 查詢(例如
SELECT * FROM cleanzonedb.csvparquet;)。 - 如果許可權組態正確,查詢結果應該會顯示在下方視窗中。
至此,我們已經完成了使用 IAM 政策管理資料湖精細存取控制的組態。在下一章節中,我們將轉換到使用 Lake Formation 管理資料湖物件的精細許可權。
AWS Lake Formation 許可權設定與資料治理
在資料湖的管理中,AWS Lake Formation 提供了一層額外的許可權控制,以增強資料的安全性和治理能力。本章節將探討如何啟用 Lake Formation 對資料函式庫和資料表的許可權控制,並深入瞭解其與 IAM 政策許可權的協同運作機制。
啟用 Lake Formation 許可權
預設情況下,Lake Formation 允許透過 IAM 許可權進行資料存取,這種模式被稱為「Pass-Through」許可權。要啟用 Lake Formation 的細粒度許可權控制,需移除 IAMAllowedPrincipals 的 Pass-Through 許可權。
操作步驟:
登入 AWS 管理控制檯,並以一般使用者身份進入 Lake Formation 服務。
在首次存取 Lake Formation 時,系統會提示設定初始的管理員角色,選擇「Add myself」將當前使用者新增為 Lake Formation 的管理員。
圖 4.6 – 將使用者新增為 Lake Formation 管理員
進入 Lake Formation 控制檯後,點選左側選單中的「Databases」,並選擇
cleanzonedb資料函式庫。在
cleanzonedb的詳細資訊頁面,點選「Actions」並選擇「View permissions」。在許可權檢視頁面,可以看到
DataEngLambdaS3CWGlueRole和IAMAllowedPrincipals兩個許可權設定。其中,IAMAllowedPrincipals是預設的 Pass-Through 許可權。圖 4.7 – Lake Formation 對
cleanzonedb的許可權設定移除
IAMAllowedPrincipals的許可權,以啟用 Lake Formation 的細粒度許可權控制。點選IAMAllowedPrincipals的選擇框,並點選「Revoke」。圖 4.8 – 復原
cleanzonedb的 Pass-Through 許可權對
CSVParquet資料表重複上述步驟,以移除其 Pass-Through 許可權。
程式碼範例與解析
# 使用 AWS SDK 設定 Lake Formation 的資料存取許可權
import boto3
lakeformation = boto3.client('lakeformation')
# 定義要授予許可權的資料表和使用者
database_name = 'cleanzonedb'
table_name = 'csvparquet'
principal = {'DataLakePrincipalIdentifier': 'datalake-user'}
# 授予 SELECT 許可權並排除特定欄位
lf_permissions = ['SELECT']
lf_resource = {
'DataLocation': {
'ResourceArn': f'arn:aws:s3:::your-s3-bucket/{database_name}/{table_name}'
}
}
# 設定欄位過濾條件
column_wildcard = {'ExcludedColumnNames': ['Age']}
try:
response = lakeformation.grant_permissions(
Principal=principal,
Resource={
'Table': {
'DatabaseName': database_name,
'Name': table_name,
'ColumnWildcard': column_wildcard
}
},
Permissions=lf_permissions
)
print("Granted permissions successfully:", response)
except Exception as e:
print("Error granting permissions:", e)
#### 內容解密:
lakeformation.grant_permissions方法:此方法用於授予特定主體(如使用者或角色)對 Lake Formation 資源(如資料表)的存取許可權。Principal引數:指定要授予許可權的目標主體,例如datalake-user。Resource引數:定義要授予許可權的資源,包括資料函式庫名稱、資料表名稱以及欄位過濾條件。Permissions引數:指定授予的許可權型別,例如SELECT以允許查詢操作。ColumnWildcard設定:透過ExcludedColumnNames指定排除的欄位(如Age),實作欄位層級的存取控制。
Lake Formation 許可權的實際應用
在啟用 Lake Formation 細粒度許可權後,使用者需同時具備 IAM 和 Lake Formation 的許可權才能存取資料。這種機制使得資料治理更加靈活和精確。例如,透過授予 datalake-user 對 CSVParquet 資料表的 SELECT 許可權,但排除 Age 欄位,可以有效控制敏感資料的存取。