原文地址:Role-based access control
總覽
身份驗證已添加到etcd 2.1中。 etcd v3 API略微修改了身份驗證功能的API和用戶界面,以更好地適應新的數據模型。本指南旨在幫助用戶在etcd v3中設置基本身份驗證和基於角色的訪問控制。
特殊用戶和角色
有一個特殊用戶root
,一個特殊角色root
。
用戶root
在激活身份驗證之前,必須創建對etcd
具有完全訪問權限的root
用戶。 root
用戶的想法是出於管理目的:管理角色和普通用戶。 root
用戶必須具有root
角色,並且可以在etcd
中進行任何更改。
角色root
可以將角色root
授予除root
用戶之外的任何用戶。 具有root
角色的用戶既具有全局讀寫訪問權限,又具有更新集群的身份驗證配置的權限。 此外,root
角色授予常規集群維護的特權,包括修改集群成員資格,對存儲進行碎片整理以及拍攝快照。
用戶的工作方式
etcdctl
的user
子命令處理與用戶帳戶有關的所有事情。
可以通過以下方式找到用戶列表:
$ etcdctl user list
通過以下方式創建新用戶:
$ etcdctl user add myusername
創建新用戶將提示您輸入新密碼。 當給出選項--interactive=false
時,可以從標准輸入中提供密碼。 --new-user-password
也可以用於提供密碼。
可以通過以下方式為用戶授予和撤消角色:
$ etcdctl user grant-role myusername foo
$ etcdctl user revoke-role myusername bar
可以使用以下命令檢查用戶的設置:
$ etcdctl user get myusername
用戶密碼可以通過以下方式更改:
$ etcdctl user passwd myusername
更改密碼將再次提示您輸入新密碼。 當給出選項--interactive=false
時,可以從標准輸入中提供密碼。
通過以下方式刪除帳戶:
$ etcdctl user delete myusername
角色的工作方式:
etcdctl
的role
子命令處理與授予特定用戶的特定角色的訪問控制有關的所有事情。
列出角色:
$ etcdctl role list
創建一個新角色:
$ etcdctl role add myrolename
角色沒有密碼; 它僅定義了一組新的訪問權限。
授予角色訪問單個密鑰或一系列密鑰的權限。
范圍可以指定為間隔[開始鍵,結束鍵],其中開始鍵應按字母順序在詞匯上小於結束鍵。
可以將訪問權限授予讀取,寫入或同時授予兩者,如以下示例所示:
# Give read access to a key /foo
$ etcdctl role grant-permission myrolename read /foo
# Give read access to keys with a prefix /foo/. The prefix is equal to the range [/foo/, /foo0)
$ etcdctl role grant-permission myrolename --prefix=true read /foo/
# Give write-only access to the key at /foo/bar
$ etcdctl role grant-permission myrolename write /foo/bar
# Give full access to keys in a range of [key1, key5)
$ etcdctl role grant-permission myrolename readwrite key1 key5
# Give full access to keys with a prefix /pub/
$ etcdctl role grant-permission myrolename --prefix=true readwrite /pub/
要查看授予的權限,我們可以隨時查看該角色:
$ etcdctl role get myrolename
撤消權限是按照相同的邏輯方式完成的:
$ etcdctl role revoke-permission myrolename /foo/bar
就像完全刪除一個角色一樣:
$ etcdctl role delete myrolename
開啟身份認證
啟用身份驗證的最少步驟如下。 管理員可以根據喜好在啟用身份驗證之前或之后設置用戶和角色。
確保已創建root用戶:
$ etcdctl user add root
Password of root:
開啟身份認證
$ etcdctl auth enable
此后,etcd在啟用身份驗證的情況下運行。 要出於任何原因禁用它,請使用reciprocal命令:
$ etcdctl --user root:rootpw auth disable
使用etcdctl
進行身份驗證
etcdctl
支持類似curl
的標志進行身份驗證。
$ etcdctl --user user:password get foo
可以從提示符處獲取密碼:
$ etcdctl --user user get foo
密碼也可以從命令行參數--password
獲取:
$ etcdctl --user user --password password get foo
否則,所有etcdctl
命令均保持不變。 用戶和角色仍然可以創建和修改,但是需要具有root
角色的用戶進行身份驗證。
使用TLS通用名稱
從v3.2版本開始,如果使用參數--client-cert-auth=true
啟動etcd服務器,則客戶端的TLS證書中的“通用名稱(CN)”字段將用作etcd用戶。在這種情況下,公用名將對用戶進行身份驗證,並且客戶端不需要密碼。請注意,如果同時傳遞了1. --client-cert-auth=true
且客戶端提供了CN,並且客戶端提供了2.用戶名和密碼,則將優先考慮基於用戶名和密碼的身份驗證。請注意,此功能不能與gRPC-proxy
和gRPC-gateway
一起使用。這是因為gRPC-proxy
會從其客戶端終止TLS,因此所有客戶端都共享代理證書。 gRPC-gateway
內部使用TLS連接將HTTP請求轉換為gRPC請求,因此它具有相同的限制。因此,客戶端不能正確地將其CN提供給服務器。如果給定證書的CN不為空,則gRPC-proxy
將導致錯誤並停止。 gRPC-proxy
返回錯誤,表明客戶端證書中的CN為非空。
從v3.3版本開始,如果啟用了帶有選項--peer-cert-allowed-cn
或--peer-cert-allowed-hostname
的etcd
服務器啟動,則對等節點連接篩選。如果節點的TLS證書身份與允許的節點匹配,則節點只能加入etcd集群。有關更多詳細信息,請參見etcd安全性頁面。