0%

为 MinIO 设置 Nginx 代理以及访问策略的设置

我们可以通过 Nginx 来为 MinIO 集群做负载均衡,如下图:

图片来自 Enterprise-Grade Cloud Storage with NGINX Plus and Minio

安装配置 Nginx proxy

下面为相关的 Nginx 配置文件(nginx/conf.d/minio.conf):

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
upstream minio_cluster {
server 192.168.1.77:19000;
}

server {
listen 80;
server_name 192.168.1.77 localhost;

# To allow special characters in headers
ignore_invalid_headers off;

# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 100m;

# To disable buffering
proxy_buffering off;

location /kyc/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;

proxy_connect_timeout 300;

# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;

proxy_pass http://minio_cluster;
}
}

其中:

  • ignore_invalid_headers 标识 Nginx 默认是不支持部分特殊字符(如忽略带下划线的 header);
  • 通过 upstream 来配置后向的 minio 集群节点;
  • 这里代理了 kyc bucket 的所有访问请求;

配置之后重启 Nginx,接着我们设置一个 public 权限的目录 kyc/public 来演示通过 Nginx 来访问资源。

配置指定 bucket 的指定目录的访问策略为 public

默认情况下,创建的 bucket 的权限都是私有的,我们这里选一个 kyc/public 作为公共访问目录(public)。

通过 minio client 来设置

通过 mc policy 策略命令来设置匿名访问 kyc/public 目录下的所有文件的访问权限为可读可写(public)。

上图为 mc policy 策略命令的帮助,可以看到支持的权限 policy 有:none, download, upload, public,根据名称权限一目了然。

下面为通过 mc policy 命令设置对 kyc/public 目录下的资源的匿名访问权限:

1
2
3
4
5
6
[health@kyc-dev bin]$ mc policy set public local/kyc/public
Access permission for `local/kyc/public` is set to `public`
[health@kyc-dev bin]$ mc policy list local/kyc/public
kyc/public* => readwrite
[health@kyc-dev bin]$ mc policy list local/kyc
kyc/public* => readwrite

通过 mc policy 命令我们也可以根据业务需求来设置指定的目录或资源仅有上传(upload)或下载(download)的权限,如下命令将 kyc/public 目录重新设置为 readonly 权限:

1
2
3
4
[health@kyc-dev ~]$ mc policy set download local/kyc/public
Access permission for `local/kyc/public` is set to `download`
[health@kyc-dev ~]$ mc policy list local/kyc
kyc/public* => readonly

设置成功之后,就可以直接通过浏览器访问其中的资源,如下图:

通过 Java SDK 来设置

除了通过 mc policy 命令来为指定的 bucket 设置策略之外,还可以通过代码的方式在运行时根据业务需求来动态设置资源的访问策略:

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
public class MinIODemo {

public static final String ENDPOINT = "http://192.168.1.77:19000/";
public static final String POLICY_PUBLIC_READONLY = "{\n" +
" \"Version\": \"2012-10-17\",\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Effect\": \"Allow\",\n" +
" \"Action\": [\n" +
" \"s3:PutObject\"\n" +
" ],\n" +
" \"Principal\": \"*\",\n" +
" \"Resource\": [\n" +
" \"arn:aws:s3:::kyc/public/*\"\n" +
" ]\n" +
" }\n" +
" ]\n" +
"}";

public static void main(String[] args) throws Exception {
MinioClient minioClient = MinioClient.builder()
.endpoint(ENDPOINT)
.credentials("AKIAIOSFODNN7EXAMPLE", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")
.build();
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder()
.bucket(BUCKET).config(POLICY_PUBLIC_READONLY).build());
}
}

上面的示例代码,通过 minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(BUCKET).config(POLICY_PUBLIC_READONLY).build()) 来设置策略,在这个示例代码中,我们将 kyc/public/ 目录重新设置为只有 PutObject 权限之后,这时再访问就会报错,如下图:

返回响应的错误信息提示了 Access Denied

如果我们调整 Action,更改 PutObject 为 GetObject 之后再次执行程序(当然也可以添加 GetObject 权限,那就是 RW 可读写了),就可以再次访问,如下图:

通过程序控制会更加灵活一些,当然要注意的是覆盖原有权限的问题,你可以先通过 minioClient.getBucketPolicy(GetBucketPolicyArgs.builder().bucket(BUCKET).build()) 来获取当前的策略,添加上新的策略,再重新设置 bucket 策略。

参考资料

Welcome to my other publishing channels