Secret

このページでは、Kubernetes の Secret オブジェクトと Google Kubernetes Engine でのその使用方法について説明します。

Secret とは

Secret

Secret は、パスワード、OAuth トークン、SSH 認証鍵などの機密データをクラスタに格納する安全なオブジェクトです。機密データを Secret に保存することは、平文の ConfigMap や Pod 仕様よりも安全です。Secret を使用すると、機密データの使用方法を制御し、権限のないユーザーにデータが公開されるリスクを軽減できます。

Cloud KMS で管理する鍵を使用して Secret を暗号化することもできます。詳しくはアプリケーション レイヤでの Secret の暗号化をご覧ください。

Secret の作成

kubectl create secret を使用して Secret を作成します。

kubectl create secret type name data

ここで

  • type は、次のいずれかになります。

    • generic: ローカル ファイル、ディレクトリ、またはリテラル値から Secret を作成します。
    • docker-registry: Docker レジストリで使用する dockercfg Secret を作成します。Docker レジストリに対する認証に使用されます。
    • tls: 指定された公開鍵と秘密鍵のペアから TLS Secret を作成します。公開鍵と秘密鍵のペアが事前に存在している必要があります。公開鍵証明書は.PEM エンコードされ、指定された秘密鍵と一致する必要があります。

    ほとんどの Secret では、generic 型を使用します。

  • name は、作成するシークレットの名前です。

  • data は、次のいずれかになります。

    • --from-file または --from-env-file フラグを使用して指定された、1 つ以上の構成ファイルを含むディレクトリへのパス
    • それぞれが --from-literal フラグを使用して指定された Key-Value ペア

kubectl create の詳細については、リファレンス ドキュメントをご覧ください。

別の方法では、YAML マニフェスト ファイルで Secret オブジェクトを定義し、次のコマンドを使用してそのオブジェクトをデプロイすることでも Secret を作成できます。

kubectl create -f file-name.yaml

例については、Secret を使用して認証情報を安全に配布するをご覧ください。

ファイルから

1 つ以上のファイルから Secret を作成するには、--from-file または --from-env-file を使用します。ファイルは平文である必要がありますが、ファイルの拡張子は関係ありません。

--from-file

--from-file を使用して Secret を作成すると、Secret の値はファイルの内容全体になります。Secret の値に複数の Key-Value ペアが含まれている場合は、代わりに --from-env-file を使用します。

単一のファイルまたは複数のファイルを渡すことができます。

kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2

複数のファイルを含むディレクトリを渡すこともできます。

kubectl create secret type name --from-file /path/to/directory

たとえば、次のコマンドでは、username.txtpassword.txt の 2 つのファイルから credentials という Secret を作成し、キーをそれぞれ username.txtpassword.txt に設定しています。

kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt

Secret の値は Kubernetes で base64 でエンコードされます。

kubectl get secret credentials -o yaml を実行すると、次の出力が返されます。

apiVersion: v1
data:
  password.txt: MTIzNAo=
  username.txt: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: ...
  name: credentials
  namespace: default
  resourceVersion: "2011810"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: ...
type: Opaque

デフォルトでは、キーはファイル名です。--from-file の拡張構文を使用してキーをオーバーライドできます。

kubectl create secret type name --from-file=key=/path/to/directory

次の例では、username.txt と password.txt の 2 つのファイルから credentials という名前の Secret を作成し、(ファイル名を使用せずに)キーをそれぞれ usernamepassword に設定しています。

kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt

--from-env-file

複数の Key-Value ペアを単一の Secret に読み込むには、1 つ以上の平文ファイルに Key-Value ペアを保存してから、--from-file ではなく --from-env-file を使用してそれらを読み込みます。フラグを複数回指定することで複数のファイルを読み込むことができます。--from-file と同じ制限が適用されます。

たとえば、次のコマンドでは、複数の Key-Value ペアを含む単一のファイル credentials.txt から credentials という Secret を作成しています。

# Each of these key-value pairs is loaded into the Secret
username=jane
password=d7xnNss7EGCFZusG

Secret の値は Kubernetes で base64 でエンコードされます。

kubectl create secret generic credentials --from-env-file ./credentials.txt

kubectl get secret credentials -o yaml を実行すると、次の出力が返されます。

apiVersion: v1
data:
  password: ZDd4bk5zczdFR0NGWnVzRw==
  username: amFuZQ==
kind: Secret
metadata:
  creationTimestamp: 2019-06-04T15:39:27Z
  name: credentials
  namespace: default
  resourceVersion: "14507319"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque

制限事項

シンボリック リンク、デバイス、パイプなどの非正規ファイルは、kubectl によって無視されます。サブディレクトリも無視されます。kubectl create secret は、サブディレクトリへの再帰適用を行いません。

リテラル値から

リテラル値から Secret を作成するには、--from-literal を使用します。

たとえば、次のコマンドは、2 つの Key-Value ペアを含む literal-token という名前の一般的な Secret を作成します。

kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234

各 Key-Value ペアに対して --from-literal を指定します。値は自動的に base64 でエンコードされます。

kubectl get secret literal-token -o yaml を実行すると、次の出力が返されます。

apiVersion: v1
data:
  password: MTIzNA==
  user: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: ...
  name: literal-token
  namespace: default
  resourceVersion: "2012831"
  selfLink: /api/v1/namespaces/default/secrets/literal-token
  uid: ...
type: Opaque

上記の出力で、passworduser が base64 でエンコードされていることを確認してください。base64 でエンコードすることで、特定の文字を処理できないアプリやサービスに情報が認識されるようになります。base64 エンコードではセキュリティは保証されません。

Secret の使用

ワークロードで Secret を使用するには、Secret の値を参照する環境変数を指定するか、Secret を含むボリュームをマウントします。

Secret の使用方法については、Secret の使用をご覧ください。

次のステップ