访问管理
概述
MinIO 使用基于策略的访问控制(PBAC)来定义已验证用户可以访问的授权操作和资源。 每项政策描述了一个或多个 操作 和 条件 ,这些操作和条件概述了一个 用户 或 用户组 的权限。
MinIO 的 PBAC 是为了与 AWS IAM 策略语法、结构和行为兼容而构建的。 MinIO 文档努力最好地覆盖 IAM 特定行为和功能。 如果您需要更完整的关于 AWS IAM 特定主题的文档,请参考 AWS IAM 文档 <> 。
mc admin policy 命令支持在 MinIO 部署上创建和管理策略。
请参阅命令参考以获取使用示例。
基于标签的政策条件
内置策略
MinIO 为分配给 用户 或 用户组 提供了以下内置策略:
- readonly
- 授予对MinIO部署上任何对象的只读权限。 GET 操作 必须 应用于一个特定的对象,而不需要任何列举。 等同于以下一组操作: - 例如, 这个策略特别支持对特定路径上的对象的GET 操作(例如 - GET play/mybucket/object.file),例如:- 故意排除了列表权限,因为典型的用例并 不希望 “只读” 角色在对象存储资源上具有 完全的可发现性(列出所有桶和对象)。 
- readwrite
- 授予对MinIO服务器上所有桶和对象的读写权限。 等同于 - s3:*。
- writeonly
- 授予对MinIO部署的任何命名空间(桶和对象路径)的写权限。 PUT操作 必须 应用到一个特定的对象位置, 而不需要任何列表。 等同于 - s3:PutObject操作。
要在MinIO部署上将策略关联到用户或组,
请使用 mc admin policy attach 命令。
例如,请考虑以下用户表。 每个用户都 被分配了一个 内置策略 或 一个支持的 操作 。 表格描述了如果以该用户身份进行身份验证, 客户端可以执行的操作的子集:
| User | Policy | Operations | 
|---|---|---|
| 
 | PUTandGETonfinancebucket.GETonauditbucket | |
| 
 | readonlyonauditbucket | 
 | 
| 
 | All  | 
