ここでは、TLS接続を保護するための証明書を作成し、相互認証を提供する2つの方法を提供します。1つは、証明書を手動で作成および更新する方法です。もう1つは、cert-managerを使用して自動で更新される証明書を作成する方法です。
注意
MTLS構成のデータベースクラスタへのクライアント接続には、以下が適用されます。
MTLSデータベースクラスタの作成時に指定したサーバ(検証) のルート証明書をクライアントマシンに配布します。
新しいクライアント証明書を作成して使用します。
サーバールート証明書とクライアントルート証明書が異なる場合は、サーバー側の構成の更新が必要です。
作業の概要
MTLS通信を有効にする手順を以下に示します。
CAとして自己署名証明書を作成します
CA証明書を保存するためのConfigmapを作成します
FEPサーバの秘密鍵を保護するためのパスワードを作成します(オプション)
FEPサーバの秘密鍵を作成します
FEPサーバ証明書署名要求を作成します
CAによって署名されたFEPサーバ証明書を作成します
FEPサーバの証明書とキーを保存するためのTLSシークレットを作成します
Patroniの秘密鍵を作成します
Patroniの証明書署名要求を作成します
Patroni用にCAによって署名された証明書を作成します
Patroni証明書とキーを保存するためのTLSシークレットを作成します
“postgres”ユーザーのクライアント証明書の秘密鍵を作成します
“postgres”ユーザーのクライアント証明書の証明書署名要求を作成します
“postgres”ユーザーのクライアント証明書を作成します
“postgres”証明書とキーを保存するためのTLSシークレットを作成します
“repluser”と“rewinduser”に対して手順12-15を繰り返します
注意
マニュアルに記載されている情報は一例であり、動作時には、ユーザーが信頼できる認証局 (CA) によって署名された証明書を使用してください。
Kubernetesクラスタ上で操作する場合は、ocコマンドをkubectlコマンドに読み替えてください。
CA証明書の作成
openssl genrsa -aes256 -out myca.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes) ........................++++ ........................................................++++ e is 65537 (0x010001) Enter pass phrase for myca.key: 0okm9ijn8uhb7ygv Verifying - Enter pass phrase for myca.key: 0okm9ijn8uhb7ygv cat << EOF > ca.cnf
[req]
distinguished_name=req_distinguished_name
x509_extensions=v3_ca
[v3_ca]
basicConstraints = critical, CA:true
keyUsage=critical,keyCertSign,digitalSignature,cRLSign
[req_distinguished_name]
commonName=Common Name
EOF
openssl req -x509 -new -nodes -key myca.key -days 3650 -out myca.pem -subj "/O=My Organization/OU=CA /CN=My Organization Certificate Authority" -config ca.cnf Enter pass phrase for myca.key: 0okm9ijn8uhb7ygv
oc create configmap cacert --from-file=ca.crt=myca.pem -n my-namespace
oc create secret generic mydb-fep-private-key-password --from-literal=keypassword=abcdefghijk -n my-namespace
サーバ証明書の作成
openssl genrsa -aes256 -out fep.key 2048
Generating RSA private key, 2048 bit long modulus ................................................+++ .......+++ e is 65537 (0x10001) Enter pass phrase for fep.key: abcdefghijk Verifying - Enter pass phrase for fep.key: abcdefghijk
cat << EOF > san.cnf
[SAN]
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.my-namespace.pod
DNS.2 = *.my-namespace.pod.cluster.local
DNS.3 = mydb-primary-svc
DNS.4 = mydb-primary-svc.my-namespace
DNS.5 = mydb-primary-svc.my-namespace.svc
DNS.6 = mydb-primary-svc.my-namespace.svc.cluster.local
DNS.7 = mydb-replica-svc
DNS.8 = mydb-replica-svc.my-namespace
DNS.9 = mydb-replica-svc.my-namespace.svc
DNS.10 = mydb-replica-svc.my-namespace.svc.cluster.local
EOF
$ openssl req -new -key fep.key -out fep.csr -subj "/CN=mydb-headless-svc" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(cat san.cnf))
Enter pass phrase for fep.key: abcdefghijk
注意
クラスタ名と名前空間を適切に変更する必要があります。
OCPクラスタの外部から接続する場合は、その接続に使用するホスト名も含める必要があります。
openssl x509 -req -in fep.csr -CA myca.pem -CAkey myca.key -out fep.pem -days 365 -extfile <(cat /etc/pki/tls/openssl.cnf <(cat san.cnf)) -extensions SAN -CAcreateserial # all in one line
Signature ok
subject=/CN=mydb-headless-svc
Getting CA Private Key
Enter pass phrase for myca.key: 0okm9ijn8uhb7ygv
oc create secret generic mydb-fep-cert --from-file=tls.crt=fep.pem --from-file=tls.key=fep.key -n my-namespace
現時点では、FEPコンテナはPatroniのパスワードで保護された秘密鍵をサポートしていません。
openssl genrsa -out patroni.key 2048
Generating RSA private key, 2048 bit long modulus ...............................................+++ .......+++ e is 65537 (0x10001)
cat << EOF > san.cnf
[SAN]
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.my-namespace.pod
DNS.2 = *.my-namespace.pod.cluster.local
DNS.3 = mydb-primary-svc
DNS.4 = mydb-primary-svc.my-namespace
DNS.5 = mydb-replica-svc
DNS.6 = mydb-replica-svc.my-namespace
DNS.7 = mydb-headless-svc
DNS.8 = mydb-headless-svc.my-namespace
EOF
openssl req -new -key patroni.key -out patroni.csr -subj "/CN=mydb-headless-svc" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(cat san.cnf)) # all in one line
openssl x509 -req -in patroni.csr -CA myca.pem -CAkey myca.key -out patroni.pem -days 365 -extfile <(cat /etc/pki/tls/openssl.cnf <(cat san.cnf)) -extensions SAN -CAcreateserial # all in one line
Signature ok subject=/CN=mydb-headless-svc Getting CA Private Key Enter pass phrase for myca.key: 0okm9ijn8uhb7ygv
oc create secret tls mydb-patroni-cert --cert=patroni.pem --key=patroni.key -n my-namespace
ユーザー証明書の作成
現時点では、FEPサーバコンテナ内のSQLクライアントはパスワードで保護された証明書をサポートしていません。
openssl genrsa -out postgres.key 2048
Generating RSA private key, 2048 bit long modulus ...............................................+++ .......+++ e is 65537 (0x10001)
openssl req -new -key postgres.key -out postgres.csr -subj "/CN=postgres"
$ openssl x509 -req -in postgres.csr -CA myca.pem -CAkey myca.key -out postgres.pem -days 365
Signature ok
subject=CN = postgres
Getting CA Private Key
Enter pass phrase for myca.key: 0okm9ijn8uhb7ygv
oc create secret tls mydb-postgres-cert --cert=postgres.pem --key=postgres.key -n my-namespace
証明書管理ツールは、多く公開されています。 この例では、cert-managerを使用します。
注意
この例で作成された証明書はパスワードで保護されていないことに注意してください。
Kubernetesクラスタ上で操作する場合は、ocコマンドをkubectlコマンドに読み替えてください。
oc create namespace cert-manager
oc apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.0/cert-manager.yaml
この例では、名前空間my-namespaceに自己署名証明書を作成できる発行者を作成します。
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: selfsigned-issuer namespace: my-namespace spec: selfSigned: {} EOF
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: cacert namespace: my-namespace spec: subject: organizations: - My Organization organizationalUnits: - CA commonName: "My Organization Certificate Authority" duration: 87600h isCA: true secretName: cacert issuerRef: name: selfsigned-issuer EOF
上記のコマンドは、名前空間my-namespaceのKubernetesシークレット「cacert」に格納されている自己署名ルート証明書と秘密鍵を作成します。
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: ca-issuer namespace: my-namespace spec: ca: secretName: cacert EOF
FEPCluster名が名前空間my-namespaceのmydbであると仮定します。
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: mydb-fep-cert namespace: my-namespace spec: subject: commonName: "mydb-headless-svc" dnsNames: - "*.my-namespace.pod" - "*.my-namespace.pod.cluster.local" - "mydb-primary-svc" - "mydb-primary-svc.my-namespace" - "mydb-primary-svc.my-namespace.svc" - "mydb-primary-svc.my-namespace.svc.cluster.local" - "mydb-replica-svc" - "mydb-replica-svc.my-namespace" - "mydb-replica-svc.my-namespace.svc" - "mydb-replica-svc.my-namespace.svc.cluster.local" duration: 8760h usages: - server auth secretName: mydb-fep-cert issuerRef: name: ca-issuer EOF
FEPCluster名が名前空間my-namespaceのmydbであると仮定します。
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: mydb-patroni-cert namespace: my-namespace spec: subject: commonName: "mydb-headless-svc" dnsNames: - "*.my-namespace.pod" - "*.my-namespace.pod.cluster.local" - "*.mydb-primary-svc" - "*.mydb-primary-svc.my-namespace" - "*.mydb-replica-svc " - "*.mydb-replica-svc.my-namespace" duration: 8760h usages: - server auth secretName: mydb-patroni-cert issuerRef: name: ca-issuer EOF
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: mydb-postgres-cert namespace: my-namespace spec: subject: commonName: "postgres" duration: 8760h usages: - client auth secretName: mydb-postgres-cert issuerRef: name: ca-issuer EOF
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: mydb-repluser-cert namespace: my-namespace spec: subject: commonName: "repluser" duration: 8760h usages: - client auth secretName: mydb-repluser-cert issuerRef: name: ca-issuer EOF
FEPLogging名が名前空間feplogging-devのnflであると仮定します。
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: fluentd-cert namespace: feplogging-dev spec: subject: commonName: "nfl-fluentd-headless-service" dnsNames: - 'nfl-fluentd-headless-service' - 'nfl-fluentd-headless-service.feplogging-dev' - 'nfl-fluentd-headless-service.feplogging-dev.svc' - 'nfl-fluentd-headless-service.feplogging-dev.svc.cluster.local' duration: 8760h usages: - server auth secretName: fluentd-cert issuerRef: name: ca-issuer EOF
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: prometheus-cert namespace: feplogging-dev spec: subject: commonName: "prometheus" duration: 8760h usages: - client auth secretName: prometheus-cert issuerRef: name: ca-issuer EOF
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: fluentbit-cert namespace: feplogging-dev spec: subject: commonName: "fluentbit" duration: 8760h usages: - client auth secretName: fluentbit-cert issuerRef: name: ca-issuer EOF
FEPExporter名が名前空間my-namespaceのexp1であると仮定します。
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: fepexporter-cert namespace: my-namespace spec: subject: commonName: "exp1-service" dnsNames: - 'exp1-service' - 'exp1-service.fepexporter-dev' - 'exp1-service.fepexporter-dev.svc' - 'exp1-service.fepexporter-dev.svc.cluster.local' duration: 8760h usages: - server auth secretName: fepexporter-cert issuerRef: name: ca-issuer EOF
cat << EOF | oc apply -f - apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: prometheus-cert namespace: my-namespace spec: subject: commonName: "prometheus" duration: 8760h usages: - client auth secretName: prometheus-cert issuerRef: name: ca-issuer EOF
手動の証明書管理を使用してFEPClusterをデプロイする
手動の証明書管理を使用してFEPClusterをデプロイする例として、以下にyamlを示します。 MTLS関連のパラメータは赤字で強調表示されています。
apiVersion: fep.fujitsu.io/v2 kind: FEPCluster metadata: name: mydb namespace: my-namespace spec: fep: usePodName: true
patroni:
tls:
certificateName: mydb-patroni-cert
caName: cacert
postgres:
tls:
certificateName: mydb-fep-cert
caName: cacert
privateKeyPassword: mydb-fep-private-key-password forceSsl: true podAntiAffinity: false mcSpec: limits: cpu: 500m memory: 700Mi requests: cpu: 200m memory: 512Mi customAnnotations: allDeployments: {} servicePort: 27500 image: image: 'quay.io/fujitsu/fujitsu-enterprise-postgres-16-server:ubi9-16-1.0' pullPolicy: IfNotPresent sysExtraLogging: false podDisruptionBudget: false instances: 3 syncMode: 'on' fepChildCrVal: customPgAudit: | # define pg audit custom params here to override defaults. # if log volume is not defined, log_directory should be # changed to '/database/userdata/data/log' [output] logger = 'auditlog' log_directory = '/database/log/audit' [rule] customPgHba: | # define pg_hba custom rules here to be merged with default rules. # TYPE DATABASE USER ADDRESS METHOD hostssl all all 0.0.0.0/0 cert
hostssl replication all 0.0.0.0/0 cert
customPgParams: >+ # define custom postgresql.conf parameters below to override defaults. # Current values are as per default FEP deployment shared_preload_libraries='pgx_datamasking,pgaudit,pg_prewarm' session_preload_libraries='pg_prewarm' max_prepared_transactions = 100 max_worker_processes = 30 max_connections = 100 work_mem = 1MB maintenance_work_mem = 12MB shared_buffers = 128MB effective_cache_size = 384MB checkpoint_completion_target = 0.8 # tcp parameters tcp_keepalives_idle = 30 tcp_keepalives_interval = 10 tcp_keepalives_count = 3 # logging parameters in default fep installation # if log volume is not defined, log_directory should be # changed to '/database/userdata/data/log' log_directory = '/database/log' log_filename = 'logfile-%a.log' log_file_mode = 0600 log_truncate_on_rotation = on log_rotation_age = 1d log_rotation_size = 0 log_checkpoints = on log_line_prefix = '%e %t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h' log_lock_waits = on log_autovacuum_min_duration = 60s logging_collector = on pgaudit.config_file='/opt/app-root/src/pgaudit-cfg/pgaudit.conf' log_replication_commands = on log_min_messages = WARNING log_destination = stderr # wal_archive parameters in default fep installation archive_mode = on archive_command = '/bin/true' wal_level = replica max_wal_senders = 12 wal_keep_segments = 64 storage: dataVol: size: 2Gi storageClass: nfs-client walVol: size: 1200Mi storageClass: nfs-client logVol: size: 1Gi storageClass: nfs-client sysUsers: pgAdminPassword: admin-password pgdb: mydb pgpassword: mydbpassword pguser: mydbuser pgrepluser: repluser pgreplpassword: repluserpwd pgRewindUser: rewinduser pgRewindPassword: rewinduserpwd pgAdminTls:
certificateName: mydb-postgres-cert
caName: cacert
sslMode: prefer
pgrepluserTls:
certificateName: mydb-repluser-cert
caName: cacert
sslMode: prefer
pgRewindUserTls:
certificateName: mydb-rewinduser-cert
caName: cacert
sslMode: prefer
tdepassphrase: tde-passphrase systemCertificates: key: |- -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA0DFkImha8CIJiVcwXbBPlL+/DmS9/ipRhQQHxfO5x7jSOnse IHdFd6+Qx2GX8KAiAhVykf6kfacwBYTATU1xDgwWTm82KVRPh+kZDIj2wPcJr14m mTP6I6a2mavUgDhezHc9F8/dchYj3cw81X0kU6xamqrKQYlxQH48NkI0qcwhO6sK AHF4eWfCr8Ot44xADIA1JcU2CS1RKSZEtURZ+30Py+j907Enjp1YR33ZKUHw30pU 9dpIneyfXBN/pT6cX3MetYwtgmpV/pHqY8pbxqGfoyRhgQDsSRCl4dtlecaZeZ4j uTOotcPkZELHP6eu8gaLtycG9lpbAMQl5w0r8QIDAQABAoIBACq213qPuoimExrQ fqXaNJmqNYK4fJqXCB6oUwf0F1u4ubkx5V532hLSPHwLs+a0lAWlbNozSoBVOu8G 64VwrA9bv3/cJVqZZ6/UzUTbHPU+Ogh24qhwF5QU8kXZEUI1To3YsPoftalgjX9G Ff0fLcLVC8nL3K9RiaDXxXbEYpWrYu39M3FCpAXAzV2PrNxsP9PKyNWHnBPc08z5 tFj45/bHn+j31AVVvgWtqz0pLks57hc4Q7yW/2RoRYq2md1KI709OLNwtkWEOVqb qnraorh2TwGnNaOB5oX5/lJvKtlq778fw96jGqykBr0+DKozj9rlr1OGgYOKDwlD nsZJPAECgYEA+Oqf/fxtPdsNGiaL2Z/heewvtaxjw/WoEVBFECb6/y4Ro7aux9nB 16FcVi79Cwfp0UTJ7cnZvYSmBk5GWEObEIAeo61lvm/QeltM5+usAPd5/TcHXLYe 92OnXmq7h3F4UXEkMayak8Lpu/TdmR5uOaL+m4aEu+XMY5tlxqDCnyECgYEA1h4X jCPi7Ja5CHK7a2Ud4TL2DNpIBE6GSK9iQ+0xFL6TsiK2Sfu6n8mx2sh+Jm0KHTiE /gWHdHQZSSWiuULfHoYEq3Rq8S6Av3GsGtRSpO03j7BE8C20Vpt0FnNTjZmdzf2/ YZxc5KuYLh9qeY7Y7ceOsWA8JckDgMHPYzyLAtECgYBALD0TPgDr8Y1vMIDdmlqH FF04eTk/TBYIYKltgJ81KqthibeFzp4q+W7UyUhzj5a4XQOySlfYhFpJReTc3JEd r+o2SH3ymuEkqmUpZZjyptrMbWN4g3t4TDjaHqo6QQbD+GdcZyNy9M1Np9N5pl7E fUEm14dg6d3H0Ehs7QVAAQKBgQDRUx3mLXc9oKRINBIyDerGLJILQqLBQxtYl81T ZuFizGWL8w+PCIAMkpxDrVpWqqcGpiiuRi2ElbPapOaOg2epaY/LJscd/j5z6uc8 W3JoNljpKoRa4fO578Pv5tM6TYHOzlF5Veoiy/a8sI3hRNuiqkM/+TsUHY5FJDRh aeDk4QKBgCOHIevvR+MWuwakzD6lNCbb8H6fvZ3WRAT8BYYz3wW9YfnV4J4uh/Bl moWYgIK2UpkrhA8scMUC790FoybQeParQ35x7Jl91bmTKkCqsX63fyqqYhx3SXRl JSktmH4E2cGmosZisjB7COKHR32w0J5JCgaGInQxjldbGrwhZQpn -----END RSA PRIVATE KEY----- crt: |- -----BEGIN CERTIFICATE----- MIID2DCCAsCgAwIBAgIQDfFYteD4kZj4Sko2iy1IJTANBgkqhkiG9w0BAQsFADBX MRgwFgYDVQQKEw9NeSBPcmdhbml6YXRpb24xCzAJBgNVBAsTAkNBMS4wLAYDVQQD EyVNeSBPcmdhbml6YXRpb24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTIxMDQy MDAwMDQ1OVoXDTIxMDQyMDAxMDQ1OVowGDEWMBQGA1UEAwwNKi5jaGctcHRjLnBv ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAxZCJoWvAiCYlXMF2w T5S/vw5kvf4qUYUEB8Xzuce40jp7HiB3RXevkMdhl/CgIgIVcpH+pH2nMAWEwE1N cQ4MFk5vNilUT4fpGQyI9sD3Ca9eJpkz+iOmtpmr1IA4Xsx3PRfP3XIWI93MPNV9 JFOsWpqqykGJcUB+PDZCNKnMITurCgBxeHlnwq/DreOMQAyANSXFNgktUSkmRLVE Wft9D8vo/dOxJ46dWEd92SlB8N9KVPXaSJ3sn1wTf6U+nF9zHrWMLYJqVf6R6mPK W8ahn6MkYYEA7EkQpeHbZXnGmXmeI7kzqLXD5GRCxz+nrvIGi7cnBvZaWwDEJecN K/ECAwEAAaOB3jCB2zATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA MIG1BgNVHREEga0wgaqCCWxvY2FsaG9zdIIbKi5jaGctcHRjLnBvZC5jbHVzdGVy LmxvY2FsghMqLm15ZGItaGVhZGxlc3Mtc3ZjghsqLm15ZGItaGVhZGxlc3Mtc3Zj LmNoZy1wdGOCHyoubXlkYi1oZWFkbGVzcy1zdmMuY2hnLXB0Yy5zdmOCLSoubXlk Yi1oZWFkbGVzcy1zdmMuY2hnLXB0Yy5zdmMuY2x1c3Rlci5sb2NhbDANBgkqhkiG 9w0BAQsFAAOCAQEALnhliDflu+BHp5conq4dXBwD/Ti2YR5TWQixM/0a6OD4KecZ MmaLl0T+OJJvA/j2IufZpc7dzEx5mZDkR2CRmoq10qZXqCRTrBZSXm6ARQWoYpeg 9c0l4f8roxrkMGUKVPTKUwAvbnNYhD2l6PlBPwMpkMUfqFaSEXMaPyQKhrtQxdpH WjuS54OP0lm0peYu/yiaD98LtrTXnb6jch84SKf6Vii4HAVQyMeJaW+dpkqcI2+V Q4fkwWYSJy8BNcmXCwvHDLDy+s4EXWvHafhusuUhcp4HyMb1A6hd5hJhgFSnEvLy kLA0L9LaScxee6V756Vt9TN1NGjwmwyQDOhnQQ== -----END CERTIFICATE----- cacrt: |- -----BEGIN CERTIFICATE----- MIIDXDCCAkSgAwIBAgIRAMPzF3BNFxT9HWE+NXlFQjQwDQYJKoZIhvcNAQELBQAw VzEYMBYGA1UEChMPTXkgT3JnYW5pemF0aW9uMQswCQYDVQQLEwJDQTEuMCwGA1UE AxMlTXkgT3JnYW5pemF0aW9uIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0yMTA0 MTkwNDQ0MjNaFw0zMTA0MTcwNDQ0MjNaMFcxGDAWBgNVBAoTD015IE9yZ2FuaXph dGlvbjELMAkGA1UECxMCQ0ExLjAsBgNVBAMTJU15IE9yZ2FuaXphdGlvbiBDZXJ0 aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQC5t6CS23Glk65YMw5e4i4xHldyxkCZS67w/6LWqeIlYKmFAaEl83WWy8MHUpOb 4mahtUafEzDEOX6+URf72J8m0voldQ5FYr1AyUOyX8U90wGFqhbEgKRqt7vZEwIe 2961fwqHh6917zI4xmt5W6ZJ5dBQVtkhzB+Pf7O6KBYjHoCnBBkfNVzsfZQ/1hnR 0UzimfAc7Ze+UNwhXJhinFRJ3YuR+xiOTpPkl1GXPhLgFSQhekz4KepcbQEQKejb jg0dum1oBYIXZTSSbiO9rNmfUVLB5DcV0vZbSrGxLjWLBt5U8N2xf2d1bvkQW+bw Kklf9OG26bAi27tujurzN3r3AgMBAAGjIzAhMA4GA1UdDwEB/wQEAwICpDAPBgNV HRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAM0CN3n5C/KOT4uZ4ewwKK rHmANBPVM9u6MJBO8U62HcqLeoCuDFeU8zmUjLHjsQaPX64mJZlR7T5y52gEKO5A 0qsBz3pg/vJ5DJTv0698+1Q1hB9k3smQdksAim19FZqysB7J4zK/+8aJ/q2kIFvs Jk3ekwQdQ3xfggklBQVuf76gr1v0uYlPtfPffPlfcGZ06Im6mqbajenXoR1PxPB0 +zyCS8DkgPtDulplruwvXCFMYw9TPbzXKlt7tlsqRXogYLnxWJDzM1nOYCnD+rDm qxenV9Ir8RqZ0XSYuUyzRka5N4dhIhrzTAiNdeU5gzynXOz67u/Iefz1iK9ZcdE3 -----END CERTIFICATE-----
自動の証明書管理を使用してFEPClusterをデプロイする
自動の証明書管理を使用してFEPClusterをデプロイする例として、以下にyamlを示します。 MTLS関連のパラメータは赤字で強調表示されています。
apiVersion: fep.fujitsu.io/v2 kind: FEPCluster metadata: name: mydb namespace: my-namespace spec: fep: usePodName: true
patroni:
tls:
certificateName: mydb-patroni-cert
postgres:
tls:
certificateName: mydb-fep-cert
forceSsl: true podAntiAffinity: false mcSpec: limits: cpu: 500m memory: 700Mi requests: cpu: 200m memory: 512Mi customAnnotations: allDeployments: {} servicePort: 27500 image: image: 'quay.io/fujitsu/fujitsu-enterprise-postgres-16-server:ubi9-16-1.0' pullPolicy: IfNotPresent sysExtraLogging: false podDisruptionBudget: false instances: 3 syncMode: 'on' fepChildCrVal: customPgAudit: | # define pg audit custom params here to override defaults. # if log volume is not defined, log_directory should be # changed to '/database/userdata/data/log' [output] logger = 'auditlog' log_directory = '/database/log/audit' [rule] customPgHba: | # define pg_hba custom rules here to be merged with default rules. # TYPE DATABASE USER ADDRESS METHOD hostssl all all 0.0.0.0/0 cert
hostssl replication all 0.0.0.0/0 cert customPgParams: >+ # define custom postgresql.conf parameters below to override defaults. # Current values are as per default FEP deployment shared_preload_libraries='pgx_datamasking,pgaudit,pg_prewarm' session_preload_libraries='pg_prewarm' max_prepared_transactions = 100 max_worker_processes = 30 max_connections = 100 work_mem = 1MB maintenance_work_mem = 12MB shared_buffers = 128MB effective_cache_size = 384MB checkpoint_completion_target = 0.8 # tcp parameters tcp_keepalives_idle = 30 tcp_keepalives_interval = 10 tcp_keepalives_count = 3 # logging parameters in default fep installation # if log volume is not defined, log_directory should be # changed to '/database/userdata/data/log' log_directory = '/database/log' log_filename = 'logfile-%a.log' log_file_mode = 0600 log_truncate_on_rotation = on log_rotation_age = 1d log_rotation_size = 0 log_checkpoints = on log_line_prefix = '%e %t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h' log_lock_waits = on log_autovacuum_min_duration = 60s logging_collector = on pgaudit.config_file='/opt/app-root/src/pgaudit-cfg/pgaudit.conf' log_replication_commands = on log_min_messages = WARNING log_destination = stderr # wal_archive parameters in default fep installation archive_mode = on archive_command = '/bin/true' wal_level = replica max_wal_senders = 12 wal_keep_segments = 64 storage: dataVol: size: 2Gi storageClass: nfs-client walVol: size: 1200Mi storageClass: nfs-client logVol: size: 1Gi storageClass: nfs-client sysUsers: pgAdminPassword: admin-password pgdb: mydb pgpassword: mydbpassword pguser: mydbuser pgrepluser: repluser pgreplpassword: repluserpwd pgRewindUser: rewinduser pgRewindPassword: rewinduserpwd pgAdminTls: certificateName: mydb-postgres-cert
sslMode: verify-full
pgrepluserTls:
certificateName: mydb-repluser-cert
sslMode: verify-full
pgRewindUserTls:
certificateName: mydb-rewinduser-cert
sslMode: verify-full
tdepassphrase: tde-passphrase systemCertificates: key: |- -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA0DFkImha8CIJiVcwXbBPlL+/DmS9/ipRhQQHxfO5x7jSOnse IHdFd6+Qx2GX8KAiAhVykf6kfacwBYTATU1xDgwWTm82KVRPh+kZDIj2wPcJr14m mTP6I6a2mavUgDhezHc9F8/dchYj3cw81X0kU6xamqrKQYlxQH48NkI0qcwhO6sK AHF4eWfCr8Ot44xADIA1JcU2CS1RKSZEtURZ+30Py+j907Enjp1YR33ZKUHw30pU 9dpIneyfXBN/pT6cX3MetYwtgmpV/pHqY8pbxqGfoyRhgQDsSRCl4dtlecaZeZ4j uTOotcPkZELHP6eu8gaLtycG9lpbAMQl5w0r8QIDAQABAoIBACq213qPuoimExrQ fqXaNJmqNYK4fJqXCB6oUwf0F1u4ubkx5V532hLSPHwLs+a0lAWlbNozSoBVOu8G 64VwrA9bv3/cJVqZZ6/UzUTbHPU+Ogh24qhwF5QU8kXZEUI1To3YsPoftalgjX9G Ff0fLcLVC8nL3K9RiaDXxXbEYpWrYu39M3FCpAXAzV2PrNxsP9PKyNWHnBPc08z5 tFj45/bHn+j31AVVvgWtqz0pLks57hc4Q7yW/2RoRYq2md1KI709OLNwtkWEOVqb qnraorh2TwGnNaOB5oX5/lJvKtlq778fw96jGqykBr0+DKozj9rlr1OGgYOKDwlD nsZJPAECgYEA+Oqf/fxtPdsNGiaL2Z/heewvtaxjw/WoEVBFECb6/y4Ro7aux9nB 16FcVi79Cwfp0UTJ7cnZvYSmBk5GWEObEIAeo61lvm/QeltM5+usAPd5/TcHXLYe 92OnXmq7h3F4UXEkMayak8Lpu/TdmR5uOaL+m4aEu+XMY5tlxqDCnyECgYEA1h4X jCPi7Ja5CHK7a2Ud4TL2DNpIBE6GSK9iQ+0xFL6TsiK2Sfu6n8mx2sh+Jm0KHTiE /gWHdHQZSSWiuULfHoYEq3Rq8S6Av3GsGtRSpO03j7BE8C20Vpt0FnNTjZmdzf2/ YZxc5KuYLh9qeY7Y7ceOsWA8JckDgMHPYzyLAtECgYBALD0TPgDr8Y1vMIDdmlqH FF04eTk/TBYIYKltgJ81KqthibeFzp4q+W7UyUhzj5a4XQOySlfYhFpJReTc3JEd r+o2SH3ymuEkqmUpZZjyptrMbWN4g3t4TDjaHqo6QQbD+GdcZyNy9M1Np9N5pl7E fUEm14dg6d3H0Ehs7QVAAQKBgQDRUx3mLXc9oKRINBIyDerGLJILQqLBQxtYl81T ZuFizGWL8w+PCIAMkpxDrVpWqqcGpiiuRi2ElbPapOaOg2epaY/LJscd/j5z6uc8 W3JoNljpKoRa4fO578Pv5tM6TYHOzlF5Veoiy/a8sI3hRNuiqkM/+TsUHY5FJDRh aeDk4QKBgCOHIevvR+MWuwakzD6lNCbb8H6fvZ3WRAT8BYYz3wW9YfnV4J4uh/Bl moWYgIK2UpkrhA8scMUC790FoybQeParQ35x7Jl91bmTKkCqsX63fyqqYhx3SXRl JSktmH4E2cGmosZisjB7COKHR32w0J5JCgaGInQxjldbGrwhZQpn -----END RSA PRIVATE KEY----- crt: |- -----BEGIN CERTIFICATE----- MIID2DCCAsCgAwIBAgIQDfFYteD4kZj4Sko2iy1IJTANBgkqhkiG9w0BAQsFADBX MRgwFgYDVQQKEw9NeSBPcmdhbml6YXRpb24xCzAJBgNVBAsTAkNBMS4wLAYDVQQD EyVNeSBPcmdhbml6YXRpb24gQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTIxMDQy MDAwMDQ1OVoXDTIxMDQyMDAxMDQ1OVowGDEWMBQGA1UEAwwNKi5jaGctcHRjLnBv ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAxZCJoWvAiCYlXMF2w T5S/vw5kvf4qUYUEB8Xzuce40jp7HiB3RXevkMdhl/CgIgIVcpH+pH2nMAWEwE1N cQ4MFk5vNilUT4fpGQyI9sD3Ca9eJpkz+iOmtpmr1IA4Xsx3PRfP3XIWI93MPNV9 JFOsWpqqykGJcUB+PDZCNKnMITurCgBxeHlnwq/DreOMQAyANSXFNgktUSkmRLVE Wft9D8vo/dOxJ46dWEd92SlB8N9KVPXaSJ3sn1wTf6U+nF9zHrWMLYJqVf6R6mPK W8ahn6MkYYEA7EkQpeHbZXnGmXmeI7kzqLXD5GRCxz+nrvIGi7cnBvZaWwDEJecN K/ECAwEAAaOB3jCB2zATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA MIG1BgNVHREEga0wgaqCCWxvY2FsaG9zdIIbKi5jaGctcHRjLnBvZC5jbHVzdGVy LmxvY2FsghMqLm15ZGItaGVhZGxlc3Mtc3ZjghsqLm15ZGItaGVhZGxlc3Mtc3Zj LmNoZy1wdGOCHyoubXlkYi1oZWFkbGVzcy1zdmMuY2hnLXB0Yy5zdmOCLSoubXlk Yi1oZWFkbGVzcy1zdmMuY2hnLXB0Yy5zdmMuY2x1c3Rlci5sb2NhbDANBgkqhkiG 9w0BAQsFAAOCAQEALnhliDflu+BHp5conq4dXBwD/Ti2YR5TWQixM/0a6OD4KecZ MmaLl0T+OJJvA/j2IufZpc7dzEx5mZDkR2CRmoq10qZXqCRTrBZSXm6ARQWoYpeg 9c0l4f8roxrkMGUKVPTKUwAvbnNYhD2l6PlBPwMpkMUfqFaSEXMaPyQKhrtQxdpH WjuS54OP0lm0peYu/yiaD98LtrTXnb6jch84SKf6Vii4HAVQyMeJaW+dpkqcI2+V Q4fkwWYSJy8BNcmXCwvHDLDy+s4EXWvHafhusuUhcp4HyMb1A6hd5hJhgFSnEvLy kLA0L9LaScxee6V756Vt9TN1NGjwmwyQDOhnQQ== -----END CERTIFICATE----- cacrt: |- -----BEGIN CERTIFICATE----- MIIDXDCCAkSgAwIBAgIRAMPzF3BNFxT9HWE+NXlFQjQwDQYJKoZIhvcNAQELBQAw VzEYMBYGA1UEChMPTXkgT3JnYW5pemF0aW9uMQswCQYDVQQLEwJDQTEuMCwGA1UE AxMlTXkgT3JnYW5pemF0aW9uIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0yMTA0 MTkwNDQ0MjNaFw0zMTA0MTcwNDQ0MjNaMFcxGDAWBgNVBAoTD015IE9yZ2FuaXph dGlvbjELMAkGA1UECxMCQ0ExLjAsBgNVBAMTJU15IE9yZ2FuaXphdGlvbiBDZXJ0 aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQC5t6CS23Glk65YMw5e4i4xHldyxkCZS67w/6LWqeIlYKmFAaEl83WWy8MHUpOb 4mahtUafEzDEOX6+URf72J8m0voldQ5FYr1AyUOyX8U90wGFqhbEgKRqt7vZEwIe 2961fwqHh6917zI4xmt5W6ZJ5dBQVtkhzB+Pf7O6KBYjHoCnBBkfNVzsfZQ/1hnR 0UzimfAc7Ze+UNwhXJhinFRJ3YuR+xiOTpPkl1GXPhLgFSQhekz4KepcbQEQKejb jg0dum1oBYIXZTSSbiO9rNmfUVLB5DcV0vZbSrGxLjWLBt5U8N2xf2d1bvkQW+bw Kklf9OG26bAi27tujurzN3r3AgMBAAGjIzAhMA4GA1UdDwEB/wQEAwICpDAPBgNV HRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAM0CN3n5C/KOT4uZ4ewwKK rHmANBPVM9u6MJBO8U62HcqLeoCuDFeU8zmUjLHjsQaPX64mJZlR7T5y52gEKO5A 0qsBz3pg/vJ5DJTv0698+1Q1hB9k3smQdksAim19FZqysB7J4zK/+8aJ/q2kIFvs Jk3ekwQdQ3xfggklBQVuf76gr1v0uYlPtfPffPlfcGZ06Im6mqbajenXoR1PxPB0 +zyCS8DkgPtDulplruwvXCFMYw9TPbzXKlt7tlsqRXogYLnxWJDzM1nOYCnD+rDm qxenV9Ir8RqZ0XSYuUyzRka5N4dhIhrzTAiNdeU5gzynXOz67u/Iefz1iK9ZcdE3 -----END CERTIFICATE-----
MTLSを有効にするには、次のパラメータを変更します
Key | Value | Details |
---|---|---|
spec.fep.usePodName | True | MTLSの場合、このキーを定義してtrueに設定する必要があります。 MTLSを使用しないTLS接続の場合、省略できます。 ただし、これもtrueに設定することをお勧めします。 |
spec.fep.patroni.tls.certificateName | <secret-name> | Patroni RESTAPIのtls.crtの証明書とtls.keyの秘密鍵を含むKubernetesシークレットの名前。 MTLS Patroni REST API通信の場合、このキーを定義する必要があります。 秘密鍵をパスワードで保護することはできません。 cert-managerを使用する場合、シークレットにはca.crtのCAバンドルも含まれます。 |
spec.fep.patroni.tls.caName | <configmap-name> | CAバンドルを含むKubernetesconfigmapの名前。 cert-managerを使用している場合、ca.crtはすでに上記のシークレットに含まれています。 この場合、このキーは省略できます。 |
spec.fep.postgres.tls.certificateName | <secret-name> | Postgresサーバのtls.crtの証明書とtls.keyの秘密鍵を含むKubernetesシークレットの名前。 MTLS Postgres通信の場合、このキーを定義する必要があります。 秘密鍵はパスワードで保護できます。 cert-managerを使用する場合、シークレットにはca.crtのCAバンドルも含まれます。 |
spec.fep.postgres.tls.caName | <configmap-name> | CAバンドルを含むKubernetesconfigmapの名前。 cert-managerを使用している場合、ca.crtはすでに上記のシークレットに含まれています。 この場合、このキーは省略できます。 |
spec.fep.postgres.tls.privateKeyPassword | <secret-name> | Postgresサーバの秘密鍵のパスワードを含むKubernetesシークレットの名前。. |
spec.fepChildCrVal.sysUsers.pgAdminTls.certificateName | <secret-name> | 「postgres」ユーザーのtls.crtの証明書とtls.keyの秘密鍵を含むKubernetesシークレットの名前。 MTLS Postgres通信の場合、このキーを定義する必要があります。 秘密鍵をパスワードで保護することはできません。 cert-managerを使用する場合、シークレットにはca.crtのCAバンドルも含まれます。 |
spec.fepChildCrVal.sysUsers.pgAdminTls.caName | <configmap-name> | CAバンドルを含むKubernetesconfigmapの名前。 cert-managerを使用している場合、ca.crtはすでに上記のシークレットに含まれています。この場合、このキーは省略できます。 |
spec.fepChildCrVal.sysUsers.pgAdminTls.sslMode | verify-full | MTLSの場合、この値をverify-fullに設定する必要があります。TLSのみが必要な場合は、verify-caまたはpreferに設定できます。 |
spec.fepChildCrVal.sysUsers.pgrepluserTls.certificateName | <secret-name> | 「repluser」ユーザーのtls.crtの証明書とtls.keyの秘密鍵を含むKubernetesシークレットの名前。MTLS Postgres通信の場合、このキーを定義する必要があります。 秘密鍵をパスワードで保護することはできません。 cert-managerを使用する場合、シークレットにはca.crtのCAバンドルも含まれます。 |
spec.fepChildCrVal.sysUsers.pgrepluserTls.caName | <configmap-name> | CAバンドルを含むKubernetesconfigmapの名前。 cert-managerを使用している場合、ca.crtはすでに上記のシークレットに含まれています。 この場合、このキーは省略できます。 |
spec.fepChildCrVal.sysUsers.pgrepluserTls.sslMode | verify-full | MTLSの場合、この値をverify-fullに設定する必要があります。 TLSのみが必要な場合は、verify-caまたはpreferに設定できます。 |
spec.fepChildCrVal.sysUsers.pgRewindUserTls.certificateName | <secret-name> | 「rewinduser」ユーザーのtls.crtの証明書とtls.keyの秘密鍵を含むKubernetesシークレットの名前。MTLS Postgres通信の場合、このキーを定義する必要があります。 秘密鍵をパスワードで保護することはできません。 cert-managerを使用する場合、シークレットにはca.crtのCAバンドルも含まれます。 |
spec.fepChildCrVal.sysUsers.pgRewindUserTls.caName | <configmap-name> | CAバンドルを含むKubernetesconfigmapの名前。 cert-managerを使用している場合、ca.crtはすでに上記のシークレットに含まれています。この場合、このキーは省略できます。 |
spec.fepChildCrVal.sysUsers.pgRewindUserTls.sslMode | verify-full | MTLSの場合、この値をverify-fullに設定する必要があります。TLSのみが必要な場合は、verify-caまたはpreferに設定できます。 |
MTLSを実行するには、pg_hba.confをカスタマイズする必要もあります。 以下は2つの可能な設定です。
spec.fep.customPgHba | hostssl all all 0.0.0.0/0 cert |
上記の設定により、FEPサーバは認証を実行します。同時に、クライアント証明書の信頼性を検証します。
spec.fep.customPgHba | hostssl all all 0.0.0.0/0 md5 clientcert=verify-full |
上記の設定により、FEPサーバはmd5認証を実行し、クライアント証明書の信頼性を検証します。