シークレットは、機密情報を格納するために使用されるKubernetesオブジェクトです。

適切なシークレット管理は、SystemLink Enterprise環境のセキュリティを維持するために重要です。SystemLink Enterpriseをデプロイする前にシークレットを作成する必要があります。シークレットは、組織のセキュリティポリシーに従って管理する必要があります。

このセクションでは、SystemLink Enterpriseに必要なシークレットについて説明し、SystemLink Enterpriseシークレットを安全に管理するためのガイダンスを提供します。

以下のシークレットは必須で、特に指定しない限り、Opaqueタイプです。

シークレットを安全に管理する

シークレットは、2つの主要なアプローチを使用して管理できます。

  • Helm管理シークレット: systemlink-secrets.yamlファイルでシークレットを定義します。Helmインストールの一部としてKubernetesクラスタにシークレットをデプロイします。この方法は構成が簡単ですが、バージョン管理で安全なストレージのためにシークレットファイルを暗号化する追加の手順が必要です。
  • 外部シークレット管理: HashiCorp Vault、AWS Secrets Manager、またはAzure Key Vaultなどの外部シークレット管理システムにシークレットを保存および管理します。シークレットは、外部シークレットオペレータなどのツールを使用してKubernetesクラスタに同期されます。このアプローチは、一元化されたシークレット管理を提供します。
メモ シークレットをローテーションすると、環境変数としてシークレットを使用するKubernetesポッドは最新のシークレット値を自動的に使用できない場合があります。更新された環境変数を取得するには、ポッドを再起動する必要があります。ボリュームとしてマウントされたシークレットは自動的に更新されますが、伝播遅延が発生する可能性があります。

Helm管理シークレット (暗号化された値ファイル)

Helmを使用してシークレットを管理する場合は、systemlink-values.yamlglobal.deploySecretsパラメータをtrueに設定します。systemlink-secrets.yamlファイルでシークレットを定義し、Helmのインストールまたはアップグレード中にクラスタにデプロイします。

systemlink-secrets.yamlファイルをバージョン管理に安全に保存するには、ファイルを暗号化する必要があります。1つの方法は、Mozilla SOPS (Secrets OPerationS) でHelmシークレットプラグインを使用することです。

HelmシークレットとMozilla SOPSを使用する:

Helm Secretsプラグインは、Mozilla SOPSと統合して、Helm値ファイルを暗号化および復号化します。SOPSは、AWS KMS、Azure Key Vault、Google Cloud KMS、PGPなどの複数の暗号化バックエンドをサポートしています。

Helmシークレットを使用するには:

  1. Helm Secretsプラグインをインストールする:
    helm plugin install https://github.com/jkroepke/helm-secrets --version <version>
  2. SOPSのインストール手順に従ってMozilla SOPSをインストールします。
  3. 暗号化バックエンド (AWS KMS、Azure Key Vault、GCP KMS、またはPGP) を構成します。構成の詳細については、SOPSのドキュメントを参照してください。
  4. systemlink-secrets.yamlファイルを暗号化します。
    helm secrets encrypt systemlink-secrets.yaml
  5. SystemLink Enterpriseは、helm upgradeコマンドの代わりにhelm secrets upgradeを使用してデプロイします。Helm Secretsプラグインは、デプロイ中に暗号化された値ファイルを自動的に復号化します。

暗号化されたsystemlink-secrets.yamlファイルは、バージョン管理に安全にコミットできます。

メモ Helm管理シークレットを使用する場合、復号化されたシークレットはクラスタにKubernetesシークレットオブジェクトとして保存されます。etcdに保存されたシークレットを保護するために、静止状態でKubernetes暗号化を有効にすることを検討してください。

外部シークレット管理ツール

外部シークレット管理ツールは、Kubernetesクラスタ外のシークレットを一元的に保存および管理します。シークレットは、オペレータまたはエージェントを使用してKubernetesに同期されます。外部シークレット管理を使用する場合、systemlink-values.yamlglobal.deploySecretsパラメータをfalseに設定して、Helmがシークレットをデプロイしないようにします。

メモ Helmインストール外のクラスタでシークレットを手動で管理する場合は、global.deploySecretsパラメータをfalseに設定します。アップグレード中にこの値をtrueからfalseに変更すると、既存のシークレットが削除されます。
外部シークレットオペレータ:

