使用kubeseal加密和管理k8s集羣的secret

使用kubeseal加密和管理k8s集羣的secret

在k8s的管理過程中,像secret這種資源並不好維護,kubeseal提供了一種相對簡單的方式來對原始secret資源進行加密,並通過控制器進行解密,以此來規避secret泄露風險。

安裝

安裝kubeseal

$ wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/kubeseal-0.18.0-linux-amd64.tar.gz
$ tar -xvf kubeseal-0.18.0-linux-amd64.tar.gz
$ cp kubeseal /usr/local/bin/
$ kubeseal --version

安裝controller

$ kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/controller.yaml

執行上述命令之後會在kube-system命名空間下啓動一個控制器Pod:

$ k get pod -n kube-system |grep seal
sealed-secrets-controller-b9fb75d85-k4csm    1/1     Running   0          7h28m

pod啓動之後,使用端口轉發映射到本地:

$ kubectl -n kube-system port-forward svc/sealed-secrets-controller 8080:8080

使用方式

生成加密文件

首先在本地創建一個名爲secret-example.yaml的文件,編碼前的secret字段爲:mysupersecret

apiVersion: v1
kind: Secret
metadata:
  name: secret-example
data:
  secret: bXlzdXBlcnNlY3JldAo=

使用如下命令將secret-example.yaml,轉換爲加密後的文件sealed-secret-example.yaml

$ kubeseal --secret-file secret-example.yaml --sealed-secret-file sealed-secret-example.yaml

sealed-secret-example.yaml的內容如下,spec.encryptedData.secret就是加密後的內容:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  creationTimestamp: null
  name: secret-example
  namespace: kube-system
spec:
  encryptedData:
    secret: AgB1ZZg8+J+0HLymOQZdTfWVQZiNkhm5X6WULJuBAAEaQQNhM8i2TV2I1SgKT4sUOCRv90XA1oeFld3XoGPjvYE3leOD1cvK1dDVqno6mNLRziokISk/9fB3cVE2GVgyCud//M53xNpVemDufgsJS2q/KGIOeNEijk9ZM2FaKoLDwtPaVNL0NfmC2xne2XtWJp+/eMOREhbubQhnj5M/Se75axazviuDNf6Ss9fAuR38Msd5DXnKBtyrckEHSa8TDn8ErssOh0ogX14e0/ThN3EWJecSBtx7Xfd0m90+vjmvWevMag442349aquR/qLo0mg40mhcCqSBw/MjaIGZ2F5XRufG1WEP43OgLMTixN2lLSU3eYTrv5t075taI9WJgoOl0DD8UA74EMpX7RMKTiXD6C0XngKmMKg5fUK7JNLFfwHMRPi4zNTwJa9ViDyD0iAJrGGbmMso/nHEtwOtrLE5Rrf0kLQ5N6Lj57gOBdqu903/vDM4Jm695GvEWL2aR3ShOxasHCuZeXj8Q5+KYWeF9sySiJH8bwEtaw6x7j9AxBOwjxWYD0Jvj9KhtlqBa4okSDc3bcgRKGhsSXQx6jOumI5rj+V542hkB6Z8JOtJ17VmzR6XDQDmqSl1FqqwKD5n5yUy5Kf6pJYBnsgKn3TzesQ6JfQbyRLTh1Pn3odOYCnp+Ixbd0Tgn0n5m0KO3RX0hiwGoe0hObIZcsF36g==
  template:
    data: null
    metadata:
      creationTimestamp: null
      name: secret-example
      namespace: kube-system

可以將加密後的文件保存到gitlab。

創建加密文件:

$ k create -f sealed-secret-example.yaml
sealedsecret.bitnami.com/secret-example created

$ k get sealedsecrets.bitnami.com
NAME             AGE
secret-example   6s

在創建完加密文件之後,controller會解密並生成對應的secret

$ k get secrets |grep secret-example
secret-example                                   Opaque                                1      2m15s

查看由controller生成的secret資源內容,可以看到data.secret與上面創建的secret-example.yaml文件內容一致

$ k get secret secret-example -oyaml
apiVersion: v1
data:
  secret: bXlzdXBlcnNlY3JldAo=
kind: Secret
metadata:
  creationTimestamp: "2022-06-10T00:50:40Z"
  name: secret-example
  namespace: kube-system
  ownerReferences:
  - apiVersion: bitnami.com/v1alpha1
    controller: true
    kind: SealedSecret
    name: secret-example
    uid: 57a5b691-9bb5-4dac-800a-1a1baa878299
  resourceVersion: "675560"
  uid: e0db31ad-082b-4596-9fd0-28cc810d86f4
type: Opaque

注:SealedSecret 和對應的secret資源必須位於相同的命名空間

TIPs

  • kubeseal支持如下API

    Route Description
    /healthz Health check route useful for the readiness and liveness probes and for creating an external probe; for example with blackbox exporter.
    /metrics Endpoint for the Prometheus to retrieve the controller’s metrics.
    /v1/verify Validates a secret.
    /v1/rotate Rotates the secret.
    /v1/cert.pem Retrieves the public certificate.
  • 上例中controller用的證書是自己生成的,還可以指定自己的證書,更方便遷移和管理

  • 使用kubeseal可能會有一種困惑,如果用戶直接掛載其他命名空間的secret,那麼這樣可能會導致secret泄露。官方對此有作解釋,如可以通過RBAC限制用戶可以訪問的命名空間以及資源類型。更多參見README

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章