簡體   English   中英

如何通過 yaml 將機密文件設置為 kubernetes 機密?

[英]How to set secret files to kubernetes secrets by yaml?

我想將文件存儲在 Kubernetes Secrets 中,但我還沒有找到使用yaml文件的方法。

我已經能夠使用帶有kubectl的 cli 來實現它:

kubectl create secret generic some-secret --from-file=secret1.txt=secrets/secret1.txt

但是當我在yaml嘗試類似的東西時:

apiVersion: v1
kind: Secret
metadata:
  name: some-secret
type: Opaque
data:
  secret1.txt: secrets/secret1.txt

我有這個錯誤:

[pos 73]: json: error decoding base64 binary 'assets/elasticsearch.yml': illegal base64 data at input byte 20

我正在遵循本指南http://kubernetes.io/docs/user-guide/secrets/ 它解釋了如何使用yaml創建機密,但沒有說明如何使用yaml文件創建機密。

有可能嗎? 如果是這樣,我該怎么做?

如上一篇文章所述,我們需要向文件提供編碼為 based64 的證書/密鑰。

這是證書的通用示例(在本例中為 SSL):

secret.yml.tmpl

    apiVersion: v1    

    kind: Secret
    metadata:
         name: test-secret
         namespace: default
    type: Opaque
    data:
        server.crt: SERVER_CRT
        server.key: SERVER_KEY

預處理文件以包含證書/密鑰:

sed "s/SERVER_CRT/`cat server.crt|base64 -w0`/g" secret.yml.tmpl | \
sed "s/SERVER_KEY/`cat server.key|base64 -w0`/g" | \
kubectl apply -f -

請注意,證書/密鑰使用不含空格 (-w0) 的 base64 進行編碼。

對於 TLS 可以簡單地:

kubectl create secret tls test-secret-tls --cert=server.crt --key=server.key

您可以使用 --dry-run 標志來准備包含文件數據的 YAML。

kubectl create secret generic jwt-certificates --from-file=jwt-public.cer --from-file=jwt-private.pfx --dry-run=true  --output=yaml > jwt-secrets.yaml

編輯

感謝@Leopd 對 API 棄用的評論,新的 kubectl 使用以下命令:

kubectl create secret generic jwt-certificates --from-file=jwt-public.cer --from-file=jwt-private.pfx --dry-run=client --output=yaml > jwt-secrets.yaml

在我的機器上我還有舊的 kubectl 版本

使用CLI格式時,基本上是在將 yaml 發布到服務器端之前使用它的生成器。

由於 Kubernetes 是客戶端 - 服務器應用程序,中間有 REST API,並且操作需要是原子的,發布的 YAML 需要包含文件的內容,最好的方法是將其嵌入為 base64 格式的內聯. 如果文件可以以其他方式嵌入(縮進可能用於創建文件的邊界),那就太好了,但直到現在我還沒有看到任何這樣的例子。

話雖如此,在 yaml 上放置文件引用是不可能的,因為沒有預先渲染 yaml 來包含內容。

所以我剛剛學習了一個我錯過的超級有用的 k8s 基礎,然后發現它有一個與之相關的安全漏洞,並想出了一個解決方案。

域名注冊地址:
您可以將明文多行字符串/文本文件作為 secret.yaml 在您的秘密倉庫中! :)
(注意我建議將其存儲在 Hashicorp Vault 中,您可以存儲具有機密的版本化配置文件,並通過 Vault 網頁輕松查看/編輯它們,與 git repo 不同,您可以進行細粒度訪問控制,管道可以使用 REST用於提取更新秘密的 API,這也使密碼輪換變得容易。)

cleartext-appsettings-secret.yaml
appsettings.Dummy.json 是默認文件名(密鑰的密鑰)
(我使用單詞默認文件名,因為您可以在 yaml 掛載中覆蓋它)
明文json代碼是文件內容(秘密的值)

apiVersion: v1
kind: Secret
metadata:
  name: appsettings
  namespace: api
type: Opaque
stringData:
  appsettings.Dummy.json: |-
    {
      "Dummy": {
        "Placeholder": {
          "Password": "blank"
        }
      }
    }