外部シークレットオペレータは、外部シークレット管理システムからのシークレットをKubernetesシークレットオブジェクトに同期するKubernetesオペレータです。オペレータは、HashiCorp Vault、AWS Secrets Manager、Azure Key Vault、Google Cloud Secret Managerなどの複数のバックエンドをサポートしています。

外部シークレットオペレータを使用するには:

  1. インストールガイドに従って、外部シークレットオペレータをKubernetesクラスタにインストールします。
  2. 外部シークレット管理システムへの接続を定義するSecretStoreリソースまたはClusterSecretStoreリソースを構成します。構成の詳細については、各プロバイダのドキュメントを参照してください。
  3. SystemLink Enterpriseシークレットに対してExternalSecretリソースを作成します。オペレータは、外部システムからのシークレットをKubernetesに同期します。
  4. systemlink-values.yamlglobal.deploySecrets: falseを設定します。
  5. Helmを使用してSystemLink Enterpriseをデプロイします。

セキュリティのベストプラクティス

Kubernetesのシークレットとセキュリティの詳細については、「Kubernetesシークレット」のドキュメントおよび「Kubernetesシークレットのベストプラクティス」を参照してください。

シークレット形式の例

このセクションでは、Kubernetesでシークレットを生成したり、シークレットを表示したりするサンプルを提供します。シークレットは、Base64でエンコードされた形式でクラスタに保存されます。

暗号化キーを生成する:

OpenSSLまたは同様のツールを使用して、暗号で保護されたランダムキーを生成します。

  • AES-256キー (32バイト):
    openssl rand -base64 32

    出力例:

    h8F3mK9pL2nQ7vR4tY6uE1wX5zA8bC0dD2fG4hJ6k=
  • AES-128キー (16バイト):
    openssl rand -base64 16
    

    出力例:

    mK9pL2nQ7vR4tY6u
  • AEADキー (32バイト):
    openssl rand -base64 32
    

    出力例:

    p2sT4uV5wX8yA9bC0dD2fG4hJ6kL7mN9qR2sT5vW8=
  • SHA-256署名キー (32~64バイト):
    openssl rand -base64 48
    

    出力例:

    G4hJ6kL7mN9qR2sT4uV5wX8yA9bC0dD2fG4hJ6kL7mN9qR2sT4uV5wX8yA9b
  • ホワイトリストに登録されたAPIキー (42バイト):
    openssl rand -base64 42
    

    出力例:

    kL7mN9qR2sT4uV5wX8yA9bC0dD2fG4hJ6kL7mN9qR2sT4uV5w=
  • MongoDBレプリカセットキー:

    MongoDBレプリカセットキーは、データベースクラスタ内のポッドの認証に使用されます。キー生成の手順については、MongoDBのドキュメントを参照してください。

  • RabbitMQ Erlang Cookie
    openssl rand -hex 32
    

    出力例:

    a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2
  • Salt Master用RSAキー:

    ミニオンとのSalt Master通信に使用されます。PKCS1形式である必要があります。

    # Generate RSA private key (4096-bit)
    openssl genrsa 4096
    # Generate RSA public key from private key
    openssl rsa -in private_key.pem -pubout -outform PEM
    

    プライベートキーの例:

    -----BEGIN RSA PRIVATE KEY-----
    MIIJKAIBAAKCAgEA1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL
    ...
    -----END RSA PRIVATE KEY-----
    

    パブリックキーの例:

    -----BEGIN PUBLIC KEY-----
    MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1234567890abcdefgh
    ...
    -----END PUBLIC KEY-----
  • MongoDB接続文字列形式:

    接続文字列のサンプルおよび形式については、「SystemLink Enterprise用にMongoDBを構成する」を参照してください。

  • PostgreSQL接続文字列形式:

    接続文字列のサンプルと構成の詳細については、「PostgreSQL」を参照してください。

  • Kubernetesでシークレットを表示する:

    クラスタにデプロイされたシークレットを表示するには、kubectlを使用します。シークレットデータはbase64でエンコードされています。

    # View a secret in YAML format
    kubectl get secret webserver-session -n systemlink -o yaml
    

    出力例:

    apiVersion: v1
    kind: Secret
    metadata:
      name: webserver-apikey
      namespace: systemlink
    type: Opaque
    data:
      encryptionKey: aDhGM21LOXBMMm5RN3ZSNHRZNnVFMXdYNXpBOGJDMGQ=
      signatureKey: RDJmRzRoSjZrN21MOHBOOXFSMnNUNHVWNXdYOHlBOWI=
    

    シークレット値をデコードする:

    kubectl get secret webserver-session -n systemlink -o jsonpath='{.data.encryptionKey}' | base64 -d
  • シークレットを手動で作成する:

    Helm管理シークレットを使用しない場合は、kubectlで直接シークレットを作成します。

    # Create a secret with multiple fields
    kubectl create secret generic oidc-secret \
      --from-literal=clientId='my-client-id' \
      --from-literal=clientSecret='my-client-secret' \
      --from-literal=jwks='' \
      -n systemlink

