0x01 创建RootCA根证书
1.1 安装cfSSL pki管理工具
安装cfssl工具 下载链接 CFSSL
- 初始化环境
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
chmod +x /usr/local/bin/cfssl*
1.2 配置PKI
在etcd中证书分为两种情况
-
服务器与客户端之间的通信,这种情况下服务器的证书仅用于服务器认证,客户端证书仅用于客户端认证
-
服务器间的通信,这种情况下每个etcd既是服务器也是客户端,因此其证书既要用于服务器认证,也要用于客户端认证
-
创建PKI配文件 vi ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
PS: 在其中定义3个profile
- server,作为服务器与客户端通信时的服务器证书
- client,作为服务器与客户端通信时的客户端证书
- peer,作为服务器间通信时用的证书,既认证服务器也认证客户端
1.3 创建RootCA证书
配置ROOT CA
vi rootca-csr.json
由于CA证书不表示任何一台服务器,因此此处无需hosts字段
{
"CN": "etcd",
"key": {
"algo": "rsa",
"size": 2048
},
"ca": {
"expiry": "87600h"
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "Test",
"OU": "Security"
}
]
}
使用cfssl生成相关文件
$ cfssl gencert -initca rootca-csr.json | cfssljson -bare rootca
$ ls root*
rootca.csr rootca-csr.json rootca-key.pem rootca.pem
- 证书授权
因为用root用户生成的证书文件,证书权限为
rw-------
,etcd用户没有读权限,而配置文件里面的ETCD_就代表etcd用户,因此需要将其属主修改为etcd。
chown -R etcd:etcd /etc/etcd/pki/*
根CA证书只有1个, 每个节点都保存,只保存证书即可
服务器server证书1个,本实验中为整个集群使用1个证书,每个服务器均保存该证书和私钥。
客户端证书,可以为一个,但是安全性考虑每个访问etcd的客户端都应该有自己的客户端证书和私钥。
服务器peer证书3个, 每个节点保存自己的证书和私钥
0x02 创建服务器证书
两种方式创建服务器证书
- 集群成员用各自的证书,也就是说请求文件中的hosts只写本机IP地址和域名,后续方便扩展,旧的节点不用更新证书信息.建议使用这种方式
- 集群成员用统一的证书,也就是说请求文件中hosts填写集群所有ip地址.所有使用证书的服务器都要写到下面hosts列表里面,否则无法建立连接,以后添加新成员的话,hosts也要改,生产环境一般把hosts写成统一的对外域名。这里最好分开创建三个配置文件,每个配置文件里面填写一个ip,不公用。以后扩容也方便。
2.1 集群成员用各自的证书
生成etcd1 服务端证书
vi server-csr.json
配置示例如下:
{
"CN": "server",
"hosts": ["etcd1.sec.cn","192.168.0.91","127.0.0.1"],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "Test",
"OU": "Security"
}
]
}
生成证书命令
$ cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
$ ls server*
server.csr server.json server-key.pem server.pem
其他集群节点同理,只需要修改配置文件中的hosts键对应的值就行,将其换成本机的地址和域名等信息
- 最后将所有证书进行授权
因为用root用户生成的证书文件,证书权限为
rw-------
,etcd用户没有读权限,而配置文件里面的ETCD_就代表etcd用户,因此需要将其属主修改为etcd。
chown -R etcd:etcd /etc/etcd/pki/*
2.2 集群成员用统一证书
集群成员用统一的证书,也就是说请求文件中hosts填写集群所有ip地址.所有使用证书的服务器都要写到下面hosts列表里面,否则无法建立连接,以后添加新成员的话,hosts也要改,生产环境一般把hosts写成统一的对外域名。这里最好分开创建三个配置文件,每个配置文件里面填写一个ip,不公用。以后扩容也方便。
vi server-csr.json
配置如下
{
"CN": "ETCD Cluster",
"hosts": [
"192.168.0.91",
"192.168.0.92",
"192.168.0.93"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
- 生成命令
$ cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
- 所有节点创建目录
mkdir -p /etc/etcd/pki/
- 给所有节点证书授权
因为用root用户生成的证书文件,证书权限为
rw-------
,etcd用户没有读权限,而配置文件里面的ETCD_就代表etcd用户,因此需要将其属主修改为etcd。
chown -R etcd:etcd /etc/etcd/pki/*
0x03 修改etcd配置并重启
vi /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.0.91:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.0.91:2379,http://127.0.0.1:2379" # 注意修改这里的协议为https
ETCD_NAME="etcd1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.91:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.91:2379"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.0.91:2380,etcd2=http://192.168.0.92:2380,etcd3=http://192.168.0.93:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#开启集群外部服务端认证
ETCD_CERT_FILE="/etc/etcd/pki/server.pem"
ETCD_KEY_FILE="/etc/etcd/pki/server-key.pem"
- 重启
systemctl daemon-reload && systemctl restart etcd
此时改变的仅仅时集群对外的服务方式,内部的通信方式并没有改变,因此无需删除实例,可直接重启etcd。 重启后,使用etcdctl指令访问集群,如果在不指定–ca-file参数,结果会提示 https://192.168.0.91:2379 访问失败,因为其证书是不受信任的
- 查看集群状态
etcdctl --ca-file /etc/etcd/pki/rootca.pem cluster-health
其他节点与上述操作一样,注意修改相关的监听地址即可
0x04 添加客户端验证机制
4.1 启动etcd客户端验证机制
- 修改etcd配置 启动客户端认证需要修改以下参数:
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
- 重启etcd1
systemctl daemon-reload && systemctl restart etcd
其他节点操作与之相同
启动后注意事项
重启etcd服务后发现即使指定了–ca-file参数,https节点仍然无法访问。这次的错误是证书错误,因为客户端没有提供任何证书。
4.2 创建客户端证书
根据实际情况,确定是否在配置文件中指定hosts列表,比如etcdctl运行在多台节点上,因此不指定可以使用该证书的主机列表
配置如下
vi client-root.json
后面ACL配置的时候,需要启用root账户,这里需要在CN中进行配置
配置如下
{
"CN": "root", //后面ACL配置的时候,需要启用root账户,这里需要配置
"hosts": [""],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "Test",
"OU": "Security"
}
]
}
- 命令生成
$ cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=client client-root.json | cfssljson -bare client-root
$ ls client-root*
-
最后将生成的证书交给客户端使用即可。
-
在etcdctl命令行中指定生成的证书和私钥,就能成功访问节点:
$ etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem cluster-health
0x05 集群内部开启pki安全认证
5.1 不重建集群开启pki安全认证
过程较复杂,适合正在运行中的集群
1 准备peer证书
注意:peer证书既是服务端证书又是客户端证书 和server证书一样,3个节点的peer证书其实也可以共用一个,考虑到以后扩容代理的麻烦,所以这里每个节点都配置自己的peer证书3个节点分别创建peer证书请求文件
- 生成peer证书 vi peer.json 配置如下
{
"CN": "peer",
"hosts": ["etcd1.sec.cn","192.168.0.91","127.0.0.1"],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "Test",
"OU": "Security"
}
]
}
- 命令生成
$ cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=peer peer-csr.json | cfssljson -bare peer
$ ls peer*
通过修改配置文件中的hosts值,使用相同方式生成其他节点的peer证书
- 授权证书
cp /etc/etcd/pki/peer*.pem /etc/etcd/pki/
chown -R etcd:etcd /etc/etcd/pki/*
2 节点配置
这里修改etcd1节点为例
查看节点列表,获取节点标识
$ etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem member list
$ etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem cluster-health
修改节点的peer url为https
[root@etcd1 pki]$ etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem member update c883f9e325d8667d https://192.168.0.91:2380
重新检查节点列表和集群健康状态
$ etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem member list
adff72f24ac33f4b: name=etcd1 peerURLs=https://192.168.0.91:2380 clientURLs=https://192.168.0.91:2379 isLeader=true
c883f9e325d8667d: name=etcd3 peerURLs=http://192.168.0.93:2380 clientURLs=https://192.168.0.93:2379 isLeader=false
c96f41ba37a00a16: name=etcd2 peerURLs=http://192.168.0.92:2380 clientURLs=https://192.168.0.92:2379 isLeader=false
$ etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem cluster-health
可以看到etcd1的peer地址已经是https了,但实际上此时etcd1侦听地址没有修改,https所需要的相关证书都没有配置,https通信是不可能建立的,因此事实上此时与etcd1通信仍然是通过http。
注意:如果发现peerURLs不是https,原因在于执行"修改etcd1点的peer url为https步骤"的时候掉了步骤最后面的https://192.168.0.912380 或者ID不正确,重新执行几遍即可
修改节点的peer工作端口为https
修改内容如下
ETCD_LISTEN_PEER_URLS="https://192.168.0.912380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.912380"
ETCD_INITIAL_CLUSTER="etcd1=https//192.168.0.91:2380,etcd2=http://192.168.0.92:2380,etcd3=http://192.168.0.93:2380" # 注意这里的etcd1的url改为https,其他的还保持不变
ETCD_PEER_CERT_FILE="/etc/etcd/pki/-peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
上述配置在etcd1启动了服务器端的https通信,并且要求进行客户端验证,而作为客户端的etcd2和etcd3还没有相关配置,因此https通信仍然会失败,与etcd1的通信仍然fallback到http上。因此需要修改etcd3和etcd2进行客户端验证
3 其他节点peer启用https
- 在etcd2和etcd3节点上首先配置证书和私钥,以及用于验证节点的根CA证书: 需要修改的配置如下
ETCD_PEER_CERT_FILE="/etc/etcd/pki/peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
配置示例
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.0.92:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.0.92:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.92:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.92:2379"
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.0.91:2380,etcd2=http://192.168.0.92:2380,etcd3=http://192.168.0.93:2380" # 这里该节点的地址先不动,还是保持http协议通信
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#开启集群外部服务端认证
ETCD_CERT_FILE="/etc/etcd/pki/etcd1.pem"
ETCD_KEY_FILE="/etc/etcd/pki/etcd1-key.pem"
#开启集群外部客户端认证
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
#开启集群内部服务端认证同时带上客户端证书
ETCD_PEER_CERT_FILE="/etc/etcd/pki/peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
- 重启
systemctl daemon-reload && systemctl restart etcd
etcd3节点与etcd2的节点配置类似,不要修改ETCD_INITIAL_CLUSTER的http配置。原因是如果先在节点上修改配置文件启用https URL,再使用etcdctl指令修改集群的peer访问端点,在两步之间的时间里,实际上是客户端使用http协议访问服务器的https服务,这段时间实际集群间的通信是失败的
启用节点的安全通信
修改etcd2节点的peer url为https
etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-roo.pem --key-file /etc/etcd/pki/client-root-key.pem member update [c96f41ba37a00a16] https://192.168.0.92:2380
重新检查节点列表和集群健康状态
etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem member list
adff72f24ac33f4b: name=etcd1 peerURLs=https://192.168.0.91:2380 clientURLs=https://192.168.0.91:2379 isLeader=false
c883f9e325d8667d: name=etcd3 peerURLs=http://192.168.0.93:2380 clientURLs=https://192.168.0.93:2379 isLeader=true
c96f41ba37a00a16: name=etcd2 peerURLs=https://192.168.0.92:2380 clientURLs=https://192.168.0.92:2379 isLeader=false
发现etcd2节点 peerURLs变为https.注意:如果发现peerURLs不是https,原因在于执行"修改etcd2节点的peer url为https步骤"的时候掉了步骤最后面的https://192.168.0.92:2380 或者ID不正确,重新执行几遍即可
修改etcd1的peer工作端口为https
需要修改的配置如下
ETCD_LISTEN_PEER_URLS="https://192.168.0.92:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.92:2380"
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.0.91:2380,etcd2=https://192.168.0.92:2380,etcd3=http://192.168.0.93:2380" # 将etcd2的URL修改为https
ETCD_PEER_CERT_FILE="/etc/etcd/pki/peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
重启
systemctl daemon-reload && systemctl restart etcd
重新检查节点列表和集群健康状态
[root@etcd3 ~]# etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem member list
adff72f24ac33f4b: name=etcd1 peerURLs=https://192.168.0.91:2380 clientURLs=https://192.168.0.91:2379 isLeader=false
c883f9e325d8667d: name=etcd3 peerURLs=https://192.168.0.93:2380 clientURLs=https://192.168.0.93:2379 isLeader=true
c96f41ba37a00a16: name=etcd2 peerURLs=https://192.168.0.92:2380 clientURLs=https://192.168.0.92:2379 isLeader=false
[root@etcd3 ~]# etcdctl --ca-file /etc/etcd/pki/rootca.pem --cert-file /etc/etcd/pki/client-root.pem --key-file /etc/etcd/pki/client-root-key.pem cluster-health
member adff72f24ac33f4b is healthy: got healthy result from https://192.168.0.91:2379
member c883f9e325d8667d is healthy: got healthy result from https://192.168.0.93:2379
member c96f41ba37a00a16 is healthy: got healthy result from https://192.168.0.92:2379
cluster is healthy
- 修改etcd3节点的peer url为https过程产考etcd2的操作方式
节点配置全部修改为https并重启
etcd1配置
以etcd1节点配置文件为例
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.0.91:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.0.91:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.91:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.91:2379"
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.0.91:2380,etcd2=https://192.168.0.92:2380,etcd3=https://192.168.0.93:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#开启集群外部服务端认证
ETCD_CERT_FILE="/etc/etcd/pki/etcd1.pem"
ETCD_KEY_FILE="/etc/etcd/pki/etcd1-key.pem"
#开启集群外部客户端认证
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
#开启集群内部服务端认证并带上客户端证书
ETCD_PEER_CERT_FILE="/etc/etcd/pki/peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
重启
systemctl daemon-reload && systemctl restart etcd
etcd3与etcd2操作方法一样
5.2 重建集群启用https
注意:这种方式会丢失所有数据,一般在新建集群时使用。一般不使用这种方式
集群节点的peer访问端点存储在数据目录,因此修改ETCD_INITIAL_CLUSTER
参数后,最简单让其生效的方法就是重建集群。
在所有节点上修改etcd配置文件,将peer的url修改为https,配置相关证书,以etcd3为例,涉及参数如下:
ETCD_LISTEN_PEER_URLS="https://192.168.0.93:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.93:2380"
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.0.91:2380,etcd2=https://192.168.0.92:2380,etcd3=https://192.168.0.93:2380"
ETCD_PEER_CERT_FILE="/etc/etcd/pki/etcd1-peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/etcd1-peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
配置示例
[root@etcd3 ~]# cat /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.0.93:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.0.93:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd3"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.93:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.93:2379"
ETCD_INITIAL_CLUSTER="etcd4=https://192.168.0.94:2380,etcd1=https://192.168.0.91:2380,etcd3=https://192.168.0.93:2380,etcd2=https://192.168.0.92:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_CERT_FILE="/etc/etcd/pki/server.pem"
ETCD_KEY_FILE="/etc/etcd/pki/server-key.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
ETCD_PEER_CERT_FILE="/etc/etcd/pki/peer.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/pki/peer-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/pki/rootca.pem"
在所有节点上删除已有实例,重启etcd。
systemctl stop etcd
rm -rf /var/lib/etcd/default.etcd
systemctl daemon-reload && systemctl restart etcd
0x06 ACL
6.1 初始化root账户
因为root是内置账户,要启动ACL必须创建root账号,后续的一些基本操作,必须要root账号才能操作
- 使用root(CN=root)证书创建root,(前面已经创建了client-root相关证书信息)并且激活ACL
- 激活ACL
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem user add root
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem auth enable
6.2 创建client1用户证书
该证书是用户client1
(CN配置指定)使用的。后续客户端需要基于该证书访问etcd服务器
配置文件client1.json如下
{
"CN": "client1",
"hosts": [""],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "Test",
"OU": "Security"
}
]
}
命令生成客户端访问证书
cfssl gencert -ca=rootca.pem -ca-key=rootca-key.pem -config=ca-config.json -profile=client client1.json | cfssljson -bare client
6.3 创建角色clientserver
创建角色clientserver
,同时创建用户client1,并将角色clientserver赋予用户client1
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem role add clientserver
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem user add client1
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem user grant-role client1 clientserver
- 查看用户列表
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem user list
- 查看角色列表
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem role list
6.4 角色授权
权限设置如下
1./hids/agent/register/{hostname}
type:prefix
clientserver:read # 角色clientserver对该key只可读
clientagent:readwrite # 角色clientagent对该key可读可写
配置如下
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem role grant-permission clientserver --prefix=true read /hids/agent/register/
etcdctl --endpoints=[https://192.168.0.91:2379,https://192.168.0.92:2379,https://192.168.0.93:2379] --cert=/pki/client/client-root.pem --key=/pki/client/client-root-key.pem --cacert=/pki/client/ca.pem role grant-permission clientagent --prefix=true readwrite /hids/agent/register/