データベースのセキュリティ
共有持続性を使用する展開では、サーバー、データベース、ファイル共有間のネットワーク トラフィックはインストール後のデフォルトでは暗号化されていません。また、セントラル データベースの障害に対応するためデータベースの複製を設定することを検討すべき場合もあります。
データベース パスワードの整合性の維持
Qlik Sense 共有持続性を使用する展開で、パスワードの整合性を維持するための指針をいくつか紹介します。
- 重要なのは、PostgreSQL のユーザーに関して、[パスワードの保存オプション] を無効にすることです。このオプションが有効化されると、パスワードがファイルに保存され、着信接続がパスワードなしでデータベースに接続できるようになります。
-
パスワードを変更するには、PostgreSQL データベースで次のクエリを実行します。
ALTER USER <user> WITH PASSWORD '<newpassword>';
パスワードの変更に成功すると、ALTER ROLE が表示されます。
上記と同じ理由で、PostgreSQL のユーザー インターフェースではパスワードを変更しないでください。
- md5 ハッシュを使用します。
- パスワードに PASSWORD "、つまり空白文字列を設定しないでください。PostgreSQL で正しく処理されません。
データベース トラフィックの暗号化
Qlik Sense では SSL を使用したデータベース トラフィックの暗号化がサポートされていますが、共有持続性を使用した展開で SSL や MD5 によるパスワード保護を設定するには、手動による構成がいくつか必要です。
次の手順を実行します。
-
postgresql.conf で以下の値を編集します。
listen_addresses = '*' port = 4432 ssl = on ssl_cert_file = 'server.pem' ssl_key_file = 'server_key.pem' #ssl_ca_file = '' #ssl_crl_file = '' -
pg_hba.conf に次の行を追加します。
hostssl all all all md5 - pg_hba.conf で、hostssl または host で始まる行をすべて削除します。
- server.pem と server_key.pem を %PROGRAMDATA%\Qlik\Sense\Repository\Exported Certificates\.Local Certificates から %PROGRAMDATA%\Qlik\Sense\Repository\PostgreSQL\12.x にコピーします。
- 接続文字列エディターを使用して、クラスターに属するセントラル ノードとすべてのリム ノードの repository.exe.config に以下の設定を行います。接続文字列エディターを開くには、C:\Program Files\Qlik\Sense\Repository\Util\QlikSenseUtil に移動し、管理者として QlikSenseUtil.exe ファイルを開きます。
- [接続文字列エディター] タブで [読み取り] をクリックし、Repository.exe ファイルの接続文字列を開きます。
-
‘Ssl Mode=Require;’ を次の接続文字列に追加します。
<add name="QSR" connectionString="User ID=qliksenserepository;Ssl Mode=Require;Host='fullhostname.com';Port='4432';Database=QSR;Pooling=true;Min Pool Size=0;Max Pool Size=90;Connection Lifetime=3600;Unicode=true;Password='randompass';" providerName="Devart.Data.PostgreSql" /><add name="QSMQ" connectionString="User ID=qliksenserepository;Ssl Mode=Require;Host='fullhostname.com';Port='4432';Database=QSMQ;Pooling=true;Min Pool Size=0;Max Pool Size=90;Connection Lifetime=3600;Unicode=true;Password='randompass';" providerName="Devart.Data.PostgreSql" /> - [暗号化された config ファイルに値を保存する] をクリックして変更を保存します。
- すべての Qlik Sense サービスを起動し、すべて機能することを確認します。
-
PostgreSQL の pgAdmin ツールを使用して認証を検証します。
ユーザー postgres とユーザー qliksenserepository は、接続に有効なパスワードの入力が必要です。
データベース接続での TLS 1.2 のみの使用の強制
TLS 1.2 のみをサポートし、TLS 1.1 以前を使用した接続をブロックするようにデータベース接続を構成することができます。
次の手順を実行します。
- 接続文字列にパラメータ-を追加します。"SSL TLS Protocol=1.2"
データベースの整合性を維持するため、以下の追加の構成変更をお勧めします。
- リポジトリが動作しているサーバーからの接続のみを受け付けるようデータベースを構成する。
-
Postgresql.conf ファイルに次の行を追加することにより、弱い暗号スイートを拒否するよう、SSL を構成する。
ssl_ciphers = 'DEFAULT:!LOW:!EXP:!eNULL:!aNULL:!MD5:!RC2:!RC4:!DES:@STRENGTH'
Qlik Sense Service Dispatcher が制御するサービスのデータベース接続の暗号化
次のコードスニペットは、Qlik Sense Service Dispatcher が制御する次のサービス向けのデータベースを暗号化するために使用できます。
ライセンス サービス
C:\Program Files\Qlik\Sense\Licenses\appsettings.json 内:
{
"licenses": {
"host": "localhost",
"port": 4432,
"dbName": "Licenses",
"user": "qliksenserepository",
"password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAABuvYPntQ2k+cR8K7frd+MQQAAAACAAAAAAAQZgAAAAEAACAAAAD8/TGvNzoDOPCleEynZCIfw+q/cpFaHRLcsRuR2cXjSgAAAAAOgAAAAAIAACAAAABSZavuu/lRWW2s92wdDbOeUW2sHSZP8sXI0PfPyAT7ZSAAAAD4GqZdVQacn/SzaN03617zNLfzg1owMethVPGOp2bv2UAAAADsFbcNkIOY4CEBJ/jh2djgfVEWu0L2Q8nipfWxyMg3NO5xLEGxUTpZ0riJ+J9LRX9WyW84tkAToP4pexntagZ+",
"sslMode": "require"
},
"messageQueue": {
"host": "localhost",
"port": 4432,
"dbName": "QSMQ",
"user": "qliksenserepository",
"password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAABuvYPntQ2k+cR8K7frd+MQQAAAACAAAAAAAQZgAAAAEAACAAAAA78d6YdDM+L1OGg0C/d1irzf3Ml4/cskYQxB4A/DvyfwAAAAAOgAAAAAIAACAAAACTpVvY32teeFMJbZNsSSC/4xqaOF5j5BT7TlCA/RWkgiAAAADaOOtbEjL6DpP1sPh8optOF+diHuM2gpxFzmmfDtubF0AAAAD9ujXzsYyW53yVVUQUMtJNfoZnz6y40wdU0LcSoMACuCSt4W5vryetKdRAQF7jn1P1b5RNt4+xONi17d4bPJsl",
"sslMode": "require"
}
}
アプリ配布サービス
C:\Program Files\Qlik\Sense\AppDistributionService\appsettings.json 内:
"Postgres": {
"Host": "localhost",
"Port": 4432,
"Database": "SenseServices",
"Username": "qliksenserepository",
"Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAABuvYPntQ2k+cR8K7frd+MQQAAAACAAAAAAAQZgAAAAEAACAAAACEws1dK+PEB5TNRkrMpmMguUuMYKQx/StRpcT08T4mSgAAAAAOgAAAAAIAACAAAAD9CE26tQn2no6qttNjzyqeBZQkgIYl49lw98Fvy6TyriAAAAA2LiBpizUuEgfSlXKZHgrD4bdy12ErkG3zD3afabBmBkAAAAAZGqqheCccUlCnhEMiMjCbIEcyPfLQKmtJ5cXHNHSN2S9kTdAJjnZi5N9DiQi+0PhxgHFFPapwsqvSvJbDrgXs",
"ConnectionRetryPolicy": {
"MaxRetries": 10,
"RetryTimeMs": 100
},
"Security": {
"Enable": true,
"ServerCertificate": {
"Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\server.pem",
"PrivateKeyPath": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\server_key.pem"
},
"RootCertificate": {
"Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
}
}
},
ハイブリッド展開サービス
C:\Program Files\Qlik\Sense\HybridDeploymentService\appsettings.json 内:
"Postgres": {
"Host": "localhost",
"Port": 4432,
"Database": "SenseServices",
"Username": "qliksenserepository",
"Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAABuvYPntQ2k+cR8K7frd+MQQAAAACAAAAAAAQZgAAAAEAACAAAADKcv4roLbsaB0VW9XBLAyHp+d/+C7m31sSQg0vhBIKdAAAAAAOgAAAAAIAACAAAADce1TO9aFSv0NgUHYt5fjvKd/W+vTEnsfXT4uXAcKpUiAAAAAHZVoGx2tMg/zUVqykZVtAVngR2BtNcrklz0zG2z90QUAAAACQUSC0gv71htU90HA51n1VVXSTUBlGfVTo0nc/zqoIujyAcMi8svRQHJLZlaE9OhQM+SnKUTlYvs7JkQ4FquSg",
"Security": {
"Enable": true,
"ServerCertificate": {
"Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\server.pem",
"PrivateKeyPath": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\server_key.pem"
},
"RootCertificate": {
"Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
}
}
},
参照元サービス
C:\Program Files\Qlik\Sense\PrecedentsService\appsettings.json 内:
"Postgres": {
"Host": "localhost",
"Port": 4432,
"Database": "SenseServices",
"Schema": "precedents_service",
"Username": "qliksenserepository",
"Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAABuvYPntQ2k+cR8K7frd+MQQAAAACAAAAAAAQZgAAAAEAACAAAAACA3w4vDFBOOzXIqTdnacAgNMivnBG7hKwyRtFcNfSzAAAAAAOgAAAAAIAACAAAADLvmc6D5Jbkt+mN3DJwBCTZTIu72BTbCPTD1qh6b5ToiAAAACw+tqwiH2adN8FslbdQg3hm4ShT6fv8kbBSMqapTJ6d0AAAACiSEovBVjcN8Y65jj7EoupznENLc+JPvh6iDVt3G9PuaAVMBEBF5VF9YC5h+JFOZgbRbesppullY8/E9tcjBff",
"Secure": {
"Enable": true
}
},
通知サービス
C:\Program Files\Qlik\Sense\NotifierService\appsettings.json 内:
{
"qsmq": {
"host": "localhost",
"port": 4432,
"database": "QSMQ",
"user": "qliksenserepository",
"password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAr/UQ7Qw2UkKeUZc0tKzpuAQAAAACAAAAAAAQZgAAAAEAACAAAACH6Y8cTrKGnDeaCwnDdIG5GVZyVs8FWozTBMJdysKTzQAAAAAOgAAAAAIAACAAAADTJstqSpIU9o6n3xzLXRqJFHgx3chZqxnssHJvV7bkdRAAAABP7QcqZrgEe9F4K5AoAGBZQAAAAP+8Sewi+NlB6TOBS+pSlxMKyTKJD1vqa8TzcOdep54sBJfiEjLu2qlq0YKN4DnI/KCMMLMVHdaMm1qzk9wlolM=",
"ssl": "true"
},
"senseServices": {
"host": "localhost",
"port": 4432,
"database": "SenseServices",
"user": "qliksenserepository",
"password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAr/UQ7Qw2UkKeUZc0tKzpuAQAAAACAAAAAAAQZgAAAAEAACAAAABHh7YWG9F996GbE1Jbry6B7Jiytn8432DsQ0VmgIxKGQAAAAAOgAAAAAIAACAAAACYxIKEvBO7aXFgGINUuWLD76jskNNK6DbiBaBvnRUkGBAAAABqzh9FMFbJDxWd532nEukBQAAAAHjGKDYs+/BNlFhMqBd77GOtXN/i5LAc96mWZahRZ4hE/Ve7aa2Uqx2/SwdwMUIr6g8xhu9CJ56QwRkukj7pRXc=",
"ssl": "true"
},
Mobility Registrar サービス
C:\Program Files\Qlik\Sense\MobilityRegistrarService\appsettings.json 内:
{
"Postgres": {
"Host": "localhost",
"Port": 4432,
"Database": "SenseServices",
"Schema": "qlik_mobility_registrar_service",
"Username": "qliksenserepository",
"Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAr/UQ7Qw2UkKeUZc0tKzpuAQAAAACAAAAAAAQZgAAAAEAACAAAAA6L9dGr9oeIaqpdxz9W4BP2QmUHtxaFzGfzx051sUrnQAAAAAOgAAAAAIAACAAAAAoXU1esPxGwBi+Xs4eH3qB3WXUDPm4QbWbiAWBnlfW9hAAAADamUq8qBtA6qhQUzmcPl2MQAAAAHYky7wdQgBw20cXPN6wK0Oxnp+Iizw+MeMhqDQPH0iUnnkcLQo40jCFlijHwXeDcxVEGirCje1xCvBv/Itf94k=",
"SSL": "true"
}
}
追加の構成
各 node.js サービスのために、C:\Program Files\Qlik\Sense\ServiceDispatcher\services.conf 内の追加パラメーター、--ssl により、サービスとの https 通信を構成することもできます。次の例では、リソース配分 サービスのために TLS 1.2 を構成しています。
[resource-distribution]
Identity=Qlik.resource-distribution
DisplayName=Resource Distribution
ExePath=Node\node.exe
Script=..\ResourceDistributionService\server.js
[resource-distribution.parameters]
--secure
--wes-port=${WESPort}
--mode=server
--log-path=${LogPath}
--log-level=info
--ssl=369098752
次の node.js コードは、OpenSSL オプションに従って OpenSSL を構成するために使用する数、369098752 を生成します。
const crypto = require("crypto");
console.log(crypto.constants.SSL_OP_NO_SSLv2 |
crypto.constants.SSL_OP_NO_SSLv3 | crypto.constants.SSL_OP_NO_TLSv1 |
crypto.constants.SSL_OP_NO_TLSv1_1);
データベースの複製とフェールオーバー
このセクションでは、共有持続性環境でのデータベースの複製とフェールオーバーの設定方法について説明します。さらに、ファイル ストレージ コンテンツの複製も必要になります。セントラル データベースやセントラル ノードが停止した場合にスタンバイ ノードにフェールオーバーするために、1 つまたは複数のスタンバイ データベースを構成してプライマリ ノードのデータベースから複製をストリーミングできます。
Qlik Sense のインストールに関連するテキスト ファイルを編集する場合の手順は次のとおりです。
- ファイルをサーバーの別の場所にコピーします。
- ファイルを編集して、変更を保存します。
- 更新したファイルを元の場所にコピーします。
スタンバイ ノードへのフェールオーバー用の複製の設定
このセクションでは、1 つまたは複数のスタンバイ ノードに対する複製の非同期ストリーミングの設定方法について説明します。始める前に、環境が構成されで動作していることを確認したら、スタンバイ マシンに PostgreSQL をインストールします。
プライマリ データベース サーバーの構成
プライマリ データベース サーバー側の手順は以下のとおりです。
-
%ProgramFiles%\PostgreSQL\12.x\data\postgresql.conf ファイルを開きます。
次の設定項目を探して設定します。
wal_level = replica max_wal_senders = 3 wal_keep_segments = 8 hot_standby = on -
複製に使用できるユーザー アカウントを作成します。コマンド プロンプトで作成するには、以下のコマンドを実行します。ホスト名は必要に応じて変更し、適切なパスワードを指定します。パスワードの入力を求められることがありますが、これはインストール中に指定したパスワードです。
"C:\Program Files\PostgreSQL\12.x\bin\psql.exe" -h <machinename> -p 4432 -W -c "CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'secretpassword';" -
%ProgramFiles%\PostgreSQL\12.x\data\pg_hba.conf ファイルを開きます。
ファイルの末尾に次の行を追加します。
host replication replicator 0.0.0.0/0 md5必要に応じてサブネット アクセスをさらに制限することもできます。
- PostgreSQL サービスを再起動します。
スタンバイ データベース サーバーの構成
スタンバイ PostgreSQL データベース サーバー側の手順は以下のとおりです。
- Postgres サービスを停止します。
- %ProgramFiles%\PostgreSQL\12.x\data のすべてのコンテンツを削除します。
-
次のコマンドを、使用するプライマリ サーバー名に合わせて修正し、コマンド ラインから実行します。
"C:\Program Files\PostgreSQL\12.x\bin\pg_basebackup.exe" -h <primaryServer> -D "C:\Program Files\PostgreSQL\12.x\data" -U replicator -v -P -p 4432ファイルの手動コピーに関する警告はすべて無視して構いません。
- テキスト エディタで recovery.conf という名前のファイルを作成し、%ProgramFiles%\PostgreSQL\12.x\data に置きます。
-
recovery.conf を開き、 以下のテキストを追加して、ホスト名とポートを修正します。
standby_mode = 'on' primary_conninfo = 'host=< primaryServer > port=4432 user=replicator password=secretpassword' trigger_file = 'failover' recovery_target_timeline = 'latest' - PostgreSQL サービスを起動します。
これでデータベースに接続してプライマリ ノードからストリーミングされているデータを読み取り専用モードで表示できるようになります。
手動でのデータベース フェールオーバー
プライマリ ノードのデータベースが停止した場合、スタンバイ ノードが引き継ぐ必要があります。
次の手順を実行します。
-
新しいプライマリ ノードになるスタンバイ ノードで、failover という名前のファイルを %ProgramFiles%\PostgreSQL\12.x\data フォルダーに作成します。
情報メモfailover ファイルにはファイル拡張子をつけません。このファイルが、PostgreSQL を起動して復元を停止し、読み書きモードに移行します。また、PostgreSQL が recovery.conf のファイル名を recovery.done に変更してこの移行を反映させます。
-
各ノードで、リポジトリ データベース接続文字列を新しいデータベース ノードのホスト名または IP アドレスを指定するように変更します。接続文字列は、構成ファイルで暗号化されているため、接続文字列エディター を使って文字列を復号化し、編集してからもう一度文字列を暗号化する必要があります。
- 接続文字列エディターを開くには、C:\Program Files\Qlik\Sense\Repository\Util\QlikSenseUtil に移動し、管理者として QlikSenseUtil.exe ファイルを開きます。
-
[接続文字列エディター] タブで [読み取り] をクリックし、Repository.exe ファイルの接続文字列を開きます。
復号化されたデータベース接続文字列が表示されます。
-
[ホスト] の値を新しいデータベース ノードのホスト名または IP アドレスで置き換えます。
-
[暗号化された config ファイルに値を保存する] をクリックして変更を保存します。