多くの人と同じように、SSL接続に新しいrds-ca-2019証明書を使用するようにRDSインスタンスを更新するよう通知するメールを受け取りました(以前は2020年3月5日で有効期限が切れるrds-ca-2015です)。彼らの プロセスに関するドキュメント は少しまばらで、「新しいSSL/TLS証明書を使用するようにデータベースアプリケーションを更新する」のようなことを言っています。および「オペレーティングシステムに証明書をインポートします。」クライアント側で必要な変更に関する詳細はありません。
最初にセットアップしたとき、証明書をインストールせず、Vanilla Ubuntu 18.04 EC2イメージを使用しました。 RDSインスタンスはrds-ca-2015を使用するように設定されており、psqlでRDSに接続すると、TLSv1.2が適切に使用されていると報告されました。 OSにインストールされているルート証明書を見ると、1から4の番号が付いた4つの「AmazonルートCA」証明書が見つかります。これらの証明書は、2038および2040まで有効期限が切れません。
だから、私の質問は2つの部分があります:
PostgreSQLのデフォルトsslmode
はprefer
です。これは、サーバーから提供された証明書で接続を暗号化しますが、検証はしません。 sslmode
設定をverify-ca
またはverify-full
に変更すると、中間証明書を特定のディレクトリにインストールする必要があり、適切な検証が行われます。
私はVPCに対するMITM攻撃を心配していないので、「確認」モードに切り替える必要はないと思います。
問題のRDS証明書は、中間証明書です。これはCA証明書としても知られています。たとえば、MySQL Workbenchを使用する場合、それを指定する必要があります
[証明書]をインストールしたことがない場合、SSL/TLSは最初どのように適切に機能しましたか?
システムのセットアップ方法によって異なります。 CA証明書は、提示された証明書に信頼できる機関を提供するだけです。確認を試みずに、証明書を受け入れるものを設定することは可能です(つまり、自己署名証明書を使用します)。もう1つのオプションは、CAストアに暗黙的にそれを信頼するものがあることです。これは可能性は低いですが、不可能ではありません。
これをローカルで行う場合(RDSインスタンスと同じVPCにEC2インスタンスがある場合など)、SSLは必要ない場合もあります。
RDSデータベースインスタンスを変更してrds-ca-2019を使用するように変更し、「正常に機能する」ように見える場合、他に必要なことはありますか?
いいえ、混乱を招きますが、接続していて証明書エラーが発生しない場合は、心配する必要はありません。
Ubuntuで、次の説明に従ってca-certを追加します。 https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate
wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
Sudo mkdir /usr/local/share/ca-certificates/aws
Sudo mv rds-ca-2019-root.pem /usr/local/share/ca-certificates/aws
Sudo openssl x509 \
-in /usr/local/share/ca-certificates/aws/rds-ca-2019-root.pem \
-inform PEM \
-out /usr/local/share/ca-certificates/aws/rds-ca-2019-root.crt
Sudo update-ca-certificates
: Sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
Adding debian:rds-ca-2019-root.pem
done.
done.
このリンクは、Djangoアプリケーションのssl証明書の場所を設定する方法を示しています: https://www.digitalocean.com/community/questions/how-to-connect-managed- database-postgres-with-ssl-mode-varify-full-in-Django-app
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': '<name>',
'USER': '<user>',
'PASSWORD': '<password>',
'Host' : '<Host>',
'PORT' : '25060',
'OPTIONS':{
'sslmode':'verify-full',
'sslrootcert': os.path.join(BASE_DIR, 'ca-certificate.crt')
}
Stackoverflowのこの投稿 https://stackoverflow.com/a/58214922/1415254 は、psqlのコマンドラインパラメーターを使用して接続する方法を説明しています。
psql "Host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} \
sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} \
dbname={db}"
また
psqlrc and ~/.psqlrc
Unless it is passed an -X or -c option, psql attempts to read and execute commands
from the system-wide startup file (psqlrc) and then the user's personal startup
file (~/.psqlrc), after connecting to the database but before accepting normal
commands. These files can be used to set up the client and/or the server to taste,
typically with \set and SET commands.
詳細はこちら(最後にあります): https://info.crunchydata.com/blog/ssl-certificate-authentication-postgresql-docker-containers
# the first parameter specifies which TLS mode to use to connect
export PGSSLMODE="verify-full"
# the following two parameters point to the client key/certificate
export PGSSLCERT="`pwd`/certs/client.crt"
export PGSSLKEY="`pwd`/keys/client.key"
# this parameter points to the trusted root CA certificate
export PGSSLROOTCERT="`pwd`/certs/ca.crt"
ここに環境変数の完全なリスト: https://www.postgresql.org/docs/9.2/libpq-envars.html
この証明書の更新には2つの側面があります。
Postgresは、クライアントが接続するデフォルトの方法として「優先」を使用します。つまり、クライアントはSSLを使用できる場合は試行しますが、そうでない場合はフォールバックします。したがって、デフォルトの接続構成を持つ既存のクライアントは引き続き動作します。
投稿OPが自分自身に答えたように、postgresのデフォルトのsslmodeはprefer
に設定されています。これはドキュメントからの抜粋です。
I don't care about encryption, but I wish to pay the overhead of encryption if the server supports it.
したがって、デフォルトでは、pgドライバーは指定されない限り証明書を検証しません。これがまさにOPの元の質問の理由であり、最初からそのままで機能し、RDSがrds-ca-2019
にアップグレードされた後にも機能します。
Postgresに接続するための環境変数の1つは、DATABASE_URL
を介した形式です。
postgres://username:password@Host/database?sslmode=verify-full&sslrootcert=config/ca/rds-combined-ca-bundle.pem
中間証明書を確認する場合は、ここでsslmode
およびsslrootcert
を指定できます。 sslrootcert
の内容は次のいずれかである必要があります...
https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
HTH
RDSの認証局をrds-ca-2019にアップグレードする前に、接続を中断することなく、クライアント側で証明書をアップグレードできます。
RDSにrds-ca-2015がある場合、これでクライアント側のキーをアップグレードする必要があります https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem 。
AWSドキュメントのとおり https://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html rds-combined-ca-bundle.pemファイルには両方の中間証明書があると記載されていますそして根。
アプリケーションがcombined-caファイルを作成したら、RDSを認証局rds-ca-2019にアップグレードする必要があります。
このようにして、ダウンタイムなしで、RDSの認証局をrds-ca-2019にアップグレードできます。
2019年11月1日以降に作成された新しいRDS DBインスタンスは、デフォルトで新しい証明書を使用します。 RDSインスタンスが上記の日付より前に作成されている場合は、証明書を更新する必要があります。
DBインスタンスの認証局をrds-ca-2015からrds-ca-2019に変更するには