Я, как и многие люди, получил электронное письмо с просьбой обновить мой экземпляр 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 годов.
Итак, мой вопрос состоит из 2 частей:
В дефолт 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, и мне кажется, что он «просто работает», нужно ли мне еще что-нибудь сделать?
Нет. Это сбивает с толку, но если вы подключаетесь и не получаете ошибок сертификата, я бы не стал об этом беспокоиться.
В 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
Точно так же, как post 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 - через 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, если он доступен, но отступать, если нет. Таким образом, существующие клиенты с конфигурацией подключения по умолчанию продолжат работу.
Перед обновлением центра сертификации в 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 -comdated-ca-bundle.pem имеет как промежуточные, так и корневые сертификаты.
После того, как в ваших приложениях будет создан файл comb-ca, вам следует перейти к обновлению RDS до центра сертификации rds-ca-2019.
Таким образом, вы можете без простоев обновить центр сертификации в RDS до rds-ca-2019.
Все новые экземпляры БД RDS, созданные после 1 ноября 2019 г., по умолчанию используют новые сертификаты. Если ваш экземпляр RDS создан до указанной выше даты, вам необходимо обновить сертификат.
Чтобы изменить центр сертификации с rds-ca-2015 на rds-ca-2019 для инстанса БД