分享知识,分享快乐

0%

Trino 开启用户名密码校验

https://sslover.me/2022/03/15/trino-deploy-tutorials/

开启 TLS 支持

当采用用户名/密码的方式进行认证时,Trino 强制要求我们使用 TLS,所以我们需要对其进行配置。

首先我们需要创建 HTTPS 证书,由于是本地测试,所以我们直接自己签发一个。Trino 支持 PEM 文件和 JKS 文件,我们使用标准的 PEM 文件进行配置。

1
2
3
4
5
6
7
8
9
10
11
# 生成私钥
[root@cdh192-150 ssl]# openssl genrsa -out server.key 2048
# 生成 CSR
[root@cdh192-150 ssl]# openssl req -new -key server.key -out server.csr
# 自己派发证书
[root@cdh192-150 ssl]# openssl x509 -req -days 36500 -in server.csr -signkey server.key -out server.crt
# 生成 PEM 格式文件
[root@cdh192-150 ssl]# cat server.key server.crt > server.pem
# 校验 PEM 文件
[root@cdh192-150 ssl]# openssl rsa -in server.pem -check -noout
[root@cdh192-150 ssl]# openssl x509 -in server.pem -text -noout

生成完证书后,在 config.properties 文件中添加如下配置即可开启 TLS 支持:

1
2
3
4
5
6
7
8
# 开启 https
http-server.https.enabled=true
# 指定 https 端口
http-server.https.port=8443
# 指定证书文件
http-server.https.keystore.path=/opt/module/trino-server-405/etc/ssl/server.pem
# 开启web-ui访问
http-server.authentication.allow-insecure-over-http=true

最后修改 JDBC 连接地址,由于是自签证书,所以我们需要关闭证书校验:

1
jdbc:trino://127.0.0.1:8443?SSL=true&SSLVerification=NONE

同理,CLI 命令修改为:

1
trino --server https://localhost:8443 --user user --password --execute 'SELECT * FROM mysql.test.user' --insecure

开启 Trino 内部通讯 (Internal Communication)

使用 TLS 以及一个 configured shared secret 是使用基于文件的用户名密码认证的必要条件。 本节阐述如何开启 Internal Communication 并配置一个 configured shared secret。

在本例中我们使用 lhoOHWfehuKgkXnu4E6Gq5L5K4i8iMPlHFwUzrj25r5lUKUZSn 作为内部通信密码进行示范。

配置 shared secert

编辑配置文件,将内部通讯的密文配置在所有 Trino 节点的配置文件中。注意,该密文必须一致,否则 worker 节点无法连接至 coordinator。

打开 Trino 的配置文件: vim $TRINO_HOME/etc/config.properties

在配置文件中配好 internal-communication.shared-secret 配置项:

1
2
# Set the shared secret to the same value in config.properties on all nodes of the cluster 
internal-communication.shared-secret=lhoOHWfehuKgkXnu4E6Gq5L5K4i8iMPlHFwUzrj25r5lUKUZSn

创建用户名密码文件

至此,TLS 和内部通讯都已经配置成功。接下来,我们要为 Trino 添加用户名密码校验功能。

修改 Trino 配置文件

打开 Trino 的配置文件: vim $TRINO_HOME/etc/config.properties

在配置文件中配好 http-server.authentication.type 配置项:

1
# Password file authentication http-server.authentication.type=PASSWORD

根据文档,一旦上述配置项配置完毕,我们就需要创建一个新文件 $TRINO_HOME/etc/password-authenticator.properties, 并在该文件中添加部分配置。

创建该配置文件: vim $TRINO_HOME/etc/password-authenticator.properties

在该配置文件中添加如下配置:

1
2
password-authenticator.name=file 
file.password-file=/opt/trino-server-392/etc/password.db

添加用户与密码至 password.db

根据上述配置文件内 password.db 的位置,创建一个空的 password 文件:

1
touch password.db

使用如下命令添加或更新名为 flinkrt 用户的密码。备注: 在本示例中,flinkrt 用户的密码同样为 flinkrt:

1
htpasswd -B -C 10 password.db flinkrt

执行结果如下:

1
2
3
[root@p0-tkldmp-rc01 etc]# htpasswd -B -C 10 password.db flinkrt 
New password:
Re-type new password: Adding password for user flinkrt

权限控制

默认在不开启权限控制的情况下,用户都拥有最大权限,这显示是很不安全的,所以需要配置权限控制。

创建 access-control.properties 文件,指定权限控制文件:

1
2
3
4
5
access-control.name=file
# 指定控制文件位置
security.config-file=/opt/module/trino-server-405/etc/rules.json
# 自动刷新间隔,不再需要重启 Trino 即可自动生效
security.refresh-period=1s

创建 group-provider.properties 文件,指定群组配置文件:

1
2
group-provider.name=file
file.group-file=/opt/module/trino-server-405/etc/group.txt

然后编辑群组映射关系 group.txt

1
2
admin:admin-user
user:user1,user2

然后创建 rules.json 文件编写规则,具体的权限控制比较复杂,可以参考 File-based access control,这里我们只写一个基础的权限控制规则,实现 admin 组的用户可以进行所有操作,任意用户可以访问 mysql,user 可以读取 postgresql 的数据,system 没有用户可以访问。权限匹配是从上到下的,如果没有匹配到,则默认拒绝权限。具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"catalogs":[
{
"group":"admin",
"allow":"all"
},
{
"catalog":"mysql",
"allow":"all"
},
{
"user":"user1",
"catalog":"hive",
"allow":"read-only"
},
{
"catalog":"system",
"allow":"none"
}
]
}

再创建用户 user2 及 admin-user,来测试一下效果