k8s etcd 权限与角色 用户创建 https安全访问实现总结

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 

k8s etcd 权限与角色 用户创建 https安全访问实现总结_第1张图片

创建用户

查看所有用户

/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
创建用户 并 赋予 角色

在这里插入图片描述

测试权限效果

k8s etcd 权限与角色 用户创建 https安全访问实现总结_第2张图片

开启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服务端认证

服务端认证:即客户端访问服务端的时候,客户端需要知道自己访问的服务端是否是真的服务端。 所以服务端需要证明自己的真伪性

类似使用浏览器访问阿里云的时候,浏览器去帮我们确认访问的网址是否是真正的阿里云网站

所以需要服务端提供证明自己的证书

整体结构如下:

k8s etcd 权限与角色 用户创建 https安全访问实现总结_第3张图片

实现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

k8s etcd 权限与角色 用户创建 https安全访问实现总结_第4张图片

产出物

  • 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

k8s etcd 权限与角色 用户创建 https安全访问实现总结_第5张图片

这种Etcd服务端认证其实类似于浏览器访问https的网站,关键点如下

  • 1 服务端需要配置证书私钥
  • 2 客服端访问时需要指定根证书
  • 3 利用根证书实现对服务端提供的证书的认证实现安全访问

Etcd客户端认证

客户端认证:即客户端(用户)访问服务端的时候,服务端需要知道客户端(用户)是否真实的客户端(用户),所以客户端需要证明自己的真伪性

所以需要客户端提供证明自己的证书

整体结构如下:

k8s etcd 权限与角色 用户创建 https安全访问实现总结_第6张图片

这样客户端(用户)就不需要使用账号密码而直接使用证书实现访问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

k8s etcd 权限与角色 用户创建 https安全访问实现总结_第7张图片

产出物

  • 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 整个操作过程是加密访问

你可能感兴趣的:(docker+k8s,etcd,kubernetes,etcd,安全)