前言
etcd 和 ZooKeeper 一样,都是分布式系统里常见的数据共享组件。只要开始存数据、传配置,安全就不能再放到最后补。etcd 的认证和权限控制正是围绕这个问题逐步完善起来的。
这篇内容只看容器云场景下 etcd 集群的数据安全,重点放在认证机制和实际操作上。版本用的是 etcd V3,示例通过 Docker 跑起来。
etcd 的安全机制怎么看
etcd 的访问控制基于 RBAC 模型,也就是用用户、角色和资源来拼出权限关系。简单说,谁能做什么,不是写死在客户端里,而是由服务端统一判断。
如果你想确认自己手上的版本,可以直接访问:
http://[你的 etcd ip]:2379/version
启动时先把参数理清
用 Docker 部署时,几个启动参数基本绕不开:
| 参数名称 | 参数说明 |
|---|---|
| TZ | 时区,国内一般选 Asia/Shanghai |
| ETCD_NAME | etcd 节点名称 |
| ETCD_DATA_DIR | etcd 容器的数据存储目录 |
| ETCD_ADVERTISE_CLIENT_URLS | 当前节点对外公布的客户端地址 |
| ETCD_INITIAL_ADVERTISE_PEER_URLS | 当前节点对外公布的通信地址 |
| ETCD_LISTEN_PEER_URLS | 当前节点与其他节点通信时的监听地址 |
| ETCD_INITIAL_CLUSTER_TOKEN | 初始化集群 token,保证集群唯一性 |
| ETCD_INITIAL_CLUSTER | 初始化集群时定义成员列表 |
| ETCD_INITIAL_CLUSTER_STATE | 初始化状态,首次为 new,已有集群则用 existing |
| ALLOW_NONE_AUTHENTICATION | 是否允许免密登录,设置为 yes |
这些参数里,真正容易踩坑的通常不是名字,而是集群初始化那几个。地址写错了,后面认证还没测就先卡在成员通信上了。
常用授权命令
etcdctl 负责用户、角色和权限的管理,常用命令如下:
# 查看 etcd 用户列表
etcdctl user list
# 添加一个用户
etcdctl user add [USER_NAME]
# 查看 etcd 角色列表
etcdctl role list
# 添加一个角色
etcdctl role add [ROLE_NAME]
# 为角色赋予读写权限
etcdctl role grant-permission [ROLE_NAME] --prefix=true readwrite [DATA_DIR]
# 查看用户的角色
etcdctl user get [USER_NAME]
# 为用户添加角色
etcdctl user grant-role [USER_NAME] [ROLE_NAME]
开启认证
先看认证状态:


