Skip to Content

シークレット

Secret は、パスワード、トークン、鍵など、少量の機密データを保持するオブジェクトです。
こうした情報は、Secret を使わなければ Cargo の仕様に記述することになります。
Secret を使うことで、アプリケーションのコードに機密データを含めずに済みます。

Secret は、それを使う Cargoes とは独立して作成できます。そのため、Cargoes の作成、表示、編集の過程で Secret とそのデータが露出するリスクを抑えられます。
Nanocl とクラスター内で動作するアプリケーションも、シークレットデータを不揮発性ストレージに書き込まないなど、Secrets に対する追加の保護策を講じることができます。

Nanocl の Secret は、デフォルトでは API サーバーの基盤となるデータストア(cockroachdb)に暗号化されずに保存されます。
API にアクセスできるユーザーは Secret を取得または変更できます。cockroachdb にアクセスできるユーザーも同様です。また、Cargo の作成権限があるユーザーは、その権限を利用して任意の Secret を読み取れます。Deployment を作成する権限など、間接的なアクセスも含まれます。

Secrets を安全に使うために、少なくとも次の対策を講じてください。

  • Secret の保存時暗号化を有効にします。
  • 外部の Secret ストアプロバイダーの利用を検討します。

Secret の用途

Secret は、次のような用途に使えます。

  • Cargo の環境変数を設定します。
  • TLS 証明書を保存します。

Nanocl デーモンも Secrets を利用します。たとえば、ブートストラップトークンの Secrets はノード登録の自動化を助ける仕組みです。

シークレットの種類

Secret を作成するときは、Secret リソースの type フィールドで Kind を指定する必要があります。
Secret の型は、プログラムから Secret データを扱いやすくするために使われます。

Nanocl は、よくある用途に対応する複数の組み込み型を提供します。
型によって、行われる検証や Nanocl が課す制約が異なります。

Secret オブジェクトの Kind に独自の文字列を指定すれば、独自の Secret 型を定義して利用できます。

Nanocl は型名に制約を設けません。ただし、組み込み型を利用する場合は、その型に定義されたすべての要件を満たす必要があります。

組み込みの Kind用途
nanocl.io/env環境変数のデータ
nanocl.io/tlsTLS クライアントまたはサーバーのデータ

Env

Kind が Env の Secret は、Cargoes に関連付けられる環境変数です。
次の Statefile で作成できます。

ApiVersion: v0.18 Secrets: - Name: env.super-secret Kind: nanocl.io/env Data: - MY_ENV=MY_VALUE - MY_ENV1=MY_VALUE1

Tls

Kind が Tls の Secret は、ProxyRules に関連付けられる証明書です。
次の Statefile で作成できます。

ApiVersion: v0.18 Secrets: - Name: cert.my-certificate Kind: nanocl.io/tls Data: Certificate: | -----BEGIN CERTIFICATE----- MIIDETCCAfkCFFOJVQs8PxWlcJQDn... CertificateKey: | -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0B...

以下は Tls の Kind の完全な仕様です。

Certificate
required
string

TLS シークレットに保存する場合の証明書の内容。

CertificateClient
string or null

TLS シークレットに保存する場合の認証局証明書の内容。

CertificateKey
required
string

TLS シークレットに保存する場合の秘密鍵の内容。

Dhparam
string or null

TLS シークレットに保存する場合の DH パラメーターの内容。

VerifyClient
boolean or null

クライアントの検証を有効または無効にする。

Tls Secret を使う場合は、ファイルのパスではなく、その内容が必要です。

最終更新日