Kubernetes Injector

1Passwordマニュアル|Kubernetes Secrets Injectorは、ウェブフックを通じてシークレット管理を効率化し、安全なデプロイメントを実現します。

1Password Kubernetes Secrets Injector は、サービス アカウントまたはConnect サーバーを環境変数として使用して 1Password シークレットを Kubernetes ポッドまたはデプロイメントに挿入できるようにする変更 Webhook を実装します。

1Password Kubernetes Operatorとは異なり、Secrets Injector はリソースにシークレットを割り当てるときに Kubernetes Secret をCreateしません。Kubernetes Operator と Kubernetes Injector を比較するには、Kubernetes 統合を参照してください。

ヒント

1Password サービス アカウントで Kubernetes Secrets Injector を使う方法を紹介します。

https://youtu.be/WS1CAooBqog

Requirements

Kubernetes Injector を使う前に、次の点を確認してください。

Limitations

Kubernetes Injector については、考慮すべき制限とニュアンスがいくつかあります。例:

  • Kubernetes Injector では、commandフィールドを使うためにデプロイメント仕様が必要です。

  • デフォルトでは、シークレットは全てのコンテナのセッションで使用できるわけではありません。

The command field

Kubernetes Secrets Injector は、初期化時にコマンド値を変更することで機能します。そのため、シークレットを注入するポッドには、デプロイメント仕様ファイルでコマンド値が定義されている必要があります (次のコード ブロックに示すように)。

以下のコード ブロックのコマンド フィールドを参照してください。この例では、1Password サービス アカウントは、npm start によって実行されるアプリケーションにシークレットを挿入します。

deployment-specification.yaml

spec:

containers:

- name: app-example1

image: my-image

ports:

- containerPort: 5000

command: ["①npm"]

args: ["②start"]

env:

- name: OP_SERVICE_ACCOUNT_TOKEN

valueFrom:

secretKeyRef:

name: op-service-account

key: token

- name: DB_USERNAME

value: op://my-vault/my-item/sql/username

- name: DB_PASSWORD

value: op://my-vault/my-item/sql/password

使用しているデプロイメントが、デプロイメントでコマンド フィールドが指定されるように設計されていない場合は、1Password Kubernetes Operator がユースケースに適している可能性があります。

Session availability

挿入されたシークレットは、現在のポッドのセッションでのみ使用できます。コンテナ仕様にリストされているコマンドのシークレットにのみアクセスできます。他のセッションでアクセスするには、例えば kubectl を使用して、コマンドの先頭に op run -- を追加する必要があります。

サービス アカウントの例のデプロイメント仕様では、app-example1 コンテナは、コマンドにnpm startよって実行されたセッションにDB_USERNAMEおよび DB_PASSWORD 値を挿入します。

コンテナの全てのセッションでシークレットを使用できるようにするもう 1 つの方法は、Kubernetes Operatorを使うことです。

Secrets Automation ワークフローと Kubernetes デプロイメントを使用して Kubernetes Injector を構成およびデプロイするには、次の手順に従います。

これらのコード例で使用される文字列と変数に関する注意事項。

このページのコード例で使用されている一部の文字列は可変かつ任意です。その他の文字列は、1Password のコンテキスト内で特定の意味を持ちます。

このページのコード例で使用されている次の文字列は、1Password のコンテキスト内で非常に具体的かつハードコードされた意味を持ちます。

  • OP_CONNECT_HOST

  • OP_CONNECT_TOKEN

  • OP_SERVICE_ACCOUNT_TOKEN

このページのコード例で使用されている次の文字列は変数であり、1Password のコンテキスト内では特定の意味を持ちません。

  • DB_PASSWORD

  • DB_USERNAME

Step 1: Create a Kubernetes Secret

サービス アカウントまたは Connect サーバーの認証トークンを含む Kubernetes Secret をCreateします。

注意

Kubernetes Injector は、サービス アカウントと Connect サーバーの両方を使用して構成できます。両方を構成すると、Connect サーバーとその環境変数 (OP_CONNECT_HOSTおよびOP_CONNECT_TOKEN) が優先されます。

Service account

kubectlサービス アカウントのトークンを含む Kubernetes Secret をCreateするために使用します。サービス アカウント トークンは、サービス アカウントのCreateプロセス中に自動的に生Createされます。トークンを紛失した場合は、新しいサービス アカウントをCreateする必要があります。

次のコマンドを実行する前に、コマンド内の OP_SERVICE_ACCOUNT_TOKEN を実際のトークンに置き換えるか、トークンを OP_SERVICE_ACCOUNT_TOKEN という名前の環境変数としてエクスポートします。

$ kubectl create secret generic service-account --from-literal=token=OP_SERVICE_ACCOUNT_TOKEN

Step 2: Enable secrets injection

kubectl を使用して、名前空間 (NAMESPACE) に Secrets-injection=enabled ラベルを追加してシークレット インジェクションを有効にします。 Kubernetes Injector は、カスタム名前空間を指定しない限り、デフォルトの名前空間を使用します。

$ kubectl label namespace NAMESPACE secrets-injection=enabled

Step 3: Deploy the injector

kubectl applyデプロイメント仕様ファイルに対してコマンドを使用します。手動デプロイメントを使う場合は、各デプロイメント仕様ファイルを個別に適用する必要があります。

次の例では、INJECTOR.yaml はKubernetes Injector デプロイメント仕様ファイルの名前であり、CONNECT.yamlは Connect デプロイメント仕様ファイルの名前です。

