在Linux上使用Glusterfs存储的群集如何启用TLS/SSL加密

时间:2019-11-20 08:53:51  来源:igfitidea点击:

如何使用SSL/TLS设置GlusterFS?
在Glusterfs Linux集群中如何使用SSL?
如何在Linux上的Glusterfs存储群集上使用TLS/SSL启用网络加密?

在GlusterFS中设置SSL的相关文件

需要在每个节点创建以下文件以进行TLS/SSL加密:

  • /etc/ssl/glusterfs.pemSSL证书。该文件"必须在每个节点上创建",并且"不得与群集中的任何其他节点或任何其他服务器共享"。
  • /etc/ssl/glusterfs.keySSL私钥。该文件"必须在每个节点上创建",并且"不得与群集中的任何其他节点或任何其他服务器共享"。
  • /etc/ssl/glusterfs.ca所有节点证书的串联。该文件"不是唯一的",并且在所有服务器节点和客户端上必须"相同"。
  • /var/lib/glusterd/secure-access在每个节点的管理路径上启用TLS加密。需要使用touch命令在每个节点上创建此文件。

GlusterFS集群配置

假设集群配置如下:

IP地址节点主机名
192.168.2.45gfs01
192.168.2.46gfs01
192.168.2.47gfs01
192.168.2.48gfs01

在每个节点上使用DNS或/etc/hosts文件进行设置:

$ cat /etc/hosts

输出示例:

127.0.0.1	localhost 
127.0.1.1	ubuntu-box-1 
192.168.2.45  gfs01 
192.168.2.46  gfs02 
192.168.2.47  gfs03 
192.168.2.48  gfs04

在Glusterfs中使用SSL

在每个节点(gfs01,gfs02,gfs03和gfs04)上执行以下命令。

如何为每个节点和客户端生成私钥

$ cd /etc/ssl/
$ sudo openssl genrsa -out glusterfs.key 2048

输出示例:

Generating RSA private key, 2048 bit long modulus
.......................................................................+++
................................+++
e is 65537 (0x10001)

如何为每个节点生成签名证书

在所有节点上执行下面的命令,例如,gfs01:

$ cd /etc/ssl/
$ sudo openssl req -new -x509 -key glusterfs.key -subj "/CN=gfs01" -out glusterfs.pem

对于客户端,同样使用相同命令生成证书, 比如,client01:

$ cd /etc/ssl/
$ sudo openssl req -new -x509 -key glusterfs.key -subj "/CN=client01" -out glusterfs.pem

如何创建证书颁发机构(CA)文件的证书

在gfs01节点上进行操作:

从所有其他节点(包括客户端)中,复制所有.pem文件过来,如下所示:

$ mkdir /tmp/ca/
$ cd /tmp/ca/
$ scp root@gfs02:/etc/ssl/glusterfs.pem gfs02.pem
$ scp root@gfs03:/etc/ssl/glusterfs.pem gfs03.pem
$ scp root@gfs04:/etc/ssl/glusterfs.pem gfs04.pem
$ scp root@client01:/etc/ssl/glusterfs.pem client01.pem

然后将这些证书合并成一个文件

### 给所有服务器节点使用
$ cat /etc/ssl/glusterfs.pem gfs02.pem gfs03.pem gfs04.pem client01.pem > glusterfs.ca

### 给所有客户端节点使用
$ cat /etc/ssl/glusterfs.pem gfs02.pem gfs03.pem gfs04.pem > glusterfs-client.ca

现在将glusterfs.ca文件放在所有服务器节点上:

$ sudo cp glusterfs.ca /etc/ssl/
$ scp glusterfs.ca root@gfs02:/etc/ssl/
$ scp glusterfs.ca root@gfs03:/etc/ssl/
$ scp glusterfs.ca root@gfs04:/etc/ssl/

现在将glusterfs-client.ca文件放在所有客户端节点上,同时改个名:

$ scp glusterfs-client.ca root@client01:/etc/ssl/glusterfs.ca
$ rm -rf /tmp/ca/

如何在服务器节点上启用SSL加密

在所有的服务器节点上执行以下命令:

$ sudo touch /var/lib/glusterd/secure-access

在所有服务器上重启glusterd:

$ systemctl restart glusterfs-server.service

如何在客户端节点上启用管理加密

假设卷名称为gvol0。

在所有客户端上执行以下命令:

$ sudo touch /var/lib/glusterd/secure-access

在所有客户端上卸载该卷:

$ sudo umount /var/www

在所有客户端上挂载该卷:

$ sudo mount -t glusterfs gfs01:/gvol0 /mnt/www/

如何卷gvol0启用TLS/SSL I/O加密?

首先停止卷gvol0,
然后运行:

$ sudo gluster volume stop gvol0

## 需要在所有客户机/服务器(如果有)上卸载卷
## 在所有节点上(gfs01,gfs02,gfs03,gfs04,client01)重启 glusterfs-server.service 服务
$ sudo sudo umount /var/www
$ sudo systemctl restart glusterfs-server.service

接下来,执行以下命令,设置可以对该卷访问的所有服务器和客户端。

语法为:

$ sudo gluster volume set {VOLNAME} auth.ssl-allow '{server1,server2,client1,client2,....}'

例如:

$ sudo gluster volume set gvol0 auth.ssl-allow 'gfs01,gfs02,gfs03,gfs04,client01'

允许所有经过TLS身份验证的客户端都可以挂载并且访问该卷:

$ sudo gluster volume set gvol0 auth.ssl-allow '*'

客户端访问卷启用ssl

$ gluster volume set gvol0 client.ssl on

在服务端访问卷启用ssl

$ gluster volume set gvol0 server.ssl on

启动卷服务:

$ sudo gluster vol start gvol0

在所有客户端/服务器上挂载卷:

$ sudo mount -t glusterfs gfs01:/gvol0 /mnt/www/

检查卷gvol0的I/O路径上是否启用了SSL:

$ sudo grep -i ssl /var/log/glusterfs/bricks/nodirectwritedata-brick1-gvol0.log

输出示例:

150:     option auth.login./nodirectwritedata/brick1/gvol0.ssl-allow gfs01,gfs02
152:     option transport.socket.ssl-enabled on
[2017-03-07 08:24:38.893211] I [socket.c:343:ssl_setup_connection] 0-tcp.gvol0-server: peer CN = gfs01
[2017-03-07 08:24:38.893248] I [socket.c:346:ssl_setup_connection] 0-tcp.gvol0-server: SSL verification succeeded (client: 192.168.2.45:49149)
[2017-03-07 08:24:39.146162] I [socket.c:343:ssl_setup_connection] 0-tcp.gvol0-server: peer CN = gfs02
[2017-03-07 08:24:39.146197] I [socket.c:346:ssl_setup_connection] 0-tcp.gvol0-server: SSL verification succeeded (client: 192.168.2.46:49148)