大纲
在开启etcd认证前必须先创建root用户并且角色必须是root
创建root用户并赋予root角色 注意 etcd默认存在一个root权限 可以操作任意数据
./etcdctl user add root --endpoints=192.168.0.160:2479
./etcdctl user grant-role root root --endpoints=192.168.0.160:2479
#默认存在root角色
赋予root角色
使用/etcdctl auth enable --user=root --password=123456 --endpoints=192.168.0.160:2479开启权限认证
后续所有的请都需要带上–user --password 才能正常访问了
./etcdctl get key --user=root --password=123456 --endpoints=192.168.0.160:2479
查看角色
/etcdctl role list
注意: ectd中的role 权限主要是对key的操作权限
权限相关的命令
例如 创建一个devops角色有如下权限操作
./etcdctl role add devops --user=root --password=123456 --endpoints=192.168.0.160:2479
./etcdctl role grant-permission devops readwrite /dev --prefix=true --user=root --password=123456 --endpoints=192.168.0.160:2479
./etcdctl role grant-permission devops readwrite k1 k100 --user=root --password=123456 --endpoints=192.168.0.160:2479
./etcdctl role grant-permission devops read /test --prefix=true --user=root --password=123456 --endpoints=192.168.0.160:2479
./etcdctl role grant-permission devops write /ops --prefix=true --user=root --password=123456 --endpoints=192.168.0.160:2479
./etcdctl role get devops --user=root --password=123456 --endpoints=192.168.0.160:2479
查看所有用户
/etcdctl use list
用户相关的命令
例如 创建一个liuyijiang用户并赋予devops角色
./etcdctl user add liuyijiang --user=root --password=123456 --endpoints=192.168.0.160:2479
./etcdctl user grant-role liuyijiang devops --user=root --password=123456 --endpoints=192.168.0.160:247
创建用户 并 赋予 角色
测试权限效果
目前的请求都是http请求,使用如下命令时
查询key= /dev
./etcdctl get /dev --user=liuyijiang --password=12345 --endpoints=http://192.168.0.160:2479
–user=liuyijiang --password=12345都是明文传输的会有密码泄露的风险
Etcd支持https访问接口
服务端认证:即客户端访问服务端的时候,客户端需要知道自己访问的服务端是否是真的服务端。 所以服务端需要证明自己的真伪性
类似使用浏览器访问阿里云的时候,浏览器去帮我们确认访问的网址是否是真正的阿里云网站
所以需要服务端提供证明自己的证书
整体结构如下:
实现Etcd服务端认证步骤如下
例如Etcd服务器部署在192.168.0.160这台服务器上
这里使用cfssl 来创建需要的证书 关于cfssl的使用见 《使用cfssl为程序添加https证书》
需要创建一个根证书,并用根证书签发server端的证书 server端证书证明自己就是192.168.0.160这台服务器上的Etcd
创建根CA根证书的配置文件 ca-csr.json 如下 (见 /crt/单机服务端认证/ca-csr.json)
{
"CN": "ETCD-CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Chengdu",
"ST": "Sichuan",
"O": "ETCD-CA",
"OU": "System"
}
],
"ca": {
"expiry":"8760h"
}
}
CA根证书签署配置文件ca-config.json如下 (见 /crt/单机服务端认证/ca-config.json)
{
"signing":{
"default":{
"expiry":"8760h"
},
"profiles":{
"server":{ //一个配置项server
"expiry":"8760h",
"usages":[
"signing",
"key encipherment",
"server auth" //使用服务端认证模式
]
}
}
}
}
服务端证书签名申请配置 server-csr.json 如下 (见 /crt/单机服务端认证/server-csr.json)
{
"CN": "server",
"hosts":["192.168.0.160","127.0.0.1"], //指定host 即向客户端证明192.168.0.160和127.0.0.1 这个两个ip就是服务端所在的ip
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Chengdu",
"ST": "Sichuan",
"O": "server",
"OU": "System"
}
]
}
创建根证书:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
根证书签署的服务端证书 :
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
产出物
其中ca.pem根证书将给客户端(etcdctl)使用,server-key.pem和server.pem将给服务端使用
启动etcd命令如下
./etcd --name=simple-node --data-dir=/ops/etcd/etcd-v3.5.0-linux-amd64/data --wal-dir=/ops/etcd/etcd-v3.5.0-linux-amd64/wallog --listen-client-urls=https://0.0.0.0:2479 --advertise-client-urls=https://0.0.0.0:2479 --cert-file=/ops/cfssl/etcd/server.pem --key-file=/ops/cfssl/etcd/server-key.pem
参数说明:
--listen-client-urls=https://0.0.0.0:2479 注意这里需要使用https
--advertise-client-urls=https://0.0.0.0:2479 注意这里需要使用https
--cert-file=/ops/cfssl/etcd/server.pem 指定服务端证书
--key-file=/ops/cfssl/etcd/server-key.pem 指定服务端证书私钥
这里使用前面创建的liuyijiang用户访问ectd
命令如下 注意指定根证书–cacert=./ca.pem
./etcdctl get /dev --user=liuyijiang --password=123456 --cacert=./ca.pem --endpoints=https://192.168.0.160:2479
参数说明:
--cacert=./ca.pem 指定根证书
--endpoints=https://192.168.0.160:2479 访问的服务端地址 注意https
这种Etcd服务端认证其实类似于浏览器访问https的网站,关键点如下
客户端认证:即客户端(用户)访问服务端的时候,服务端需要知道客户端(用户)是否真实的客户端(用户),所以客户端需要证明自己的真伪性
所以需要客户端提供证明自己的证书
整体结构如下:
这样客户端(用户)就不需要使用账号密码而直接使用证书实现访问Etcd
实现Etcd服务端认证步骤如下
注意 使用Etcd客户端认证 需要保证etcd中已经存在对应的用户并且用户已经配置好权限
给前面创建的liuyijiang用户创建证书
根证书创建和 Etcd服务端认证时创建根证书方式一致
CA根证书签署配置文件ca-config.json如下 (见 /crt/单机客户端认证/ca-config.json)
{
"signing":{
"default":{
"expiry":"8760h"
},
"profiles":{
"server":{
"expiry":"8760h",
"usages":[
"signing",
"key encipherment",
"server auth"
]
},
"client":{ //增加一个配置项 client 注意usages 中使用"client auth"
"expiry":"8760h",
"usages":[
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
客户端证书签名申请配置 liuyijiang-csr.json 如下 (见 /crt/单机客户端认证/liuyijiang-csr.json)
{
"CN": "liuyijiang", //注意CN必须对应ectd中存在的用户名称
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Chengdu",
"ST": "Sichuan",
"O": "server",
"OU": "System"
}
]
}
根证书签署的客户端证书 :
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client liuyijiang-csr.json | cfssljson -bare liuyijiang
产出物
./etcd --name=simple-node --data-dir=/ops/etcd/etcd-v3.5.0-linux-amd64/data --wal-dir=/ops/etcd/etcd-v3.5.0-linux-amd64/wallog --listen-client-urls=https://0.0.0.0:2479 --advertise-client-urls=https://0.0.0.0:2479 --client-cert-auth=true --trusted-ca-file=/ops/cfssl/etcd/ca.pem --cert-file=/ops/cfssl/etcd/server.pem --key-file=/ops/cfssl/etcd/server-key.pem
参数说明
--listen-client-urls=https://0.0.0.0:2479 注意这里需要使用https
--advertise-client-urls=https://0.0.0.0:2479 注意这里需要使用https
--cert-file=/ops/cfssl/etcd/server.pem 指定服务端证书
--key-file=/ops/cfssl/etcd/server-key.pem 指定服务端证书私钥
--client-cert-auth=true 指定开启客户端认证
--trusted-ca-file=/ops/cfssl/etcd/ca.pem 指定根证书(用于验证客户端证书)
命令如下 注意没有使用–user --password
./etcdctl get /dev --cert=./liuyijiang.pem --key=./liuyijiang-key.pem --cacert=./ca.pem --endpoints=https://192.168.0.160:2479
参数说明:
--cert=./liuyijiang.pem 指定客户端证书
--key=./liuyijiang-key.pem 指定客户端证书私钥
--cacert=./ca.pem 指定根证书
--endpoints=https://192.168.0.160:2479 访问的服务端地址 注意https
Etcd客户端认证关键点如下