# データベースのセキュリティ

共有持続性を使用する展開では、サーバー、データベース、ファイル共有間のネットワーク トラフィックはインストール後のデフォルトでは暗号化されていません。また、セントラル データベースの障害に対応するためデータベースの複製を設定することを検討すべき場合もあります。

## データベース パスワードの整合性の維持

Qlik Sense 共有持続性を使用する展開で、パスワードの整合性を維持するための指針をいくつか紹介します。

* 重要なのは、PostgreSQL のユーザーに関して、[パスワードの保存オプション] を無効にすることです。このオプションが有効化されると、パスワードがファイルに保存され、着信接続がパスワードなしでデータベースに接続できるようになります。

* パスワードを変更するには、PostgreSQL データベースで次のクエリを実行します。

  `ALTER USER <user> WITH PASSWORD '<newpassword>';`

  `ALTER ROLE` パスワードの変更に成功すると、が表示されます。

  上記と同じ理由で、PostgreSQL のユーザー インターフェースではパスワードを変更しないでください。

* MD5 (デフォルト) のパスワード暗号化を使用します。

* パスワードに `PASSWORD ''`、すなわち空白文字列を設定しないでください。PostgreSQL で正しく処理できないからです。

## MD5 暗号から SCRAM 暗号への変更

PostgreSQLデータベースのデフォルトのパスワード暗号化は MD5 です。インストール後に pgAdmin デスクトップ app からこれを SCRAM に変更できます。 暗号化方式は常にデータベース ユーザー パスワードと PostgreSQL スーパーユーザー パスワードに付加されます (例: md5password または SCRAM-SHA-256password)。

pgAdmin デスクトップでスーパーユーザーとして以下のコマンドを実行します。

1. 現在、暗号化が MD5 に設定されていることを確認してください。

   ```
   show password_encryption;
   ```

2. データベース ユーザーのパスワードが MD5 で暗号化されていることを確認します。

   ```
   select passwd from pg_shadow where usename = 'qliksenserepository';
   ```

3. PostgreSQL スーパーユーザーのパスワードが MD5 で暗号化されていることを確認します。

   ```
   select passwd from pg_shadow where usename = 'postgres';
   ```

4. 暗号化を SCRAM に変更します。

   ```
   alter system set password_encryption = 'scram-sha-256';
   ```

5. 設定ファイルをリロードすると、暗号化の変更が表示されます。

   ```
   select pg_reload_conf();
   ```

6. パスワードの暗号化が SCRAM に変更されていることを確認します。

   ```
   show password_encryption;
   ```

7. データベース ユーザーのパスワードをリセットして、SCRAM 暗号化で保存します。

   ```
   alter user qliksenserepository with password '*******';
   ```

8. PostgresSQL スーパーユーザーのパスワードをリセットし、SCRAM 暗号化で保存します。

   ```
   alter user postgres with password '*******';
   ```

9. ユーザーの暗号化方式を確認します。

   ```
   select passwd from pg_shadow where usename = 'qliksenserepository';
   ```

10. スーパーユーザーの暗号化方式を確認します。

    ```
    select passwd from pg_shadow where usename = 'postgres';
    ```

pg\_hba.conf ファイルを手動で更新します。

1. %ProgramData%\Qlik\Sense\Repository\PostgreSQL\14 に移動します。

2. pg\_hba.conf を開きます。

3. md5 を scram-sha-256 に変更し、ファイルを保存します。

4. Qlik Sense リポジトリ データベースサービスを再起動します。

## データベース トラフィックの暗号化

Qlik Sense では SSL を使用したデータベース トラフィックの暗号化がサポートされていますが、共有持続性を使用した展開で SSL や MD5 または SCRAM-SHA-256 などのパスワード保護を設定するには、手動による構成がいくつか必要です。

情報メモQlik Sense インストーラーでは、PostgreSQL への接続を確立する際に SSL 暗号化を使用できません。SSL 暗号化を有効にすると、インストールはすでにインストールされている PostgreSQL データベースを認識せず、その結果インストールを完了できません。回避方法: インストールまたはアップグレード時に SSL を一時的に無効にします。

次の手順を実行します。

1. 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 = ''

2. 使用する認証方法に応じて、pg\_hba.conf に次のいずれかの行を追加します。

   hostssl all all all md5

   hostssl all all all scram-sha-256

