使用存储分段和组访问策略
StorageGRID 使用 Amazon Web Services ( AWS )策略语言允许 S3 租户控制对这些存储分段和对象的访问。StorageGRID 系统实施 S3 REST API 策略语言的一个子集。S3 API 的访问策略以 JSON 格式写入。
访问策略概述
StorageGRID 支持两种访问策略。
-
存储分段策略,使用GetBucketPolicy、PutBucketPolicy和DeleteBucketPolicy S3 API操作或租户管理器或租户管理API进行管理。存储分段策略附加到存储分段,因此,可以对其进行配置,以控制存储分段所有者帐户或其他帐户中的用户对存储分段及其对象的访问。一个存储分段策略适用场景 只能包含一个存储分段,并且可能包含多个组。
-
* 组策略 * ,使用租户管理器或租户管理 API 配置。组策略会附加到帐户中的某个组,因此,这些策略会配置为允许该组访问该帐户拥有的特定资源。一个组策略只对一个组进行适用场景 ,并且可能对多个存储分段进行。
组策略和存储分段策略之间的优先级没有差别。 |
StorageGRID 存储分段和组策略遵循由 Amazon 定义的特定语法。每个策略中都包含一组策略语句,每个语句都包含以下元素:
-
语句 ID ( SID )(可选)
-
影响
-
主体 / 不重要
-
资源 /NotResource
-
操作 / 未操作
-
条件(可选)
策略语句是使用此结构构建的,用于指定权限: Grant <Effic> to allow/deny <Principe> to Perform <Action> on <Resource> when <condition> applies 。
每个策略元素都用于特定功能:
Element | 说明 |
---|---|
SID |
Sid 元素是可选的。SID 仅用作用户的问题描述 。它会被存储,但不会被 StorageGRID 系统解释。 |
影响 |
使用 Effect 元素确定是否允许或拒绝指定的操作。您必须使用支持的 Action Element 关键字来确定允许(或拒绝)对存储分段或对象执行的操作。 |
主体 / 不重要 |
您可以允许用户,组和帐户访问特定资源并执行特定操作。如果请求中不包含 S3 签名,则可以通过指定通配符( * )作为主体来进行匿名访问。默认情况下,只有帐户 root 有权访问该帐户拥有的资源。 您只需要在存储分段策略中指定主体元素。对于组策略,附加该策略的组为隐式主体元素。 |
资源 /NotResource |
资源元素用于标识分段和对象。您可以使用 Amazon 资源名称( ARN )来标识资源,从而允许或拒绝对存储分段和对象的权限。 |
操作 / 未操作 |
操作和效果元素是权限的两个组成部分。当组请求资源时,它们会被授予或拒绝访问该资源。除非您明确分配权限,否则访问将被拒绝,但您可以使用显式拒绝覆盖由其他策略授予的权限。 |
条件 |
条件元素是可选的。通过条件,您可以构建表达式以确定何时应用策略。 |
在 Action 元素中,您可以使用通配符( * )指定所有操作或部分操作。例如,此操作与 S3 : GetObject , S3 : PutObject 和 S3 : DeleteObject 等权限匹配。
s3:*Object
在资源元素中,可以使用通配符( \* )和(?)。星号( * )与 0 个或更多字符匹配时,问号(?) 匹配任意单个字符。
在Principal元素 中、不支持使用通配符、但设置匿名访问除外、此操作会向所有人授予权限。例如,您将通配符( * )设置为 Principal 值。
"Principal":"*"
"Principal":{"AWS":"*"}
在以下示例中,该语句使用的是 " 影响 " , " 主体 " , " 操作 " 和 " 资源 " 元素。此示例显示了一个完整的存储分段策略语句,该语句使用“允许”效应授予Principals、admin组和Finance组 federated-group/finance`对名为的存储分段执行操作的权限,并 `s3:GetObject`授予 `federated-group/admin`对该存储分 `mybucket`段中所有对象执行操作的权限 `s3:ListBucket
。
{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::27233906934684427525:federated-group/admin", "arn:aws:iam::27233906934684427525:federated-group/finance" ] }, "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::mybucket", "arn:aws:s3:::mybucket/*" ] } ] }
存储分段策略的大小限制为 20 , 480 字节,而组策略的大小限制为 5 , 120 字节。
策略一致性
默认情况下,对组策略所做的任何更新最终都是一致的。当组策略保持一致时、由于策略缓存、更改可能需要额外15分钟才能生效。默认情况下、您对存储分段策略进行的任何更新都具有强烈的一致性。
您可以根据需要更改存储分段策略更新的一致性保证。例如、您可能希望在站点中断期间对存储分段策略进行更改。
在这种情况下、您可以在PutBucketPolicy请求中设置 `Consistency-Control`标题、也可以使用Put BucketPolicy一致性请求。如果存储分段策略保持一致、则由于策略缓存、所做的更改可能需要额外8秒才能生效。
如果您将一致性设置为其他值以解决临时情况、请务必在完成后将存储分段级别设置恢复为其原始值。否则、所有未来存储分段请求都将使用修改后的设置。 |
在策略语句中使用 ARN
在策略语句中, ARN 用于 Principal 和 Resource Element 。
-
使用以下语法指定 S3 资源 ARN :
arn:aws:s3:::bucket-name arn:aws:s3:::bucket-name/object_key
-
使用以下语法指定身份资源 ARN (用户和组):
arn:aws:iam::account_id:root arn:aws:iam::account_id:user/user_name arn:aws:iam::account_id:group/group_name arn:aws:iam::account_id:federated-user/user_name arn:aws:iam::account_id:federated-group/group_name
其他注意事项:
-
您可以使用星号( * )作为通配符,以匹配对象密钥中的零个或多个字符。
-
可以在对象密钥中指定的国际字符应使用 JSON UTF-8 或 JSON \u 转义序列进行编码。不支持百分比编码。
PutBucketPolicy操作的HTTP请求正文必须使用charset=UTF-8进行编码。
在策略中指定资源
在策略语句中,您可以使用资源元素指定允许或拒绝权限的分段或对象。
-
每个策略语句都需要一个资源元素。在策略中,资源用元素表示,或者以排除方式
NotResource`表示 `Resource
。 -
您可以使用 S3 资源 ARN 指定资源。例如:
"Resource": "arn:aws:s3:::mybucket/*"
-
您也可以在对象密钥中使用策略变量。例如:
"Resource": "arn:aws:s3:::mybucket/home/${aws:username}/*"
-
资源值可以指定创建组策略时尚不存在的存储分段。
指定策略中的主体
使用 Principal 元素标识策略语句允许 / 拒绝访问资源的用户,组或租户帐户。
-
存储分段策略中的每个策略语句都必须包含一个主体元素。组策略中的策略语句不需要Principal元素、因为该组被理解为主体。
-
在策略中、主体由元素"Principal"或"NotPrincipal"表示以供排除。
-
必须使用 ID 或 ARN 指定基于帐户的身份:
"Principal": { "AWS": "account_id"} "Principal": { "AWS": "identity_arn" }
-
此示例使用租户帐户 ID 27233906934684427525 ,其中包括帐户 root 和帐户中的所有用户:
"Principal": { "AWS": "27233906934684427525" }
-
您只能指定帐户 root :
"Principal": { "AWS": "arn:aws:iam::27233906934684427525:root" }
-
您可以指定一个特定的联合用户( "Alex" ):
"Principal": { "AWS": "arn:aws:iam::27233906934684427525:federated-user/Alex" }
-
您可以指定特定的联合组( "Managers" ):
"Principal": { "AWS": "arn:aws:iam::27233906934684427525:federated-group/Managers" }
-
您可以指定匿名主体:
"Principal": "*"
-
为避免歧义,您可以使用用户 UUID ,而不是用户名:
arn:aws:iam::27233906934684427525:user-uuid/de305d54-75b4-431b-adb2-eb6b9e546013
例如、假设Alex离开了组织、用户名 `Alex`被删除。如果新的Alex加入组织并分配了相同的 `Alex`用户名、则新用户可能会无意中继承授予给原始用户的权限。
-
主体值可以指定在创建存储分段策略时尚不存在的组 / 用户名称。
在策略中指定权限
在策略中, Action 元素用于允许 / 拒绝对资源的权限。您可以在策略中指定一组权限,这些权限由元素 "Action" 或 "NotAction" 表示以表示排除。其中每个元素都映射到特定的 S3 REST API 操作。
下表列出了应用于存储分段的权限以及应用于对象的权限。
现在、Amazon S3会对PutBucketReplication和DeleteBucketReplication操作使用S3:PutReplication配置权限。StorageGRID 对每个操作使用单独的权限,这些权限与原始 Amazon S3 规范匹配。 |
使用放置覆盖现有值时执行删除。 |
应用于存储分段的权限
权限 | S3 REST API 操作 | 为 StorageGRID 自定义 |
---|---|---|
S3 : CreateBucket |
CreateBucket |
是。 注意:仅用于组策略。 |
S3 : DeleteBucket |
DeleteBucket |
|
S3 : DeleteBucketMetadataNotification |
删除存储分段元数据通知配置 |
是 |
S3 : DeleteBucketPolicy |
DeleteBucketPolicy |
|
S3 : DeleteReplicationConfiguration |
DeleteBucketReplication |
可以、分开放置和删除权限 |
S3 : GetBucketAcl |
GetBucketAcl |
|
S3 : GetBucketCompliance |
获取存储分段合规性(已弃用) |
是 |
S3 : GetBucketConsistency |
获取存储分段一致性 |
是 |
S3 : GetBucketCORS |
GetBucketCors |
|
S3 : GetEncryptionConfiguration |
GetBucketEncryption |
|
S3 : GetBucketLastAccessTime |
获取存储分段上次访问时间 |
是 |
S3 : GetBucketLocation |
GetBucketLocation |
|
S3 : GetBucketMetadataNotification |
获取存储分段元数据通知配置 |
是 |
S3 : GetBucketNotification |
GetBucketNotizationConfiguration |
|
S3 : GetBucketObjectLockConfiguration |
GetObjectLockConfiguration |
|
S3 : GetBucketPolicy |
GetBucketPolicy |
|
S3 : GetBucketTagging |
GetBucketTaging |
|
S3 : GetBucketVersioning |
GetBucketVersioning |
|
S3 : GetLifeycleConfiguration |
GetBucketLifecycleConfiguration |
|
S3 : GetReplicationConfiguration |
GetBucketReplication |
|
S3 : ListAllMy桶 |
|
是、对于GET存储使用情况。 注意:仅用于组策略。 |
S3 : ListBucket |
|
|
S3 : ListBucketMultipartUploads |
|
|
S3 : ListBucketVersions |
获取存储分段版本 |
|
S3 : PutBucketCompliance |
PUT 存储分段合规性(已弃用) |
是 |
S3 : PutBucketConsistency |
PUT 存储分段一致性 |
是 |
S3 : PutBucketCORS |
|
|
S3 : PutEncryptionConfiguration |
|
|
S3 : PutBucketLastAccessTime |
PUT 分段上次访问时间 |
是 |
S3 : PutBucketMetadataNotification |
PUT 存储分段元数据通知配置 |
是 |
S3 : PutBucketNotification |
PutBucketNotizationConfiguration |
|
S3 : PutBucketObjectLockConfiguration |
|
|
S3 : PutBucketPolicy |
PutBucketPolicy |
|
S3 : PutBucketTagging |
|
|
S3 : PutBucketVersioning |
PutBucketVersioning |
|
S3 : PutLifeycleConfiguration |
|
|
S3 : PutReplicationConfiguration |
PutBucketReplication |
可以、分开放置和删除权限 |
应用于对象的权限
权限 | S3 REST API 操作 | 为 StorageGRID 自定义 |
---|---|---|
S3 : AbortMultipartUpload |
|
|
S3:BypassGovernanceRetention |
|
|
S3 : DeleteObject |
|
|
S3 : DeleteObjectTagging |
DeleteObjectTagging |
|
S3 : DeleteObjectVersionTagging |
DeleteObjectTaging(对象的特定版本) |
|
S3 : DeleteObjectVersion |
DeleteObject (对象的特定版本) |
|
S3 : GetObject |
|
|
S3 : GetObjectAcl |
GetObjectAcl |
|
S3 : GetObjectLegend |
GetObjectLegalHold |
|
S3 : GetObjectRetention |
GetObject保留 |
|
S3 : GetObjectTagging |
GetObjectTagging |
|
S3 : GetObjectVersionTagging |
GetObjectTaging(对象的特定版本) |
|
S3 : GetObjectVersion |
GetObject (对象的特定版本) |
|
S3 : ListMultipartUploadPart |
ListParts、RestorEObject |
|
S3 : PutObject |
|
|
S3 : PutObjectLegend |
PutObjectLegalHold |
|
S3 : PutObjectRetention |
PutObject保留 |
|
S3 : PutObjectTagging |
PutObjectTagging |
|
S3 : PutObjectVersionTagging |
PutObjectTaging(对象的特定版本) |
|
S3 : PutOverwriteObject |
|
是 |
S3 : RestoreObject |
RestorEObject |
使用 PutOverwriteObject 权限
S3 : PutOverwriteObject 权限是一种自定义 StorageGRID 权限,适用场景 可通过此权限创建或更新对象。此权限的设置可确定客户端是否可以覆盖对象的数据,用户定义的元数据或 S3 对象标记。
此权限的可能设置包括:
-
* 允许 * :客户端可以覆盖对象。这是默认设置。
-
deny:客户端无法覆盖对象。如果设置为 deny ,则 PutOverwriteObject 权限的工作原理如下:
-
如果在同一路径中找到现有对象:
-
无法覆盖对象的数据、用户定义的元数据或S3对象标记。
-
正在执行的任何载入操作均会取消,并返回错误。
-
如果启用了S3版本控制、则拒绝设置将阻止PutObjectTaging或DeleteObjectTaging操作修改对象及其非最新版本的标记集。
-
-
如果未找到现有对象,此权限将不起作用。
-
-
如果不存在此权限,则效果与设置了 allow 时相同。
如果当前S3策略允许覆盖、并且PutOverwriteObject权限设置为deny、则客户端无法覆盖对象的数据、用户定义的元数据或对象标记。此外,如果选中了*禁止修改客户端*复选框(配置>*安全设置*>*网络和对象*),则该设置将覆盖PutOverwriteObject权限的设置。 |
指定策略中的条件
条件用于定义策略何时生效。条件包括运算符和键值对。
条件使用键值对进行评估。一个条件元素可以包含多个条件,每个条件可以包含多个键值对。条件块使用以下格式:
Condition: { condition_type: { condition_key: condition_values
在以下示例中, ipaddress 条件使用 SourceIp 条件密钥。
"Condition": { "IpAddress": { "aws:SourceIp": "54.240.143.0/24" ... }, ...
支持的条件运算符
条件运算符分为以下几类:
-
字符串
-
数字
-
布尔值
-
IP 地址
-
空检查
条件运算符 | 说明 |
---|---|
StringEquals |
根据完全匹配(区分大小写)将键与字符串值进行比较。 |
StringNotEquals |
根据否定匹配(区分大小写)将键与字符串值进行比较。 |
StringEqualsIgnoreCase |
根据完全匹配将键与字符串值进行比较(忽略大小写)。 |
StringNotEqualsIgnoreCase |
根据否定的匹配将键与字符串值进行比较(忽略大小写)。 |
StringLike |
根据完全匹配(区分大小写)将键与字符串值进行比较。可以包含*和?通配符。 |
StringNotLike |
根据否定匹配(区分大小写)将键与字符串值进行比较。可以包含*和?通配符。 |
数值方程式 |
根据精确匹配将键与数字值进行比较。 |
NumericNotEquals |
根据否定匹配将键与数字值进行比较。 |
数值 GreaterThan |
将键与基于"大于"匹配的数值进行比较。 |
NumericGreaterThals. |
将键与基于"大于或等于"匹配的数值进行比较。 |
数值细小 |
将键与基于"小于"匹配的数值进行比较。 |
数值 ThalEquals |
将键与基于"小于或等于"匹配的数值进行比较。 |
池 |
根据"true或false"匹配将键与布尔值进行比较。 |
IP 地址 |
将密钥与 IP 地址或 IP 地址范围进行比较。 |
NotIpAddress |
根据否定匹配将密钥与 IP 地址或 IP 地址范围进行比较。 |
空 |
检查当前请求上下文中是否存在条件密钥。 |
支持的条件密钥
条件键 | 操作 | 说明 |
---|---|---|
AWS :源 Ip |
IP 运算符 |
将与发送请求的 IP 地址进行比较。可用于存储分段或对象操作。
|
AWS :用户名 |
资源 / 身份 |
将与发送请求的发件人用户名进行比较。可用于存储分段或对象操作。 |
S3 :分隔符 |
S3 : ListBucket 和 S3 : ListBucketVersions 权限 |
将与在ListObjects或ListObjectVersies请求中指定的delifier参数进行比较。 |
S3:<tag-key> |
S3 : DeleteObjectTagging S3 : DeleteObjectVersionTagging S3 : GetObject S3 : GetObjectAcl 3:GetObjectTaging S3 : GetObjectVersion S3:GetObjectVersionAcl S3 : GetObjectVersionTagging S3:PutObjectAcl S3 : PutObjectTagging S3:PutObjectVersion对象 S3 : PutObjectVersionTagging |
将要求现有对象具有特定的标记键和值。 |
S3 :最大密钥 |
S3 : ListBucket 和 S3 : ListBucketVersions 权限 |
将与ListObjects或ListObjectVersies请求中指定的最大键数参数进行比较。 |
S3 : object-lock-real-retenation-days |
S3 : PutObject |
与请求标头中指定的保留截止日期或根据存储分段默认保留期限计算得出的保留截止日期进行比较
|
S3 : object-lock-real-retenation-days |
S3 : PutObjectRetention |
与PutObjectRetain请求中指定的保留截止日期进行比较、以确保该日期在允许的范围内。 |
S3 :前缀 |
S3 : ListBucket 和 S3 : ListBucketVersions 权限 |
将与ListObjects或ListObjectVersies请求中指定的前缀参数进行比较。 |
S3:<tag-key> |
S3 : PutObject S3 : PutObjectTagging S3 : PutObjectVersionTagging |
如果对象请求包含标记、则需要特定的标记密钥和值。 |
指定策略中的变量
您可以在策略中使用变量填充可用的策略信息。您可以在元素中以及元素的字符串比较中 Condition`使用策略变量 `Resource
。
在此示例中,变量 `${aws:username}`是Resource元素的一部分:
"Resource": "arn:aws:s3:::bucket-name/home/${aws:username}/*"
在此示例中、变量 `${aws:username}`是条件块中条件值的一部分:
"Condition": { "StringLike": { "s3:prefix": "${aws:username}/*" ... }, ...
变量 | 说明 |
---|---|
|
使用 SourceIp 键作为提供的变量。 |
|
使用 username 密钥作为提供的变量。 |
|
使用特定于服务的前缀密钥作为提供的变量。 |
|
使用特定于服务的 max-keys 键作为提供的变量。 |
|
特殊字符。使用字符作为文字 * 字符。 |
|
特殊字符。使用字符作为文字?字符。 |
|
特殊字符。使用字符作为文字 $ 字符。 |
创建需要特殊处理的策略
有时,策略可能会授予对安全性有危险或对持续操作(例如锁定帐户的 root 用户)有危险的权限。在策略验证期间, StorageGRID S3 REST API 实施的限制性要低于 Amazon ,但在策略评估期间同样严格。
策略问题描述 | Policy type | Amazon 行为 | StorageGRID 行为 |
---|---|---|---|
拒绝向自己授予对 root 帐户的任何权限 |
存储分段 |
有效且强制实施,但 root 用户帐户保留所有 S3 存储分段策略操作的权限 |
相同 |
拒绝用户 / 组的任何权限 |
组 |
有效且强制实施 |
相同 |
允许外部帐户组拥有任何权限 |
存储分段 |
主体无效 |
有效,但如果某个策略允许,则所有 S3 存储分段策略操作的权限均会返回 405 Method not allowed 错误 |
允许外部帐户 root 或用户拥有任何权限 |
存储分段 |
有效,但如果某个策略允许,则所有 S3 存储分段策略操作的权限均会返回 405 Method not allowed 错误 |
相同 |
允许所有人对所有操作拥有权限 |
存储分段 |
有效,但对所有 S3 存储分段策略操作的权限会为外部帐户 root 和用户返回 405 Method not allowed 错误 |
相同 |
拒绝任何人对所有操作的权限 |
存储分段 |
有效且强制实施,但 root 用户帐户保留所有 S3 存储分段策略操作的权限 |
相同 |
主体是不存在的用户或组 |
存储分段 |
主体无效 |
有效 |
资源不是 S3 存储分段 |
组 |
有效 |
相同 |
主体是一个本地组 |
存储分段 |
主体无效 |
有效 |
策略授予非所有者帐户(包括匿名帐户)放置对象的权限。 |
存储分段 |
有效。对象由创建者帐户拥有,并且存储分段策略不适用。创建者帐户必须使用对象 ACL 为对象授予访问权限。 |
有效。对象由存储分段所有者帐户拥有。存储分段策略适用。 |
一次写入多读( WORM )保护
您可以创建一次写入多读( Write Once Read-Many , WORM )分段来保护数据,用户定义的对象元数据和 S3 对象标记。您可以配置 WORM 分段,以便创建新对象并防止覆盖或删除现有内容。请使用此处所述的方法之一。
为了确保覆盖始终被拒绝,您可以:
-
在网格管理器中,转到*configuration*>*Security*>*Security settings >*Network and objects,然后选中*prevent client修改*复选框。
-
应用以下规则和 S3 策略:
-
向 S3 策略添加 PutOverwriteObject deny 操作。
-
将 DeleteObject deny 操作添加到 S3 策略中。
-
将PutObject Allow操作添加到S3策略中。
-
在S3策略中将DeleteObject设置为deny不会阻止ILM在存在"30天后将副本置零"等规则时删除对象。 |
即使应用了所有这些规则和策略、它们也无法防止并发写入(请参见情形A)。它们可以防止顺序完成的覆盖(请参见情况 B )。 |
-
情形 A* :并发写入(不受保护)
/mybucket/important.doc PUT#1 ---> OK PUT#2 -------> OK
-
情形 B* :顺序完成的覆盖(防止)
/mybucket/important.doc PUT#1 -------> PUT#2 ---X (denied)