官术网_书友最值得收藏!

2.4 Kubernetes集群的安全設(shè)置

2.4.1 基于CA簽名的雙向數(shù)字證書認(rèn)證方式

在一個安全的內(nèi)網(wǎng)環(huán)境中,Kubernetes的各個組件與Master之間可以通過kube-apiserver的非安全端口http://<kube-apiserver-ip>:8080進(jìn)行訪問。但如果API Server需要對外提供服務(wù),或者集群中的某些容器也需要訪問API Server以獲取集群中的某些信息,則更安全的做法是啟用HTTPS安全機(jī)制。Kubernetes提供了基于CA簽名的雙向數(shù)字證書認(rèn)證方式和簡單的基于HTTP Base或Token的認(rèn)證方式,其中CA證書方式的安全性最高。本節(jié)先介紹如何以CA證書的方式配置Kubernetes集群,要求Master上的kube-apiserver、kube-controller-manager、kube-scheduler進(jìn)程及各Node上的kubelet、kube-proxy進(jìn)程進(jìn)行CA簽名雙向數(shù)字證書安全設(shè)置。

基于CA簽名的雙向數(shù)字證書的生成過程如下。

(1)為kube-apiserver生成一個數(shù)字證書,并用CA證書簽名。

(2)為kube-apiserver進(jìn)程配置證書相關(guān)的啟動參數(shù),包括CA證書(用于驗(yàn)證客戶端證書的簽名真?zhèn)危⒆约旱慕?jīng)過CA簽名后的證書及私鑰。

(3)為每個訪問Kubernetes API Server的客戶端(如kube-controller-manager 、kube-scheduler、kubelet、kube-proxy及調(diào)用API Server的客戶端程序kubectl等)進(jìn)程都生成自己的數(shù)字證書,也都用CA證書簽名,在相關(guān)程序的啟動參數(shù)里增加CA證書、自己的證書等相關(guān)參數(shù)。

1.設(shè)置kube-apiserver的CA證書相關(guān)的文件和啟動參數(shù)

使用OpenSSL工具在Master服務(wù)器上創(chuàng)建CA證書和私鑰相關(guān)的文件:

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

注意:在生成ca.crt時,-subj參數(shù)中“/CN”的值為Master主機(jī)名。

