访问管理
概述
MinIO 使用基于策略的访问控制 (PBAC) 来定义经过身份验证的用户可以访问的授权操作和资源。每个策略描述一个或多个 操作 和 条件,这些操作和条件概述了 用户 或 用户组 的权限。
MinIO PBAC 的构建是为了与 AWS IAM 策略语法、结构和行为兼容。MinIO 文档尽力涵盖 IAM 特定行为和功能。请考虑参考 IAM 文档 以获取有关 AWS IAM 特定主题的更完整文档。
在 mc admin policy 命令支持在 MinIO 部署上创建和管理策略。请参见命令参考以获取使用示例。
基于标签的策略条件
内置策略
- readonly
- 授予对 MinIO 部署中任何对象的只读权限。GET 操作 *必须* 应用于特定对象,而无需任何列出操作。相当于以下操作集 - 例如,此策略特别支持对特定路径上的对象的 GET 操作(例如 - GET play/mybucket/object.file),例如- 有意排除了列出权限,因为典型的用例并不希望“只读”角色对对象存储资源具有完全的发现能力(列出所有桶和对象)。 
- readwrite
- 授予对 MinIO 服务器上的所有桶和对象的读写权限。相当于 - s3:*.
- writeonly
- 授予对 MinIO 部署的任何命名空间(桶和对象路径)的只写权限。PUT 操作 *必须* 应用于特定对象位置,而无需任何列出操作。相当于 - s3:PutObject操作。
使用 mc admin policy attach 将策略与 MinIO 部署上的用户或组关联。
例如,考虑以下用户表。每个用户都分配了一个 内置策略 或受支持的 操作。该表描述了如果以该用户身份进行身份验证,客户端可以执行的一组操作
| 用户 | 策略 | 操作 | 
|---|---|---|
| 
 | PUTandGETonfinancebucket.GETonauditbucket | |
| 
 | readonlyonauditbucket | 
 | 
| 
 | 所有  | 
每个用户只能访问由内置角色 *明确* 授予的那些资源和操作。默认情况下,MinIO 拒绝访问任何其他资源或操作。
Deny 覆盖 Allow
MinIO 遵循 IAM 策略评估规则,其中 Deny 规则会覆盖对同一操作/资源的 Allow 规则。例如,如果用户具有明确分配的策略,其中包含针对操作/资源的 Allow 规则,而其某个组具有分配的策略,其中包含针对该操作/资源的 Deny 规则,则 MinIO 仅应用 Deny 规则。
有关 IAM 策略评估逻辑的更多信息,请参阅有关 确定请求在帐户内是否被允许或拒绝 的 IAM 文档。
策略文档结构
MinIO 策略文档使用与 AWS IAM 策略 文档相同的模式。
以下示例文档提供了一个用于创建自定义策略以与 MinIO 部署一起使用的模板。有关 IAM 策略元素的更完整文档,请参阅 IAM JSON 策略元素参考。
任何单个策略文档的最大大小为 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 资源规范 中所述。- *通配符可能会导致策略意外地应用于多个桶或前缀,具体取决于 模式匹配。例如,- arn:aws:s3:::data*将匹配桶- data、- data_private和- data_internal。仅指定- *作为资源键会将策略应用于部署上的所有桶和前缀。
- 对于 - Statement.Condition键,您可以指定一个或多个 支持的条件。
支持的 S3 策略操作
MinIO 策略文档支持 IAM 的一个子集 S3 操作键。本节还包括特定操作支持的任何 条件键,超出支持键的通用集。
以下操作控制对常见 S3 操作的访问。其余小节记录了更高级 S3 操作的操作
- s3:CreateBucket
- 控制对 CreateBucket S3 API 操作的访问。 
- s3:DeleteBucket
- 控制对 DeleteBucket S3 API 操作的访问。 
- s3:ForceDeleteBucket
- 控制对 DeleteBucket S3 API 操作的访问,用于使用 - x-minio-force-delete标记的操作。需要用于删除非空桶。
- s3:GetBucketLocation
- 控制对 GetBucketLocation S3 API 操作的访问。 
- s3:ListAllMyBuckets
- 控制对 ListBuckets S3 API 操作的访问。 
- s3:DeleteObject
- 控制对 DeleteObject S3 API 操作的访问。 
- s3:GetObject
- 控制对 GetObject S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:x-amz-server-side-encryption s3:x-amz-server-side-encryption-customer-algorithm s3:ExistingObjectTag/<key> s3:versionid 
- s3:ListBucket
- 控制对 ListObjectsV2 S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:prefix s3:delimiter s3:max-keys 
- s3:PutObject
- 控制对 PutObject S3 API 操作的访问。 - 支持以下额外的 条件键 - 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 操作的访问。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> s3:RequestObjectTagKeys s3:RequestObjectTag/<key> 
- s3:GetObjectTagging
- 控制对 GetObjectTagging S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> 
- s3:DeleteObjectTagging
- 控制对 DeleteObjectTagging S3 API 操作的访问。 - 支持以下额外的 条件键 - 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 操作的访问。 - 支持以下额外的 条件键 - s3:RequestObjectTagKeys s3:RequestObjectTag/<key> 
分段上传
- 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 操作的访问。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> 
- s3:ListBucketVersions
- 控制对 ListBucketVersions S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:prefix s3:delimiter s3:max-keys 
- s3:PutObjectVersionTagging
- 控制对 PutObjectVersionTagging S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> s3:RequestObjectTagKeys s3:RequestObjectTag/<key> 
- s3:GetObjectVersionTagging
- 控制对 GetObjectVersionTagging S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> 
- s3:DeleteObjectVersionTagging
- 控制对 DeleteObjectVersionTagging S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> 
- s3:GetObjectVersion
- 控制对 GetObjectVersion S3 API 操作的访问。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> 
- s3:BypassGovernanceRetention
- 控制对在 - GOVERNANCE保留模式下锁定对象的以下 S3 API 操作的访问- s3:PutObjectRetention
- s3:PutObject
- s3:DeleteObject
 - 有关更多信息,请参阅有关 s3:BypassGovernanceRetention 的 S3 文档。 - 支持以下额外的 条件键 - 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操作都是必需的。- 支持以下额外的 条件键 - 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操作的响应的一部分包含在内是必需的。- 支持以下额外的 条件键 - 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 操作的访问。 - 对于指定了 法律保留元数据 的任何 - PutObject操作都是必需的。- 支持以下额外的 条件键 - 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
