k8s技术预研5--Kubernetes集群的安全设置
一、基于HTTP BASE的简单认证方式各组件与apiserver之间的通信方式仍然采用HTTPS,但不使用CA数字证书。不建议在生产环境中这样使用。1、配置支持HTTP BASE认证在Master Node上创建/etc/kubernetes/basic_auth文件,文件中每行的格式为password,user,uid,"group1,group2,group3"。 [ro
·
一、基于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服务端和除此之外的其它所有扮演客户端角色的服务进程。也有很多部署方案中,选择为每一个客户端单独制作一个专用的密钥与证书。
更多推荐
已为社区贡献8条内容
所有评论(0)