シークレット
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/tls | TLS クライアントまたはサーバーのデータ |
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_VALUE1Tls
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 を使う場合は、ファイルのパスではなく、その内容が必要です。