オペレーターが証明書を自動的に生成し、コンテナ間の通信をMTLSにすることで安全性を向上することができます。
Kubernetes環境にcert-managerがインストールされている場合はcert-managerを利用し、cert-managerがインストールされていない場合はコンテナ内のopensslコマンドを利用して証明書を生成します。
証明書が自動生成される場合、デフォルトのPostgreSQLへの接続方法は相互認証TLS通信のみです。
ユーザーごとに認証方法を変更する場合には、spec.fepChildCrVal.customPgHbaでユーザーごとの接続方法を定義してください。
証明書の自動生成機能を変更するには下記のConfigMap“fepopr-cert-methood”をオペレーターのインストール前に作成してください。data.fepopr-cert-methodには、cert-manager、openssl、disableを指定することができます。証明書の自動生成機能を無効にする場合は、disableを記載します。
$ cat > /tmp/cert-method.yaml <<EOF kind: ConfigMap apiVersion: v1 metadata: name: fepopr-cert-method immutable: true data: fepopr-cert-method: disable EOF $ kubectl -n <namespace> apply -f /tmp/cert-method.yaml
また、手動で作成した証明書を利用する場合は、“4.8.2 独自の証明書を利用する場合”を参照してください。
独自の証明書を利用する場合は、証明書の自動生成機能を無効にしてください。
証明書の自動生成機能では、データベース管理のためのシステムユーザーの証明書を自動生成します。データベースに接続する一般ユーザーの証明書を作成する場合は次の手順を参照してください。
ここでは、クライアントコンテナにマウントする証明書が格納されたSecretリソースを作成する方法を説明します。作成されたSecretリソースをクライアントのPodにマウントして、証明書認証でFEPClusterに接続するために利用することができます。
Issuerリソース“<namespace>-ca-issuer”があることを確認します。
Certificateリソースのテンプレートを作成します。
$ cat mydbuser-cert.yaml apiVersion:cert-manager.io/v1 kind:Certificate metadata: name: "<fepclustername>-<username>-cert" namespace: "<namespace>" spec: commonName: "< username >" issuerRef: name: <namespace>-ca-issuer secretName: "<fepclustername>-<username>-cert"
Certificateリソースをアプライします。
$ kubectl apply -f mydbuser-cert.yaml
Secret“fepopr-root-secret”に格納されたCA証明書を取得します。
$ kubectl -n <namespace> get secret fepopr-root-secret-o jsonpath='{.data.tls\.key}' | base64 -d > <namespace>-ca.key $ kubectl -n <namespace> get secret fepopr-root-secret-o jsonpath=’{.data.tls\.crt}’ | base64 -d > <namespace>-ca.crt
次のコマンドを使用して証明書を作成します。
$ serial=$(openssl rand -hex 8) $ openssl genrsa -out <fepclustername>-<username>.key 2048 $ openssl req -new -key <fepclustername>-<username>.key -out <fepclustername>-<username>.csr -subj “/CN=<username>” $ openssl x509 -req -in <fepclustername>-<username>.csr -CA <namespace>-ca.crt -CAkey <namespace>-ca.key -set_serial “0x${serial}” -out <fepclustername>-<username>.crt -days 365
証明書を格納するシークレットを作成します。
$ kubectl -n <namespace> create secret tls <fepclustername>-<username>-cert --cert <fepclustername>-<username>.crt -key=<fepclustername>-<username>.key