溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

kubernetes ssl證書梳理

發(fā)布時間:2020-07-20 14:14:06 來源:網(wǎng)絡 閱讀:1305 作者:無鋒劍 欄目:云計算

前言

kubernetes 集群安裝配置過程中,會使用各種證書,目的是為了加強集群安全性,但是會坑很多入門新手.   
前期如果手動部署集群, 想了解集群組件配合工作原理,各種不通,報很多奇葩的錯,很多是證書配置錯誤導致的。  
推薦報錯時多看master節(jié)點和調試服務節(jié)點的日志.  基本都能發(fā)現(xiàn)有用的錯誤日志,k8s打印的錯誤日志,指引的錯誤方向還是靠譜的. 
為了少踩坑,個人簡單梳理了一下集群配置過程中使用的證書信息,詳細如下:

集群使用證書

etcd:                                使用 ca.pem、server-key.pem、server.pem;
kube-apiserver:         使用 ca.pem、server-key.pem、server.pem;
kubelet:                         使用 ca.pem;
kube-proxy:                 使用 ca.pem、kube-proxy-key.pem、kube-proxy.pem;
kubectl:                     使用 ca.pem、admin-key.pem、admin.pem;
kube-controller-manager:使用 ca-key.pem、ca.pem

注意:

證書生成操作都可以在master節(jié)點主機上執(zhí)行,證書只需要創(chuàng)建一次即可。然后將證書copy到新添加節(jié)點,
根據(jù)不同服務使用的證書的不同單獨配置即可。

其它幾個類證書文件

token.csv
該文件為一個用戶的描述文件,基本格式為 Token,用戶名,UID,用戶組;這個文件在 apiserver 啟動時被 apiserver 加載,  
然后就相當于在集群內創(chuàng)建了一個這個用戶;接下來就可以用 RBAC 給他授權
bootstrap.kubeconfig
該文件中內置了 token.csv 中用戶的 Token,以及 apiserver CA 證書;kubelet 首次啟動會加載此文件,  
使用 apiserver CA 證書建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標識像 apiserver 發(fā)起 CSR 請求

生成證書過程簡介

安裝cfssl

CFSSL是CloudFlare開源的一款PKI/TLS工具。CFSSL 包含一個命令行工具和一個用于 簽名,驗證并且捆綁TLS證書的 HTTP API 服務.
使用Go語言編寫。

CFSSL包括:

一組用于生成自定義 TLS PKI 的工具;
cfssl程序,是CFSSL的命令行工具;
multirootca程序是可以使用多個簽名密鑰的證書頒發(fā)機構服務器;
mkbundle程序用于構建證書池;
cfssljson程序,從cfssl和multirootca程序獲取JSON輸出,并將證書,密鑰,CSR和bundle寫入磁盤;

PKI借助數(shù)字證書和公鑰加密技術提供可信任的網(wǎng)絡身份。通常,證書就是一個包含如下身份信息的文件:

證書所有組織的信息
公鑰
證書頒發(fā)組織的信息
證書頒發(fā)組織授予的權限,如證書有效期、適用的主機名、用途等
使用證書頒發(fā)組織私鑰創(chuàng)建的數(shù)字簽名

下載

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

安裝

chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

證書生成過程演示

制作server ca證書

cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "server": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

字段說明:
expiry : 87600h  10 年
ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等參數(shù);后續(xù)在簽名證書時使用某個 profile;
signing:表示該證書可用于簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
server auth:表示client可以用該 CA 對server提供的證書進行驗證;
client auth:表示server可以用該CA對client提供的證書進行驗證;
cat << EOF | tee ca-csr.json
{
    "CN": "server",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

字段說明:
"CN":Common Name,kube-apiserver 從證書中提取該字段作為請求的用戶名 (User Name);瀏覽器使用該字段驗證網(wǎng)站是否合法;
"O":Organization,kube-apiserver 從證書中提取該字段作為請求用戶所屬的組 (Group);

生成CA證書和私鑰

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

驗證ca 證書

k8s-ssl]# ls
ca-config.json
ca-csr.json

