附註:

使用 Oracle Cloud Native Environment 的加密密碼

簡介

許多應用程式都有一個只有獲得授權的使用者才應該存取的資訊,例如密碼。在這種情況下,Kubernetes 加密密碼可以提供協助。它們提供安全管理機密資料 (例如密碼、SSH 以及 API 金鑰) 的方式。使用加密密碼可將機密資料與應用程式的程式碼分開,以降低在 Pod 工作流程期間公開或修改機密資料的風險。

開始之前,它有助於瞭解一些關於 Kubernetes 加密密碼的基本詳細資訊:

重要事項: Kubernetes 加密密碼預設不會加密,因為這些加密密碼只有 Base64 編碼且會以未加密方式儲存在 etcd 中。因此,任何具備 etcd 存取權的人都可以檢視或更改加密密碼。使用 Kubernetes 加密密碼可以使用下列任何一種方法,確保安全:

本教學課程涵蓋 Kubernetes 加密密碼的基本知識,並示範簡單的使用案例。

如需有關 Oracle Cloud Native Environment 2 的詳細資訊,請參閱目前的版本文件網站。

目標

在本教學課程中,您將學習到:

必要條件

設定 Oracle Cloud Native Environment

注意:如果是在您自己的租用戶中執行,請先閱讀 linux-virt-labs GitHub 專案 README.md 並完成先決條件,再部署實驗環境環境。

  1. 在 Luna Desktop 上開啟終端機。

  2. 複製 linux-virt-labs GitHub 專案。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 變更至工作目錄。

    cd linux-virt-labs/ocne2
    
  4. 安裝必要的集合。

    ansible-galaxy collection install -r requirements.yml
    
  5. 部署實驗環境環境。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e install_ocne_rpm=true -e create_ocne_cluster=true -e "ocne_cluster_node_options='-n 1 -w 1'"
    

    自由實驗環境環境需要額外的變數 local_python_interpreter,此變數會設定在 localhost 上執行的播放 ansible_python_interpreter。由於環境會安裝 Oracle Cloud Infrastructure SDK for Python 的 RPM 套件 (位於 python3.6 模組底下),因此需要此變數。

    預設部署資源配置使用 AMD CPU 和 Oracle Linux 8。若要使用 Intel CPU 或 Oracle Linux 9,請在部署命令中新增 -e instance_shape="VM.Standard3.Flex"-e os_version="9"

    重要事項: 請等待播放手冊順利執行,然後到達暫停工作。在手冊的這個階段,已完成 Oracle CNE 的安裝,且執行處理已就緒。記下先前的播放,此播放會列印其部署節點的公用和專用 IP 位址,以及執行實驗室時所需的任何其他部署資訊。

存取 Kubernetes 叢集

  1. 開啟終端機,並透過 SSH 連線至 ocne 執行處理。

    ssh oracle@<ip_address_of_instance>
    
  2. 等待叢集穩定,以及讓所有 Pod 報告處於執行中狀態。

    watch kubectl get pods -A
    

    一旦所有 Pod 顯示 執行中STATUS ,請輸入 ctrl-c 以結束 watch 指令。

  3. 確認有多少節點存在。

    kubectl get nodes
    

建立加密貨幣

建立 Kubernetes 加密密碼的方法有三種,分別是:

直接從命令列使用 Kubectl

Kubectl 以下列兩種方式之一建立加密密碼:

  1. 使用直接從命令行傳送的文字值建立加密密碼。

    kubectl create secret generic my-literal-secret --from-literal=username=my-user --from-literal=password=my-password
    

    注意:請使用單引號 '' 來遁離字串值中包含的特殊字元,例如 $\$&= 以及 !。否則,命令 shell 會解譯它們 。

    輸出範例:

    [oracle@ocne ~]$ kubectl create secret generic my-literal-secret --from-literal=username=my-user --from-literal=password=my-password
    secret/my-literal-secret created
    

使用 Kubectl 搭配預存證明資料檔案

檔案的內容會變成 VALUE ,而檔案名稱會變成 KEY

  1. 建立證明資料檔案。

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    
  2. 使用儲存的檔案建立加密密碼。

    kubectl create secret generic my-file-secret \
     --from-file=username=./username.txt \
     --from-file=password=./password.txt
    

    注意:預設行為會使用檔案名稱作為 KEY 值,顯示如何覆寫預設行為,並使用 --from-file=[key]=[path to file] 方法直接從命令行宣告 KEY 名稱值。

    額外資訊 :

    或者,您可以從儲存在子目錄中的多個檔案建立加密密碼。

    1. 建立子目錄。

      mkdir secrets
      
    2. 建立證明資料檔案。

      echo -n 'user1' > ./secrets/username.txt
      echo -n 'my-super-secret-password' > ./secrets/password.txt
      
    3. 使用子目錄中的證明資料檔案建立加密密碼。

      kubectl create secret generic my-secret --from-file=./secrets/
      

      注意:此方法使用每個檔案名稱作為 KEY 值,且檔案內容為 VALUE