イメージプルシークレット

SystemLink EnterpriseをホストするNIコンテナリポジトリは非公開で、アクセスするには認証が必要です。SystemLink Enterpriseにアクセスするための資格情報は事前にNIからお知らせします。systemlink-values.yamlおよびsystemlink-admin-values.yamlglobal.imagePullSecrets配列を使用してSystemLink Enterpriseの画像プルシークレットを構成します。イメージプルシークレットは、kubernetes.io/dockerconfigjson形式に準拠している必要があります。

表 80. イメージプルシークレット
シークレット 詳細
niartifacts-secret

認証シークレット

表 81. 認証シークレット
シークレット 詳細
oidc-secret OpenID Connect (OIDC) 認証プロバイダを使用してSystemLink Enterpriseを識別し、以下のフィールドを備えています。
  • clientId: OIDCクライアントID。
  • clientSecret: clientIdに対応するシークレット。
  • jwks: JSON Webキーセット。不要な場合は、空の文字列に設定します。

ホワイトリストに登録されたAPIキー

SystemLink Enterpriseでは、ホワイトリストに登録されたAPIキーを使用して、クラスタ間で行われるサービス同士の通信を認証します。ホワイトリストに登録されたAPIキーは、特定のユーザのコンテキストで実行されない操作に使用されます。このシークレットのフィールドは1つです。
  • apiKey: Base64でエンコードされた、42バイトの乱数シーケンスです。
Helmでシークレットを管理している場合は、systemlink-secrets.yamluserservices.secrets.whitelistedApiKeys値を使用して各シークレットとその対応するハッシュを定義します。generate_whitelisted_key.shスクリプトを使用すると、キーの生成を簡素化することができます。
表 82. ホワイトリストに登録されたAPIキー
シークレット 詳細
alarmservice-apikey
alarmserviceroutineexecutor-apikey
assetservice-apikey
comments-apikey
dashboardhost-apikey
jupyterhub-apikey
nbexec-argo-workflow-apikey
routineeventtrigger-apikey
routineexecutor-apikey
routinescheduletrigger-apikey
saltmaster-init-apikey
sessionmanagerservice-apikey
systemsmanagement-service-apikey
tageventprocessor-apikey
testmonitor-apikey
webserver-apikey
workorder-apikey

ホワイトリストに登録されたAPI キーハッシュ

表 83. ホワイトリストに登録されたAPI キーハッシュ
シークレット 詳細
userservices-apikey-whitelist ホワイトリストに登録された承認済みAPI キーのリストを管理します。このシークレットのフィールドは1つです。
  • whitelistedApiKeyHashes: 16進数でエンコードされたSHA-512ハッシュ。カンマで区切られ、空白や末尾の区切り文字はありません。

暗号化キー

表 84. 暗号化キー
シークレット 詳細
fileingestionservices-encryption-key

フィールド: encryptionKey

キーのタイプ: AES-256

エンコーディング: Base64

fileingestionservices-download-encryption-key

フィールド: encryptionKey

キーのタイプ: AES-256

エンコーディング: Base64

saltmaster-rsa-keys

フィールド: saltmaster-private-key

タイプ: RSA

形式: PKCS

フィールド: saltmaster-private-key

タイプ: RSA

形式: PKCS1

systemsmanagementservice-dataprotection

フィールド: aesKey

キーのタイプ: AES-128

エンコーディング: Base64

systemsstateservice-dataprotection

フィールド: aesKey

キーのタイプ: AES-128

エンコーディング: Base64

taghistorian-continuation-token

フィールド: encryptionKey

キーのタイプ: AEAD

キーの長さ: 32バイト

エンコーディング: Base64

userservices-continuation-token

フィールド: encryptionKey

キーのタイプ: AEAD

キーの長さ: 32バイト

