第2章 Red Hat Quay と SQL 間の証明書ベースの認証
Red Hat Quay 管理者は、クライアント側認証用に独自の SSL/TLS 証明書を提供することで、Red Hat Quay と SQL (PostgreSQL および GCP CloudSQL) 間の証明書ベースの認証を設定できます。これにより、セキュリティーが強化され、Red Hat Quay レジストリーの自動化が容易になります。
次のセクションでは、Red Hat Quay と PostgreSQL、および Red Hat Quay と CloudSQL の間で証明書ベースの認証を設定する方法を説明します。
2.1. SQL による証明書ベースの認証の設定
次の手順では、安全なクライアント側証明書を使用して、Red Hat Quay を SQL データベースに接続する方法を示します。この方法では、信頼できる認証局 (CA) に対して SQL サーバーの証明書を検証するため、証明書信頼検証を通じて接続と認証の両方が確保されます。これにより、Red Hat Quay と SQL サーバー間の接続のセキュリティーが強化され、デプロイメントの自動化が簡素化されます。この例では Google Cloud Platform の CloudSQL を使用していますが、この手順は PostgreSQL やその他のサポートされているデータベースにも適用されます。
前提条件
-
カスタム認証局 (CA) が生成され、CloudSQL データベースとの SSL 接続を生成するために使用される
PEM
形式の SSL/TLS 証明書とキーが利用可能となっている。詳細は、Red Hat Quay の SSL および TLS を参照してください。 -
base64
で元の設定バンドルをconfig.yaml
ファイルにデコードしている。詳細は、既存の設定のダウンロード を参照してください。 -
外部で管理されている PostgreSQL または CloudSQL データベースを使用している。詳細は、
DB_URI
変数が設定された 既存の PostgreSQL データベースの使用 を参照してください。 - 外部で管理されている PostgreSQL または CloudSQL データベースが SSL/TLS 用に設定されている。
-
QuayRegistry
CRD のpostgres
コンポーネントがmanaged: false
に設定され、CloudSQL データベースがDB_URI
設定変数で設定されている。次の手順では、postgresql://<cloudsql_username>:<dbpassword>@<database_host>:<port>/<database_name>
を使用します。
手順
CloudSQL データベースの CA と SSL/TLS 証明書およびキーを生成し、それらが
.pem
形式であることを確認したら、CloudSQL サーバーへの SSL 接続をテストします。次のコマンドを入力して、CloudSQL サーバーへの接続を開始します。
$ psql "sslmode=verify-ca sslrootcert=<ssl_server_certificate_authority>.pem sslcert=<ssl_client_certificate>.pem sslkey=<ssl_client_key>.pem hostaddr=<database_host> port=<5432> user=<cloudsql_username> dbname=<cloudsql_database_name>"
Red Hat Quay ディレクトリーで、次のコマンドを実行して、新しい YAML ファイル (例:
quay-config-bundle.yaml)
を作成します。$ touch quay-config-bundle.yaml
次のコマンドを入力して、
postgresql-client-certs
リソースを作成します。$ oc -n <quay_namespace> create secret generic postgresql-client-certs \ --from-file config.yaml=<path/to/config.yaml> 1 --from-file=tls.crt=<path/to/ssl_client_certificate.pem> 2 --from-file=tls.key=<path/to/ssl_client_key.pem> 3 --from-file=ca.crt=<path/to/ssl_server_certificate.pem> 4
`quay-config-bundle.yaml
ファイルを編集して、次のデータベース接続設定を含めます。重要-
DB_CONNECTION_ARGS
変数に含まれる情報 (例:sslmode
、sslrootcert
、sslcert
、sslkey
) は、DB_URI
変数に追加された情報と一致する 必要があります。一致しない場合は、接続に失敗する可能性があります。 -
カスタムファイル名またはパスを指定することはできません。
sslrootcert
、sslcert
、およびsslkey
の証明書ファイルパスはハードコードされたデフォルトであり、Kubernetes シークレットからQuay
Pod にマウントされます。次の命名規則に従わないと、接続が失敗します。
DB_CONNECTION_ARGS: autorollback: true sslmode: verify-ca 1 sslrootcert: /.postgresql/root.crt 2 sslcert: /.postgresql/postgresql.crt 3 sslkey: /.postgresql/postgresql.key 4 threadlocals: true 5 DB_URI: postgresql://<dbusername>:<dbpassword>@<database_host>:<port>/<database_name>?sslmode=verify-full&sslrootcert=/.postgresql/root.crt&sslcert=/.postgresql/postgresql.crt&sslkey=/.postgresql/postgresql.key 6
- 1
verify-ca
を使用すると、データベース接続で SSL/TLS が必ず使用され、信頼できる CA に対してサーバー証明書が検証されます。これは、信頼できる CA 証明書と自己署名 CA 証明書の両方で機能します。ただし、このモードではサーバーのホスト名は検証されません。完全なホスト名と証明書の検証には、verify-full
を使用します。使用可能な設定オプションの詳細は、PostgreSQL SSL/TLS 接続引数 を参照してください。- 2
root.crt
ファイルには、CloudSQL データベースとの SSL/TLS 接続を検証するために使用されるルート証明書が含まれています。このファイルは、Kubernetes シークレットからQuay
Pod にマウントされています。- 3
postgresql.crt
ファイルには、CloudSQL データベースへの接続を認証するために使用されるクライアント証明書が含まれています。このファイルは、Kubernetes シークレットからQuay
Pod にマウントされています。- 4
postgresql.key
ファイルには、クライアント証明書に関連付けられた秘密鍵が含まれています。このファイルは、Kubernetes シークレットからQuay
Pod にマウントされています。- 5
- 接続の自動ロールバックを有効にします。
- 6
- CloudSQL データベースにアクセスする URI。
sslmode
タイプ、root.crt
、postgresql.crt
、postgresql.key
ファイルを追加する必要があります。DB_URI
に含まれる SSL/TLS 情報は、DB_CONNECTION_ARGS
で提供される情報と一致する必要があります。CloudSQL を使用している場合は、この変数にデータベースのユーザー名とパスワードを含める必要があります。
-
次のコマンドを入力して、
configBundleSecret
リソースを作成します。$ oc create -n <namespace> -f quay-config-bundle.yaml
出力例
secret/quay-config-bundle created
次のコマンドを入力して、
QuayRegistry
YAML ファイルを更新し、quay-config-bundle
オブジェクトを参照します。$ oc patch quayregistry <registry_name> -n <namespace> --type=merge -p '{"spec":{"configBundleSecret":"quay-config-bundle"}}'
出力例
quayregistry.quay.redhat.com/example-registry patched
次のコマンドを入力して、
QuayRegistry
YAML ファイルが更新され、追加の CA 証明書configBundleSecret
リソースが使用されるようにします。$ oc get quayregistry <registry_name> -n <namespace> -o yaml
出力例
# ... configBundleSecret: quay-config-bundle # ...