準(zhǔn)備master_ssl.cnf文件,該文件用于x509 v3版本的證書。在該文件中主要需要設(shè)置Master服務(wù)器的hostname(k8s-master)、IP地址(192.168.18.3),以及Kubernetes Master Service的虛擬服務(wù)名稱(kubernetes.default等)和該虛擬服務(wù)的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 = @alt_names
          [alt_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創(chuàng)建server.csr和server.crt文件。在生成server.csr時,-subj參數(shù)中“/CN”的值需為Master的主機(jī)名:

        # openssl req -new -key server.key -subj "/CN=k8s-master" -config master_ssl.cnf
    -out server.csr
        # 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

在全部執(zhí)行完后會生成6個文件:ca.crt、ca.key、ca.srl、server.crt、server.csr、server.key。

將這些文件復(fù)制到一個目錄下(例如/var/run/kubernetes/),然后設(shè)置kube-apiserver的三個啟動參數(shù)“--client-ca-file”“--tls-cert-file”和“--tls-private-key-file”,分別代表CA根證書文件、服務(wù)端證書文件和服務(wù)端私鑰文件:

        --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

同時,可以關(guān)閉非安全端口(設(shè)置--insecure-port=0),設(shè)置安全端口為6443(默認(rèn)值):

        --insecure-port=0
        --secure-port=6443

最后重啟kube-apiserver服務(wù)。

2.設(shè)置kube-controller-manager的客戶端證書、私鑰和啟動參數(shù)

代碼如下:

        $ openssl genrsa -out cs_client.key2048
        $ openssl req -new -key cs_client.key -subj "/CN=k8s-master"-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參數(shù)和-CAkey參數(shù)使用的是API Server的ca.crt和ca.key文件。然后將這些文件復(fù)制到一個目錄下(例如/var/run/kubernetes/)。

接下來創(chuàng)建/etc/kubernetes/kubeconfig文件(kube-controller-manager與kube-scheduler共用),配置客戶端證書等相關(guān)參數(shù),內(nèi)容如下:

        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
            server: https://192.168.18.3:6443
        contexts:
        - context:
            cluster: local
            user: controllermanager
          name: my-context
        current-context: my-context

然后設(shè)置kube-controller-manager服務(wù)的啟動參數(shù):

        --service-account-key-file=/var/run/kubernetes/server.key
        --root-ca-file=/var/run/kubernetes/ca.crt
        --kubeconfig=/etc/kubernetes/kubeconfig

最后重啟kube-controller-manager服務(wù)。

3.設(shè)置kube-scheduler啟動參數(shù)

kube-scheduler復(fù)用上一步kube-controller-manager創(chuàng)建的客戶端證書,配置啟動參數(shù):

        --kubeconfig=/etc/kubernetes/kubeconfig

重啟kube-scheduler服務(wù)。

4.設(shè)置每個Node上kubelet的客戶端證書、私鑰和啟動參數(shù)

首先,復(fù)制kube-apiserver的ca.crt和ca.key文件到Node上,在生成kubelet_client.crt時-CA參數(shù)和-CAkey參數(shù)使用的是API Server的ca.crt和ca.key文件;在生成kubelet_client.csr時,將-subj參數(shù)中的“/CN”設(shè)置為本Node的IP地址:

        $ openssl genrsa -out kubelet_client.key2048
        $ 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

將這些文件復(fù)制到一個目錄下(例如/var/run/kubernetes/)。

接下來創(chuàng)建/etc/kubernetes/kubeconfig文件(kubelet和kube-proxy進(jìn)程共用),配置客戶端證書等相關(guān)參數(shù),內(nèi)容如下:

        apiVersion: v1
        kind: Config
        users:
        - name: kubelet
          user:
            client-certificate: /etc/kubernetes/ssl_keys/kubelet_client.crt
            client-key: /etc/kubernetes/ssl_keys/kubelet_client.key
        clusters:
        - name: local
          cluster:
            certificate-authority: /etc/kubernetes/ssl_keys/ca.crt
            server: https://192.168.18.3:6443
        contexts:
        - context:
            cluster: local
            user: kubelet
          name: my-context
        current-context: my-context

然后設(shè)置kubelet服務(wù)的啟動參數(shù):

        --kubeconfig=/etc/kubelet/kubeconfig

最后重啟kubelet服務(wù)。

5.設(shè)置kube-proxy的啟動參數(shù)

kube-proxy復(fù)用上一步kubelet創(chuàng)建的客戶端證書,配置啟動參數(shù):

        --kubeconfig=/etc/kubernetes/kubeconfig

重啟kube-proxy服務(wù)。

至此,一個基于CA的雙向數(shù)字證書認(rèn)證的Kubernetes集群環(huán)境就搭建完成了。

6.設(shè)置kubectl客戶端使用安全方式訪問API Server

在使用kubectl對Kubernetes集群進(jìn)行操作時,默認(rèn)使用非安全端口8080對API Server進(jìn)行訪問,也可以設(shè)置為安全訪問API Server的模式,需要設(shè)置3個證書相關(guān)的參數(shù)“——certificate -authority”“--client-certificate”和“--client-key”,分別表示用于CA授權(quán)的證書、客戶端證書和客戶端密鑰。

◎ --certificate-authority:使用為kube-apiserver生成的ca.crt文件。

◎ --client-certificate:使用為kube-controller-manager生成的cs_client.crt文件。

◎ --client-key:使用為kube-controller-manager生成的cs_client.key文件。

同時,指定API Server的URL地址為HTTPS安全地址(例如https://k8s-master:443),最后輸入需要執(zhí)行的子命令,即可對API Server進(jìn)行安全訪問了:

          # kubectl --server=https://192.168.18.3:6443
      --certificate-authority=/etc/kubernetes/ssl_keys/ca.crt
      --client-certificate=/etc/kubernetes/ssl_keys/cs_client.crt
      --client-key=/etc/kubernetes/ssl_keys/cs_client.key get nodes
          NAME            STATUS    AGE
          k8s-node-1     Ready     1h

2.4.2 基于HTTP Base或Token的簡單認(rèn)證方式

除了提供了基于CA的雙向數(shù)字證書認(rèn)證方式,Kubernetes也提供了基于HTTP Base或Token的簡單認(rèn)證方式。各組件與API Server之間的通信方式仍然采用HTTPS,但不使用CA數(shù)字證書。

采用基于HTTP Base或Token的簡單認(rèn)證方式時,API Server對外暴露HTTPS端口,客戶端提供用戶名、密碼或Token來完成認(rèn)證過程。需要說明的是,kubectl命令行工具比較特殊,它同時支持CA雙向認(rèn)證和簡單認(rèn)證兩種模式與API Server通信,其他客戶端組件只能配置為雙向安全認(rèn)證或非安全模式與API Server通信。

1.基于HTTP Base認(rèn)證的配置過程

(1)創(chuàng)建包括用戶名、密碼和UID的文件basic_auth_file,放置在合適的目錄下,例如/etc/kuberntes目錄。需要注意的是,這是一個純文本文件,用戶名、密碼都是明文。

        # vi /etc/kubernetes/basic_auth_file
        admin,admin,1
        system,system,2

(2)設(shè)置kube-apiserver的啟動參數(shù)“--basic-auth-file”,使用上述文件提供安全認(rèn)證:

        --secure-port=6443
        --basic-auth-file=/etc/kubernetes/basic_auth_file

然后,重啟API Server服務(wù)。

(3)使用kubectl通過指定的用戶名和密碼來訪問API Server:

        # kubectl --server=https://192.168.18.3:6443--username=admin --password=admin
    --insecure-skip-tls-verify=trueget nodes
        NAME            STATUS    AGE
        k8s-node-1     Ready     1h

2.基于Token認(rèn)證的配置過程

(1)創(chuàng)建包括用戶名、密碼和UID的文件token_auth_file,放置在合適的目錄下,例如/etc/kuberntes目錄。需要注意的是,這是一個純文本文件,用戶名、密碼都是明文。

        $ cat /etc/kubernetes/token_auth_file
        admin,admin,1
        system,system,2

(2)設(shè)置kube-apiserver的啟動參數(shù)“--token-auth-file”,使用上述文件提供安全認(rèn)證:

        --secure-port=6443
        --token-auth-file=/etc/kubernetes/token_auth_file

然后,重啟API Server服務(wù)。

(3)用curl驗(yàn)證和訪問API Server:

        $ curl -k --header "Authorization:Bearer admin"
    https://192.168.18.3:6443/version
        {
          "major": "1",
          "minor": "14",
          "gitVersion": "v1.14.0",
          "gitCommit": "641856db18352033a0d96dbc99153fa3b27298e5",
          "gitTreeState": "clean",
          "buildDate": "2019-03-25T15:45:25Z",
          "goVersion": "go1.12.1",
          "compiler": "gc",
          "platform": "linux/amd64"
        }
主站蜘蛛池模板: 临澧县| 宜昌市| 江油市| 黑河市| 高要市| 兴义市| 新邵县| 中山市| 宁德市| 新巴尔虎左旗| 公安县| 辉南县| 吐鲁番市| 忻州市| 澳门| 六盘水市| 循化| 河源市| 榆树市| 绥中县| 阳春市| 辽阳市| 东安县| 湟中县| 徐州市| 子洲县| 叶城县| 临城县| 乌审旗| 正镶白旗| 赤壁市| 万安县| 喀喇沁旗| 徐汇区| 行唐县| 镶黄旗| 乌海市| 健康| 库伦旗| 吉木萨尔县| 东乡|