メインコンテンツまでスキップ

シークレットのシール

カタログPodの探索

現在、catalogデプロイメントは、環境変数を通じてcatalog-dbシークレットからデータベース認証情報にアクセスしています:

  • RETAIL_CATALOG_PERSISTENCE_USER
  • RETAIL_CATALOG_PERSISTENCE_PASSWORD

これはenvFromを使用してシークレットを参照することで行われています:

~$kubectl -n catalog get deployment catalog -o yaml | yq '.spec.template.spec.containers[] | .envFrom'
 
- configMapRef:
    name: catalog
- secretRef:
    name: catalog-db

catalog-dbシークレットを調査すると、base64エンコードされただけであることがわかります。これは以下のように簡単にデコードできるため、シークレットマニフェストをGitOpsワークフローの一部とすることが難しくなります。

~/environment/eks-workshop/base-application/catalog/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: catalog-db
data:
RETAIL_CATALOG_PERSISTENCE_USER: "Y2F0YWxvZw=="
RETAIL_CATALOG_PERSISTENCE_PASSWORD: "ZFltTmZXVjR1RXZUem9GdQ=="

~$kubectl -n catalog get secrets catalog-db --template {{.data.RETAIL_CATALOG_PERSISTENCE_USER}} | base64 -d
catalog%
~$kubectl -n catalog get secrets catalog-db --template {{.data.RETAIL_CATALOG_PERSISTENCE_PASSWORD}} | base64 -d
dYmNfWV4uEvTzoFu%

catalog-sealed-dbという新しいシークレットを作成しましょう。catalog-dbシークレットと同じキーと値を持つ新しいファイルnew-catalog-db.yamlを作成します。

~/environment/eks-workshop/modules/security/sealed-secrets/new-catalog-db.yaml
apiVersion: v1
kind: Secret
metadata:
name: catalog-sealed-db
namespace: catalog
type: Opaque
data:
RETAIL_CATALOG_PERSISTENCE_USER: "Y2F0YWxvZw=="
RETAIL_CATALOG_PERSISTENCE_PASSWORD: "ZFltTmZXVjR1RXZUem9GdQ=="

次に、kubesealを使用してSealedSecret YAMLマニフェストを作成します。

~$kubeseal --format=yaml < ~/environment/eks-workshop/modules/security/sealed-secrets/new-catalog-db.yaml \
> /tmp/sealed-catalog-db.yaml

または、コントローラから公開鍵を取得し、オフラインでシークレットをシールすることもできます:

~$kubeseal --fetch-cert > /tmp/public-key-cert.pem
~$kubeseal --cert=/tmp/public-key-cert.pem --format=yaml < ~/environment/eks-workshop/modules/security/sealed-secrets/new-catalog-db.yaml \
> /tmp/sealed-catalog-db.yaml

これにより、以下の内容のsealed-secretが作成されます:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
creationTimestamp: null
name: catalog-sealed-db
namespace: catalog
spec:
encryptedData:
password: AgBe(...)R91c
username: AgBu(...)Ykc=
template:
data: null
metadata:
creationTimestamp: null
name: catalog-sealed-db
namespace: catalog
type: Opaque

SealedSecretをEKSクラスタにデプロイしましょう:

~$kubectl apply -f /tmp/sealed-catalog-db.yaml

コントローラのログを見ると、デプロイされたSealedSecretカスタムリソースを検知し、それを解除して通常のシークレットを作成していることがわかります。

~$kubectl logs deployments/sealed-secrets-controller -n kube-system
 
2022/11/07 04:28:27 Updating catalog/catalog-sealed-db
2022/11/07 04:28:27 Event(v1.ObjectReference{Kind:"SealedSecret", Namespace:"catalog", Name:"catalog-sealed-db", UID:"a2ae3aef-f475-40e9-918c-697cd8cfc67d", APIVersion:"bitnami.com/v1alpha1", ResourceVersion:"23351", FieldPath:""}): type: 'Normal' reason: 'Unsealed' SealedSecret unsealed successfully

コントローラによってSealedSecretから解除されたcatalog-sealed-dbシークレットがsecure-secretsネームスペースにデプロイされたことを確認します。

~$kubectl get secret -n catalog catalog-sealed-db
 
NAME                       TYPE     DATA   AGE
catalog-sealed-db          Opaque   4      7m51s

上記のシークレットから読み取るcatalogデプロイメントを再デプロイしましょう。catalogデプロイメントを更新して、catalog-sealed-dbシークレットを読み取るようにしました:

~/environment/eks-workshop/modules/security/sealed-secrets/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog
spec:
template:
spec:
containers:
- name: catalog
envFrom:
- configMapRef:
name: catalog
env:
- name: RETAIL_CATALOG_PERSISTENCE_USER
valueFrom:
secretKeyRef:
name: catalog-sealed-db
key: RETAIL_CATALOG_PERSISTENCE_USER
- name: RETAIL_CATALOG_PERSISTENCE_PASSWORD
valueFrom:
secretKeyRef:
name: catalog-sealed-db
key: RETAIL_CATALOG_PERSISTENCE_PASSWORD
~$kubectl apply -k ~/environment/eks-workshop/modules/security/sealed-secrets
~$kubectl rollout status -n catalog deployment/catalog --timeout 30s

SealedSecretリソースであるcatalog-sealed-dbは、クラスターにデプロイされた他のKubernetesリソース(DaemonSet、Deployment、ConfigMapなど)に関するYAMLマニフェストとともにGitリポジトリに安全に保存できます。その後、GitOpsワークフローを使用して、これらのリソースをクラスターにデプロイする管理ができます。