在左侧导航中切换到Buckets,选中需要进行权限配置的BUckets。点击”Summary”,修改”Access Policy”,选择”Custom”。将 Action 字段下的 "s3:ListBucket" 删除,这是为了禁止匿名查看文件列表。可以在 Resource 值为 arn:aws:s3:::any-bucket-name/* 的配置后面增加一条 Condition 字段,用来防盗链或者其它选项配置都可以在这里修改。如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucketsname" #修改成桶的名字
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucketsname/*" #替换成桶的名字
],
"Condition": {
"StringLike": {
"aws:Referer": [
"https://domain.com/*" #替换域名
]
},
"IpAddress": {
"aws:SourceIp": [
"192.168.1.100/32" #替换IP
]
}
}
}
]
}

这个MinIO配置用于定义哪些主体可以执行哪些操作以及在哪些资源上执行这些操作。这个策略是为Minio这样的对象存储服务配置的,Minio兼容Amazon S3(Simple Storage Service)的API。下面是对这段配置的逐项解释:

  1. "Version": "2012-10-17"
    • 这指定了IAM策略的版本,2012-10-17是AWS IAM策略的版本。
  2. "Statement"
    • 这是一个数组,包含了策略中的所有声明。
  3. 第一个声明:
    • "Effect": "Allow":表示这个声明将允许指定的操作。
    • "Principal": {"AWS": ["*"]}:表示这个声明适用于所有AWS账户("*"是一个通配符,代表所有)。
    • "Action": ["s3:GetBucketLocation", "s3:ListBucket"]:指定了允许的操作,这里是获取存储桶的位置和列出存储桶中的所有对象。
    • "Resource": ["arn:aws:s3:::bucketsname"]:指定了资源,即这个声明适用的存储桶。"bucketsname"需要替换成实际的存储桶名称。
  4. 第二个声明:
    • "Effect": "Allow":同样表示这个声明将允许指定的操作。
    • "Principal": {"AWS": ["*"]}:同样适用于所有AWS账户。
    • "Action": ["s3:GetObject"]:指定了允许的操作,这里是获取存储桶中的对象。
    • "Resource": ["arn:aws:s3:::bucketsname/*"]:指定了资源,即这个声明适用于存储桶中的所有对象。"bucketsname"需要替换成实际的存储桶名称,"*"表示存储桶中的所有对象。
    • "Condition"
      • "StringLike": {"aws:Referer": ["https://domain.com/*"]}:这是一个条件,只有当HTTP请求头部的Referer字段匹配https://domain.com/*时,这个声明才生效。"domain.com"需要替换成实际的域名。
      • "IpAddress": {"aws:SourceIp": ["192.168.1.100/32"]}:这是另一个条件,只有当请求来自IP地址192.168.1.100时,这个声明才生效。"192.168.1.100"需要替换成实际允许访问的IP地址。

总结来说,这个IAM策略允许所有AWS账户列出存储桶和获取存储桶的位置,同时也允许从特定域名和特定IP地址获取存储桶中的对象。这种配置通常用于确保只有来自特定来源的请求才能访问存储桶中的数据,增加了安全性。

Statement且与或的关系

IP和域名写在一个Statement里,则是且的关系,如果希望ip或域名其中一个满足就能访问,即或关系,可以修改两个不同的 Statement,每个 Statement 只有一个条件(要么是 Referer,要么是 SourceIp):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucketsname"
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucketsname/*"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"192.168.1.100/32"
]
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucketsname/*"
],
"Condition": {
"StringLike": {
"aws:Referer": [
"https://domain.com/*"
]
}
}
}
]
}