Ceph IAM多租戶功能介紹與實踐
介 紹
在本文中,我們將探討如何通過引入 IAM 賬戶來提升 Ceph 的多租戶功能。Ceph 是一個開源的分布式存儲系統(tǒng),廣泛用于大規(guī)模數(shù)據(jù)存儲,提供高性能和高可靠性。隨著多租戶需求的增加,在 Ceph Squid 版本中,Ceph 通過 IAM 賬戶的引入,進(jìn)一步增強了其在多租戶環(huán)境中的管理。
Ceph 通過 IAM 賬戶的引入,提供了更精細(xì)的訪問控制和資源管理。管理員可以為每個租戶創(chuàng)建獨立的 IAM 賬戶,并根據(jù)需要分配相應(yīng)的權(quán)限。這種機制確保了資源的隔離,避免了租戶之間的沖突和安全風(fēng)險。
IAM API 與 AWS S3 完全兼容,并通過對象網(wǎng)關(guān) API 端點提供。這樣,IAM 帳戶管理員(根帳戶)不需要訪問 Ceph 內(nèi)部 radosgw-cli 或 adminOPS API 的權(quán)限,從而在保持安全性的同時增強訪問能力。
隨著 IAM 賬戶的引入,我們新增了一個用戶角色,代表租戶管理員,即 IAM 根賬戶用戶。
- Ceph 對象存儲管理員:負(fù)責(zé)系統(tǒng)范圍的管理和創(chuàng)建 IAM 賬戶。
- IAM 根賬戶用戶:賬戶管理員。管理特定租戶/IAM 賬戶內(nèi)的資源,使用通過 RGW 端點提供的 IAM API。
- S3 最終用戶:在 root 賬戶用戶授予的權(quán)限范圍內(nèi)進(jìn)行操作。
圖片
實踐:在 Ceph 中使用 IAM 賬戶
前提條件:Ceph Squid 或更高版本,并運行 RGW/對象存儲服務(wù)。
下面提供了一個 RGW 配置的案例文件,用于為 RGW 設(shè)置 RGW 服務(wù)和 Ingres 服務(wù)(負(fù)載均衡)。
# cat << EOF > /root/rgw-ha.spec
---
service_type: ingress
service_id: rgw.rgwsrv
service_name: ingress.rgw.rgwsrv
placement:
count: 2
hosts:
- ceph-node-02.cephlab.com
- ceph-node-03.cephlab.com
spec:
backend_service: rgw.rgwsrv
first_virtual_router_id: 50
frontend_port: 80
monitor_port: 1497
virtual_ip: 192.168.122.100
---
service_type: rgw
service_id: rgwsrv
service_name: rgw.rgwsrv
placement:
count: 3
hosts:
- ceph-node-03.cephlab.com
- ceph-node-00.cephlab.com
- ceph-node-01.cephlab.com
spec:
rgw_frontend_port: 8080
rgw_realm: realm1
rgw_zone: zone1
rgw_zonegroup: zonegroup1
EOF
# ceph orch apply -i /root/rgw-ha.spec
此處使用了192.168.122.100作為訪問 IP ,該IP解析的域名為s3.zone1.cephlab.com 。
如何創(chuàng)建和設(shè)置 IAM賬戶作為對象存儲管理員
下面將逐步完成配置 IAM 賬戶、創(chuàng)建用戶和應(yīng)用權(quán)限的步驟。
創(chuàng)建 IAM 賬戶
我們將會使用 radosgw-admin 命令行工具來創(chuàng)建一個 IAM 賬戶,用于分析 Web 應(yīng)用程序;當(dāng)然也可以使用 AdminOPS API。
在這個案例中,我們首先創(chuàng)建 IAM 賬戶,然后定義這個特定 IAM 賬戶可以從全局 RGW/對象存儲系統(tǒng)中訪問的資源。
# radosgw-admin account create --account-name=analytic_app
該命令創(chuàng)建一個名為`analytic_app`的賬戶。該賬戶使用默認(rèn)配額和限制進(jìn)行初始化,之后可能會進(jìn)行調(diào)整。使用 IAM 賬戶時,會創(chuàng)建一個 RGW 賬戶 ID,當(dāng)我們需要引用它時,它將成為主體 ARN 的一部分,
例如:arn:aws:iam::RGW00889737169837717:user/name。
輸出:
{
"id": "RGW00889737169837717",
"tenant": "analytics",
"name": "analytic_app",
"max_users": 1000,
...
}
修改 IAM 賬戶限制
作為 RGW 管理員,在此示例中,我們調(diào)整賬戶的最大用戶數(shù):
# radosgw-admin account modify --max-users 10 --account-name=analytic_app
這可確保 IAM 賬戶最多可以創(chuàng)建十個用戶。根據(jù)我們需求,還可以管理組、密鑰、策略、存儲桶等的最大數(shù)量。
設(shè)置 IAM 賬戶配額
作為創(chuàng)建 IAM 賬戶的一部分,我們可以啟用并定義賬戶配額來控制資源使用。在本例中,我們將賬戶的最大存儲使用量配置為 20GB,我們還可以配置與每個存儲桶的對象計數(shù)相關(guān)的其他配額:
# radosgw-admin quota set --quota-scope=account --account-name=analytic_app --max-size=20G
# radosgw-admin quota enable --quota-scope=account --account-id=RGW00889737169837717
為新 IAM 賬戶創(chuàng)建賬戶根用戶
每個 IAM 賬戶均由 root 用戶管理,該用戶對賬戶內(nèi)的所有資源擁有默認(rèn)權(quán)限。與普通用戶和角色一樣,帳戶和帳戶 root 用戶必須由管理員使用 radosgw-admin 或 Admin Ops API 創(chuàng)建。
要為analytic_app帳戶創(chuàng)建帳戶根用戶,運行以下命令:
# radosgw-admin user create --uid=root_analytics_web --display-name=root_analytics_web --account-id=RGW00889737169837717 --account-root --gen-secret --gen-access-key
輸出示例:
{
"user_id": "root_analytics_web",
"access_key": "1EHAKZAXKPV6LU65QS2R",
"secret_key": "AgXK1BqPOP25pt0HvERDts2yZtFNfF4Mm8mCnoJX",
...
}
根賬戶用戶現(xiàn)在已準(zhǔn)備好在 IAM 賬戶內(nèi)創(chuàng)建和管理用戶、組、角色和權(quán)限。這些資源可以通過 RGW 提供的 IAM API 進(jìn)行管理和管理。此時,RGW 管理員可以將 IAM 帳戶的根用戶的憑證提供給負(fù)責(zé)該帳戶的人員。該人員可以使用 RGW 提供的 IAM API 執(zhí)行與其賬戶相關(guān)的所有管理操作,這完全由 RGW 管理員操作。
以下是 IAM 根賬戶無需 RGW 管理員權(quán)限即可執(zhí)行的一些操作:
- 創(chuàng)建、修改和刪除用戶
- 管理賬戶用戶訪問和ak,sk密鑰
- 管理 IAM 策略
- 管理 IAM 用戶策略
- 管理 IAM 組
- 創(chuàng)建、修改和刪除 OIDC providers
- 創(chuàng)建、修改和刪除 Notification Topics
通過 IAM API 創(chuàng)建用戶、組和角色作為 IAM 根賬戶
在 IAM 賬戶中創(chuàng)建新的 IAM 用戶
現(xiàn)在,我們將使用上一步中生成的 IAM 根賬戶的訪問密鑰來配置 AWS CLI。默認(rèn)情況下,IAM API 在 Ceph 對象網(wǎng)關(guān) (RGW) 端點上可用。在此示例中,
我們將s3.zone1.cephlab.com作為訪問域名,提供對 API 的訪問。
# dnf install awscli -y
# aws configure
AWS Access Key ID [****************dmin]: 1EHAKZAXKPV6LU65QS2R
AWS Secret Access Key [****************dmin]: AgXK1BqPOP25pt0HvERDts2yZtFNfF4Mm8mCnoJX
Default region name [multizg]: zonegroup1
Default output format [json]: json
# aws configure set endpoint_url http://s3.zone1.cephlab.com
將analytics_frontend作為新的 IAM 用戶添加到分析 IAM 賬戶:
# aws iam create-user --user-name analytics_frontend
為新用戶分配訪問的ak與sk密鑰:
# aws iam create-access-key --user-name analytics_frontend
此時用戶無法訪問S3資源。下一步,我們將使用戶能夠訪問資源。以下是嘗試以analytics_frontend用戶身份訪問 S3 命名空間而不附加策略的示例:
# aws --profile analytics_backend s3 ls
argument of type 'NoneType' is not iterable
# aws --profile analytics_backend s3 ls s3://staticfront/
argument of type 'NoneType' is not iterable
為 IAM 用戶提供 S3 資源訪問權(quán)限的選項
有多種方法來授予新 IAM 用戶訪問賬戶中可用的各種資源的權(quán)限,例如 IAM、S3 和 SNS 資源:
- 附加預(yù)定義的托管策略;托管 IAM 策略可以附加到多個 IAM 實體(用戶、組、角色)并且可以在多個AWS賬戶中重復(fù)使用。
- 創(chuàng)建自定義內(nèi)聯(lián)用戶或組策略(使用戶成為附加策略的組的一部分)
- 承擔(dān)現(xiàn)有的 IAM 角色以獲取授予該角色的權(quán)限
示例 1. 將托管策略附加到新 IAM 用戶
在第一個示例中,我們將使用托管策略policy/AmazonS3FullAccess來允許analytics_frontend用戶完全訪問 IAM 賬戶 S3 資源:
# aws iam attach-user-policy --user-name analytics_frontend --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
附加托管策略后,我們可以創(chuàng)建 IAM 賬戶的 S3 資源,例如:
# aws --profile analytics_frontend s3 mb s3://staticfront
make_bucket: staticfront
示例 2. 將托管策略附加到組并將 IAM 用戶添加到該組
首先創(chuàng)建一個 IAM 組來管理需要類似角色的用戶的權(quán)限。在這種情況下,我們正在為前端監(jiān)控團(tuán)隊創(chuàng)建一個組。
# aws iam create-group --group-name frontend-monitoring
將策略附加到組:在本示例中,我們將向組附加 S3 只讀訪問策略,以便所有用戶繼承權(quán)限并可以以只讀模式訪問 S3 資源。不允許對 S3 數(shù)據(jù)集進(jìn)行修改。
# aws iam attach-group-policy --group-name frontend-monitoring --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
檢查策略是否已成功附加到組:
# aws iam list-attached-group-policies --group-name frontend-monitoring
{
"AttachedPolicies": [
{
"PolicyName": "AmazonS3ReadOnlyAccess",
"PolicyArn": "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}
]
}
使用其密鑰創(chuàng)建將成為組成員的單獨 IAM 用戶。
# aws iam create-user --user-name mon_user1
# aws iam create-user --user-name mon_user2
# aws iam create-access-key --user-name mon_user1
# aws iam create-access-key --user-name mon_user2
將上一步中創(chuàng)建的用戶添加到`frontend-monitoring`組,以便他們繼承權(quán)限。
# aws iam get-group --group-name frontend-monitoring
{
"Users": [
{
"Path": "/",
"UserName": "mon_user1",
"UserId": "fe09d373-08e8-4b61-bffa-6f65eaf11e56",
"Arn": "arn:aws:iam::RGW60952341557974488:user/mon_user1"
},
{
"Path": "/",
"UserName": "mon_user2",
"UserId": "29c57263-1293-4bdf-90e4-a784859f12ef",
"Arn": "arn:aws:iam::RGW60952341557974488:user/mon_user2"
}
],
"Group": {
"Path": "/",
"GroupName": "frontend-monitoring",
"GroupId": "a453d5af-4e25-401c-be76-b4075419cc94",
"Arn": "arn:aws:iam::RGW60952341557974488:group/frontend-monitoring"
}
}
確認(rèn)兩個用戶都是該組的一部分:
# aws iam create-user --user-name static_ro
# aws iam create-access-key --user-name static_ro
示例 3. 創(chuàng)建自定義內(nèi)聯(lián)策略并將其附加到特定用戶
此示例演示了創(chuàng)建內(nèi)聯(lián)策略并將其附加到 IAM 中的特定用戶。內(nèi)聯(lián)策略定義單個用戶的權(quán)限并直接嵌入到他們的身份中。雖然此示例重點介紹PutUserPolicy操作,但如果您需要管理這些實體的權(quán)限,則相同的方法也適用于組 (PutGroupPolicy) 和角色 (PutRolePolicy)。
我們首先創(chuàng)建一個將被分配自定義內(nèi)聯(lián)策略的用戶。
# aws iam create-user --user-name static_ro
# aws iam create-access-key --user-name static_ro
我們創(chuàng)建一個包含策略文檔的 JSON 文件來定義自定義內(nèi)聯(lián)策略。此策略允許用戶對特定 S3 存儲桶及其對象執(zhí)行只讀操作。
# cat << EOF > analytics_policy_web_ro.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::staticfront/*",
"arn:aws:s3:::staticfront"
]
}
]
}
EOF
策略字段說明:
- Effect:允許指定該策略授予權(quán)限。
- Action:包括 s3:GetObject、s3:ListBucket 和 s3:ListBucketMultipartUploads,允許用戶讀取數(shù)據(jù)并列出 S3 存儲桶中的對象。
- Resource:指定 S3 存儲桶 (analytics:staticfront) 及其對象。
使用 put-user-policy 命令將策略附加到用戶。
# aws iam put-user-policy --user-name static_ro --policy-name analytics-static-ro --policy-document file://analytics_policy_web_ro.json
列出附加到用戶的內(nèi)聯(lián)策略以確認(rèn)策略已成功應(yīng)用。
# aws iam list-user-policies --user-name static_ro
{
"PolicyNames": [
"analytics-static-ro"
]
}
結(jié) 論
在Ceph Squid 版本,IAM賬戶的引入將極大地提升Ceph在多租戶環(huán)境中的表現(xiàn)。未來,社區(qū)計劃進(jìn)一步優(yōu)化IAM賬戶的功能,提供更多的自定義選項和自動化工具,以滿足不同用戶的需求。
通過引入IAM賬戶,Ceph在多租戶環(huán)境中的靈活性和安全性得到了顯著提升。我們期待這一新功能能夠為用戶帶來更好的體驗,并幫助用戶在復(fù)雜的多租戶環(huán)境中更高效地管理存儲資源。