シークレットのシール
カタログPodの探索
現在、catalogデプロイメントは、環境変数を通じてcatalog-dbシークレットからデータベース認証情報にアクセスしています:
RETAIL_CATALOG_PERSISTENCE_USERRETAIL_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シークレットを読み取るようにしました:
- Kustomize Patch
- Deployment/catalog
- Diff
~/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
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
name: catalog
namespace: catalog
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: service
app.kubernetes.io/instance: catalog
app.kubernetes.io/name: catalog
template:
metadata:
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/instance: catalog
app.kubernetes.io/name: catalog
spec:
containers:
- env:
- name: RETAIL_CATALOG_PERSISTENCE_USER
valueFrom:
secretKeyRef:
key: RETAIL_CATALOG_PERSISTENCE_USER
name: catalog-sealed-db
- name: RETAIL_CATALOG_PERSISTENCE_PASSWORD
valueFrom:
secretKeyRef:
key: RETAIL_CATALOG_PERSISTENCE_PASSWORD
name: catalog-sealed-db
envFrom:
- configMapRef:
name: catalog
image: public.ecr.aws/aws-containers/retail-store-sample-catalog:1.2.1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
name: catalog
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
httpGet:
path: /health
port: 8080
periodSeconds: 5
successThreshold: 3
resources:
limits:
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-volume
securityContext:
fsGroup: 1000
serviceAccountName: catalog
volumes:
- emptyDir:
medium: Memory
name: tmp-volume