如何在Linux上使用Glusterfs存储群集启用TLS/SSL加密
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.45 | gfs01 |
192.168.1.46 | gfs01 |
192.168.1.47 | gfs01 |
192.168.1.48 | gfs01 |
公用名(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)