认证插件

译者:Nancy 校对:无

Kubernetes使用客户端证书,令牌,或者HTTP基本身份验证用户的API调用。

在API服务器中配置—client-ca-file=SOMEFILE选项,就会启动客户端证书认证。引用文件必须包含一个或多个认证机制,通过认证机制验证传给API服务器的客户端证书。当一个客户端证书通过认证,该证书主题的名字就被作为该请求的用户名。

在API服务器中配置选项:--token-auth-file=SOMEFILE, 启动Token认证。目前,Token没有有效期,必须重启API服务,Token列表的更改才会生效。

令牌文件格式路径:plugin/pkg/auth/authenticator/token/tokenfile/...,该文件是一个CSV文件,含有三行:Token,用户名,用户uid。

当http客户端使用Token认证,apiserver需要含有Bearer Sometoken值的一个Authorization头。

OpenID Connect ID Token,传递下面的参数给apiserver:

  • --oidc-issuer-url (必须) API Server连接到OpenID提供者的URL, 只接受HTTPS协议。
  • --oidc-client-id (必须) API Server用于验证Token用户,合法的ID Token在它的aud参数(aud claims 翻译待考虑)中包含该client-id。
  • --oidc-ca-file (可选) API Server用于和OpenID提供者建立和验证安全连接。
  • --oidc-username-claim (可选, 实验性参数) 指定用户名对应的OpenID。默认设置为sub参数,在指定域中是唯一的,不可变的。集群管理员可以选择其它参数如email,作为用户名,但不保证其唯一性和不变性。

请注意,这个标志仍然处于试验阶段,如果我们可以处理更多关于OpenID用户和Kubernetes用户的映射关系,便可以开始使用。因此,未来的变化还是很有可能的。

目前,该ID Token会通过一些第三方应用程序获取。这意味着应用程序必须和API Server共享该配置--oidc-client-id。

如Token文件,当从HTTP客户端使用Token认证方式,API Server希望在Authorization头添加一个Bearer SOMETOKEN的值。

启动基本认证,需要在API Server配置选项—basic_auth_file=SOMEFILE。当前,基本认证凭据是无限期的,而且重启API Server,密码的修改才会生效。需要注意,基本认证方式是更安全的模式,更容易使用,更通用。

基本认证文件格式,plugin/pkg/auth/authenticator/password/passwordfile/...,该文件是一个CSV文件,含有三个值,密码,用户名和用户id。 如果在HTTP客户端使用基本认证,API Server需要一个值是Basic BASE64ENCODEDUSER:PASSWOR的Authorization头。

Keystone认证会在API Server启动的时候把--experimental-keystone-url='AuthURL'参数传给API Server,该认证就会生效。该插件在plugin/pkg/auth/authenticator/request/keystone/keystone.go文件中实现。有关如何使用Keystone去管理项目和用户的详细信息,请参考Keystone文档。请注意,该插件还处于试验阶段,很可能还会变化。请参考有关该插件的讨论计划了解更多细节。

插件开发

我们计划给Kubernetes API Server解决Token问题。使用“bedrock”认证用户,外部提供者给Kubernetes。我们计划使Kubernetes和一个Bedrock认证提供者(如github.com,google.com,Enterprise Directory, Kerberos等等)之间的接口开发更容易。

附录

创建证书

客户端证书认证,用户可以手动产生证书,也可以使用已经存在的脚本部署。

部署脚本路径在cluster/saltbase/salt/generate-cert/make-ca-cert.sh。执行该脚本需要两个参数,一个是API Server的IP地址,另一个是IP:或者DNS:主题备用名称的列表。该脚本会产生三个文件,ca.crt,server.crt和server.key。最后,添加下面的参数作为API Server的启动参数, --client-ca-file=/srv/kubernetes/ca.crt,--tls-cert-file=/srv/kubernetes/server.cert,--tls-private-key-file=/srv/kubernetes/server.key。

Easyrsa可以用来为你的集群手动生成证书。

  1. 下载,解压,初始化Easyrsa3的补丁版本。
    curl -L -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz 
    tar xzf easy-rsa.tar.gz 
    cd easy-rsa-master/easyrsa3 
    ./easyrsa init-pki
    
  2. 产生一个CA. (--batch设置自动模式。--req-cn使用默认CN。)
    ./easyrsa --batch "--req-cn=${MASTER_IP}@date +%s" build-ca nopass
    
  3. 产生服务器证书和秘钥。(build-server-full [文件名]:给客户端和服务器生成一个本地的秘钥对和信号)
    ./easyrsa --subject-alt-name="IP:${MASTER_IP}" build-server-full kubernetes-master nopass
    
  4. 复制pki/ca.crt,pki/issued/kubernetes-master.crt,pki/private/kubernetes-master.key到你的目录。
  5. 记得填写参数--client-ca-file=/yourdirectory/ca.crt,--tls-cert-file=/yourdirectory/server.cert,--tls-private-key-file=/yourdirectory/server.key,并作为API Server的启动参数。

Openssl也可以用来给你的集群手动生成证书。

  1. 使用2048bit生成ca.key:openssl genrsa -out ca.key 2048
  2. 根据ca.key生成ca.crt。(-days设置证书的有效时间)。
    openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
    
  3. 使用2048bit生成server.key:openssl genrsa -out server.key 2048
  4. 根据server.key生成server.csr。
    openssl req -new -key server.key -subj "/CN=${MASTER_IP}" -out server.csr
    
  5. 根据ca.key,ca.crt和server.csr生成server.crt。
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000
    
  6. 查看证书:openssl x509 -noout -text -in ./server.crt。 最后,记得填写参数,并作为API Server的启动参数。