当前位置:   article > 正文

k8s技术预研5--Kubernetes集群的安全设置

k8s技术预研5--Kubernetes集群的安全设置

一、基于HTTP BASE的简单认证方式

各组件与apiserver之间的通信方式仍然采用HTTPS,但不使用CA数字证书。不建议在生产环境中这样使用。

1、配置支持HTTP BASE认证

在Master Node上创建/etc/kubernetes/basic_auth文件,文件中每行的格式为password,user,uid,"group1,group2,group3"。 
[root@bogon kubernetes]# more baisc_auth
123456,admin,1
121212,system,2

在设置kube-apiserver的配置文件/etc/kubernetes/apiserver中加入:
--secure-port=6443
--basic_auth_file=/etc/kubernetes/basic_auth

重启kube-apiserver服务:systemctl restart kube-apiserver

2、使用kubectl进行验证测试

[root@bogon kubernetes]# kubectl --server= https://10.0.2.5:6443 --username=admin --password=123456 --insecure-skip-tls-verify=true cluster-info
Kubernetes master is running at https://10.0.2.5:6443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

[root@bogon kubernetes]#kubectl --server= https://10.0.2.5:6443 --username=admin --password=123456 --insecure-skip-tls-verify=true get nodes
NAME       STATUS    ROLES     AGE       VERSION
10.0.2.6   Ready     <none>    1d        v1.8.8

3、模拟HTTP客户端请求时,使用请求头Authorization Basic BASE64ENCODED(USER:PASSWORD)

[root@bogon kubernetes]# echo -n "admin:123456" | base64
YWRtaW46MTIzNDU2

[root@bogon kubernetes]# curl -k --header "Authorization:Basic YWRtaW46MTIzNDU2"   https://10.0.2.5:6443/api
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.2.5:6443"
    }
  ]
}


二、基于TOKEN认证的配置

1、在Master节点上创建包括token、用户名、密码和UID的token_auth文件。

文件格式为 token,user,uid,"group1,group2,group3"
792c62a1b5f2b07b,admin,1
设置kube-apiserver的启动参数,增加--token-auth-file=/etc/kubernetes/token_auth
重启kube-apiserver服务:
systemctl restart kube-apiserver

2、模拟HTTP请求Api时要在Authorization头中加入Bearer Token

[root@bogon kubernetes]# curl -k --header "Authorization: Bearer 792c62a1b5f2b07b" https://10.0.2.5:6443/api
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.2.5:6443"
    }
  ]
}

[root@bogon kubernetes]# curl -k --header "Authorization: Bearer 792c62a1b5f2b07b" https://10.0.2.5:6443/version
{
  "major": "1",
  "minor": "8",
  "gitVersion": "v1.8.8",
  "gitCommit": "2f73858c9e6ede659d6828fe5a1862a48034a0fd",
  "gitTreeState": "clean",
  "buildDate": "2018-02-09T21:23:25Z",
  "goVersion": "go1.8.3",
  "compiler": "gc",
  "platform": "linux/amd64"

3、使用kubectl进行验证

root@bogon kubernetes]# kubectl --server= https://10.0.2.5:6443 --token=792c62a1b5f2b07b --insecure-skip-tls-verify=true cluster-info
Kubernetes master is running at https://10.0.2.5:6443


三、基于CA签名的双向数字证书认证方式

证书实际是由证书签证机关(CA)签发的对用户的公钥的认证,证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。因为我们是在程序接口调用中使用数字证书,所以可以制作和使用自签的证书。
基于CA签名的双向数字证书的生成过程:
  • 为kube-apiserver生成一个数字证书,并用CA证书进行签名;
  • 配置kube-apiserver进程的启动参数,增加CA证书、服务器证书及私钥;
  • 为每个要访问k8s API Server的客户端进程(kube-controller-manager,kube-scheduler,kubelet,kube-proxy)制作自己的一个证书,也都使用CA证书进行签名,在这些进程的启动参数中增加CA证书、自己的证书等参数配置。

1、制作kube-apiserver使用的CA证书相关的文件和参数

