web-dev-qa-db-ja.com

「Amazon RDS SSL / TLS証明書を2019年10月31日までに更新してください」

多くの人と同じように、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つの部分があります:

  1. Amazonが提供するRDS証明書と中間証明書 をインストールしたことがない場合、SSL/TLSは最初どのように適切に機能しましたか?
  2. RDSデータベースインスタンスを変更してrds-ca-2019を使用するように変更し、「正常に機能する」ように見える場合、他に必要なことはありますか?
19
Tim Tisdall

PostgreSQLのデフォルトsslmodeprefer です。これは、サーバーから提供された証明書で接続を暗号化しますが、検証はしません。 sslmode設定をverify-caまたはverify-fullに変更すると、中間証明書を特定のディレクトリにインストールする必要があり、適切な検証が行われます。

私はVPCに対するMITM攻撃を心配していないので、「確認」モードに切り替える必要はないと思います。

13
Tim Tisdall

問題のRDS証明書は、中間証明書です。これはCA証明書としても知られています。たとえば、MySQL Workbenchを使用する場合、それを指定する必要があります

  1. SSL(TLS)を使いたい
  2. RDS CAチェーンファイルを使用して証明書を確認する

MySQL Workbench

[証明書]をインストールしたことがない場合、SSL/TLSは最初どのように適切に機能しましたか?

システムのセットアップ方法によって異なります。 CA証明書は、提示された証明書に信頼できる機関を提供するだけです。確認を試みずに、証明書を受け入れるものを設定することは可能です(つまり、自己署名証明書を使用します)。もう1つのオプションは、CAストアに暗黙的にそれを信頼するものがあることです。これは可能性は低いですが、不可能ではありません。

これをローカルで行う場合(RDSインスタンスと同じVPCにEC2インスタンスがある場合など)、SSLは必要ない場合もあります。

RDSデータベースインスタンスを変更してrds-ca-2019を使用するように変更し、「正常に機能する」ように見える場合、他に必要なことはありますか?

いいえ、混乱を招きますが、接続していて証明書エラーが発生しない場合は、心配する必要はありません。

7
Machavity

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

4
vinh

この証明書の更新には2つの側面があります。

  1. サーバー側:2019-11-01より前に作成されたRDSインスタンスは再起動が必要です。これにより、約5分の停止が発生します。これにより、新しい証明書が配置されるように更新されます。
  2. クライアントがSSLを使用している場合(デフォルトではオフ/優先)、クライアントが実行されているすべての場所でAWSからの証明書(中間+チェーン)を更新する必要があります。

Postgresは、クライアントが接続するデフォルトの方法として「優先」を使用します。つまり、クライアントはSSLを使用できる場合は試行しますが、そうでない場合はフォールバックします。したがって、デフォルトの接続構成を持つ既存のクライアントは引き続き動作します。

2
Ron Wail

投稿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

2
MrAtheist

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にアップグレードできます。

1
Piyush Sonigra

2019年11月1日以降に作成された新しいRDS DBインスタンスは、デフォルトで新しい証明書を使用します。 RDSインスタンスが上記の日付より前に作成されている場合は、証明書を更新する必要があります。

DBインスタンスの認証局をrds-ca-2015からrds-ca-2019に変更するには

  1. AWSマネジメントコンソールにサインインし、Amazon RDSコンソールを https://console.aws.Amazon.com/rds/ で開きます。
  2. ナビゲーションペインで、[Databases]を選択してから、変更するDBインスタンスを選択します。
  3. 変更を選択します。 [DBインスタンスの変更]ページが表示されます。添付ファイルを参照
  4. [ネットワークとセキュリティ]セクションで、rds-ca-2019を選択します。添付ファイルを参照してください。
  5. 続行を選択し、変更の概要を確認します。
  6. 変更をすぐに適用するには、「すぐに適用」を選択します。このオプションを選択すると、停止が発生します。
  7. 確認ページで、変更を確認します。正しい場合は、[Modify DB Instance]を選択して変更を保存します。
0