1、Kubernetes apiserver认证

https://www.jianshu.com/p/97a3e7060f4c

https://www.cnblogs.com/netonline/p/8710481.html
https://segmentfault.com/a/1190000005808237


当设置产品Kubernetes集群的时候,认证和授权是两个很重要的基本需求。在这篇文章中,让我们来浏览一些细节,这些细节可以帮助Kubernetes环境做好方案。

clipboard.png

比如说,你现在已经引发了通过输入yaml文件到kubectl(kubectl create-f pod.yaml)创建POD的命令。这个命令被发送到有安全保障的api-server端口(http://),然后身份验证流就开始生效了。注意,如果你正在为api-server使用不安全的端口(http://),那么验证就无法应用。(http://)理想情况下生产环境设置中应该避免不安全端口(http://)。

以下是这篇文章中会提到的在Kubernetes中可使用的验证途径。

认证有多种方式:

客户证书验证

为了使用这个方案,api-server需要用-client-ca-file=<PATH_TO_CA_CERTIFICATE_FILE>选项来开启。
CA_CERTIFICATE_FILE肯定包括一个或者多个认证中心,可以被用来验证呈现给api-server的客户端证书。客户端证书的/CN将作为用户名。

基于令牌的身份验证

为了使用这个方案,api-server需要用-token-auth-file=<PATH_TO_TOKEN_FILE>选项来开启。TOKEN_FILE是个csv文件,每个用户入口都有下列格式:token,user,userid,group。

Group的名字是随意的。

令牌文件的例子:

clipboard.png

生成tokens的一个非常简单的方法就是运行以下命令:

clipboard.png

基于令牌的身份验证面临的挑战就是,令牌是无期限的,而且对令牌清单做任何的修改都需要重新启动api-server。

基本认证

为了使用这个方案,api-server需要使用-basic-auth-file=<PATH_TO_HTTP_AUTH>选项来开启。HTTP_AUTH_FILE是个csv文件,每个用户入口都有下列格式:password,user name,userid。目前,对AUTH_FILE的任意修都需要重新启动api-server。

Open ID

Open ID支持也是可用的,但是还在试验阶段。

Keystone

Keystone支持也是可用的,但是还在试验阶段。如果你想要将keystone跟LDAP或者动态目录服务整合到一起,那么就要使用keystone认证方法。为了使用这个方案,api-server需要用-experimental-keystone-url=<KEYSTONE_URL>选项来开启服务。


授权方案:
验证成功之后,下一步就是找出对于验证用户来说,哪些操作是允许的。目前来讲,Kubernetes支持4种验证策略方案。api-server需要使用-authorization-mode=<AUTHORIZATION_POLICY_NAME>选项来开启。

始终否认

这个策略否认所有的请求。

始终允许

这个策略允许所有的请求。

基于属性的访问控制

ABAC允许灵活的用户特定授权策略。当使用-authorization-policy-file=<PATH_TO_ABAC_POLICY_FILE>选项开启api-sever的时候,ABAC的策略文件需要指定。目前,对策略文件有任何的修改都需要重启api-server。
ABAC策略文件样本如下所示:

clipboard.png

在以上例子中,策略文件中的每一行都是JSON对象,且指定一个策略。这是从Kubernetes文档页面上对策略对象的简要描述。

版本控制特性——允许多版本和策略的转换格式。

api版本,字符串类型:有效值就是“abac.authorization.kubernetes.io/v1beta1”。
kind,字符串类型:有效值是“policy”。

规格属性——是一个用以下属性的映射:

面向对象匹配属性——用户,字符串:用户字符串不是从-token-auth-file,就是从证书文件的普通名字(CN)而来。如果你指定用户,那么它就肯定跟经过身份验证的用户匹配。*跟所有请求都匹配;group,字符串:如果你指定group,那么它肯定跟groups中经过身份验证的用户相匹配。*跟所有请求都匹配。

资源匹配属性

apiGroup,字符串类型:API group,比如拓展版本。*跟所有APIgroup相匹配。
命名空间,字符串类型:命名空间字符串。*跟所有的资源请求相匹配。
资源,字符串类型:资源,比如pods。*匹配所有的资源请求。

非资源匹配属性

nonResourcePath,字符串类型:跟所有的非资源请求路径相匹配(比如/version,/apis)。*跟匹配所有非资源请求。/foo/*跟/foo/,以及它的子路径。
只读,布尔型:当为真,也就意味着策略只应用于获取,列出和监测操作。

Webhook

调出一个外部RESTful授权服务。
身份验证和授权机制的选择取决于你的要求。然而在我的经验看来,我发现基于证书的身份验证方法,基于身份验证方法的keystone(LDAP),基于身份验证策略的ABAC,这三种方法的灵活结合提供了所需的功能,来培养Kubernetes环境。
想要了解更多关于认证和授权的信息,建议浏览一下两个链接:
认证:这里
授权:这里

原文链接
(如果需要转载,请联系我们哦,尊重知识产权人人有责;)


=================================================================

kubernetes认证

Kubernetes集群的操作可以通过apiserver来进行操作,kubectl命令最终也是调用的apiserver,如果想要获取对apiserver进行操作,需要先通过其认证

api-server的认证方式:

  • 基本认证:basic-auth

    --basic-auth-file=/path/to/basic-auth.csv
    在basic-auth.csv中拥有以列为单位的认证信息,格式为password,username,uid

    示例:

    passwd,kinderao,1
    password2,test,2
    

    然后在 kube-apiserver启动的时候加上--basic-auth-file=/path/to/basic-auth.csv这个参数,启动起来过后再在使用k8s的api就需要加上认证信息,否则就会unauthorized,加认证信息的方法是在http请求的header中添加一个Authorization,value是Basic base64编码后的用户名密码信息

  • Token认证:token-auth

    --token-auth-file=/path/to/token-auth.csv
    在token-auth.csv中拥有以列为单位的认证信息,格式为token,username,uid

    示例

    token,kinderao,1
    token2,kinderao2,2
    

    同样也是在apiserver的启动参数里面加入--token-auth-file=/path/to/token-auth.csv这个参数,然后在请求的时候同样在header中添加Authorization,value是Bearer token

  • CA证书认证:

    在使用证书认证之前首先需要申请证书,证书可以通过权威CA来申请,也可以通过自签证书,不过部署kubernetes的大多数环境都是内网环境,所以更多的还是使用的是自签证书。
    生成证书的步骤如下:

  1. 首先需要你的linux系统上安装有openssl,大多数的linux发行版都带有这个工具,使用openssl生成根证书cacert:
# 生成密钥
openssl genrsa -out ca.key 2048
# 生成根证书
openssl req -x509 -nodes -key ca.key -subj "/CN=yourcomany.com" -days 5000 -out ca.crt
  1. 为server生成证书:
# 生成server的密钥
openssl genrsa -out server.key 2048
# 生成证书申请,其中的hostname需要填入你的服务器的域名或者ip地址,这个地方有个坑
# 就是在这填入的是什么地址,在client请求的时候就要使用这个地址,之前配的是ip,但是请求的时候使用主机名,导致一直没有出现bad certificate的问题
openssl req -new -key server.key -subj "/CN=`hostname`" -out server.csr
# 使用刚才生成的根证书以及密钥来生成server的证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
  1. 再为client生成证书:
# 生成client的密钥
openssl genrsa -out client.key 2048
# 生成证书申请,这里需要填的地址和上面的server一致即可
openssl req -new -key client.key -subj "/CN=`hostname`" -out client.csr
# 使用根证书和密钥来生成client的证书
openssl x509 -req -in client.csr -CA ca.crt -CAcreateserial -out client.crt -days 5000
  1. 配置api-server的启动参数,在apiserver的启动参数中加上下面的启动参数
--secure-port=443 
--client_ca_file=/root/genkey/ca.crt 
--tls-private-key-file=/root/genkey/server.key 
--tls-cert-file=/root/genkey/server.crt

也可以放到/etc/kubernets/apiserver配置文件的args参数里面
启动kube-apiserver会看见一下日志:

I0330 05:17:46.582385 4776 config.go:531] Will report 10.0.0.103 as public IP address. [restful] 2017/03/30 05:17:46 log.go:30: [restful/swagger] listing is available at https://10.0.0.103:443/swaggerapi/ [restful] 2017/03/30 05:17:46 log.go:30: [restful/swagger] https://10.0.0.103:443/swaggerui/ is mapped to folder /swagger-ui/ I0330 05:17:46.950556 4776 serve.go:104] Serving securely on 0.0.0.0:443 I0330 05:17:46.950618 4776 serve.go:118] Serving insecurely on 127.0.0.1:8080

我们在本机上使用curl来验证一下:

curl https://hostname:443 --cacert ca.crt --key client.key --cert client.crt 

以后的请求都需要带有根证书和client key和client的证书



作者:kinderao
链接:https://www.jianshu.com/p/97a3e7060f4c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Kubernetes 中,API Server 是集群中的控制中心,所有的 Kubernetes API 调用都通过 API Server 进行。API Server 认证Kubernetes 中非常重要的一环,它确保了只有经过身份验证的用户才能够访问 Kubernetes API,并限制了用户能够访问的资源和操作。 Kubernetes 支持多种认证方式,例如 X.509 证书、Token、基于 HTTP Header 的认证等。下面我们以 X.509 证书认证为例,介绍如何启用 API Server 认证: 1. 生成证书和私钥 首先,需要使用 OpenSSL 工具生成证书和私钥。可以使用以下命令生成一个自签名的证书和私钥: ``` openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout tls.key -out tls.crt -subj "/CN=kube-apiserver" ``` 该命令生成一个有效期为 365 天的自签名证书和私钥,可以使用 -subj 参数指定证书的主题(这里指定为 kube-apiserver)。 2. 配置 API Server 启用 API Server 认证需要在 kube-apiserver 的启动参数中添加以下配置项: ``` --tls-cert-file=<path/to/tls.crt> --tls-private-key-file=<path/to/tls.key> --client-ca-file=<path/to/ca.crt> --authentication-mode=x509 ``` 其中,--tls-cert-file 和 --tls-private-key-file 分别指定 TLS 证书和私钥的路径,--client-ca-file 指定用于验证客户端证书的 CA 证书的路径,--authentication-mode 设置认证方式为 x509。 3. 配置 kubectl 为了使用证书进行认证,需要在 kubectl 的配置文件中添加以下配置项: ``` apiVersion: v1 kind: Config clusters: - name: my-cluster cluster: certificate-authority: /path/to/ca.crt users: - name: my-user user: client-certificate: /path/to/tls.crt client-key: /path/to/tls.key contexts: - name: my-context context: cluster: my-cluster user: my-user current-context: my-context ``` 其中,certificate-authority 指定用于验证服务器证书的 CA 证书的路径,client-certificate 和 client-key 分别指定客户端证书和私钥的路径。 4. 测试认证 完成上述步骤后,可以使用 kubectl 命令测试认证是否生效。例如,使用以下命令查看所有的 Pod: ``` kubectl get pods ``` 如果认证配置正确,则应该能够成功列出 Pod。如果认证失败,则会提示需要提供证书和私钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值