KubernetesのSecretとExternalSecretsOperatorによる機密情報管理

2024-08-15
広瀬 雅季
#
#
#

概要

本記事では、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を使用することで、機密情報の管理が大幅に簡素化されます。

ExternalSecretsOperatorの公式サイト

導入方法

1. k8sにESOを導入します。


kubectl apply -k "/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では、フルリモートであなたのスキルを活かし、活躍できるエンジニアを募集しております。 詳しくは採用ページをご確認いただき、お気軽にお問い合わせください。

株式会社グランドリームでは、AWSを駆使した開発からUI/UXデザインまで、Webアプリケーションに関するすべての要望に応えます。
まずは一度お気軽にご相談ください。

お問い合わせはこちら