使用 Kubectl 套用 YAML 組態檔

  1. 建立加密密碼 YAML 定義檔案。

    cat << EOF | tee db-credentials.yaml > /dev/null
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-credentials
      # immutable: true
    type: Opaque
    data:
      username: "bXktdXNlcg=="
      password: "bXktcGFzc3dvcmQ="
    EOF
    

    注意: YAML 檔案中的「加密密碼」值必須編碼為 BASE64。

  2. 套用加密密碼。

    kubectl apply -f db-credentials.yaml
    

使用 Kustomize 搭配 kustomization.yaml 檔案

使用自訂建立加密密碼時,需要 kustomization.yaml 檔案。該檔案應該使用下列其中一種方法來定義 secretGenerator

使用 Kustomize 時,上述所有密碼值都不需要 Base64 編碼。自訂所使用的 YAML 檔案名稱必須kustomization.yamlkustomization.yml

此範例顯示如何使用文字來建立加密密碼。

  1. 建立 secretGenerator 檔案。

    cat << EOF | tee kustomization.yaml > /dev/null
    secretGenerator:
    - name: database-credentials
      literals:
      - username=admin
      - password=password
    EOF
    
  2. 使用 Kustomize 產生加密密碼。

    kubectl -n default apply -k .
    

    輸出範例:

    [oracle@ocne ~]$ kubectl -n default apply -k .
    secret/database-credentials-fd8288cb7g created
    

管理 Kubernetes 加密密碼

您可以將 Kubernetes 加密密碼儲存在不同的命名空間中。因此,您必須使用 -n 選項從特定命名空間擷取加密密碼,或使用 --all-namespaces-A 從所有命名空間擷取加密密碼。如果您未指定命名空間,kubectl 命令會使用 default 命名空間。建立 Kubernetes 加密密碼時,也會有相同的行為。

列出現有的 Kubernetes 加密密碼

  1. 列出新建立的加密密碼。

    kubectl get secrets
    

    輸出範例:

    NAME                              TYPE     DATA   AGE
    database-credentials-fd8288cb7g   Opaque   2      34s
    db-credentials                    Opaque   2      2m16s
    my-file-secret                    Opaque   2      2m40s
    my-literal-secret                 Opaque   2      2m51s
    
  2. 取得新建立加密密碼的詳細資訊。

    kubectl describe secrets
    

    輸出範例:

    [oracle@ocne ~]$ kubectl describe secrets
    Name:         database-credentials-fd8288cb7g
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  8 bytes
    username:  5 bytes
    
    
    Name:         db-credentials
    Namespace:    default
    ...
    ...
    
    Name:         my-literal-secret
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    username:  7 bytes
    password:  11 bytes
    

    請注意,kubectl getkubectl describe 指令不會顯示 secret 的內容,以防止意外顯示或包含在記錄檔中。

  3. 檢視其中一個加密密碼的資訊。

    kubectl -n default describe secret db-credentials
    

    輸出範例:

    [oracle@ocne ~]$ kubectl -n default describe secret db-credentials
    Name:         db-credentials
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  11 bytes
    username:  7 bytes
    

解碼 Kubernetes 加密密碼

  1. 檢視其中一個加密密碼的儲存資料。

    kubectl -n default get secret db-credentials -o jsonpath='{.data}'
    

    輸出範例:

    [oracle@ocne ~]$ kubectl -n default get secret db-credentials -o jsonpath='{.data}'
    {"password":"bXktcGFzc3dvcmQ=","username":"bXktdXNlcg=="}[oracle@ocne ~]$ 
    

    輸出會顯示加密密碼資料的編碼 Key:Value 組。值資料為 base64 編碼。

  2. 解碼編碼的 Key:Value 資料。

    echo <BASE64-VALUE-FOR-PASSWORD> | base64 --decode
    

    輸出範例:

    [oracle@ocne ~]$ echo bXktc3VwZXItc2VjcmV0LXBhc3Nvd3Jk | base64 --decode
    my-password[oracle@ocne ~]$ 
    

    警告: 這些步驟可能導致 Shell 歷史記錄中的加密密碼資料記錄。請合併兩個步驟以避免發生此情況,如下一個步驟所示。

  3. 更安全的方式來解碼編碼的 Key:Value 資料。

    kubectl -n default get secret db-credentials -o jsonpath='{.data.password}' | base64 --decode
    

    輸出範例:

    [oracle@ocne ~]$ kubectl -n default get secret db-credentials -o jsonpath='{.data.password}' | base64 --decode
    my-password[oracle@ocne ~]$ 
    

編輯加密密碼

