k8s etcd 权限与角色 用户创建 https安全访问实现总结
大纲
- 1 开启安全认证
- 2 权限配置总结
- 3 创建角色
- 4 创建用户分配角色
- 5 ectd https访问
- 6 etcd 服务端认证实现
- 7 etcd 客户端认证实现
开启Etcd安全认证
配置root用户角色和权限
在开启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的操作权限
权限相关的命令
- role add 创建角色
- role delete 删除角色
- role get 查看角色
- role grant-permission 配置角色权限
- role list 查询所有角色
- role revoke-permission 撤销角色权限
例如 创建一个devops角色有如下权限操作
- 对 /dev开头的key 有读写权限 ,对 k1 ~ k100 有读写权限 [k1 k100)
- 对/test开头的key只有查询权限,对/ops开头的key只有写权限
./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
用户相关的命令
- user add 新增用户
- user delete 删除用户
- user get 查询用户
- user grant-role 给用户分配权限
- user list 查询所有用户
- user passwd 修改密码
- user revoke-role 撤销用户权限
例如 创建一个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
创建用户 并 赋予 角色
测试权限效果
开启Etcd https访问
目前的请求都是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服务端认证步骤如下
Step1 创建相关证书
例如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 根证书
- server-key.pem 服务端证书私钥
- server.pem 服务端证书
其中ca.pem根证书将给客户端(etcdctl)使用,server-key.pem和server.pem将给服务端使用
Step2 给etcd服务端配置证书
启动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 指定服务端证书私钥
Step3 etcdctl 客户端使用https访问
这里使用前面创建的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的网站,关键点如下
- 1 服务端需要配置证书私钥
- 2 客服端访问时需要指定根证书
- 3 利用根证书实现对服务端提供的证书的认证实现安全访问
Etcd客户端认证
客户端认证:即客户端(用户)访问服务端的时候,服务端需要知道客户端(用户)是否真实的客户端(用户),所以客户端需要证明自己的真伪性
所以需要客户端提供证明自己的证书
整体结构如下:
这样客户端(用户)就不需要使用账号密码而直接使用证书实现访问Etcd
实现Etcd服务端认证步骤如下
Step1 创建相关证书
注意 使用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
产出物
- liuyijiang-key.pem 客户端证书私钥 即liuyijiang这个用户的私钥
- liuyijiang.pem 客户端证书 即liuyijiang这个用户的证书
Step2 给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 --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 指定根证书(用于验证客户端证书)
Step3 etcdctl 客户端使用https访问
命令如下 注意没有使用–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客户端认证关键点如下
- 1 etcd会使用客户端证书中的CN配置名称找到对应的用户
- 2 可以省略–user --password配置账号密码
- 3 整个操作过程是加密访问