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

时间:2020-01-09 14:17:06  来源:igfitidea点击:

Ubuntu Linux上设置了GlusterFS集群。
在基于WAN(广域网)或Internet之类的不安全网络上使用时,出于安全原因,如何在Linux上的Glusterfs存储群集上使用TLS/SSL启用网络加密?
如何使用Glusterfs设置I/O加密和管理加密?

GlusterFS允许您使用OpenSSL设置TLS(传输层安全性)。

GlusterFS对于TLS/SSL有两个选项。
首先,它可以对服务器和客户端之间的I/O通信进行加密。

glusterd管理服务器的第二次加密,即每当您发出命令行状态或创建新卷等时。

在Glusterfs中使用SSL

在GlusterFS中设置网络加密所需的文件

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

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

假设您有一个四节点的GlusterFS集群,如下所示:

IP地址用于授权的TLS身份的节点主机名
192.168.1.45gfs01
192.168.1.46gfs01
192.168.1.47gfs01
192.168.1.48gfs01

公用名(CN)必须与节点的主机名匹配,并且必须在每个节点上使用DNS或/etc/hosts文件进行设置:

$ cat /etc/hosts

127.0.0.1 localhost 
127.0.1.1 ubuntu-box-1 
192.168.1.45 gfs01 
192.168.1.46 gfs02 
192.168.1.47 gfs03 
192.168.1.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节点上(请注意,公用名(CN)必须与使用DNS或/etc/hosts设置的主机名匹配):

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

在gfs02节点上(请注意,公用名(CN)必须与使用DNS或/etc/hosts设置的主机名匹配):

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

在gfs03节点上(请注意,公用名(CN)必须与使用DNS或/etc/hosts设置的主机名匹配):

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

在gfs04节点上(请注意,公用名(CN)必须与使用DNS或/etc/hosts设置的主机名匹配):

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

对于client01,依此类推:

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

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

从gfs01(gfs01节点上的type命令)从所有其他节点(包括客户端)复制所有.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
## copy file from client01 too ##
$ scp root@client01:/etc/ssl/glusterfs.pem client01.pem

执行以下命令以将收集的文件串联为一个文件:

### this file is for all server nodes only ###
$ cat /etc/ssl/glusterfs.pem gfs02.pem gfs03.pem gfs04.pem client01.pem > glusterfs.ca
### this file is for all clients only ###
$ 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/
### now put file on clients only ###
$ scp glusterfs-client.ca root@client01:/etc/ssl/glusterfs.ca
$ rm -rf /tmp/ca/

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

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

$ 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以启用SSL,然后运行(在gfs01节点上执行所有命令):

$ sudo gluster volume stop gvol0
## You need to nmount the volume on all the clients/servers (if any) ##
## restart glusterfs-server.service on nodes such as gfs01,gfs02,gfs03,gfs04,client01 ##
$ 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
[2015-03-07 08:24:38.893211] I [socket.c:343:ssl_setup_connection] 0-tcp.gvol0-server: peer CN = gfs01
[2015-03-07 08:24:38.893248] I [socket.c:346:ssl_setup_connection] 0-tcp.gvol0-server: SSL verification succeeded (client: 192.168.1.45:49149)
[2015-03-07 08:24:39.146162] I [socket.c:343:ssl_setup_connection] 0-tcp.gvol0-server: peer CN = gfs02
[2015-03-07 08:24:39.146197] I [socket.c:346:ssl_setup_connection] 0-tcp.gvol0-server: SSL verification succeeded (client: 192.168.1.46:49148)