3. pg\_hba.conf で hostssl または host で始まる行をすべて削除します。

4. server.pem と server\_key.pem を %PROGRAMDATA%\Qlik\Sense\Repository\Exported Certificates\.Local Certificates から %PROGRAMDATA%\Qlik\Sense\Repository\PostgreSQL\12.x にコピーします。

5. 接続文字列エディターを使用して、クラスターに属するセントラル ノードとすべてのリム ノードの repository.exe.config に以下の設定を行います。接続文字列エディターを開くには、C:\Program Files\Qlik\Sense\Repository\Util\QlikSenseUtil に移動し、管理者として QlikSenseUtil.exe ファイルを開きます。

6. [接続文字列エディター] タブで [読み取り] をクリックし、Repository.exe ファイルの接続文字列を開きます。

7. ‘Ssl Mode=Require;’ を次の接続文字列に追加します。

   &lt;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" /&gt;

   &lt;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" /&gt;

8. [暗号化された config ファイルに値を保存する] をクリックして変更を保存します。

9. すべての Qlik Sense サービスを起動し、すべて機能することを確認します。

10. PostgreSQL の pgAdmin ツールを使用して認証を検証します。

    ユーザー postgres とユーザー qliksenserepository は、接続に有効なパスワードの入力が必要です。

### データベース接続での TLS 1.3 のみの使用の強制

TLS 1.3 のみをサポートし、TLS 1.2 以前を使用した接続をブロックするようにデータベース接続を構成できます。

次の手順を実行します。

* 接続文字列に "SSL TLS Protocol=1.3" のパラメータ－を追加します。

データベースの整合性を維持するため、以下の追加の構成変更をお勧めします。

* リポジトリが動作しているサーバーからの接続のみを受け付けるようデータベースを構成する。

