u1timate
Published on 2022-04-16 / 391 Visits
0

ETCD SSL+ACL配置

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用户证书

该证书是用户client1CN配置指定)使用的。后续客户端需要基于该证书访问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/

参考

https://www.cnblogs.com/effortsing/p/10332496.html