エンコーディング: Base64

webappservices-continuation-token

フィールド: encryptionKey

キーのタイプ: AEAD

キーの長さ: 32バイト

エンコーディング: Base64

webserver-session

フィールド: encryptionKey

キーのタイプ: AES-128

エンコーディング: Base64

フィールド: signatureKey

キーのタイプ: SHA-256

エンコーディング: Base64

サードパーティの資格情報

Kubernetesシークレットを使用して、MongoDB、PostgreSQL、Elasticsearch、Dremio、RabbitMQなどのサードパーティサービスを認証します。

Elasticsearch資格情報

メモ 以下のシークレットは、SystemLink Enterpriseインストールの一部としてElasticsearchをデプロイする場合にのみ必要です。
表 85. Elasticsearch資格情報
シークレット 詳細
sl-elasticsearch-filescdc-secret Elasticsearchインスタンスを使用した認証用の資格情報。fileingestionおよびfileingestioncdcサービスによって使用されます。このシークレットには以下のフィールドがあります。
  • password: filescdc Elasticsearchユーザのパスワード。

Dremio資格情報

表 86. Dremio資格情報
シークレット 詳細
nidataframe-dremio-credentials 以下のフィールドがあります。
  • username: Dremioインスタンスにアクセスするために使用されるユーザ名。
  • password: Dremioインスタンスにアクセスするために使用されるパスワード。
nidataframe-nessie-credentials NessieによるDremio認証用のBearerトークン。このシークレットには以下のフィールドがあります。
  • bearerToken: Nessie APIで認証するためのBearerトークン。任意のランダム値です。

Grafana資格情報

表 87. Grafana資格情報
シークレット 詳細
grafana-login 以下のフィールドを使用してGrafanaの管理者ユーザを定義します。
  • admin-user: ユーザ名。
  • admin-password: admin-userのパスワード。

MongoDB資格情報

すべてのMongoDBインスタンスは、以下のフィールドを持つシークレットに資格情報を格納します。

メモ 独自のMongoDBインスタンスがある場合は、mongodb-connection-string を入力するだけで十分です。
  • mongodb-root-password: データベースクラスタへのルートアクセスを付与するパスワード。
  • mongodb-passwords: それぞれが個々のデータベースへの完全アクセスを付与するパスワードの配列。これらのパスワードには、カンマや、IETF URL仕様で定義されている予約文字を含めることはできません。
    メモ パスワードはカンマで区切ります。空白や末尾の区切り文字は含めないでください。たとえば、password1,password2のようになります。userservices-mongodb-credentialssaltmaster-mongodb-credentialsを除くすべてのMongoDB資格情報シークレットには、1つのパスワードが必要です。
  • mongodb-replica-set-key: MongoDBレプリカ セット内のノードを認証するために使用されるキー。
  • mongodb-connection-string : MongoDB データベースへのアクセス認証に必要な接続情報 (資格情報を含む) の文字列です。
表 88. MongoDB資格情報
シークレット 詳細
assetservice-mongodb-credentials
locationservice-mongodb-credentials
fileingestionservices-mongodb-credentials
nbexecservice-mongodb-credentials
nicomments-mongodb-credentials
nidataframe-mongodb-credentials
nispecificationmanagement-mongodb-credentials インストールはオプションです。
niworkorder-mongodb-credentials インストールはオプションです。
notification-mongodb-credentials
repositoryservice-mongodb-credentials
routines-mongodb-credentials
routinescheduletrigger-mongodb-credentials
systemsmanagementservice-mongodb-credentials
systemsstateservice-mongodb-credentials
saltmaster-mongodb-credentials 2つのmongodb-passwordsが必要です (順にミニオン用のパスワードとピラーデータベース用のパスワード)。
taghistoriandb-mongodb-credentials
tags-mongodb-credentials
userdata-mongodb-credentials
userservices-mongodb-credentials 2つのmongodb-passwordsが必要です (順にuserデータベース用のパスワードとkeysデータベース用のパスワード)。
webappservices-mongodb-credentials

PostgreSQL資格情報

表 89. PostgreSQL資格情報
シークレット 詳細
dashboardhost-postgres-secrets 以下のフィールドがあります。
  • host: PostgreSQLサーバのホスト名。
  • user: PostgreSQLのユーザ名。
  • password: ユーザのパスワード。
