ssl 如何正确使用etcd角色来控制特定etcd密钥的写入权限?

7nbnzgx9  于 2023-06-30  发布在  Etcd
关注(0)|答案(1)|浏览(227)

我使用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.pemCN=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。是什么原因导致了这个问题?感谢您的评分

fykwrbwg

fykwrbwg1#

我不能帮助--user的问题,即为什么它不工作,但是,为什么你不能使用以下方法。你使用TLS认证,这很好,但为什么不创建master.clientv3myuserN.clientv3,其中Master是带有CN=master的主TLS证书,其他TLS证书遵循CN=myuserN的模式,其中N=0,1,2,...。然后将root角色授予master用户,将myrole角色授予所有myuserN用户。
在这种情况下,您可以使用主证书完全控制etcd和其他具有myrole角色的证书,即仅对/events/1密钥具有read权限。
按照这个想法,你基本上可以创建任何其他的permissions,并有一个master客户端来控制etcd中的所有内容。希望有帮助:)

相关问题