Kubernetes集群的安全设置

 

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

Kubernetes各个组件与Master通过apiserver进行访问,在一个安全的网络环境中,通过非安全端口http://apiserver:8080进行访问,当apiserver对外提供服务时,需要启用HTTPS访问。Kubernetes提供了基于CA签名的双向数字证书认证方式和基于HTTP BASE或TOKEN的认证方式,,其中CA证书方式安全性最高。下面已CA证书方式配置,要求Master和Node上的进程进行CA签名双向数字证书安全设置。

     基于CA签名的双向数据证书的生成过程如下:

      1)为 kube-apiserver生成一个数字证书,并用CA证书进行签名;

      2)为 kube-apiserver进程配置证书相关的启动参数,包括CA证书(用于验证客户端证书的签名真伪),自己的经过CA签名后的证书和私钥;

      3)为每个访问Kubernetes API Server的客户端(如kube-Controller-manager、 kube-scheduler、kubelet、kubelet-proxy等)进程生成自己的数字证书,也使用CA证书进行签名,在相关程序的启动参数里,添加CA证书、自己的证书等相关参数。

     A.设置kube-apiserver的CA证书相关的文件和启动参数

        使用openssl在Master节点上创建CA证书和私钥等相关文件

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=yourcompany.com" -days 5000 -out ca.crt
openssl genrsa -out server.key 2048

    注意,生成ca.crt时,-subj参数中“/CN”的值通常为域名。

    准备master_ssl.cnf文件,该文件用于x509 v3版本的证书。该文件中主要设置Master 服务器的hostname(k8s-master)、IP地址(192.168.18.3),以及Kubernetes Master Service的虚拟服务名称(kubernetes.default)和该虚拟服务的ClusterIP(169.169.0.1),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 = @ale_names
