このページのトピック
外部データベースを使用する
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.yaml
が ConfigMap
名に正しい値を使用していることを確認します。
overrides.yaml
ファイルを変更する場合は、 helm upgrade
、または helm delete --purge
と helm 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.yaml
が ConfigMap
の名前とキーに正しい値を使用していることを確認します。
overrides.yaml
ファイルを変更する場合は、 helm upgrade
、または helm delete --purge
と helm 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 --purge
と helm 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 --purge
と helm 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 の応答が遅くなったり失敗したりすることがあります。
ネットワークの遅延を解決すると、問題が解決します。