(1)生成CA的RSA密钥
[root@bogon ~]# openssl genrsa -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
.........+++
............+++
e is 65537 (0x10001)
注:这个文件实际上已经包含了公钥和私钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的2048是生成密钥的长度。可以继续使用openssl命令-pubout参数把这个文件中的公钥单独提取出来。
(2)制作自签名的CA证书
[root@bogon ~]# openssl req -x509 -new -nodes -key ca.key -subj "/CN=bogon" -days 5000 -out ca.crt
[root@bogon ~]# ls -l ca.crt
-rw-r--r--. 1 root root 1082 Feb 27 09:10 ca.crt
命令及选项说明:
  • openssl req 用于生成证书请求
  • -new这个选项用于生成一个新的证书请求
  • -x509 生成自签名证书,而不是证书请求
  • -nodes(no des)可以明确指定不需要密码保护
  • -subj 替换或指定证书申请者的个人信息,格式是:/type0=value0/type1=value1/type2=...(其中C是Country,ST是state,L是local,O是Organization,OU是Organization Unit,CN是common name)
查看刚刚生成的这个证书中的信息:
[root@bogon etc]# openssl x509 -noout -text -in /root/ca.crt
 
(3)生成kube-apiserver使用的服务器密钥
[root@bogon ~]# openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...........................................................................................................................................+++
.................................................+++
e is 65537 (0x10001)

(4)为kube-apiserver服务创建证书请求
先制作一个包含证书请求信息的配置文件master_ssl.cnf :
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
IP.1 = 10.10.10.1 #k8s 集群service ip
IP.2 = 10.0.2.5 #k8s master ip

注:这里是使用的免交互的配置文件方式,以上为创建证书请求时使用的配置文件。
注2:对于多域名,只需要一个证书就可以保护非常多的域名。SubjectAltName是X509 Version 3 (RFC 2459)的扩展,允许ssl证书指定多个可以匹配的名称。SubjectAltName 可以包含email 地址,ip地址,正则匹配DNS主机名,等等。
执行创建证书请求的命令:
openssl req -new -key server.key -subj "/CN=bogon" -config master_ssl.cnf -out server.csr
(5)使用自建CA签署 apiserver的服务器证书
[root@bogon ~]# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out server.crt
Signature ok
subject=/CN=bogon
Getting CA Private Key
注:-CAcreateserial选项,如果不存在CA证书序列号文件,则生成一个。执行上面命令后会新生成一个ca.srl的CA证书序列号文件。

按生成的先后顺序,此时共有以下7个文件了:
[root@bogon ~]# ls -lt
-rw-r--r--. 1 root root     1172 Feb 27 23:35 server.crt    #apiserver服务的经由自建CA签名了的证书
-rw-r--r--. 1 root root       17 Feb 27 23:35 ca.srl    #CA证书序列号文件
-rw-r--r--. 1 root root     1106 Feb 27 23:26 server.csr    #apiserver服务的证书请求文件
-rw-r--r--. 1 root root      396 Feb 27 23:20 master_ssl.cnf    #申请证书使用的证书请求配置文件
-rw-r--r--. 1 root root     1675 Feb 27 09:21 server.key    #给apiserver使用的密钥
-rw-r--r--. 1 root root     1082 Feb 27 09:10 ca.crt    #CA证书
-rw-r--r--. 1 root root     1675 Feb 27 08:29 ca.key    #CA证书密钥

(6)配置kube-apiserver的启动参数
--tls-cert-file=/etc/kubernetes/ssl/server.crt
--tls-private-key-file=/etc/kubernetes/ssl/server.key
--client-ca-file=/etc/kubernetes/ssl/ca.crt
关掉非安全端口,打开安全端口:
--insecure-port=0
--secure-port=6443
 调整后的kube-apiserver配置文件:
[root@bogon kubernetes]# cat apiserver
KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers= http://127.0.0.1:2379   --insecure-bind-address=0.0.0.0  --insecure-port=0 --service-cluster-ip-range=10.10.10.0/24 --service-node-port-range=1-65535 --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,DefaultStorageClass,ResourceQuota  --secure-port=6443 --tls-cert-file=/etc/kubernetes/ssl/apiserver.pem --tls-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem --client-ca-file=/etc/kubernetes/ssl/ca.pem --logtostderr=true --log-dir=/var/log/kubernetes --v=2"

创建一个存放证书文件的目录,将上面得到的证书相关的6个文件复制过来:
[root@bogon ssl]# cd /etc/kubernetes/ssl && ls
ca.crt  ca.key  ca.srl  server.crt  server.csr  server.key

最后,重启kube-apiserver服务。

2、创建访问apiServer的各个组件使用的客户端证书,修改启动参数

