目次

外部データベースを使用する

Deep Security Smart Check は、初期設定でKubernetesクラスタにデータベースポッドを設定します。これはデモンストレーションには便利ですが、実稼働環境では外部データベースを使用する必要があります。

データベースが Deep Security Smart Check クラスタに地理的に近いことが重要です。 Deep Security Smart Check とデータベース間のネットワーク遅延により、システムの動作が低下する可能性があります。

サポートされるデータベース

Deep Security Smart Check は、PostgreSQL 9.6、10、11、12、または13を実行する外部データベースで設定できます。

外部データベースを使用して Deep Security Smart Check をインストールする

データベースサーバのマスターユーザのユーザIDとパスワード、およびホスト名とポート番号を確認する必要があります。

Deep Security Smart Checkをインストールする前に、次のスニペットを overrides.yaml ファイルに追加します。

db:
  user: postgres
  password: password
  host: database.example.com
  port: 5432

データベース接続用にTLSを設定する

Deep Security Smart Check では、データベースサーバへの安全な接続が初期設定で使用されます。データベースサーバのTLS証明書を作成した認証局の信頼を設定する必要がある場合があります。

これを行うには、最初に認証局の証明書を使用して ConfigMap を作成します。

$ kubectl create \
  configmap \
  dssc-db-trust \
  --from-file=ca=ca.pem

次に、 overrides.yaml ファイルの db セクションを更新し、 tls セクションを追加して、信頼できる証明書を取得する場所を Deep Security Smart Check に通知します。

db:
  tls:
    ca:
      valueFrom:
        configMapKeyRef:
          name: dssc-db-trust
          key: ca

その後、これらのオーバーライドを使用して Deep Security Smart Check をインストールできます。

現時点では、 Deep Security Smart Check は、RSAキーを持つデータベース証明書のみをサポートしています。

外部データベースへの移行

Deep Security Smart Check は、組み込みデータベースから外部データベースへの移行をサポートしていません。再インストールする必要があります。

Deep Security Smart Check with RDS for PostgreSQL with EKSをインストールします。

EKSクラスタがない場合は、 eksctl が便利です。 RDS for PostgreSQL は、クラスタと同じVPCに配置することをお勧めします。

クラスタとRDS間の通信を容易にするには、RDSセキュリティグループでクラスタのセキュリティグループからの受信トラフィックを許可する必要があります。クラスタに複数のセキュリティグループがある場合は、すべてのセキュリティグループに対してこれを実行する必要があります。また、RDSからクラスタへの受信トラフィックも許可する必要があります。初期設定のポートは5432ですが、設定が異なる場合があります。

セキュリティ上の理由から、RDSインスタンスへのパブリックアクセスは許可しないでください。

TLSはRDSで初期設定で有効になっています。 ルート証明書および中間証明書 を取得して、上記のようにRDSに接続するように Smart Check のシークレットを設定できます。

Deep Security Smart Check with Azure Database for PostgreSQL for AKSをインストールする

Azureポータル または Azure CLIを使用して、Azureドキュメントに従ってAKSクラスタをプロビジョニングできます。クラスタノードには、 アクセラレートネットワーキング をサポートする仮想マシンの種類を選択することをお勧めします。ネットワークの高速化により、ネットワークのパフォーマンスが大幅に向上します。D / DSv2およびF / F タイプの仮想マシンは、高速ネットワーキングをサポートします。

Azureのドキュメントに従って、 Azureポータル または Azure CLIのいずれかを使用してデータベースを作成します。クラスタとデータベース間の安全な直接接続を可能にするには、 Azure Database for PostgreSQLのVNetサービスエンドポイントとVNetルール を有効にします。

TLS接続を強制する必要がある場合は、 ルート証明書 を取得して、前述のように Azure Database に接続するように Smart Check のシークレットを設定できます。

トラブルシューティング

設定に問題があると、データベース接続に依存するポッドが初期化しようとして停止します。

$ kubectl get pods --field-selector='status.phase!=Running'
NAME                                  READY   STATUS     RESTARTS   AGE
auth-7d78dccff7-nfh97                 0/1     Init:0/1   0          4m26s
openscap-scan-ddc7b9d-jrhc7           0/2     Init:0/1   0          4m26s
registryviews-5f46786b46-m6x84        0/1     Init:0/1   0          4m25s
scan-568ffb49d7-dp2tt                 0/1     Init:0/1   0          4m25s
vulnerability-scan-7b7c59d6f8-d5ql9   0/1     Init:0/2   0          4m25s

