Kubernetes シークレットの理解

完了

分散アプリケーションを使用する際の最大の考慮事項の 1 つは、パスワード、接続、それらに類するデータなど、機密情報を管理する方法です。 Kubernetes を使用すると、シークレットと呼ばれるリソースを使用して、このデータをセキュリティで保護することができます。

シークレットの理解

Kubernetes では、シークレットを使用すると、ポッドやデプロイのプレーンテキスト形式よりも安全な方法で機密情報を格納できます。 シークレットは、パスワードやその他の機密データを格納するように設計されています。

Kubernetes シークレットでは、データは base64 形式でエンコードされます。 base64 は暗号化アルゴリズムではありませんが、Kubernetes では情報がエンコードされていることを確認でき、kubectl describe などのコマンド出力でこの情報を非表示にすることができます。 このプロセスは、プレーン テキスト構成では発生しません。 シークレットのスコープは常に 1 つの名前空間です。これにより、クラスター内の他のワークロードに機密データが漏洩するのを防ぐことができます。

シークレットの種類

シークレットにはさまざまな種類があります。 最も一般的な種類 (既定) は Opaque で、ユーザー定義の任意のデータを保持します。 他の一般的な種類には、次のようなものがあります。

  • kubernetes.io/service-account-token:サービス アカウント トークンを定義します。これは、新しいサービス アカウントの作成時に自動的に作成されます。
  • kubernetes.io/basic-auth: 基本認証の資格情報。
  • kubernetes.io/tls: TLS クライアントまたはサーバー データ。たとえば、イングレス リソース内から HTTPS 接続を提供するために使用されます。

ヒント

詳細については、公式の Kubernetes シークレットのドキュメントを参照してください。

シークレットを作成して使用する

公式の Kubernetes シークレットに関するドキュメントによると、シークレットは次の 3 つの方法で使用できます。

  • ポッド内またはデプロイ内のコンテナー上のボリュームにファイルとしてマウントされます。
  • ポッドまたはデプロイの指定で環境変数として参照されます。
  • ポッド指定で imagePullSecret キーを介してプライベート レジストリからイメージをプルするときに Kubelet によって使用されます。

他の Kubernetes リソースと同様に、YAML マニフェスト ファイルまたは kubectl コマンドを使用してシークレットを作成できます。 シークレットは次のように指定されます。

apiVersion: v1
kind: Secret
metadata:
  name: secret-name
  namespace: secret-namespace
type: Opaque
data:
  key_name: "key value in base64 format"

この仕様のシークレットの場合は、シークレットを作成する "前に" 値をエンコードする必要があります。 プレーンテキスト値を使用してシークレットを作成し、Kubernetes で自動的にエンコードする場合は、data ではなく stringData を使用します。

apiVersion: v1
kind: Secret
metadata:
  name: secret-name
  namespace: secret-namespace
type: Opaque
stringData:
  key_name: "key value in plain format"

エンコードされた文字列ではなく値が渡されるため、アプリケーションは "デコードされた" シークレット文字列を受け取ります。

シークレットの更新

ポッド内に "ボリュームとしてマウントされた" すべてのシークレットは、値が変更されると自動的に更新されます。 この変更は、Kubelet の構成が原因ですぐには行われないことがありますが、自動的に行われるので、ポッドを再起動する必要はありません。

シークレットが "環境変数にバインドされている" 場合、それらは自動的に更新されないので、変更を有効にするにはポッドを再起動する必要があります。

知識を確認

1.

プレーンテキスト値よりも Kubernetes シークレットの安全性が高いのはなぜですか。

2.

アプリケーションでシークレットを使用するにはどうすればよいですか。

3.

base64 はシークレットでどのように使用されますか。