就像許多 Kubernetes 物件一樣,您可以編輯 Kubernetes 加密密碼。唯一的例外是宣告加密密碼 immutable 時。

  1. 編輯加密密碼。

    kubectl edit secrets my-literal-secret
    

    預設編輯器會開啟 (預設為 vi),讓您更新 data: 欄位中的 Base64 編碼加密密碼值。

    輸出範例:

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
      password: bXktcGFzc3dvcmQ=
      username: bXktdXNlcg==
    kind: Secret
    metadata:
      creationTimestamp: "2025-05-09T10:56:14Z"
      name: my-literal-secret
      namespace: default
      resourceVersion: "1689"
      uid: 394dfda3-025a-417d-bbfe-c4851a6b6cff
    type: Opaque
    ~                                                                                                                                       
    ~                                                                                                                                             
    ~                                                                                                                                       
    ~                                                                                                                                             
    "/tmp/kubectl-edit-1267071353.yaml" 16L, 480C
    
  2. Esc 鍵,後面接著 :q! 鍵,即可結束編輯器而不儲存。

    輸出範例:

    [oracle@ocne ~]$ kubectl edit secrets my-literal-secret
    Edit cancelled, no changes made.
    

刪除密碼

您可以使用 kubectl -n <NAMESPACE> delete 指令移除加密密碼。

  1. 刪除加密密碼。

    kubectl -n default delete secret my-file-secret my-literal-secret
    

    輸出範例:

    [oracle@ocne ~]$ kubectl -n default delete secret my-file-secret  my-literal-secret
    secret "my-file-secret" deleted
    secret "my-literal-secret" deleted
    

    注意:您可以利用空格區隔來刪除多個加密密碼。

使用部署加密密碼

接下來,您將使用您建立的 Kubernetes 加密密碼資料建立部署。

  1. 列出 default 命名空間中的所有加密密碼。

    kubectl get secrets -n default
    

    輸出範例:

    [oracle@ocne ~]$ kubectl get secrets -n default
    NAME                              TYPE     DATA   AGE
    database-credentials-fd8288cb7g   Opaque   2      10m
    db-credentials                    Opaque   2      8m
    
  2. 建立部署 YAML 檔案。

    cat << EOF | tee echo-deployment.yaml > /dev/null
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echo
            image: ghcr.io/oracle/oraclelinux:9
            command: ["/bin/bash", "-c"]
            args: ["echo 'Username: $USER' 'Password: $PASSWORD'; sleep infinity"]
            env:
            - name: USER
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: username
            - name: PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: password
          restartPolicy: Always
    EOF
    
  3. 建立部署

    kubectl -n default apply -f echo-deployment.yaml
    
  4. 確認部署。

    kubectl get deployments
    

    您可能需要在部署時重新查詢幾次。

    輸出範例:

    [oracle@ocne ~]$ kubectl get deployments 
    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    echo-deployment   1/1     1            1           4m
    
  5. 取得已部署 Pod 的名稱。

    kubectl get pods
    

    輸出範例:

    [oracle@ocne ~]$ kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    echo-deployment-59bff74847-9nnkq   1/1     Running   0          6m
    

    注意:您的 Pod 名稱將會不同。

  6. 檢查部署的 Pod 是否使用加密密碼。

    kubectl -n default describe pod <POD-NAME>
    

    其中:

    • <POD-NAME> - 您部署中的 Pod 名稱。

    輸出範例:

    [oracle@ocne ~]$ kubectl -n default describe pod echo-deployment-59bff74847-9nnkq
    Name:             echo-deployment-59bff74847-9nnkq
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             ocne-worker-1/192.168.122.77
    Start Time:       Mon, 12 May 2025 13:42:25 +0000
    ...
    ...
        Ready:          True
        Restart Count:  0
        Environment:
          USER:      <set to the key 'username' in secret 'db-credentials'>  Optional: false
          PASSWORD:  <set to the key 'password' in secret 'db-credentials'>  Optional: false
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5fp4d (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   True 
      Initialized                 True
    ...
    ..
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:                      <none>
    [oracle@ocne ~]$ 
    

    注意:請檢查 Environment: 區段,確認 $USER$PASSWORD 變數是否存在。

  7. 確認部署的 Pod 中有環境變數。

    kubectl exec -it <POD-NAME> -- printenv USER PASSWORD
    

    其中:

    • <POD-NAME> - 您部署中的 Pod 名稱。

    輸出範例:

    [oracle@ocne ~]$ kubectl exec -it echo-deployment-59bff74847-9nnkq -- printenv USER PASSWORD
    my-user
    my-password
    

    輸出會確認您已順利使用 Kubernetes 加密密碼作為已部署 Pod 中的環境變數。

接下來的步驟

本教學課程示範如何建立及使用 Kubernetes 加密密碼,以限制未授權的機密資訊存取。不過,這只是開頭。查看 Oracle Linux 訓練站,瞭解其他教學課程和內容。

其他學習資源

docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center