(1)制作客户端证书并将得到的3个证书相关文件复制到/etc/kubernetes/ssl下面
controllerManager、scheduler、kubectl、kubelet、kube-proxy服务都使用这里生成的管理员证书。
[root@bogon ssl]# openssl genrsa -out cs_client.key 2048
Generating RSA private key, 2048 bit long modulus
...........................................................................................+++
...................................................................................................................................+++
e is 65537 (0x10001)
[root@bogon ssl]# openssl req -new -key cs_client.key -subj "/CN=kube-admin"  -out cs_client.csr
[root@bogon ssl]# openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -out cs_client.crt
Signature ok
subject=/CN=kube-admin
Getting CA Private Key

(2)修改kubectl命令行工具默认使用的apiServer地址、集群CA和客户端证书
[root@bogon ssl]# kubectl config set-cluster default-cluster --server=https://10.0.2.5:6443 --certificate-authority=/etc/kubernetes/ssl/ca.crt
Cluster "default-cluster" set.
[root@bogon ssl]# kubectl config set-credentials default-admin --certificate-authority=/etc/kubernetes/ssl/ca.crt --client-key=/etc/kubernetes/ssl/cs_client.key --client-certificate=/etc/kubernetes/ssl/cs_client.crt
User "default-admin" set.
[root@bogon ssl]# kubectl config set-context default-system --cluster=default-cluster --user=default-admin
Context "default-system" created.
[root@bogon ssl]# kubectl config use-context default-system
Switched to context "default-system".
把kubectl当前使用的context配置输出来:
[root@bogon ssl]# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/ssl/ca.crt
    server: https://10.0.2.5:6443
  name: default-cluster
contexts:
- context:
    cluster: default-cluster
    user: default-admin
  name: default-system
current-context: default-system
kind: Config
preferences: {}
users:
- name: default-admin
  user:
    client-certificate: /etc/kubernetes/ssl/cs_client.crt
    client-key: /etc/kubernetes/ssl/cs_client.key
将上面输出的信息保存到公共文件/etc/kubernetes/kubeconfig ,供controllerManager、scheduler、kubelet、kube-proxy服务在启动参数里引用。

(3)设置kube-controller-manager服务的启动参数
[root@bogon kubernetes]# cat /etc/kubernetes/ controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--master=https://10.0.2.5:6443 --service-account-private-key-file=/etc/kubernetes/ssl/server.key --root-ca-file=/etc/kubernetes/ssl/ca.crt --kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
重启kube-controller-manager服务。

(4)设置kube-scheduler服务的启动参数
复用客户端证书并配置启动参数为:
[root@bogon kubernetes]# more scheduler
KUBE_SCHEDULER_ARGS="--master=https://10.0.2.5:6443 --kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=true --log-dir=/var/log/kubernetes --v=2"
重启kube-scheduler服务。

(5)设置Node节点上kubelet的客户端证书和启动参数
  • 将CA证书ca.crt和客户端证书cs_client.crt、私钥cs_client.key复制到Node节点/etc/kubernetes/ssl目录下一份。
  • 将上面编写的用于客户端程序的context配置文件kubeconfig复制到Node节点/etc/kubernetes目录下一份。
  • 配置kubelet服务的启动参数如下所示:
[root@worknode1 kubernetes]# more /etc/kubernetes/kubelet
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --address=10.0.2.6 --port=10250 --hostname-override=10.0.2.6 --allow-privileged=false  --cluster-dns=10.10.10.2 --cluster-domain=cluster.local --fail-swap-on=false --logtostderr=true --log-dir=/var/log/kubernetes --v=4"
重启kubelet服务。
注:很多资料上要求配置一个--api-server的参数,而实际情况是在新版本k8s中这个参数已经过期了,加上这个参数反而会造成服务无法启动。

(6)设置Node节点上kube-proxy的客户端证书和启动参数
客户端证书及密钥继续复用kubelet的那一套。kube-proxy启动参数修改如下:
[root@worknode1 kubernetes]# more /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--master=https://10.0.2.5:6443 --kubeconfig=/etc/kubernetes/kubeconfig --hostname-override=10.0.2.6 --logtostderr=true --log-dir=/var/log/kubernetes --v=4"
重启kube-proxy服务。

小结:本文中只制作了两套自签的数字证书,分别用于kube-apiserver服务端和除此之外的其它所有扮演客户端角色的服务进程。也有很多部署方案中,选择为每一个客户端单独制作一个专用的密钥与证书。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/578796
推荐阅读
相关标签
  

闽ICP备14008679号