每个用户只能访问由内置角色 明确 授权的 资源和工作操作。 MinIO默认拒绝访问任何其他资源或 操作。
Deny overrides Allow
MinIO遵循IAM策略评估规则,其中对于相同的操作/资源,
一个 拒绝 规则会覆盖一个 允许 规则。 例如,如果一个用户
被明确分配了一个带有 允许 规则的操作/资源策略,
而其所属的某个组被分配了一个带有 拒绝 规则的操作/资源策略,
那么MinIO将只应用 拒绝 规则。
有关 IAM 策略评估逻辑的更多信息,请参阅 IAM 文档关于 :iam-docs: 确定帐户内是否允许或拒绝请求 <reference_policies_evaluation-logic.html#policy-eval-denyallow> 。
政策文件结构
MinIO策略文档使用与 AWS IAM策略 文档相同的模式。
以下示例文档提供了一个模板,用于创建与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资源规范 使用- *和- ?通配符字符。- 通配符 - *可能会导致根据 pattern match 对多个桶或前缀意外应用策略。。 例如,- 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
- 控制对带有 - 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 操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:x-amz-server-side-encryption s3:x-amz-server-side-encryption-customer-algorithm s3:ExistingObjectTag/<key> s3:versionid 
- s3:ListBucket
- 控制对 ListObjectsV2 S3 API 操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:prefix s3:delimiter s3:max-keys 
- s3:PutObject
- 控制对 PutObject S3 API 操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - 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 操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:versionid s3:ExistingObjectTag/<key> s3:RequestObjectTagKeys s3:RequestObjectTag/<key> 
- s3:GetObjectTagging
- 控制对 GetObjectTagging S3 API 操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:versionid s3:ExistingObjectTag/<key> 
- s3:DeleteObjectTagging
- 控制对 DeleteObjectTagging S3 API 操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - 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操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - 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操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:versionid s3:ExistingObjectTag/<key> 
- s3:ListBucketVersions
- 控制对 ListBucketVersions S3 API操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:prefix s3:delimiter s3:max-keys 
- s3:PutObjectVersionTagging
- 控制对 PutObjectVersionTagging S3 API操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:versionid s3:ExistingObjectTag/<key> s3:RequestObjectTagKeys s3:RequestObjectTag/<key> 
- s3:GetObjectVersionTagging
- 控制对 GetObjectVersionTagging S3 API操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - s3:versionid s3:ExistingObjectTag/<key> 
- s3:DeleteObjectVersionTagging
- 控制对 DeleteObjectVersionTagging S3 API操作的访问。 - 支持以下附加 :ref: 条件键 <minio-policy-conditions> : - 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文档中关于 s3:BypassGovernanceRetention 的内容。 - 支持以下附加 条件键: - 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
- 用于控制与 服务器端存储桶复制 相关 API 操作的 MinIO 扩展。 - 这是 MinIO 服务器端复制所必需的。 - 支持以下附加 条件键: - s3:versionid s3:ExistingObjectTag/<key> 
- s3:ReplicateDelete
- 用于控制与 服务器端存储桶复制 相关 API 操作的 MinIO 扩展。 - 需要用于同步 delete 操作 作为 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
指定以秒为单位的时间,以限制由:ref:minio-sts-assumerolewithwebidentity 生成的 所有 Security Token Service凭证的有效期限。
此值将覆盖客户端指定的
DurationSeconds字段。例如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRoleWithWebIdentity" ], "Condition": { "NumericLessThanEquals": { "sts:DurationSeconds": "300" } } } ] }
mc admin 策略操作键
MinIO 支持以下操作,用于定义 mc admin 操作的
策略。 这些操作 仅 适用于 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的 指标。 仅在MinIO需要身份验证才能抓取指标时才需要。 
KMS 政策行动密钥
MinIO 支持按策略限制密钥管理服务 (KMS) 操作。
您可以通过以下 KMS 操作限制策略中的 KMS 活动:
要选择所有可用的 kms 策略操作,请使用 kms:* 。
在 RELEASE.2024-07-16T23-46-41Z 版本发生变更: KMS 操作可受资源或资源前缀的限制。
通配符 * 可用来将 KMS 操作策略应用于与前缀匹配的所有资源。
例如,以下策略文档允许用户为任何以 keys-abc- 或 myuser- 开头的资源列出密钥、创建新密钥和检查密钥状态。
mc admin 策略条件键
MinIO 支持以下条件,用于在与 mc admin 命令相关的
策略定义中限制 操作。
- aws:Referer
- aws:SourceIp
- aws:UserAgent
- aws:SecureTransport
- aws:CurrentTime
- aws:EpochTime
有关任何列出的条件键的完整信息,请参阅 IAM 条件元素文档。
政策变量
MinIO 支持使用策略变量,以便自动将来自已验证用户和/或操作的上下文替换到用户分配的策略或策略中。
在 Condition 或 Resource 定义中,使用 ${POLICYVARIABLE} 格式来指定策略中的变量。
MinIO 策略变量与 AWS IAM 策略元素:变量和标签 的功能类似。
每个 MinIO 身份提供者 都支持自己的一组策略变量:
MinIO 策略变量
以下表格包含了一组推荐的政策变量,用于授权 MinIO 管理的用户:
| Variable | 描述 | 
|---|---|
| 在认证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令牌中返回的一部分声明:
| Variable | 描述 | 
|---|---|
| 
 | 返回用户的  | 
| 
 | 从 ID 令牌返回颁发者标识符声明。 | 
| 
 | 从ID令牌中返回Audience声明。 | 
| 
 | 从客户端认证信息中返回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用户:
| Variable | 描述 | 
|---|---|
| 
 | 
 | 
| 
 | 已认证用户使用的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 和资源的访问权限。