當我
kubectl apply -f cleartext-appsettings-secret.yaml
kubectl 獲取秘密 appsettings -n=api -o yaml
秘密在注釋中顯示為明文......

apiVersion: v1
data:
  appsettings.Dummy.json: ewogICJEdW1teSI6IHsKICAgICJQbGFjZWhvbGRlciI6IHsKICAgICAgIlBhc3N3b3JkIjogImJsYW5rIgogICAgfQogIH0KfQ==
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Secret","metadata":{"annotations":{},"name":"appsettings","namespace":"api"},"stringData":{"appsettings.Dummy.json":"{\n  \"Dummy\": {\n    \"Placeholder\": {\n      \"Password\": \"blank\"\n    }\n  }\n}"},"type":"Opaque"}
  creationTimestamp: 2019-01-31T02:50:16Z
  name: appsettings
  namespace: api
  resourceVersion: "4909"
  selfLink: /api/v1/namespaces/api/secrets/appsettings
  uid: f0629027-2502-11e9-9375-6eb4e0983acc


顯然,用於創建注釋中顯示的秘密的 yaml 是 kubectl apply -f secret.yaml 自 2016 年以來的預期行為/已作為錯誤報告發布,但問題未解決而關閉/他們忽略它而不是修復它。

如果你是原始的 secret.yaml 是 base64 的,注釋至少是 base64 的,但在這種情況下,它直接是非 base64 的人類可讀明文。

注意1:它不會發生在命令式秘密創建中
kubectl 創建秘密通用 appsettings --from-file appsettings.Dummy.json --namespace=api

注意 2:支持聲明性 appsettings-secret.yaml 的另一個原因是,當需要編輯時 kubectl apply -f 將配置密鑰,但是如果您運行該 create 命令,它會說錯誤已經存在,您必須刪除它,然后再運行 create 命令。

注意 3: kubectl create secret generic name --from-file file --namespace 的一個原因/反對 secret.yaml 的一個原因是 kubectl show secret 不會在上次編輯機密時向您顯示。 與 create 命令一樣,因為您必須先刪除它,然后才能重新創建它,所以您將根據它存在的時間知道它上次編輯的時間,因此這有利於審計試驗。 (但有更好的審計方法)

kubectl apply -f cleartext-appsettings-secret.yaml
kubectl 注釋秘密 appsettings -n=api kubectl.kubernetes.io/last-applied-configuration-
kubectl 獲取秘密 appsettings -n=api -o yaml
抵消泄漏

apiVersion: v1
data:
  appsettings.Dummy.json: ewogICJEdW1teSI6IHsKICAgICJQbGFjZWhvbGRlciI6IHsKICAgICAgIlBhc3N3b3JkIjogImJsYW5rIgogICAgfQogIH0KfQ==
kind: Secret
metadata:
  creationTimestamp: 2019-01-31T03:06:55Z
  name: appsettings
  namespace: api
  resourceVersion: "6040"
  selfLink: /api/v1/namespaces/api/secrets/appsettings
  uid: 43f1b81c-2505-11e9-9375-6eb4e0983acc
type: Opaque

您可以使用secodebase64編碼的字符串替換秘密值,只需執行以下操作:

secode secrets.yaml > secrets_base64.yaml

當在列表 ( kind: List ) 中定義時,它對所有data字段進行編碼,並使用每個yaml文件的多個機密 ( kind:Secret ) 進行處理。

免責聲明:我是作者

對於房間中的 Windows 用戶,對每個 .cer 和 .key 使用它(示例顯示 .key 被編碼以插入到 YAML 文件中):

$Content = Get-Content -Raw -Path C:\ssl-cert-decrypted.key

[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($Content)) | Out-File -FilePath C:\ssl-cert-decrypted.key.b64

打開新的.b64文件並將(單行)輸出粘貼到您的 YAML 文件中 - 請注意,如果將 YAML 文件簽入包含此信息的源代碼存儲庫,則密鑰將有效地受到損害,因為 base64 不是t 加密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM