Grandream
KubernetesのSecretとExternalSecretsOperatorによる機密情報管理
概要
本記事では、Kubernetes (k8s) のSecretリソースを使用した環境変数の管理方法と、その課題について説明します。また、ExternalSecretsOperator (ESO) を使用して、外部シークレット管理サービスからk8sにSecretを取り込む方法とそのメリットについても詳しく解説します。これにより、機密情報の管理を効率化し、セキュリティを向上させるための手法を理解することができます。
KubernetesのSecretについて
Kubernetes (k8s) では、機密情報や環境変数を管理するために、Secretリソースを使用します。SecretはBase64エンコードされたデータを格納するため、アプリケーションに安全に機密情報を渡すことができます。
以下は、Secretリソースの基本的な定義方法です:
apiVersion: v1
kind: Secret
metadata:
name: secret-sa-sample
annotations:
kubernetes.io/service-account.name: "sa-name"
type: kubernetes.io/service-account-token
data:
# Base64エンコードされたデータ
extra: YmFyCg==
この方法では以下のような課題が存在します:
- 機密情報(DBのパスワードやAPIキーなど)をソースコード管理システムにアップロードする必要がある。
- Helmを使用して環境変数を取り込むことが可能ですが、管理が複雑になることがあります。
- アプリケーションをデプロイする際に、Secretの値を更新するためにymlファイルを変更する必要がある。
ExternalSecretsOperator (ESO)
ExternalSecretsOperator (ESO) は、AWS Secrets Manager、HashiCorp Vault、Google Secrets Manager、Azure Key Vault、IBM Cloud Secrets Manager、CyberArk Conjur などの外部シークレット管理サービスから定期的に値を取得し、k8sにSecretとして取り込むためのツールです。ESOを使用することで、機密情報の管理が大幅に簡素化されます。
導入方法
1. k8sにESOを導入します。
kubectl apply -k "<https://raw.githubusercontent.com/external-secrets/external-secrets/>/deploy/crds/bundle.yaml"
2. ESOが使用するAWSクレデンシャルを作成します。
echo -n 'KEYID' > ./access-key
echo -n 'SECRETKEY' > ./secret-access-key
kubectl create secret generic awssm-secret --from-file=./access-key --from-file=./secret-access-key
3. AWS Secrets Managerに環境変数を定義します。
4. ExternalSecretのymlファイルを作成し、k8sに適用します。
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: example
spec:
refreshInterval: 1h
secretStoreRef:
name: secretstore-sample
kind: SecretStore
target:
name: secret-to-be-created
creationPolicy: Owner
data:
- secretKey: secret-key-to-be-managed
remoteRef:
key: provider-key
version: provider-key-version
property: provider-key-property
dataFrom:
- extract:
key: remote-key-in-the-provider
kubectl apply -f "basic-external-secret.yaml"
導入して感じたメリット
- 機密情報へのアクセスが制限され、セキュリティが向上します。
- 各システムの環境変数がDEV/STG/PRD環境やフロントエンド/バックエンドなどで分けられ、SecretManagerで管理できるため、管理の負担が軽減されます。
- 環境変数による処理の分岐やアプリの切り替えが必要な場合、SecretManagerを書き換えアプリを再起動するだけで済むため、運用が効率化されます。
- 管理するymlファイルの数が減少し、管理が簡素化されます。
さいごに
KubernetesのSecretとExternalSecretsOperator (ESO) を使用することで、機密情報の管理が大幅に効率化されることが分かりました。Secretを使用することで、環境変数の管理が容易になりますが、機密情報をソースコードに含めるリスクや、デプロイ時の管理負担が課題として残ります。ESOを利用することで、外部シークレット管理サービスからの自動的なデータ取得と管理が可能になり、セキュリティと運用の負担が大幅に軽減されます。
Grandream
株式会社グランドリーム
AI・システム開発のプロフェッショナルチームです。AIエージェント・業務自動化・Webシステム開発などを手がけています。