ca.csr
ca-key.pem
ca.pem

制作server證書

cat << EOF | tee server-csr.json
{
    "CN": "server",
    "hosts": [
      "10.254.0.1",
      "127.0.0.1",
      "172.20.101.157",
      "172.20.101.165",
      "172.20.101.164",
      "172.20.101.160",
      "172.20.101.166",
      "172.20.101.167",
      "server",
      "server.default",
      "server.default.svc",
      "server.default.svc.cluster",
      "server.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF

字段說明:
如果hosts字段不為空則需要指定授權使用該證書的IP或域名列表,該證書后續(xù)被 etcd 集群和 kubernetes master 集群使用,

上面分別指定了 etcd 集群:
      "172.20.101.157",
      "172.20.101.165",
      "172.20.101.164",
kubernetes master 集群的主機 IP:
      "172.20.101.157",
      "172.20.101.165",
      "172.20.101.164",
kubernetes node 節(jié)點 IP:
      "172.20.101.160",
      "172.20.101.166",
      "172.20.101.167",

service-cluster-ip-range 網(wǎng)段和第一個IP,
      "10.254.0.1",

也可以寫物理節(jié)點的主機名。
另外集群配置高可用使用vip的IP地址也填上。

生成 kubernetes 證書和私鑰

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server

驗證

ll server*

server.csr
server-csr.json
server-key.pem
server.pem

制作kube-proxy證書

cat << EOF | tee kube-proxy-csr.json
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Beijing",
      "ST": "Beijing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

字段說明:
CN 指定該證書的Use為system:kube-proxy;
kube-apiserver 預定義的 RoleBinding system:node-proxier 將User system:kube-proxy 與 Role system:node-proxier 綁定,該 Role 授予了調用 kube-apiserver Proxy 相關 API 的權限;

創(chuàng)建 kube-proxy 證書

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kube-proxy-csr.json | cfssljson -bare kube-proxy

驗證

kube-*

kube-proxy.csr
kube-proxy-csr.json
kube-proxy-key.pem
kube-proxy.pem

創(chuàng)建 admin 證書

cat >admin-csr.json<<EOF
{
    "CN": "admin",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "system:masters",
            "OU": "System"
        }
    ]
}
EOF

字段說明:
O 指定該證書的 Group 為 system:masters,kubelet 使用該證書訪問 kube-apiserver 時 ,由于證書被 CA 簽名,所以認證通過,  
同時由于證書用戶組為經(jīng)過預授權的 system:masters,所以被授予訪問所有 API 的權限;

生成 admin ca

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server admin-csr.json | cfssljson -bare admin

驗證

ll admin*

admin.csr
admin-csr.json
admin-key.pem
admin.pem

清理 csr srl

find . -name "*.csr" -o -name "*.srl"|xargs  rm -f

驗證證書:

使用 opsnssl 命令驗證key內容

openssl x509  -noout -text -in  server.pem

cfssl-certinfo -cert server.pem

后面的pem可以換成已生成key文件,然后核對key內容。

集群核對key信息

集群搭建完成,通過命令: kubectl get clusterrolebinding cluster-admin -o yaml ,查看 clusterrolebinding cluster-admin 的 subjects 的 kind 是 Group,name 是 system:masters。 roleRef 對象是 ClusterRole cluster-admin。

即:system:masters Group 的 user 或者 serviceAccount 都擁有 cluster-admin 的角色。 因此在使用 kubectl 命令時候,  
才擁有整個集群的管理權限??梢允褂?kubectl get clusterrolebinding cluster-admin -o yaml 來查看。

參考文檔:

https://blog.51cto.com/lookingdream/2176846
https://jimmysong.io/kubernetes-handbook/practice/create-tls-and-secret-key.html

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI