作業の概要
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