我使用Go etcd/clientv3
启动我的etcd集群,参数如下:
"--name", "etcd-cluster"
"--data-dir", "/var/lib/etcd",
"--wal-dir", "/var/lib",
"--listen-client-urls", "127.0.0.1:2379",
"--listen-peer-urls", , "127.0.0.1:2380",
"--advertise-client-urls", "127.0.0.1:2379",
"--initial-advertise-peer-urls", "127.0.0.1:2380",
"--initial-cluster", "cluster",
"--initial-cluster-state", "new",
"--initial-cluster-token", "election",
"--cert-file", "tls.pem",
"--key-file", "tls.key",
"--client-cert-auth",
"--trusted-ca-file", "ca.pem",
"--peer-client-cert-auth",
"--peer-trusted-ca-file", "peer-ca.pem",
"--peer-cert-file", "peer-cert.pem",
"--peer-key-file", "peer.key",
然后运行以下命令:
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem user add root
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem role add root
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem user add myuser
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem role add myrole
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem put /events/1 value
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem role grant-permisson myrole read /events/1
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem user grant-role root root
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem user grant-role myuser myrole
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem auth enable
用于身份验证的Etcd文档说,如果客户端使用TLS证书,则从该证书中获取CN并用作etcd user
。我的证书tls.pem
有CN=myuser
,因此:
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem put /events/1 value
将导致permission denied
,这是正确的,因为只有read
权限被赋予myuser
。然而,文档还说,如果--user
选项与TLS证书沿着使用,那么--user
将优先于CN
。也就是说,如果我跑了:
env ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cert tls.pem --key tls.key --cacert ca.pem --user=root:mypass put /events/1 value
然后应该使用root
user来执行该操作,我希望它会导致OK
,但它没有发生,而是得到了相同的东西-permission denied
。是什么原因导致了这个问题?感谢您的评分
1条答案
按热度按时间fykwrbwg1#
我不能帮助
--user
的问题,即为什么它不工作,但是,为什么你不能使用以下方法。你使用TLS认证,这很好,但为什么不创建master.clientv3
和myuserN.clientv3
,其中Master是带有CN=master
的主TLS证书,其他TLS证书遵循CN=myuserN
的模式,其中N=0,1,2,...
。然后将root
角色授予master
用户,将myrole
角色授予所有myuserN
用户。在这种情况下,您可以使用主证书完全控制etcd和其他具有
myrole
角色的证书,即仅对/events/1
密钥具有read
权限。按照这个想法,你基本上可以创建任何其他的
permissions
,并有一个master
客户端来控制etcd中的所有内容。希望有帮助:)