これらのポッドの1つを選択し、その上で kubectl describe pod を実行してから、詳細について Events セクションを参照してください。

FailedMount:ボリューム「database-ca」のMountVolume.SetUpに失敗しました:configmapが見つかりません

この例のエラーは、 dssc-db-trust``ConfigMap が存在しないことを示しています。

$ kubectl describe pod auth-7d78dccff7-nfh97
...
Events:
  Type     Reason       Age                   From               Message
  ----     ------       ----                  ----               -------
  Normal   Scheduled    7m13s                 default-scheduler  Successfully assigned default/auth-7d78dccff7-nfh97 to minikube
  Warning  FailedMount  61s (x11 over 7m13s)  kubelet, minikube  MountVolume.SetUp failed for volume "database-ca" : configmap "dssc-db-trust" not found
  Warning  FailedMount  36s (x3 over 5m10s)   kubelet, minikube  Unable to mount volumes for pod "auth-7d78dccff7-nfh97_default(ff34aa94-94fc-11e9-90aa-080027ce2867)": timeout expired waiting for volumes to attach or mount for pod "default"/"auth-7d78dccff7-nfh97". list of unmounted volumes=[database-ca]. list of unattached volumes=[database-ca]

データベース接続のTLSを構成 の説明に従って、ConfigMap を作成します。overrides.yamlConfigMap 名に正しい値を使用していることを確認します。

overrides.yaml ファイルを変更する場合は、 helm upgrade、または helm delete --purgehelm install を使用して変更を反映する必要があります。

overrides.yaml ファイルを変更していない場合は、スタックしているポッドを削除できます。Kubernetesによってポッドが再作成されます。

FailedMount:ボリューム「database-ca」のMountVolume.SetUpに失敗しました:存在しない設定キー

この例のエラーは、 ca キーが dssc-db-trust``ConfigMapに存在しないことを示しています。

$ kubectl describe pod auth-7d78dccff7-p79j2
...
Events:
  Type     Reason       Age               From               Message
  ----     ------       ----              ----               -------
  Normal   Scheduled    13s               default-scheduler  Successfully assigned default/auth-7d78dccff7-p79j2 to minikube
  Warning  FailedMount  6s (x5 over 13s)  kubelet, minikube  MountVolume.SetUp failed for volume "database-ca" : configmap references non-existent config key: ca

データベース接続のTLSを構成 の説明に従って ConfigMap を作成します。overrides.yamlConfigMap の名前とキーに正しい値を使用していることを確認します。

overrides.yaml ファイルを変更する場合は、 helm upgrade、または helm delete --purgehelm install を使用して変更を反映する必要があります。

overrides.yaml ファイルを変更していない場合は、スタックしているポッドを削除できます。Kubernetesによってポッドが再作成されます。

イベントにエラーがない場合

kubectl describe pod 出力の Events セクションにエラーがない場合は、ポッドの db-init コンテナのログを確認します。

db-initログのI / Oタイムアウト

この例では、 i/o timeout エラーは、コンテナがデータベースサーバに接続できなかったことを示しています。

$ kubectl logs auth-5447fbfb7-gvrbh -c db-init
{"commit":"79d968b712cfba4407e2cdc6f848034435c04859","component":"db-init","message":"Starting up","severity":"audit","timestamp":"2019-06-17T15:48:15Z"}
{"component":"db-init","error":"dial tcp 192.168.19.226:5432: i/o timeout","message":"could not get database connection","severity":"info","timestamp":"2019-06-17T15:48:20Z"}

データベースサーバがクラスタ内のすべてのノードからの接続を許可していることを確認します。これには、クラスタインフラストラクチャに応じて、ファイアウォールルール、セキュリティグループ、またはその他のセキュリティ制御が含まれる場合があります。

ネットワーク接続の問題を解決すると、 Deep Security Smart Check が自動的に回復し、初期化プロセスが完了します。

パスワード認証の失敗