testmonitorservicedb-connection データベース接続が接続文字列と接続パラメータのどちらで定義されているかに応じて、以下のフィールドを使用した2つの形式があります。接続文字列には以下のフィールドがあります。
  • connection-string: PostgreSQL接続文字列。
接続パラメータには以下のフィールドがあります。
  • password: testmonitorservice.database.connectionInfo.user値で定義されたユーザのパスワード。
dynamicformfields-postgres-connection データベース接続が接続文字列と接続パラメータのどちらで定義されているかに応じて、以下のフィールドを使用した2つの形式があります。接続文字列には以下のフィールドがあります。
  • connection-string: PostgreSQL接続文字列。
接続パラメータには以下のフィールドがあります。
  • password: dynamicformfields.database.connectionInfo.user値で定義されたユーザのパスワード。

プロキシサーバの資格情報

表 90. プロキシサーバの資格情報
シークレット 詳細
webserver-proxy-credentials OIDCプロバイダにアクセスするための、プロキシサーバを使用した認証用の資格情報。このシークレットには、以下のフィールドがあります。
  • username: プロキシサーバのユーザ名。
  • password: ユーザ名のパスワード。

RabbitMQ資格情報

表 91. RabbitMQ資格情報
シークレット 詳細
rabbitmq-user RabbitMQインスタンスを使用した認証用の資格情報。このシークレットには、以下のフィールドがあります。
  • rabbitmq-user: ユーザ名。
  • rabbitmq-password: rabbitmq-userのパスワード。
rabbitmq-erlang-cookie Erlang Cookie の値。このシークレットのフィールドは1つです。
  • rabbitmq-erlang-cookie: Erlang Cookie値。

Redis資格情報

表 92. Redis資格情報
シークレット 詳細
webserver-redis-credentials 以下のフィールドがあります。
  • password: Redisデータベースにアクセスするために使用されるパスワード。

Amazon S3資格情報

メモ

SystemLink Enterprise構成では、Amazon S3またはAmazon S3互換ファイルストレージプロバイダを使用する場合、以下のシークレットが必要です。

表 93. Amazon S3資格情報
シークレット 詳細
feeds-s3-credentials 以下のフィールドがあります。
  • aws-access-key-id: S3アクセス用のユーザ名またはS3アクセスキーID。
  • aws-secret-access-key: S3アクセス用のパスワードまたはS3アクセスキーID。
fileingestion-s3-credentials 以下のフィールドがあります。
  • aws-access-key-id: S3アクセス用のユーザ名またはS3アクセスキーID。
  • aws-secret-access-key: S3アクセス用のパスワードまたはS3アクセスキーID。
nbexecservice-s3-credentials 以下のフィールドがあります。
  • aws-access-key-id: S3アクセス用のユーザ名またはS3アクセスキーID。
  • aws-secret-access-key: S3アクセス用のパスワードまたはS3アクセスキーID。
nidataframe-s3-credentials 以下のフィールドがあります。
  • access-key-id: S3アクセス用のユーザ名またはS3アクセスキーID。
  • secret-access-key: S3アクセス用のパスワードまたはS3アクセスキーID。

Azureストレージ資格情報

メモ SystemLink Enterprise構成では、Azure Storageファイルストレージプロバイダを使用する場合、以下のシークレットが必要です。
表 94. Azureストレージ資格情報
シークレット 詳細
feeds-azure-credentials 以下のフィールドがあります。
  • azure-secret-access-key: フィードサービスにリンクされたAzureストレージアカウント用の共有アクセスキー。
files-azure-credentials 以下のフィールドがあります。
  • azure-secret-access-key: ファイル取り込みサービスにリンクされたAzureストレージアカウント用の共有アクセスキー。
nbexecservice-azure-credentials 以下のフィールドがあります。
  • azure-secret-access-key: Notebook実行サービスにリンクされたAzureストレージアカウント用の共有アクセスキー。
nidataframe-azure-credentials 以下のフィールドがあります。
  • azure-secret-access-key: DataFrameサービスにリンクされたAzureストレージアカウント用の共有アクセスキー。

SMTP資格情報

表 95. SMTP資格情報
シークレット 詳細
smtp-server-credentials 以下のフィールドがあります。
  • username: SMTPサーバのユーザ名。
  • password: SMTPサーバのパスワードです。
smtp.smtpServer.hostが構成されていて、smtp.smtpServer.requireAuthenticationtrueの場合にのみ必要です。