Назад | Перейти на главную страницу

«Обновите свои сертификаты SSL / TLS Amazon RDS до 31 октября 2019 г.»

Я, как и многие люди, получил электронное письмо с просьбой обновить мой экземпляр 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 частей:

  1. Как правильно работал SSL / TLS изначально, если я никогда не устанавливал Сертификаты RDS и промежуточные сертификаты, предоставляемые Amazon?
  2. Если я изменил экземпляр базы данных RDS на использование rds-ca-2019, и мне кажется, что он «просто работает», нужно ли мне еще что-нибудь сделать?

В дефолт sslmode для PostgreSQL это prefer Это означает, что он будет шифровать соединение с сертификатом, предоставленным сервером, но не будет его проверять. Если бы я изменил sslmode установка на verify-ca или verify-full тогда мне нужно будет установить промежуточные сертификаты в конкретный каталог, и тогда он будет выполнять правильную проверку.

Поскольку меня не беспокоит атака MITM на мой VPC, я не думаю, что буду беспокоиться о переключении в режимы проверки.

Данный сертификат RDS является средний сертификат. Вы также можете знать его как сертификат CA. Например, когда я использую MySQL Workbench, я должен указать, что

  1. Я хочу использовать SSL (TLS)
  2. Используйте файл цепочки ЦС RDS для проверки сертификата

Как 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

У этого обновления сертификата есть две стороны:

  1. На стороне сервера: любые экземпляры RDS, созданные до 01.11.2019, требуют перезапуска. Это влечет за собой отключение на ~ 5 минут. Это обновит их, чтобы установить новые сертификаты.
  2. Если ваши клиенты используют SSL (выключено / предпочитают по умолчанию), вам необходимо обновить сертификаты (промежуточный + цепочка) из AWS везде, где работают ваши клиенты.

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 для инстанса БД

  1. Войдите в Консоль управления AWS и откройте консоль Amazon RDS по адресу https://console.aws.amazon.com/rds/.
  2. На панели навигации выберите «Базы данных», а затем выберите экземпляр БД, который вы хотите изменить.
  3. Выберите Изменить. Откроется страница изменения инстанса БД. ссылаться на вложения
  4. В разделе «Сеть и безопасность» выберите rds-ca-2019. см. вложения.
  5. Выберите Продолжить и проверьте сводку изменений.
  6. Чтобы применить изменения немедленно, выберите «Применить немедленно». Выбор этой опции вызывает отключение.
  7. На странице подтверждения просмотрите свои изменения. Если они верны, выберите «Изменить инстанс БД», чтобы сохранить изменения.