Я, как и многие люди, получил электронное письмо с просьбой обновить мой экземпляр RDS для использования нового сертификата rds-ca-2019 для SSL-соединений (предыдущий был rds-ca-2015, срок действия которого истекает 5 марта, 2020). Их документация по процессу немного скудна и говорит что-то вроде «Обновите приложения базы данных, чтобы использовать новый сертификат SSL / TLS». и «Импортируйте сертификат в вашу операционную систему». без дополнительных подробностей об изменениях, требуемых на стороне клиента.
Когда я изначально все настраивал, я не устанавливал никаких сертификатов и использовал обычный образ Ubuntu 18.04 EC2. Экземпляр RDS был настроен на использование rds-ca-2015, и когда я подключился к RDS с помощью psql, он сообщил, что правильно использует TLSv1.2. Если я посмотрю на корневые сертификаты, установленные в ОС, то обнаружу 4 сертификата «Amazon Root CA» с номерами от 1 до 4. Срок действия этих сертификатов не истекает до 2038 и 2040 годов.
Итак, мой вопрос состоит из двух частей:
значение по умолчанию sslmode
для PostgreSQL prefer
, что означает, что это зашифрует соединение с сертификатом, предоставленным сервером, но не проверит его. Если бы я должен был измениться sslmode
установка на verify-ca
, или verify-full
затем я должен был бы установить промежуточные сертификаты в конкретном каталоге, и затем она сделает надлежащую проверку.
, Поскольку я не обеспокоен нападением MITM на свой VPC, я не думаю, что потружусь переключаться на 'проверить' режимы.
Рассматриваемый сертификат RDS промежуточное звено сертификат. Вы могли бы также знать это как сертификат CA. Когда я использую MySQL Workbench, например, я должен указать, что
, Как SSL/TLS правильно работал первоначально, если я никогда не устанавливал [сертификат]?
Зависит, как Ваша система настраивается. Сертификаты CA просто обеспечивают , доверял полномочиям для представленного сертификата. Довольно возможно настроить что-то, что примет любой сертификат вообще, не пытаясь проверить его (т.е. Вы используете самоподписанный сертификат). Другая опция уже существует что-то в Вашем хранилище CA, которое слепо доверяет ей. Это менее вероятно, но не невозможно.
при выполнении этого локально (такие как у Вас есть экземпляр EC2 в том же VPC как Ваш экземпляр RDS) Вам даже, возможно, не понадобился бы SSL.
, Если я изменил экземпляр базы данных RDS для использования rds-ca-2019 и это кажется "просто, работа" является там чем-нибудь больше, что я должен сделать?
номер. Это сбивает с толку, но если бы Вы соединяете и не получаете какие-либо ошибки сертификата, я не волновался бы об этом.
Любые новые экземпляры DB RDS, созданные после 1 ноября 2019, используйте новые сертификаты по умолчанию. Если Ваш экземпляр RDS создается перед вышеупомянутой датой необходимо обновить сертификат.
Для изменения Центра сертификации от rds-ca-2015 до rds-ca-2019 для экземпляра DB
В 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.
Эта ссылка описывает, как установить местоположение сертификата ssl для приложения django: 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
Перед обновлением центра сертификации в 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 содержит оба сертификаты промежуточные и корневые.
После того как ваши приложения объединили файл ca, вам следует приступить к обновлению RDS до центра сертификации rds-ca-2019.
Таким образом без простоев вы можете обновить центр сертификации в RDS до rds-ca-2019.
Точно так же, как OP ответил сам, postgres имеет sslmode по умолчанию, установленный на предпочитают
, и это выдержка из документа:
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 - через 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
У этого обновления сертификата есть две стороны:
Postgres использует «предпочесть» как способ подключения по умолчанию для клиентов, что означает, что они будут пробовать SSL, если он доступен, но отступать, если нет. Таким образом, существующие клиенты с конфигурацией подключения по умолчанию продолжат работу.