- MinIO 扩展,用于控制与 服务器端存储桶复制 相关的 API 操作。 - MinIO 服务器端复制所需。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> 
- s3:ReplicateDelete
- MinIO 扩展,用于控制与 服务器端存储桶复制 相关的 API 操作。 - 在 MinIO 服务器端复制中,同步 删除操作 所需。 - 支持以下额外的 条件键 - s3:versionid s3:ExistingObjectTag/<key> 
支持的 S3 策略条件键
MinIO 策略文档支持 IAM 条件语句。
每个条件元素都包含 运算符 和条件键。MinIO 支持 IAM 条件键的子集。有关任何列出的条件键的完整信息,请参阅 IAM 条件元素文档
MinIO 支持所有支持的 操作 的以下条件键。
- aws:Referer
- aws:SourceIp
- aws:UserAgent
- aws:SecureTransport
- aws:CurrentTime
- aws:EpochTime
- aws:PrincipalType
- aws:userid
- aws:username
- x-amz-content-sha256
- s3:signatureAge
警告
aws:Referer、aws:SourceIp 和 aws.UserAgent 键很容易被伪造,因此存在潜在的安全风险。MinIO 建议仅使用这些条件键来拒绝访问作为辅助安全措施。
切勿单独使用这三个键授予访问权限。
有关特定 S3 操作支持的其他键,请参阅该操作的参考文档。
MinIO 扩展条件键
MinIO 使用以下扩展键扩展 S3 标准条件键。
sts:DurationSeconds
MinIO 版本新增: SERVER RELEASE.2024-02-06T21-36-22Z
以秒为单位指定时间,以限制由 AssumeRoleWithWebIdentity 生成的所有安全令牌服务凭据的持续时间。
此值将覆盖为客户端指定的
DurationSeconds字段。例如
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRoleWithWebIdentity" ], "Condition": { "NumericLessThanEquals": { "sts:DurationSeconds": "300" } } } ] }
mc admin 策略操作键
MinIO 支持以下操作,用于定义针对 mc admin 操作的策略。这些操作仅对 MinIO 部署有效,不适用于其他与 S3 兼容的服务。
- admin:SetTier
- 允许使用 - mc ilm tier命令创建和修改远程存储层。
- admin:ListTier
- 允许使用 - mc ilm tier命令列出已配置的远程存储层。
- admin:Prometheus
- 允许访问 MinIO metrics。仅当 MinIO 需要身份验证才能抓取指标时才需要。 
mc admin 策略条件键
MinIO 支持以下条件,用于定义 mc admin actions 的策略。
- aws:Referer
- aws:SourceIp
- aws:UserAgent
- aws:SecureTransport
- aws:CurrentTime
- aws:EpochTime
有关任何列出的条件键的完整信息,请参阅 IAM 条件元素文档。
策略变量
MinIO 支持使用策略变量,以便将来自已认证用户和/或操作的上下文自动替换到用户的已分配策略或策略中。使用 ${POLICYVARIABLE} 格式将变量指定为策略的一部分,作为 Condition 或 Resource 定义的一部分。MinIO 策略变量的功能类似于 AWS IAM 策略元素:变量和标签。
每个 MinIO 身份提供者 支持其自己的策略变量集
MinIO 策略变量
下表包含用于授权 MinIO 管理的用户 的推荐策略变量列表
| 变量 | 描述 | 
|---|---|
| 已认证 API 调用的 HTTP 标头中的引用程序。 | |
| 已认证 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 令牌的一部分返回的声明
| 变量 | 描述 | 
|---|---|
| 
 | 返回用户的  | 
| 
 | 从 ID 令牌返回发行者标识符声明。 | 
| 
 | 从 ID 令牌返回受众声明。 | 
| 
 | 从客户端身份验证信息返回 JWT ID 声明。 | 
| 
 | 从客户端身份验证信息返回用户主体名称声明。 | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
| 
 | 返回用户的  | 
有关这些范围的更多信息,请参阅 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 令牌中 preferred_username 的值。然后 MinIO 会评估策略,并授予或撤销对请求的 API 和资源的访问权限。
Active Directory/LDAP 策略变量
下表包含支持的策略变量列表,用于授权 AD/LDAP 用户
| 变量 | 描述 | 
|---|---|
| 
 | 
 | 
| 
 | 已验证用户使用的 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 和资源的访问权限。
