前言
本段文章来源于华为云OBS,因为都是S3标准的对象存储,所以很多概念和Minio是相通的。
为什么要进行访问权限控制(华为OBS)
为保证存储在SSO中数据的安全性,SSO资源(桶和对象)默认为私有,只有资源拥有者可以访问。
如果要允许他人访问和使用自己的SSO资源,可以设置访问权限控制策略,向他人授予指定资源的特定权限。
访问权限控制的典型场景(华为OBS)
OBS如何进行访问权限控制(华为云)
OBS提供丰富灵活的访问权限控制手段,满足不同场景下的授权需求。
IAM用户权限控制
相对比阿里云SSO、华为云OBS,Minio权限及安全管理,没有提供特别多的功能,毕竟是开源的,但是对于一般应用程序,也够用了。
用户管理
添加用户及权限
用户是权限最直接的体现,Minio提供了用户管理功能,可以在控制台直接添加用户密码(密码最少八位),及相关权限。
用户分组管理
如果每个用户都去绑定一个权限比较麻烦,minio提供了分组管理,也可以理解为角色,分组添加多个权限,然后用户添加到分组中,都可以具有多个权限了。
直接在下面菜单创建分组:
添加分组时,可以绑定用户:
点击操作,可以对当前分组添加多个角色:
IAM权限
默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予策略和角色,才能使得用户组中的用户获得策略定义的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对服务进行操作。
IAM权限作用于SSO所有的桶和对象。如果要授予IAM用户操作SSO资源的权限,则需要向IAM用户所属的用户组授予一个或多个SSO权限。
一般SSO根据授权精细程度分为角色和策略。
- 角色(Minio中貌似没有角色):IAM最初提供的一种根据用户的工作职能定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权。由于华为云各服务之间存在业务依赖关系,因此给用户授予角色时,可能需要一并授予依赖的其他角色,才能正确完成业务。角色并不能满足用户对精细化授权的要求,无法完全达到企业对权限最小化的安全管控要求。
- 策略(minio中有):IAM最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。例如:针对SSO服务,管理员能够控制IAM用户仅能对某一个桶资源进行指定的管理操作。多数细粒度策略以API接口为粒度进行权限拆分。
策略结构&语法
策略结构包括:Version(策略版本号)和Statement(策略权限语句),其中Statement可以有多个,表示不同的授权项。
S3标准策略语法(阿里华为SSO有点小改动,结构类似),示例:
{
"Sid": "DenyPublicReadACL",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::examplebucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": [
"public-read",
"public-read-write",
"authenticated-read"
]
}
}
}
以上表示,当所述请求包括以下访问控制列表(ACL)中的一个:public-read,public-read-write或authenticated-read,拒绝任何亚马逊S3在桶examplebucket中PutObject或PutObjectAcl请求。
策略语法参数:
参数 | 说明 |
---|---|
Version | 标识策略的版本号,Minio中一般为"2012-10-17" |
Statement | 策略授权语句,描述策略的详细信息,包含Effect(效果)、Action(动作)、Principal(用户)、Resource(资源)和Condition(条件)。其中Condition为可选 |
Effect | Effect(效果)作用包含两种:Allow(允许)和Deny(拒绝),系统预置策略仅包含允许的授权语句,自定义策略中可以同时包含允许和拒绝的授权语句,当策略中既有允许又有拒绝的授权语句时,遵循Deny优先的原则。 |
Action | Action(动作)对资源的具体操作权限,格式为:服务名:资源类型:操作,支持单个或多个操作权限,支持通配符号*,通配符号表示所有。例如 s3:GetObject ,表示获取对象 |
Resource | Resource(资源)策略所作用的资源,支持通配符号*,通配符号表示所有。在JSON视图中,不带Resource表示对所有资源生效。Resource支持以下字符:-_0-9a-zA-Z*./\,如果Resource中包含不支持的字符,请采用通配符号*。例如:arn:aws:s3:::my-bucketname/myobject*\,表示minio中my-bucketname/myobject目录下所有对象文件。 |
Condition | Condition(条件)您可以在创建自定义策略时,通过Condition元素来控制策略何时生效。Condition包括条件键和运算符,条件键表示策略语句的Condition元素,分为全局级条件键和服务级条件键。全局级条件键(前缀为g:)适用于所有操作,服务级条件键(前缀为服务缩写,如obs:)仅适用于对应服务的操作。运算符与条件键一起使用,构成完整的条件判断语句。 |
系统默认策略
AWSIdentity and Access Management (IAM) 是一种 Web 服务,可以帮助您安全地控制对 AWS 资源的访问。您可以使用 IAM 控制对哪个用户进行身份验证 (登录) 和授权 (具有权限) 以使用资源。
默认存在5种IAM策略:
权限 | 解释 |
---|---|
consoleAdmin | 控制台管理员 |
diagnostics | 诊断 |
readonly | 只读 |
readwrite | 读写 |
writeonly | 只写 |
自定义策略
我们可以通过控制台或者mc客户端添加策略,实际就是一个Json文件。
首先在控制台点击IAM策略,然后点击创建策略。
填写策略名称,输入策略Json。
策略Json文件内容如下:
- Allow表示允许操作
- Action表示对资源的具体操作权限,对对象操作,首先要操作存储桶,所以首先这里给了存储桶查询权限,然后给了上传和下载对象的权限
- Resource表示对test存储桶下的所有资源有限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::test/*"
]
}
]
}
添加之后,可以查看到当前决策的内容信息,也可以修改Json文件。
然后进入用户管理,选择用户后,再添加我们自定义的权限策略。
测试:
使用当前用户账号创建客户端,然后直接读写操作,发现是正常具有权限的。
然后去掉s3:PutObject,也就是上传文件的权限。
在执行putObject时,返回403访问被拒绝,而getObject时则正常执行。
桶策略
桶策略是作用于所配置的桶及桶内对象的。桶拥有者通过桶策略可为IAM用户或其他帐号授权桶及桶内对象的操作权限。
页面管理桶策略
1. 访问策略管理
存储桶的访问策略管理,是最大粒度的权限,可以设置私有或者公开。
点击存储桶的管理按钮,进入管理页面。
然后可以在Summary中,看到当前桶的访问策略为私有Private。
可以点击Private,弹出设置权限,可选的只有Private和Public。
当选择私有时,未登录或者未授权访问文件,会出现以下未授权页面:
当选择公开时,无需登录和授权可以直接访问文件:
2. 访问规则管理
除了对存储桶大粒度的进行访问控制,页面上还支持对前缀粒度的访问控制。
比如我们主要只公开当前桶一部分共有访问,需要对另一部分进行访问控制,我们可以设置桶的策略为Plubic,然后设置某一目录下的文件只读或者只写。
首先点击添加访问规则按钮。
然后添加访问前缀,访问规则。
访问规则支持一下三种:
后台管理桶策略
Minio也提供了API来管理桶策略,也是需要定义策略Json,然后调用API。
1. 设置桶策略
API如下:
public void setBucketPolicy(SetBucketPolicyArgs args)
示例:
StringBuilder builder = new StringBuilder();
builder.append("{\n");
builder.append(" \"Statement\": [\n");
builder.append(" {\n");
builder.append(" \"Action\": [\n");
builder.append(" \"s3:GetBucketLocation\",\n");
builder.append(" \"s3:ListBucket\"\n");
builder.append(" ],\n");
builder.append(" \"Effect\": \"Allow\",\n");
builder.append(" \"Principal\": \"*\",\n");
builder.append(" \"Resource\": \"arn:aws:s3:::my-bucketname\"\n");
builder.append(" },\n");
builder.append(" {\n");
builder.append(" \"Action\": \"s3:GetObject\",\n");
builder.append(" \"Effect\": \"Allow\",\n");
builder.append(" \"Principal\": \"*\",\n");
builder.append(" \"Resource\": \"arn:aws:s3:::my-bucketname/myobject*\"\n");
builder.append(" }\n");
builder.append(" ],\n");
builder.append(" \"Version\": \"2012-10-17\"\n");
builder.append("}\n");
minioClient.setBucketPolicy(
SetBucketPolicyArgs.builder().bucket("my-bucketname").config(builder.toString()).build());
2. 查询桶策略
API如下:
public String getBucketPolicy(GetBucketPolicyArgs args)
示例:
String policy =
minioClient.getBucketPolicy(
GetBucketPolicyArgs.builder().bucket("aaaaa").build());
System.out.println("Current policy: " + policy);
查询结果如下所示:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":[
"*"
]
},
"Action":[
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource":[
"arn:aws:s3:::aaaaa"
]
},
{
"Effect":"Allow",
"Principal":{
"AWS":[
"*"
]
},
"Action":[
"s3:DeleteObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:AbortMultipartUpload"
],
"Resource":[
"arn:aws:s3:::aaaaa/bb*"
]
}
]
}
对象策略
Minio貌似没有具体对象文件的访问策略管理。那么在WEB端,需要加载图片,下载视频,如何去访问文件呢?
1. SDK直接访问
如果是JS集成,可以使用使用客户端直连Minio,此方式简单效率高,但是安全性不高。
如果是后台应用JAVA集成,Web请求访问,文件服务再去访问Minio获取资源,然后再响应给Web端,此方式安全性高,但是链路较长,效率低了一半。。。
2. 公开访问权限
可以设置桶的访问策略为Public,这样就能直接访问到文件,但是各种针对于用户不需要登录就能访问的照片,文件等,因为安全性最低。
3. 临时访问URL
WEB端可以请求后台服务,后台服务调用getPresignedObjectUrl方法,返回一个临时访问路径,WEB端使用此链接直接去访问对象,此方式安全可靠,效率也高,但是多了一步请求临时URL的访问。