* 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\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": 0
  }
}
```

### NL ブローカー サービス

C:\Program Files\Qlik\Sense\NLBroker\appsettings.json で:

ホスト値には共通名 (CN) を使用する必要があります。CN を取得するには、昇格された PowerShell で次のコマンドを実行します。

```
$CertPath = [Environment]::GetFolderPath('CommonApplicationData') + "\Qlik\Sense\Repository\PostgreSQL\12.x\server.pem" $Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $CertPath $Cert | Select-Object -Property Subject
```

上記のコマンドから出力を取得し、以下のスニペットの "localhost" を置き換えます。

```
{
  "Postgres": {
    "Host": "localhost",
    "Port": 4432,
    "Database": "SenseServices",
    "Schema": "nl_broker",
    "Username": "qliksenserepository",
    "Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sAAAAnq+F3zxlakeZ96CexCiJJwQAAAACAAAAAAAQZgAAAAEAACAAAAAnIrak2CdHUivvPchAMP8d0053ZGmaG3WFnuNnqSxaFAAAAAAOgAAAAAIAACAAAACQSam6rRrQrLsgSq+IKUeEZBzpPYDNhKC+ss2uAA4I8CAAAAAIj29QiQoCXEKFzHPxzOhas2MOtC/tYm+QJbUtSC7SY0AAAACdXaXWr688zj1DciHYx/h79vXX6ll+G0U5AigLWrSwsCNtJTh1clp0gGr2YSyS54ESdkqqD+fi+vEKHoOO+2wH",
    "Security": {
      "comment": "See sslmode descriptions at https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string#tcp-connections and https://www.postgresql.org/docs/12/libpq-ssl.html#LIBPQ-SSL-PROTECTION",
      "Enable": true,
      "Mode": "require",
      "Certificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client.pem",
      "Key": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client_key.pem",
      "RootCertificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
    }
  }
}
```

### NL アプリ検索サービス

C:\Program Files\Qlik\Sense\NLAppSearch\appsettings.json 内

ホスト値には共通名 (CN) を使用する必要があります。CN を取得するには、昇格された PowerShell で次のコマンドを実行します。

```
$CertPath = [Environment]::GetFolderPath('CommonApplicationData') + "\Qlik\Sense\Repository\PostgreSQL\12.x\server.pem" $Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $CertPath $Cert | Select-Object -Property Subject
```

上記のコマンドから出力を取得し、以下のスニペットの "localhost" を置き換えます。

```
{
  "Postgres": {
    "Host": "localhost",
    "Port": 4432,
    "Database": "QSMQ",
    "Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAnq+F3zxlakeZ96CexCiJJwQAAAACAAAAAAAQZgAAAAEAACAAAAC7N047wjSCfF7zII62y1DMRh6ijHaj57BNW+asBRisqgAAAAAOgAAAAAIAACAAAAC/FuJ1IavkKFodWnIoeRLO8RpiysHPop4Dyqz8PFyaoSAAAACxdHYmcrnNTYM73q0FccSeQVWW3dZ1y/gz3Q4PRGOEAAAABK5mNZcMFf68nReI7oFhLJXw7oZl3u2PoD8O4hMqNJHicsOvzufdDDzM8YNCcrq/YVYakhiOceReEbiehxm0Jh",
    "Username": "qliksenserepository",
    "Security": {
      "comment": "See sslmode descriptions at https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string#tcp-connections and https://www.postgresql.org/docs/12/libpq-ssl.html#LIBPQ-SSL-PROTECTION",
      "Enable": true,
      "Mode": "require",
      "Certificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client.pem",
      "Key": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client_key.pem",
      "RootCertificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
    }
  },
  "QRS": {
    "Url": "https://localhost:4242/qrs",
    "ClientCertificate": {
      "Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client.pem",
      "PrivateKeyPath": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client_key.pem"
    },
    "RootCertificate": {
      "Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
    }
  }
}
```

### DataPrep サービス

C:\Program Files\Qlik\Sense\DataPrepService\appsettings.json 内

ホスト値には共通名 (CN) を使用する必要があります。CN を取得するには、昇格された PowerShell で次のコマンドを実行します。

```
$CertPath = [Environment]::GetFolderPath('CommonApplicationData') + "\Qlik\Sense\Repository\PostgreSQL\12.x\server.pem" $Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $CertPath $Cert | Select-Object -Property Subject
```

上記のコマンドから出力を取得し、以下のスニペットの "localhost" を置き換えます。

```
{
  "Postgres": {
    "Host": "localhost",
    "Port": 4432,
    "Database": "SenseServices",
    "Schema": "dataprep_service",
    "Username": "qliksenserepository",
    "Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sAAAAnq+F3zxlakeZ96CexCiJJwQAAAACAAAAAAAQZgAAAAEAACAAAAAnIrak2CdHUivvPchAMP8d0053ZGmaG3WFnuNnqSxaFAAAAAAOgAAAAAIAACAAAACQSam6rRrQrLsgSq+IKUeEZBzpPYDNhKC+ss2uAA4I8CAAAAAIj29QiQoCXEKFzHPxzOhas2MOtC/tYm+QJbUtSC7SY0AAAACdXaXWr688zj1DciHYx/h79vXX6ll+G0U5AigLWrSwsCNtJTh1clp0gGr2YSyS54ESdkqqD+fi+vEKHoOO+2wH",
    "Security": {
      "comment": "See sslmode descriptions at https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string#tcp-connections and https://www.postgresql.org/docs/12/libpq-ssl.html#LIBPQ-SSL-PROTECTION",
      "Enable": true,
      "Mode": "require",
      "Certificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client.pem",
      "Key": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client_key.pem",
      "RootCertificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
    }
  }
}
```

### 参照元サービス

C:\Program Files\Qlik\Sense\PrecedentsService\appsettings.json 内

ホスト値には共通名 (CN) を使用する必要があります。CN を取得するには、昇格された PowerShell で次のコマンドを実行します。

```
$CertPath = [Environment]::GetFolderPath('CommonApplicationData') + "\Qlik\Sense\Repository\PostgreSQL\12.x\server.pem" $Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList $CertPath $Cert | Select-Object -Property Subject
```

上記のコマンドから出力を取得し、以下のスニペットの "localhost" を置き換えます。

```
{
  "Postgres": {
    "Host": "localhost",
    "Port": 4432,
    "Database": "SenseServices",
    "Schema": "precedents_service",
    "Username": "qliksenserepository",
    "Password": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAnq+F3zxlakeZ96CexCiJJwQAAAACAAAAAAAQZgAAAAEAACAAAACI2GnlPHqAG8iKXI+Nv92uE5DeGKaDpoMLSLjSX3M3BgAAAAAOgAAAAAIAACAAAADo8y30KfZ517PHilkR+9SQA9uYGnnZjKLM8eBfrzW2UCAAAAB+Mrbs74uJo4lMr+Jr8gSbxxa2ZkrNEKqI1WRDo5PpWkAAAADw2QwbQktqRT23B9N5jBJtqw/7BqVKVyLw1vCZyW0FqHHMBxyD9Gn6ajMFmekMRjxjWB2eREt5HXLM7EUE0slW",
    "Security": {
      "comment": "See sslmode descriptions at https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string#tcp-connections and https://www.postgresql.org/docs/12/libpq-ssl.html#LIBPQ-SSL-PROTECTION",
      "Enable": true,
      "Mode": "require",
      "Certificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client.pem",
      "Key": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client_key.pem",
      "RootCertificate": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
    }
  },
  "QRS": {
    "Url": "https://localhost:4242/qrs",
    "RetryPolicy": {
      "MaxRetries": 3,
      "RetryTimeMs": 100
    },
    "Headers": {
      "X-Qlik-User": "UserDirectory=INTERNAL; UserId=sa_api"
    },
    "ClientCertificate": {
      "Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client.pem",
      "PrivateKeyPath": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\client_key.pem"
    },
    "RootCertificate": {
      "Path": "C:\\ProgramData\\Qlik\\Sense\\Repository\\Exported Certificates\\.Local Certificates\\root.pem"
    }
  }
}
```

### 追加の構成

各 node.js サービスのために、C:\Program Files\Qlik\Sense\ServiceDispatcher\services.conf 内の追加 --ssl パラメーターにより、サービスとの https 通信を構成することもできます。次の例では、Resource distribution サービスのために TLS 1.3 を構成しています。

```
[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=503316480
```

次の node.js コードは、[OpenSSL オプション](https://nodejs.org/api/crypto.html#crypto_openssl_options "OpenSSL Options")に従って OpenSSL を構成するために使用する数、503316480 を生成します。

```
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 | crypto.constants.SSL_OP_NO_TLSv1_2); 
```

情報メモ生成される数は、Qlik Sense に同梱の node.js バージョンによって異なる場合があります: C:\Program Files\Qlik\Sense\ServiceDispatcher\Node\node.exe。

## データベースの複製とフェールオーバー

このセクションでは、共有持続性環境でのデータベースの複製とフェールオーバーの設定方法について説明します。さらに、ファイル ストレージ コンテンツの複製も必要になります。セントラル データベースやセントラル ノードが停止した場合にスタンバイ ノードにフェールオーバーするために、1 つまたは複数のスタンバイ データベースを構成してプライマリ ノードのデータベースから複製をストリーミングできます。

Qlik Sense のインストールに関連するテキスト ファイルを編集する場合の手順は次のとおりです。

1. ファイルをサーバーの別の場所にコピーします。
2. ファイルを編集して、変更を保存します。
3. 更新したファイルを元の場所にコピーします。

### スタンバイ ノードへのフェールオーバー用の複製の設定

このセクションでは、1 つまたは複数のスタンバイ ノードに対する複製の非同期ストリーミングの設定方法について説明します。始める前に、環境が構成されで動作していることを確認したら、スタンバイ マシンに PostgreSQL をインストールします。

情報メモこの説明のパスは、専用マシンのデータベースとして使用されるデフォルトの PostgreSQL インストールに合わせたものです。Qlik Sense でインストールした PostgreSQL データベースを使用している場合、データベースは %ProgramData%\Qlik\Sense\Repository\PostgreSQL\&lt;バージョン&gt;\ にインストールされるため、パスをそれに合わせる必要があります。

#### プライマリ データベース サーバーの構成

プライマリ データベース サーバー側の手順は以下のとおりです。

1. %ProgramFiles%\PostgreSQL\&lt;version&gt;\dataファイルを開きます。

   次の設定項目を探して設定します。

   wal\_level = replica max\_wal\_senders = 3 wal\_keep\_segments = 8 hot\_standby = on

2. 複製に使用できるユーザー アカウントを作成します。コマンド プロンプトで作成するには、以下のコマンドを実行します。ホスト名は必要に応じて変更し、適切なパスワードを指定します。パスワードの入力を求められることがありますが、これはインストール中に指定したパスワードです。

   "C:\Program Files\PostgreSQL\&lt;version&gt;\bin\psql.exe" -h &lt;machinename&gt; -p 4432 -W -c "CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'secretpassword';"

3. %ProgramFiles%\PostgreSQL\&lt;version&gt;\data\pg\_hba.conf ファイルを開きます。

   ファイルの末尾に次の行を追加します。

   host replication replicator 0.0.0.0/0 md5

   必要に応じてサブネット アクセスをさらに制限することもできます。

4. PostgreSQLサービスを再起動します。

#### スタンバイ データベース サーバーの構成 (PostgreSQL 12.x)

スタンバイ PostgreSQL データベース サーバー側の手順は以下のとおりです。

1. PostgreSQL サービスを停止します。

2. %ProgramFiles%\PostgreSQL\&lt;version&gt;\data からすべてのコンテンツを削除します。

3. 次のコマンドを、使用するプライマリ サーバー名に合わせて修正し、コマンドラインから実行します。

   "C:\Program Files\PostgreSQL\&lt;version&gt;\bin\pg\_basebackup.exe" -h &lt;primaryServer&gt; -D "C:\Program Files\PostgreSQL\&lt;version&gt;\data" -U replicator -v -P -p 4432

   ファイルの手動コピーに関する警告はすべて無視して構いません。

4. テキスト エディターで、standby.signal という名前のファイルを作成 (サーバーはホット スタンバイとして起動する必要があることを示す) するか、recovery.signal という名前のファイルを作成 (サーバーはターゲット回復モードで起動する必要があることを示す) し、%ProgramFiles%\PostgreSQL\&lt;version&gt;\data に配置します。

   情報メモstandby.signal と recovery.signal の両方が存在する場合は、standby.signal が優先されます。

5. PostgreSQL サービスを起動します。

#### スタンバイ データベース サーバーの構成 (PostgreSQL 11.x)

スタンバイ PostgreSQL データベース サーバー側の手順は以下のとおりです。

1. PostgreSQL サービスを停止します。

2. %ProgramFiles%\PostgreSQL\&lt;version&gt;\data からすべてのコンテンツを削除します。

3. 次のコマンドを、使用するプライマリ サーバー名に合わせて修正し、コマンドラインから実行します。

   "C:\Program Files\PostgreSQL\&lt;version&gt;\bin\pg\_basebackup.exe" -h &lt;primaryServer&gt; -D "C:\Program Files\PostgreSQL\&lt;version&gt;\data" -U replicator -v -P -p 4432

   ファイルの手動コピーに関する警告はすべて無視して構いません。

4. テキスト エディターで recovery.conf という名前のファイルを作成し、%ProgramFiles%\PostgreSQL\&lt;version&gt;\data に配置します。

5. recovery.conf を開き、以下のテキストを追加して、ホスト名とポートを修正します。

   standby\_mode = 'on' primary\_conninfo = 'host=&lt; primaryServer &gt; port=4432 user=replicator password=secretpassword' trigger\_file = 'failover' recovery\_target\_timeline = 'latest'

6. PostgreSQL サービスを起動します。

これでデータベースに接続してプライマリ ノードからストリーミングされているデータを読み取り専用モードで表示できるようになります。

## 手動でのデータベース フェールオーバー

プライマリ ノードのデータベースが停止した場合、スタンバイ ノードが引き継ぐ必要があります。

次の手順を実行します。

1. 新しいプライマリ ノードになるスタンバイ ノードで、failover という名前のファイルを %ProgramFiles%\PostgreSQL\&lt;version&gt;\data に作成します

   情報メモfailover ファイルにはファイル拡張子をつけません。

   このファイルが、PostgreSQL を起動して復元を停止し、読み書きモードに移行します。

2. 各ノードで、レポジトリ データベース接続文字列を新しいデータベース ノードのホスト名または IP アドレスを指定するように変更します。接続文字列は、構成ファイルで暗号化されているため、接続文字列エディターを使って文字列を復号化し、編集してからもう一度文字列を暗号化する必要があります。

   1. 接続文字列エディターを開くには、C:\Program Files\Qlik\Sense\Repository\Util\QlikSenseUtil に移動し、管理者として QlikSenseUtil.exe ファイルを開きます。

   2. [接続文字列エディター] タブで [読み取り] をクリックし、Repository.exe ファイルの接続文字列を開きます。

      復号化されたデータベース接続文字列が表示されます。

   3. [ホスト] の値を新しいデータベース ノードのホスト名または IP アドレスで置き換えます。

   4. [暗号化された config ファイルに値を保存する] をクリックして変更を保存します。