Kubernetes 集群中包含两类用户:一类是由 Kubernetes 管理的 service account,另一类是普通用户。
普通用户被假定为由外部独立服务管理。管理员分发私钥,用户存储(如 Keystone 或 Google 帐户),甚至包含用户名和密码列表的文件。在这方面,
Kubernetes 没有代表普通用户帐户的对象
。无法通过 API 调用的方式向集群中添加普通用户。
相对的,service account 是由 Kubernetes API 管理的帐户。它们都绑定到了特定的 namespace,并由 API server 自动创建,或者通过 API 调用手动创建。Service account 关联了一套凭证,存储在
Secret
,这些凭证同时被挂载到 pod 中,从而允许 pod 与 kubernetes API 之间的调用。
API 请求被绑定到普通用户或 serivce account 上,或者作为匿名请求对待。这意味着集群内部或外部的每个进程,无论从在工作站上输入
kubectl
的人类用户到节点上的
kubelet
,到控制平面的成员,都必须在向 API Server 发出请求时进行身份验证,或者被视为匿名用户。
Kubernetes 使用客户端证书、bearer token、身份验证代理或者 HTTP 基本身份验证等身份认证插件来对 API 请求进行身份验证。当有 HTTP 请求发送到 API server 时,插件会尝试将以下属性关联到请求上:
通过将
--client-ca-file=SOMEFILE
选项传递给 API server 来启用客户端证书认证。引用的文件必须包含一个或多个证书颁发机构,用于验证提交给 API server 的客户端证书。如果客户端证书已提交并验证,则使用 subject 的 Common Name(CN)作为请求的用户名。从 Kubernetes 1.4开始,客户端证书还可以使用证书的 organization 字段来指示用户的组成员身份。要为用户包含多个组成员身份,请在证书中包含多个 organization 字段。
当使用来自 HTTP 客户端的基本身份验证时,API server 需要Authorization header 中包含 Basic BASE64ENCODED(USER:PASSWORD) 的值。
Service Account Token
Service account 是一个自动启用的验证器,它使用签名的 bearer token 来验证请求。该插件包括两个可选的标志:
--service-account-key-file 一个包含签名 bearer token 的 PEM 编码文件。如果未指定,将使用 API server 的 TLS 私钥。
--service-account-lookup 如果启用,从 API 中删除掉的 token 将被撤销。
Service account 通常 API server 自动创建,并通过 ServiceAccount注入控制器 关联到集群中运行的 Pod 上。Bearer token 挂载到 pod 中众所周知的位置,并允许集群进程与 API server 通信。 帐户可以使用 PodSpec 的 serviceAccountName 字段显式地与Pod关联。
有关上述要求3的说明,需要 CA 签名证书。如果您部署自己的身份提供商(而不是像 Google 或 Microsoft 之类的云提供商),则必须让您的身份提供商的 Web 服务器证书由 CA 标志设置为 TRUE 的证书签名,即使是自签名的。这是由于 GoLang 的 TLS 客户端实现对证书验证的标准非常严格。如果您没有 CA,可以使用 CoreOS 团队的 这个脚本 创建一个简单的 CA 和一个签名的证书和密钥对。
kubectl config set-credentials USER_NAME \
--auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=( issuer url )\
--auth-provider-arg=client-id=( your client id)\
--auth-provider-arg=client-secret=( your client secret )\
--auth-provider-arg=refresh-token=( your refresh token )\
--auth-provider-arg=idp-certificate-authority=( path to your ca certificate )\
--auth-provider-arg=id-token=( your id_token )\
--auth-provider-arg=extra-scopes=( comma separated list of scopes to add to "openid email profile", optional )
kubectl --token=eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL21sYi50cmVtb2xvLmxhbjo4MDQzL2F1dGgvaWRwL29pZGMiLCJhdWQiOiJrdWJlcm5ldGVzIiwiZXhwIjoxNDc0NTk2NjY5LCJqdGkiOiI2RDUzNXoxUEpFNjJOR3QxaWVyYm9RIiwiaWF0IjoxNDc0NTk2MzY5LCJuYmYiOjE0NzQ1OTYyNDksInN1YiI6Im13aW5kdSIsInVzZXJfcm9sZSI6WyJ1c2VycyIsIm5ldy1uYW1lc3BhY2Utdmlld2VyIl0sImVtYWlsIjoibXdpbmR1QG5vbW9yZWplZGkuY29tIn0.f2As579n9VNoaKzoF-dOQGmXkFKf1FMyNV0-va_B63jn-_n9LGSCca_6IVMP8pO-Zb4KvRqGyTP0r3HkHxYy5c81AnIh8ijarruczl-TK_yF5akjSTHFZD-0gRzlevBDiH8Q79NAr-ky0P4iIXS8lY9Vnjch5MF74Zx0c3alKJHJUnnpjIACByfF2SCaYzbWFMUNat-K1PaUk5-ujMBG7yYnr95xD-63n8CO8teGUAAEMx6zRjzfhnhbzX-ajwZLGwGUBT4WqjMs70-6a7_8gZmLZb2az1cZynkFRj2BaCkVT3A2RrjeEwZEtGXlMqKJ1_I2ulrOVsYx01_yD35-rw get nodes
配置文件使用 kubeconfig 文件格式。文件中的 ”user“ 指的是 API server 的 webhook,”clusters“ 是指远程服务。见下面的例子:
# clusters refers to the remote service.clusters:-name: name-of-remote-authn-service
cluster:certificate-authority: /path/to/ca.pem # CA for verifying the remote service.server: https://authn.example.com/authenticate # URL of remote service to query. Must use 'https'.# users refers to the API server's webhook configuration.users:-name: name-of-api-server
user:client-certificate: /path/to/cert.pem # cert for the webhook plugin to useclient-key: /path/to/key.pem # key matching the cert# kubeconfig files require a context. Provide one for the API server.current-context: webhook
contexts:-context:cluster: name-of-remote-authn-service
user: name-of-api-sever
name: webhook
--requestheader-allowed-names 可选。Common Name (cn)列表。如果设置了,则在检查用户名的请求 header 之前, 必须提供指定列表中 Common Name(cn)的有效客户端证书。如果为空,则允许使用任何 Common Name。
Keystone 密码
通过在启动过程中将 --experimental-keystone-url=<AuthURL> 选项传递给 API server 来启用 Keystone 认证。该插件在 plugin/pkg/auth/authenticator/password/keystone/keystone.go 中实现,目前使用基本身份验证通过用户名和密码验证用户。
如果您为 Keystone 服务器配置了自签名证书,则在启动 Kubernetes API server 时可能需要设置 --experimental-keystone-ca-file=SOMEFILE 选项。如果您设置了该选项,Keystone 服务器的证书将由experimental-keystone-ca-file 中的某个权威机构验证。否则,证书由主机的根证书颁发机构验证。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: scopes-impersonator
# Can set "Impersonate-Extra-scopes" header.-apiGroups:["authentication.k8s.io"]resources:["userextras/scopes"]verbs:["impersonate"]
模拟 header 的可用值可以通过设置 resourceNames 可以使用的资源来限制。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: limited-impersonator
rules:# Can impersonate the user "[email protected]"-apiGroups:[""]resources:["users"]verbs:["impersonate"]resourceNames:["[email protected]"]# Can impersonate the groups "developers" and "admins"-apiGroups:[""]resources:["groups"]-verbs:["impersonate"]resourceNames:["developers","admins"]# Can impersonate the extras field "scopes" with the values "view" and "development"-apiGroups:["authentication.k8s.io"]resources:["userextras/scopes"]verbs:["impersonate"]resourceNames:["view","development"]