デプロイを解除するには、kubectl delete を使用します。

この例のコマンドはKubernetes InjectorとConnectのみをデプロイします。アクセス許可、名前空間カスタムリソース定義(CRD)など、必要になる可能性のある追加の構成は処理しません。

ヒント

1Password Secrets Injector Helm チャートを使うと、Kubernetes Injector を 1 つのコマンドでデプロイおよび構成できます。

情報

Kubernetesインジェクターはウェブフックがデプロイされたとき(deployment.yaml )必要なTLS証明書をCreateします。クラスターから Kubernetes Injector を削除すると、TLS 証明書も自動的に削除されます。

Step 4: Annotate your deployment specification

Kubernetes デプロイメント仕様operator.1password.io/inject:の注釈を付けます。その後に、シークレットを変更して挿入するコンテナのコンマ区切りリストが続きます。

①デプロイメント仕様ファイルを編集し、次の注釈を追加します。

デプロイメント仕様.yaml

annotations:

operator.1password.io/inject: "app-example1, app-example2"

Step 5: Configure the resource environment

秘密参照を使用して 1Password アイテムを参照する値を持つ環境変数をポッドまたは Kubernetesのデプロイメント仕様に環境変数を追加します。

①デプロイメント仕様ファイルを編集し、1Password 項目へのパスを含む環境変数を追加します。 VAULT 、 ITEM、 SECTION 、および FIELD を正しい値に置き換えてください。

値は、次のコード ブロックのテキストのようになります。

シークレットインジェクションを実行するには、KubernetesポッドまたはデプロイメントにサービスアカウントまたはConnectサーバーの認証トークンを提供する必要があります。

これを行う 1 つの方法は、資格情報の KubernetesシークレットをCreateし、それを Kubernetesデプロイメント仕様ファイルで参照することです。

ヒント

認証トークンを環境変数としてエクスポートすると、仕様ファイルで環境変数を使用できます。

Service account

Connect

Service account

次の手順では、サービス アカウント トークンを Kubernetes デプロイメントにリンクします。

①まだCreateしていない場合は、kubectl を使用して、サービス アカウント トークン OP_SERVICE_ACCOUNT_TOKEN を含む汎用 Kubernetes Secret をCreateします。

$ kubectl create secret generic service-account --from-literal=token=$OP_SERVICE_ACCOUNT_TOKEN

②OP_SERVICE_ACCOUNT_TOKEN という名前のサービス アカウント トークンの環境変数をデプロイメント仕様ファイルに追加します。 SECRET_NAME をシークレットの名前に置き換え、KEY_NAME をサービス アカウント キーの名前に置き換えます。

deployment-specification.yaml

spec:

containers:

- name: app-example1

image: my-image

ports:

- containerPort: 5000

command: ["npm"]

args: ["start"]

env:

- name: OP_SERVICE_ACCOUNT_TOKEN

valueFrom:

secretKeyRef:

name: SECRET_NAME

key: KEY_NAME

Usage examples

次の Kubernetes デプロイメント仕様ファイルは、デプロイメント ファイルがどのようになるべきかを示しています。

Service account

次のコード ブロックには、1Password サービス アカウントを使用してシークレットを挿入するための Kubernetes デプロイメント仕様 YAML ファイル設定の例が含まれています。この例では、Kubernetes インジェクターはAPP_1にシークレットを挿入しますが、APP_2には挿入しません。

デプロイメント仕様.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: app-example

spec:

selector:

matchLabels:

app: app-example

template:

metadata:

annotations:

operator.1password.io/inject: APP_1

labels:

app: app-example

spec:

containers:

- name: APP_1

image: my-image

ports:

- containerPort: 5000

command: ["npm"]

args: ["start"]

env:

- name: OP_SERVICE_ACCOUNT_TOKEN

valueFrom:

secretKeyRef:

name: op-service-account

key: token

- name: DB_USERNAME

value: op://my-vault/my-item/sql/username

- name: DB_PASSWORD

value: op://my-vault/my-item/sql/password

- name: APP_2

image: my-image

ports:

- containerPort: 5000

command: ["npm"]

args: ["start"]

env:

- name: DB_USERNAME

value: op://my-vault/my-item/sql/username

- name: DB_PASSWORD

value: op://my-vault/my-item/sql/password

Connect

次のコード ブロックには、1Password Connect Server を使用してシークレットを挿入するための Kubernetes デプロイメント仕様 YAML ファイル設定の例が含まれています。この例では、Kubernetes Injector はAPP_1にシークレットを挿入しますが、APP_2には挿入しません。

​​デプロイメント仕様.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: app-example

spec:

selector:

matchLabels:

app: app-example

template:

metadata:

annotations:

operator.1password.io/inject: APP_1

labels:

app: app-example

spec:

containers:

- name: APP_1

image: my-image

ports:

- containerPort: 5000

command: ["npm"]

args: ["start"]

env:

- name: OP_CONNECT_HOST

value: http://onepassword-connect:8080

- name: OP_CONNECT_TOKEN

valueFrom:

secretKeyRef:

name: connect-token

key: token-value

- name: DB_USERNAME

value: op://my-vault/my-item/sql/username

- name: DB_PASSWORD

value: op://my-vault/my-item/sql/password

- name: APP_2

image: my-image

ports:

- containerPort: 5000

command: ["npm"]

args: ["start"]

env:

- name: DB_USERNAME

value: op://my-vault/my-item/sql/username

- name: DB_PASSWORD

value: op://my-vault/my-item/sql/password

Last updated