この例では、指定したユーザ名/パスワードがデータベースサーバによって拒否されたことがエラーログに示されています。

$ kubectl logs -f auth-66b5d948c-xht4t -c db-init
{"commit":"5c108f2e383fd54fef8d3f6848c0424d9de9e001","component":"db-init","message":"Starting up","severity":"audit","timestamp":"2019-06-22T15:22:08Z"}
Error: could not set up database: database not available: could not get database connection: pq: password authentication failed for user "postgres"

ユーザ名とパスワードを確認し、必要に応じて overrides.yaml ファイルをアップデートしてください。

overrides.yaml ファイルを変更する場合は、 helm upgrade または helm delete --purgehelm install を使用して変更を反映する必要があります。

overrides.yaml ファイルを変更していない場合は、スタックしているポッドを削除できます。Kubernetesによってポッドが再作成されます。

不明な認証局によって署名された証明書

この例では、 Deep Security Smart Check が認識しない認証局によってサーバ証明書が発行されたため、データベースへの安全な接続を確立できなかったことをエラーログが示しています。

kubectl logs auth-66b5d948c-t5jj9 -c db-init
{"commit":"5c108f2e383fd54fef8d3f6848c0424d9de9e001","component":"db-init","message":"Starting up","severity":"audit","timestamp":"2019-06-22T15:33:25Z"}
{"component":"db-init","error":"x509: certificate signed by unknown authority (possibly because of \"crypto/rsa: verification error\" while trying to verify candidate authority certificate \"database.example.com\")","message":"could not get database connection","severity":"info","timestamp":"2019-06-22T15:33:25Z"}

認証局の証明書(または証明書バンドル)を取得し、「 データベース接続のTLSの設定」の説明に従って ConfigMap を作成します。

Amazon RDSでPostgresを使用している場合は、「 Using SSL with PostgreSQL DB Instance 」を参照して詳細を確認し、必要な証明書バンドルを入手してください。

overrides.yaml ファイルを変更する場合は、 helm upgrade、または helm delete --purgehelm install を使用して変更を反映する必要があります。

overrides.yaml ファイルを変更していない場合は、スタックしているポッドを削除できます。Kubernetesによってポッドが再作成されます。

サーバ証明書にIPアドレスがない

この例では、IPアドレスを使用してデータベースに接続するように Deep Security Smart Check が設定されているため、データベースへの安全な接続を確立できなかったが、サーバ証明書にそのアドレスのエントリが含まれていないことを示すエラーログが表示されます。

$ kubectl logs auth-66b5d948c-t5jj9 -c db-init
{"component":"db-init","error":"x509: cannot validate certificate for 192.168.2.54 because it doesn't contain any IP SANs","message":"could not get database connection","severity":"info","timestamp":"2019-07-11T11:29:45Z"}

この問題を解決するには、データベースサーバのホスト名を使用するように Deep Security Smart Check を設定する方法と、証明書を再作成してサーバのIPを確認する方法の2つがあります。このアドレスは Subject Alternative Name リストに存在します。

サーバでSSLが有効になっていない

この例のエラーログは、データベースサーバでTLSが実行されていないことを示していますが、 Deep Security Smart Check はTLSを使用するように設定されています。

$ kubectl logs -f auth-66b5d948c-9cp78 -c db-init
{"commit":"5c108f2e383fd54fef8d3f6848c0424d9de9e001","component":"db-init","message":"Starting up","severity":"audit","timestamp":"2019-06-22T15:26:42Z"}
{"component":"db-init","error":"pq: SSL is not enabled on the server","message":"could not get database connection","severity":"info","timestamp":"2019-06-22T15:26:42Z"}

TLSを使用するようにサーバ設定を更新します。

TLSを使用するようにサーバ設定をアップデートできない場合は、 overrides.yaml ファイルでTLSを無効にできます。このオプションは安全性が低く、システムが危険にさらされる可能性があります。

データベース接続用にTLSを設定するオプションの詳細については、 values.yaml のドキュメントを参照してください。

ポッドは実行中でもダッシュボードをロードできない場合

外部データベースと Deep Security Smart Check クラスタ間のネットワーク遅延が発生すると、 Deep Security Smart Check の応答が遅くなったり失敗したりすることがあります。

ネットワークの遅延を解決すると、問題が解決します。