说明
本文档介绍怎样使用mc client客户端,通过命令在minio中创建多个用户,且为不同的用户分配不同的访问策略的步骤及每个步骤的相关说明
minio的访问策略描述
minio的访问策略由policy文件进行描述,一个新的policy文件的模板如下:
{
"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" : { ... }
}
]
}
以下是对上述每个字段的描述
Version字段
Version字段代表的是policy描述文件遵守的版本,有2008-10-17和2012-10-17两个可选值,我们用2012-10-17即可。
Statement字段
描述该policy的详细规则,他是一个数组的形式,支持多种规则的灵活组合
Effect字段
描述该规则的类型,有两个可选项:Allow 和 Deny,Allow代表该规则是放行规则,Deny代表该规则是拦截规则
Action字段
数组类型,描述操作,其中,可以使用s3:* 通配所有权限。
目前常用的操作摘录如下:
- s3:CreateBucket
------- 创建bucket - s3:DeleteBucket
-------删除bucket - s3:ForceDeleteBucket
-------强制删除非空bucket - s3:GetBucketLocation
-------获取bucket Location - s3:ListBucket
-------获取所有bucket - s3:ListAllMyBuckets
-------获取所有有权限的bucket - s3:DeleteObject
-------删除对象 - s3:GetObject
------- 获取/下载文件 - s3:PutObject
------- 上传文件/生成文件上传链接
其他更详细的操作类型,可以见文章最后的参考链接
Resource字段
resource用于描述这个策略控制的资源,均以arn:aws:s3:::开头,以下是几个例子:
- arn:aws:s3:::*
-------所有资源池 - arn:aws:s3:::testbucket/*
-------testbucket这个bucket下的资源 - arn:aws:s3:::testbucket/abc*
-------testbucket这个bucket下所有abc前缀的资源 - arn:aws:s3:::testbucket/abcd/abc.txt
-------testbucket这个bucket下的/abcd/abc.txt这个资源
Condition字段
condation字段用于描述该策略的生效条件,一般不作配置,具体可设置的生效条件,可参见以下链接:
https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/reference_policies_elements_condition.html
policy 文件示例
以下是一个policy文件的实例
{
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [ "s3:ListBucket","s3:ListAllMyBuckets"],
"Resource" : "arn:aws:s3:::*"
},
{
"Effect" : "Allow",
"Action" : [ "s3:GetObject","s3:GetBucketLocation"],
"Resource" : "arn:aws:s3:::testbucket/*"
},
{
"Effect" : "Deny",
"Action" : [ "s3:GetObject","s3:GetBucketLocation"],
"Resource" : "arn:aws:s3:::testbucket/20230504*"
}
]
}
上述的policy文件依次表示:
- 能够(或在程序里使用minioClient.listBuckets)查看所有bucket的名称及基础属性(不包括对应bucket的文件访问权限)
- 能够获取及下载testbucket这个bucket下的文件
- 拒绝获取或下载testbucket这个bucket下的以20230504开头的所有文件
创建全新的minio用户
接下来,我们需要创建一个用户,并给这个用户授权,以让这个用户能访问特定的资源,以下操作我们使用minio的官方客户端mc
需要说明的是: 由于minio的admin接口分为/v1,/v2,/v3等多个版本,所以必须使用和服务端配套的mc客户端使用,不能用高版本的mc客户端访问低版本的minioserver,否则可能无法正确处理admin指令,下文的演示以使用admin v1接口的版本举例,其他版本的使用命令也是类似的,只是内部真正发起的请求地址不一样:
最新版本的minioserver使用的是/v3的admin接口,最新版本的操作可参考官方文档,具体可见文章最后的参考链接
新建访问策略
参照上文的说明,配置好访问策略后,我们需要新建访问策略:
[root@local /]# mc admin policy add minio_alias testpolicy "/tmp/policy.json"
Added policy `testpolicy` successfully.
上述命令的minio_alias是mc客户端里设置的minio别名,testpolicy是新建的访问策略名称,最后的路径是配置好的策略规则所在的文件全路径
上述命令实际上是往minio服务端发起请求:PUT /minio/admin/v1/add-canned-policy?name=testpolicy
创建用户
[root@local /]# mc admin user add minio_alias testuser1 pwd1 testpolicy
Added user `testuser1` successfully.
上述命令的minio_alias是mc客户端里设置的minio别名,testuser1是用户名,pwd1是密码,testpolicy是授予给这个用户的访问策略
上述命令实际上是往minio服务端发起请求:PUT /minio/admin/v1/add-user?accessKey=testuser1
修改用户的访问策略
当我们需要修改用户的初始策略时,可以通过这个命令修改:
[root@local /]# mc admin user policy minio_alias testuser1 testpolicy
Set a policy `testpolicy` for user `testuser1` successfully.
上述命令实际是是往minio服务端发起请求:PUT /minio/admin/v1/set-user-policy?accessKey=testuser1&name=testpolicy
需要注意的是,在最新版本的minio server及mc客户端里,修改用户策略的是:
[root@local /]# mc admin policy detach minio_alias oldpolicy --user testuser1
[root@local /]# mc admin policy attach minio_alias testpolicy --user testuser1
删除旧的访问策略
当我们需要删除原来的访问策略时,可以执行以下命令进行修改:
如果是修改访问策略的话,我们可以直接新建同名的访问策略即可,minio会进行覆盖。
[root@local /]# mc admin policy remove minio_alias testpolicy
Removed policy `testpolicy` successfully.
上述命令实际上是往minio服务端发起请求:DELETE /minio/admin/v1/remove-canned-policy?name=testpolicy
至此,我们就完成了用户的创建及访问授权,我们可以使用testuser1和pwd1访问策略里配置的资源了。
参考链接:
https://min.io/docs/minio/linux/reference/minio-mc-admin.html
https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/reference_policies_elements_condition.html