1. 添加角色并授权
可以通过如下命令来查看etcd所拥有的角色:
$ ./etcdctl --endpoints http://127.0.0.1:4001 role list
root
我们可以看到,etcd默认有root
这个角色,我们可以通过以下命令查看角色所对应的权限信息:
$ ./etcdctl --endpoints http://127.0.0.1:4001 role get root
Role: root
KV Read:
/*
KV Write:
/*
其实还有个默认的角色guest
,稍后我们再了解关于他的知识。
我们创建个server角色,这个角色的权限是只能对 /server/
下的目录有读写权限:
$ ./etcdctl --endpoints http://127.0.0.1:4001 mkdir /server # 创建目录
$ ./etcdctl --endpoints http://127.0.0.1:4001 role add server # 添加server角色
$ ./etcdctl --endpoints http://127.0.0.1:4001 role get server # 查看角色默认权限
Role: server
KV Read:
KV Write:
$ ./etcdctl --endpoints http://127.0.0.1:4001 role grant --path '/server/*' --readwrite server # 授权,授予server /server/* 的 rw权限
Role server updated
$ ./etcdctl --endpoints http://127.0.0.1:4001 role get server # 角色信息以授权成功
Role: server
KV Read:
/server/*
KV Write:
/server/*
这里我们演示了授权的过程,你可以根据自己需求,添加对应的权限
2. 添加用户并授权
添加用户,在添加过程中,需要设置密码:
$ ./etcdctl --endpoints http://127.0.0.1:4001 user add server # 添加并设置密码
New password:
User server created
查看已有的用户:
$ ./etcdctl --endpoints http://127.0.0.1:4001 user list
server
查看用户角色信息:
$ ./etcdctl --endpoints http://127.0.0.1:4001 user get server
User: server
Roles:
我们可以看到,这里没有和任何角色关联,下面我们给用户授权角色信息:
$ ./etcdctl --endpoints http://127.0.0.1:4001 user grant --roles server server # 与server角色关联
User server updated
我们可以看到,server 用户已经与server角色成功关联了:
$ ./etcdctl --endpoints http://127.0.0.1:4001 user get server
User: server
Roles: server
创建特殊用户root
(如果不存在root用户的话):
./etcdctl --endpoints http://127.0.0.1:4001 user add root
New password:
User root created
如果root
用户已存在,但是不清楚密码信息,可通过如下命令设置密码:
$ ./etcdctl --endpoints http://127.0.0.1:4001 user passwd root # 设置密码
New password:
Password updated
添加之后,我们可以看到root已经自动关联到root这个角色了:
$ ./etcdctl --endpoints http://127.0.0.1:4001 user get root
User: root
Roles: root
3. 启用Basic Auth
在执行这一步之前,请确认已创建root用户并设置了密码
开启认证:
./etcdctl --endpoints http://192.168.0.1:4001,http://192.168.0.2:4001,http://192.168.0.3:4001 auth enable
关闭认证:
关闭认证需要我们指定认证信息,即用户名密码,通过 -u <user>:<passwd>
指定:
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u root:root auth disable
Authentication Disabled
4. 关于guest角色
启用认证后,大家可能会发现,我不使用 -u 参数指定用户名密码,但是仍然可以访问ETCD,那么此时我的角色是什么能?我能不能禁止或限制这种未授权的访问方式呢?当然可以啦,这里就和我们上面提到的guest角色。
我们可以看到此种角色的权限信息:
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u root:root role get guest
Role: guest
KV Read:
/*
KV Write:
/*
可以看到,guest角色对所有的目录都有读写权限,这是很危险的,我们这里更改他的权限,只允许他对 /server 下的路径有读权限:
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u root:root role revoke --path "/*" --readwrite guest # role revoke 是取消某个权限,和grant正好相反
Role guest updated
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u root:root role get guest # 查看权限,现在已经没有权限了
Role: guest
KV Read:
KV Write:
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u root:root role grant --path "/server/*" --read guest # 重新授权
Role guest updated
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u root:root role get guest # 授权成功
Role: guest
KV Read:
/server/*
KV Write:
5. 测试权限
测试guest角色:
$ ./etcdctl --endpoints http://127.0.0.1:4001 ls /
Error: 110: The request requires user authentication (Insufficient credentials) # 没权限
$ ./etcdctl --endpoints http://127.0.0.1:4001 ls /server/
/server/aaa # 可以看/server/下的信息
$ ./etcdctl --endpoints http://127.0.0.1:4001 mkdir /server/bbb
Error: 110: The request requires user authentication (Insufficient credentials) # 没写权限
测试sever用户:
./etcdctl --endpoints http://127.0.0.1:4001 -u server:server ls /
Error: 110: The request requires user authentication (Insufficient credentials) # 没权限看/
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u server:server ls /server/ # 可以看 /server/ 下的信息
/server/aaa
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u server:server mkdir /server/bbb # 可以在server下写信息
$ ./etcdctl --endpoints http://127.0.0.1:4001 -u server:server ls /server/ # 写成功
/server/aaa
/server/bbb