etcd集群开启用户身份认证

etcd 集群搭建完成之后,默认条件下,访问 etcd 是没有用户和密码限制的,任何人只要能连接到 etcd 的 2379 端口,就可以读写 etcd 数据,这就存在安全问题。etcd 支持用户身份认证,但是该功能默认是关闭的,下面将介绍如何开启 etcd 的用户身份认证功能。

etcd集群:
endpoints=192.168.56.200:2379,192.168.56.200:3379,192.168.56.200:4379

1. 创建 etcd 角色

创建 3 个角色,分别为 root,read_write,read_only,root 角色和用户必须要创建,否则开启用户认证会报错,read_write 表示读写角色,read_only 表示只读角色,如下:

  • etcdctl --endpoints=${endpoints} role add root
  • etcdctl --endpoints=${endpoints} role add read_write
  • etcdctl --endpoints=${endpoints} role add read_only

2. 给角色赋予权限

read_write 角色拥有读写权限,read_only 角色拥有只读权限,并且它们只能对前缀为 / 的 key 进行读写。

  • etcdctl --endpoints=${endpoints} role grant-permission read_write --prefix=true readwrite /
  • etcdctl --endpoints=${endpoints} role grant-permission read_only --prefix=true read /

3. 创建 etcd 用户

创建 etcd 用户 root, admin 和 monitor,密码都是 123456。

  • etcdctl --endpoints=${endpoints} user add root:123456
  • etcdctl --endpoints=${endpoints} user add admin:123456
  • etcdctl --endpoints=${endpoints} user add monitor:123456

4. 将角色赋予用户

用户 admin 的角色为 read_write,用户 monitor 的角色为 read_only。

  • etcdctl --endpoints=${endpoints} user grant-role root root
  • etcdctl --endpoints=${endpoints} user grant-role admin read_write
  • etcdctl --endpoints=${endpoints} user grant-role monitor read_only

5. 开启 etcd 用户认证

etcdctl --endpoints=${endpoints} auth enable

6. 测试 etcd 用户认证

没有指定用户名和密码时,会报错,如下:

[root@localhost ~]# etcdctl --endpoints=${endpoints} get /mykey

{"level":"warn","ts":"2020-09-28T11:29:04.668+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of 
unary invoker failed","target":"endpoint://client-7f830105-4bac-4ec5-8b5e-1e97181639a5/192.168.56.200:2379","attempt":0,"error":"rpc error: code = InvalidArgument desc = etcdserver: user name is empty"}
Error: etcdserver: user name is empty

指定正确的用户名和密码,再次重试:

[root@localhost ~]# etcdctl --endpoints=${endpoints} --user=admin:123456 put /mykey 'myvalue'
OK
[root@localhost ~]# etcdctl --endpoints=${endpoints} --user=admin:123456 get /mykey
/mykey
myvalue

访问不是 / 前缀的 key,仍然报错,因为设置的账号只对 / 前缀的 key 有访问权限,如下:

[root@localhost ~]# etcdctl --endpoints=${endpoints} --user=admin:123456 get test

{"level":"warn","ts":"2020-09-28T11:34:30.184+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of 
unary invoker failed","target":"endpoint://client-251bbf93-44b8-4e62-a68a-1549011d4f87/192.168.56.200:2379","attempt":0,"error":"rpc error: code = PermissionDenied desc = etcdserver: permission denied"}
Error: etcdserver: permission denied

monitor 账号只有只读权限,不能写入数据,如果使用 monitor 账号写入数据,会报错,如下:

[root@localhost ~]# etcdctl --endpoints=${endpoints} --user=monitor:123456 put /mykey '1'

{"level":"warn","ts":"2020-09-28T11:35:30.901+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of 
unary invoker failed","target":"endpoint://client-097c6a6e-4e25-42eb-ba13-0f6f61688513/192.168.56.200:2379","attempt":0,"error":"rpc error: code = PermissionDenied desc = etcdserver: permission denied"}
Error: etcdserver: permission denied

文章评论

0条评论