访问管理
概述
MinIO 使用 Policy-Based Access Control (PBAC) 来定义已认证用户可访问的授权操作和资源。 每个策略描述一条或多条 actions 与 conditions,用于说明某个 user 或 group 中用户的权限。
MinIO PBAC 在设计上兼容 AWS IAM 策略语法、结构和行为。 MinIO 文档会尽力覆盖 IAM 特定行为和功能。 若需要更完整的 AWS IAM 特定主题文档,请参考 IAM documentation。
mc admin policy 命令支持在 MinIO 部署上创建和管理策略。
用法示例请参见命令参考。
基于标签的策略条件
内置策略
MinIO 提供以下内置策略,可分配给 users 或 groups:
- readonly
授予对 MinIO 部署上任意对象的只读权限。
GET操作 必须 作用于某个具体对象,且不要求具备任何列举权限。 等价于以下 action 集合:例如,该策略专门支持对特定路径下对象执行
GET操作(例如GET play/mybucket/object.file),例如:有意排除列举权限,因为典型使用场景并不希望“只读”角色对对象存储资源具有完整可发现性 (列出所有存储桶和对象)。
- readwrite
授予对 MinIO 服务器上所有存储桶和对象的读写权限。 等价于
s3:*。
- writeonly
授予对 MinIO 部署中任意命名空间(存储桶及对象路径)的只写权限。
PUT操作 必须 作用于某个具体对象位置,且不要求具备任何列举权限。 等价于s3:PutObjectaction。
使用 mc admin policy attach 将策略关联到 MinIO 部署上的用户或组。
例如,考虑下表中的用户。每个用户都被分配了一个 内置策略 或某个受支持的 action。该表描述了客户端以对应用户身份完成认证后可执行的一部分操作:
用户 |
策略 |
操作 |
|---|---|---|
|
对
finance 存储桶执行 PUT 和 GET。对
audit 存储桶执行 GET |
|
|
audit 存储桶上的 readonly |
对 |
|
所有 |
每个用户只能访问内置角色 显式 授予的那些资源和操作。 默认情况下,MinIO 会拒绝访问任何其他资源或 action。
Deny overrides Allow
MinIO 遵循 IAM 策略求值规则,即在同一操作/资源上,Deny 规则会覆盖
Allow 规则。例如,如果某个用户被显式分配的策略对某个操作/资源包含
Allow 规则,而其所属某个组被分配的策略对同一操作/资源包含 Deny 规则,
则 MinIO 只会应用 Deny 规则。
有关 IAM 策略求值逻辑的更多信息,请参见 IAM 文档中的 Determining Whether a Request is Allowed or Denied Within an Account。
策略文档结构
MinIO 策略文档使用与 AWS IAM Policy 文档相同的模式。
以下示例文档为在 MinIO 部署中创建自定义策略提供了模板。 有关 IAM 策略元素的更完整文档,请参见 IAM JSON Policy Elements Reference。
任意单个策略文档的最大大小为 20KiB。 可附加到用户或组的策略文档数量没有限制。
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [ "s3:<ActionName>", ... ],
"Resource" : "arn:aws:s3:::*",
"Condition" : { ... }
},
{
"Effect" : "Deny",
"Action" : [ "s3:<ActionName>", ... ],
"Resource" : "arn:aws:s3:::*",
"Condition" : { ... }
}
]
}
对于
Statement.Action数组,指定一个或多个 受支持的 S3 API 操作。对于
Statement.Resource键,指定要对策略进行限制的存储桶或存储桶前缀。 可以按照 S3 Resource Spec 使用*和?通配符。*通配符可能会基于 模式匹配,导致策略被意外应用到多个存储桶或前缀。 例如,arn:aws:s3:::data*会匹配存储桶data、data_private和data_internal。 如果资源键仅指定*,则该策略会应用到部署上的所有存储桶和前缀。对于
Statement.Condition键,可以指定一个或多个 受支持的 Conditions。
受支持的 S3 策略 Action
MinIO 策略文档支持 IAM S3 Action keys 的一个子集。 本节还包括特定 action 在通用受支持键之外额外支持的任何 condition keys。
以下 action 用于控制常见 S3 操作的访问。 其余小节记录更高级的 S3 操作所对应的 action:
- s3:CreateBucket
控制对 CreateBucket S3 API 操作的访问。
- s3:DeleteBucket
控制对 DeleteBucket S3 API 操作的访问。
- s3:ForceDeleteBucket
控制对带有
x-minio-force-delete标志的 DeleteBucket S3 API 操作的访问。 删除非空存储桶时需要此权限。
- s3:GetBucketLocation
控制对 GetBucketLocation S3 API 操作的访问。
- s3:ListAllMyBuckets
控制对 ListBuckets S3 API 操作的访问。
- s3:DeleteObject
控制对 DeleteObject S3 API 操作的访问。
- s3:GetObject
控制对 GetObject S3 API 操作的访问。
支持以下附加 condition keys:
s3:x-amz-server-side-encryption s3:x-amz-server-side-encryption-customer-algorithm s3:ExistingObjectTag/<key> s3:versionid
- s3:GetObjectAttributes
控制对 GetObjectAttributes S3 API 操作的访问。
- s3:GetObjectVersionAttributes
控制对带版本对象执行 GetObjectAttributes S3 API 操作的访问。
- s3:RestoreObject
控制对 RestoreObject S3 API 操作的访问。
- s3:ListBucket
控制对 ListObjectsV2 S3 API 操作的访问。
支持以下附加 condition keys:
s3:prefix s3:delimiter s3:max-keys
- s3:PutObject
控制对 PutObject S3 API 操作的访问。
支持以下附加 condition keys:
s3:x-amz-copy-source s3:x-amz-server-side-encryption s3:x-amz-server-side-encryption-customer-algorithm s3:x-amz-metadata-directive s3:x-amz-storage-class s3:versionid s3:object-lock-retain-until-date s3:object-lock-mode s3:object-lock-legal-hold s3:RequestObjectTagKeys s3:RequestObjectTag/<key>
- s3:PutObjectTagging
控制对 PutObjectTagging S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key> s3:RequestObjectTagKeys s3:RequestObjectTag/<key>
- s3:GetObjectTagging
控制对 GetObjectTagging S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:DeleteObjectTagging
控制对 DeleteObjectTagging S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
存储桶配置
- s3:GetBucketPolicy
控制对 GetBucketPolicy S3 API 操作的访问。
- s3:PutBucketPolicy
控制对 PutBucketPolicy S3 API 操作的访问。
- s3:DeleteBucketPolicy
控制对 DeleteBucketPolicy S3 API 操作的访问。
- s3:GetBucketTagging
控制对 GetBucketTagging S3 API 操作的访问。
- s3:PutBucketTagging
控制对 PutBucketTagging S3 API 操作的访问。
支持以下附加 condition keys:
s3:RequestObjectTagKeys s3:RequestObjectTag/<key>
- s3:GetBucketPolicyStatus
控制对 GetBucketPolicyStatus S3 API 操作的访问。
分段上传
- s3:AbortMultipartUpload
控制对 AbortMultipartUpload S3 API 操作的访问。
- s3:ListMultipartUploadParts
控制对 ListParts S3 API 操作的访问。
- s3:ListBucketMultipartUploads
控制对 ListMultipartUploads S3 API 操作的访问。
版本控制与保留
- s3:PutBucketVersioning
控制对 PutBucketVersioning S3 API 操作的访问。
- s3:GetBucketVersioning
控制对 GetBucketVersioning S3 API 操作的访问。
- s3:DeleteObjectVersion
控制对 DeleteObjectVersion S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:ListBucketVersions
控制对 ListBucketVersions S3 API 操作的访问。
支持以下附加 condition keys:
s3:prefix s3:delimiter s3:max-keys
- s3:PutObjectVersionTagging
控制对 PutObjectVersionTagging S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key> s3:RequestObjectTagKeys s3:RequestObjectTag/<key>
- s3:GetObjectVersionTagging
控制对 GetObjectVersionTagging S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:DeleteObjectVersionTagging
控制对 DeleteObjectVersionTagging S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:GetObjectVersion
控制对 GetObjectVersion S3 API 操作的访问。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:BypassGovernanceRetention
控制对处于
GOVERNANCE保留模式下锁定对象的以下 S3 API 操作的访问:s3:PutObjectRetentions3:PutObjects3:DeleteObject
更多信息请参见 S3 文档中的 s3:BypassGovernanceRetention。
支持以下附加 condition keys:
s3:versionid s3:object-lock-remaining-retention-days s3:object-lock-retain-until-date s3:object-lock-mode s3:object-lock-legal-hold s3:RequestObjectTagKeys s3:RequestObjectTag/<key>
- s3:PutObjectRetention
控制对 PutObjectRetention S3 API 操作的访问。
对于任何指定了 保留元数据 的
PutObject操作,都需要此权限。支持以下附加 condition keys:
s3:x-amz-server-side-encryption s3:x-amz-server-side-encryption-customer-algorithm s3:x-amz-object-lock-remaining-retention-days s3:x-amz-object-lock-retain-until-date s3:x-amz-object-lock-mode s3:versionid
- s3:GetObjectRetention
控制对 GetObjectRetention S3 API 操作的访问。
若要在
GetObject或HeadObject操作的响应中包含 对象锁定元数据,则需要此权限。支持以下附加 condition keys:
s3:x-amz-server-side-encryption s3:x-amz-server-side-encryption-customer-algorithm s3:versionid
- s3:GetObjectLegalHold
控制对 GetObjectLegalHold S3 API 操作的访问。
若要在
GetObject或HeadObject操作的响应中包含 对象锁定元数据,则需要此权限。
- s3:PutObjectLegalHold
控制对 PutObjectLegalHold S3 API 操作的访问。
对于任何指定了 legal hold 元数据 的
PutObject操作,都需要此权限。支持以下附加 condition keys:
s3:x-amz-server-side-encryption s3:x-amz-server-side-encryption-customer-algorithm s3:object-lock-legal-hold s3:versionid
- s3:GetBucketObjectLockConfiguration
控制对 GetObjectLockConfiguration S3 API 操作的访问。
- s3:PutBucketObjectLockConfiguration
控制对 PutObjectLockConfiguration S3 API 操作的访问。
存储桶通知
- s3:GetBucketNotification
控制对 GetBucketNotification S3 API 操作的访问。
- s3:PutBucketNotification
控制对 PutBucketNotification S3 API 操作的访问。
对象生命周期管理
- s3:PutLifecycleConfiguration
控制对 PutLifecycleConfiguration S3 API 操作的访问。
- s3:GetLifecycleConfiguration
控制对 GetLifecycleConfiguration S3 API 操作的访问。
对象加密
- s3:PutEncryptionConfiguration
控制对 PutEncryptionConfiguration S3 API 操作的访问。
- s3:GetEncryptionConfiguration
控制对 GetEncryptionConfiguration S3 API 操作的访问。
存储桶复制
- s3:GetReplicationConfiguration
控制对 GetBucketReplication S3 API 操作的访问。
- s3:PutReplicationConfiguration
控制对 PutBucketReplication S3 API 操作的访问。
- s3:ReplicateObject
用于控制与 服务器端存储桶复制 相关 API 操作的 MinIO 扩展。
MinIO 服务器端复制需要此权限。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:ReplicateDelete
用于控制与 服务器端存储桶复制 相关 API 操作的 MinIO 扩展。
作为 MinIO 服务器端复制的一部分,在同步 删除操作 时需要此权限。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:ReplicateTags
用于控制与 服务器端存储桶复制 相关 API 操作的 MinIO 扩展。
MinIO 服务器端复制需要此权限。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
- s3:GetObjectVersionForReplication
用于控制与 服务器端存储桶复制 相关 API 操作的 MinIO 扩展。
MinIO 服务器端复制需要此权限。
支持以下附加 condition keys:
s3:versionid s3:ExistingObjectTag/<key>
受支持的 S3 策略条件键
MinIO 策略文档支持 IAM 条件语句。
每个条件元素都由 operators 和条件键组成。MinIO 支持 IAM 条件键的一个子集。 有关任何列出条件键的完整信息,请参见 IAM Condition Element Documentation
对于所有受支持的 actions,MinIO 支持以下条件键:
aws:Refereraws:SourceIpaws:UserAgentaws:SecureTransportaws:CurrentTimeaws:EpochTimeaws:PrincipalTypeaws:useridaws:usernamex-amz-content-sha256s3:signatureAge
Warning
aws:Referer、aws:SourceIp 和 aws.UserAgent 键很容易被伪造,因此存在潜在安全风险。
MinIO 建议仅将这些条件键作为辅助安全措施用于 拒绝 访问。
绝不要 仅凭这三个键授予访问权限。
对于特定 S3 action 支持的其他键,请参见该 action 的参考文档。
MinIO 扩展条件键
MinIO 在 S3 标准条件键基础上扩展了以下键:
sts:DurationSeconds
New in version MinIO: SERVER RELEASE.2024-02-06T21-36-22Z
指定一个以秒为单位的时间,用于限制由 AssumeRoleWithWebIdentity 生成的 所有 Security Token Service 凭证的有效期。
此值会覆盖客户端指定的
DurationSeconds字段。例如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRoleWithWebIdentity" ], "Condition": { "NumericLessThanEquals": { "sts:DurationSeconds": "300" } } } ] }
mc admin 策略 Action 键
MinIO 支持以下 action,用于为 mc admin 操作定义策略。
这些 action 仅 对 MinIO 部署有效,不 用于其他兼容 S3 的服务:
- admin:KMSCreateKey
允许创建新的 KMS 主密钥
虽然此选项仍受支持,但更推荐使用
kms:CreateKey。
- admin:KMSKeyStatus
允许获取 KMS 密钥状态
虽然此选项仍受支持,但更推荐使用
kms:KeyStatus。
- admin:SetTier
允许使用
mc ilm tier命令创建和修改远程存储层。
- admin:ListTier
允许使用
mc ilm tier命令列出已配置的远程存储层。
- admin:Prometheus
允许访问 MinIO metrics。 仅当 MinIO 要求采集指标时进行认证才需要此权限。
KMS 策略 action 键
MinIO 支持通过策略限制密钥管理服务 (KMS) action。
可以在策略中使用以下任一 KMS action 来限制 KMS 活动:
若要选择所有可用的 kms 策略 action,可使用 kms:*。
Changed in version RELEASE.2024-07-16T23-46-41Z: KMS action 可以按资源或资源前缀进行限制。
可以使用通配符 * 将 KMS action 策略应用到所有匹配该前缀的资源。
例如,以下策略文档允许用户列出密钥、创建新密钥,并检查任何以 keys-abc- 或 myuser- 开头资源上的密钥状态。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:CreateKey",
"kms:KeyStatus",
"kms:ListKeys"
],
"Resource": [
"arn:minio:kms:::keys-abc-*",
"arn:minio:kms:::myuser-*"
]
}
]
}
mc admin 策略条件键
MinIO 支持以下条件,用于为
mc admin actions 定义策略。
aws:Refereraws:SourceIpaws:UserAgentaws:SecureTransportaws:CurrentTimeaws:EpochTime
有关任何列出条件键的完整信息,请参见 IAM Condition Element Documentation。
策略变量
MinIO 支持使用策略变量,将来自已认证用户和/或操作的上下文自动替换到分配给该用户的一个或多个策略中。
使用 ${POLICYVARIABLE} 格式在策略的 Condition 或 Resource 定义中指定变量。
MinIO 策略变量的工作方式类似于 AWS IAM policy elements: Variables and tags。
每种 MinIO identity provider 都支持其各自的一组策略变量:
MinIO 策略变量
下表列出了用于授权 MinIO-managed users 的推荐策略变量:
变量 |
说明 |
|---|---|
已认证 API 调用的 HTTP 头中的 referrer。 |
|
已认证 API 调用的 HTTP 头中的源 IP。 |
|
与已认证 API 调用关联的用户名。 |
例如,以下策略使用变量将已认证用户的用户名替换到 Resource 字段中,使该用户只能访问与其用户名匹配的那些前缀:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket"],
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"]
}
]
}
MinIO 会将 Resource 字段中的 ${aws:username} 变量替换为用户名。
随后 MinIO 对策略进行求值,并授予或撤销对所请求 API 和资源的访问。
OpenID 策略变量
下表列出了用于授权 OIDC 管理用户 的受支持策略变量。
每个变量都对应认证用户 JWT token 中返回的一项 claim:
变量 |
说明 |
|---|---|
|
返回用户的 |
|
返回 ID token 中的 Issuer Identifier claim。 |
|
返回 ID token 中的 Audience claim。 |
|
返回客户端认证信息中的 JWT ID claim。 |
|
返回客户端认证信息中的 User Principal Name claim。 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
|
返回用户的 |
关于这些 scope 的更多信息,请参阅 OpenID Connect Core 1.0 文档。 你所选的 OIDC 提供方也可能有更具体的补充文档。
例如,以下策略使用变量将认证用户的 preferred_username 替换到 Resource 字段中,
使该用户只能访问与其用户名匹配的前缀:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket"],
"Condition": {"StringLike": {"s3:prefix": ["${jwt:preferred_username}/*"]}}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket/${jwt:preferred_username}/*"]
}
]
}
MinIO 会将 Resource 字段中的 ${jwt:preferred_username} 变量,
替换为 JWT token 中 preferred_username 的值。
随后,MinIO 会评估该策略,并对请求的 API 和资源授予或撤销访问权限。
Active Directory / LDAP 策略变量
下表列出了用于授权 AD/LDAP users 的受支持策略变量:
变量 |
说明 |
|---|---|
|
|
|
已认证用户使用的 Distinguished Name。 |
|
已认证用户的组 Distinguished Name。 |
例如,以下策略使用变量将已认证用户的 name 替换到 Resource 字段中,使该用户只能访问与其名称匹配的那些前缀:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket"],
"Condition": {"StringLike": {"s3:prefix": ["${ldap:username}/*"]}}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket/${ldap:username}/*"]
}
]
}
MinIO 会将 Resource 字段中的 ${ldap:username} 变量替换为已认证用户的 name 值。
随后 MinIO 对策略进行求值,并授予或撤销对所请求 API 和资源的访问。