[ale_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = k8s-master
IP.1 = 169.169.0.1
IP.2 = 192.168.18.3

基于master_ssl.cnf创建server.csr和server.crt文件,在生成server.crt时,-subj参数“/CN”指定的参数为Master所在的主机名

openssl req -new -key server.key -subj "/CN=k8s-master" -config master_ssl.cof -out server.csr
openssl x509 -req -in server.csr -CA ca.art -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out server.crt

执行完后生成6个文件:ca.crt、ca.key、ca.srl、server.crt、server.csr、server.key。

将这些文件复制的Kubernetes的目录中(如/var/run/kubernetes),然后设置kube-apiserver的三个启动参数“--client-ca-file”“--tls-cert-file”“--tls-private-key-file”,分别代表CA根证书文件、服务端证书文件和服务端私钥文件:

--client_ca_file=/var/run/kubernetes/ca.crt
--tls-private-key-file=/var/run/kubernetes/server.key
--tls-cert-file=/var/run/kubernetes/server.crt

同时,可以关闭非安全端口8080,设置安全出口为443(默认为6443)

--insecure-port=0
--secure-port=443

最后重启kube-apiserver服务。

B.设置kube-controller-manager的客户端证书、私钥和启动参数

openssl genrsa -out cs_client.key 2048
openssl req -new -key cs_client.key -subj "/CN=k8s-node-1" -out cs_client.csr
openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out cs_client.crt -days 5000

在生成cs_client.crt时,-CA参数和-CAkey参数使用的是apiserver的ca.crt和ca.key文件,然后将这些文件复制到一个目录中(例如/var/run/kubernetes)。

创建/etc/kubernetes/kubeconfig文件,配置客户端证书等相关参数,该配置文件由kube-controller-manager与kube-scheduler共用:

apiVersion:v1
kind:Config
users:
- name:controllermanager
  user:
    client-certificate: /var/run/kubernetes/cs_client.crt
    client-key: /var/run/kubernetes/cs_client.key
clusters:
- name: local
  cluster:
     certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
    cluster: local
    user: controllermanager
  name: my-context
current-context: my-context

设置服务的启动参数

--master=https://192.168.18.3:443
--service_account_private_key_file=/var/run/kubernetes/server.key
--root-ca-file=/var/run/kubernetes/ca.crt
--kubeconfig=/etc/kubernetes/kubeconfig

重启kube-controller-manager服务。

C.设置kube-scheduler的启动参数

--master=https://192.168.18.3:443
--kubeconfig=/etc/kubernetes/kubeconfig

重新启动kube-scheduler服务。

D.设置每个Node接待上kubelet的客户端证书、私钥和启动参数

首先复制kube-apiserver的ca.crt和ca.key文件到Node节点上,在生成kubelet_client.crt是-CA和-CAkey参数使用的是apiserver的ca.crt和ca.key文件。-subj参数的“/CN”设置为本Node的IP地址。

openssl genrsa -out kubelet_client.key 2048
openssl req -new -key kubelet_client.key -subj "/CN=192.168.18.4" -out kubelet_client.csr
openssl x509 -req -in kubelet_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kubelet_client.crt -days 5000

将生成的文件复制到一个目录中,如/var/run/kubernetes。

接下来创建文件/etc/kubernetes/kubeconfig文件,该文件kubelet和kube-proxy进程公用,配置客户端证书等相关参数:

apiVersion:v1
kind:Config
users:
- name: kubelet
  user:
    client-certificate: /var/run/kubernetes/kubelet_client.crt
    client-key: /var/run/kubernetes/kubelet_client.key
clusters:
- name: local
  cluster:
     certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
    cluster: local
    user: kubelet
  name: my-context
current-context: my-context

设置kubelet服务的启动参数:

--api_servers=https://192.168.18.3:443
--kubeconfig=/etc/kubelet/kubeconfig

重新启动kubelet。

F.设置kube-proxy的启动参数

--api_servers=https://192.168.18.3:443
--kubeconfig=/etc/kubelet/kubeconfig

重启kube-proxy

G.kubectl客户端使用安全方式访问apiserver

   在使用kubectl对Kubernetes集群进行操作时,需要设置3个证书相关的参数“--certificate-authority” “--client-certificate”和“--client-key”,分别表示CA授权的证书、客户端证书和客户端密钥。

kubectl --server=https://k8s-master:443 \
--certificate-authority=/etc/kubernetes/ca.crt \
--client-certificate=/etc/kubernetes/cs_client.crt \
--client-key=/etc/kubernetes/cs_client.key \
get nodes

2、基于HTTP BASE或TOKEN的认证方式

    采用基于HTTP BASE或TOKEN的简单认证方式时,API Server对外暴露HTTPS端口,客户端提供用户名、密码或者Token来完成认证过程。

     1)基于HTTP BASE认证过程如下。

      A.创建包括用户名、密码和UID的文件basic_auth_file,这是一个纯文本文件,用户名和密码都是明文。

vim /etc/kubernetes/basic_auth_file
admin,admin,1
system,system,2

     B.设置kube-apiserver的启动参数“--basic_auth_file”,使用上述文件提供安全认证:

--secure-port=443
--basic_auth_file=/etc/kubernetes/basic_auth_file

   重启API Server。

   C.使用kubectl通过制定的用户名和密码来访问API Server

kubectl --server=https://192.168.18.3:443 --username=admin --password=admin --insecure-skip-tls-verify=true get nodes

2)基于TOKEN认证的配置过程如下。

  A.创建包括用户名、密码和UID的文件token_auth_file, 用户名和密码以明文方式保存。

vim /etc/kubernetes/token_auth_file
admin,admin,1
system,system,2

B.设置kube-apiserver的启动参数“--token_auth_file”,使用上述文件提供安全认证

--secuer-port=443
--token_auth_file=/etc/kubernetes/token_auth_file

重启API Server服务

C.使用curl验证和访问API Server

curl -k --header "Authorization:Bearer admin" https://192.168.18.3:443/version

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值