У меня есть новый экземпляр Postgres 11 RDS, к которому я могу подключиться с сертификатом SSL или без него. Однако я хотел бы убедиться, что мы никогда не подключаемся к этой базе данных без SSL. Итак, я предпринял следующие шаги, чтобы попытаться добиться этого:
rds.force_ssl
к 1
.psql -h aws_hostname -p 5432 "dbname=mydbname user=dbuser"
Я ожидал, что соединение не удастся, потому что я не указал сертификат SSL.Результат:
Password for user postgres:
psql (11.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
mydbname=>
Итак, я вижу, что соединение установлено по TLSv1.2. Однако я не понимаю, почему AWS, кажется, позволяет вам применять SSL и предоставляет способ загрузить сертификат для этого, но не использует его. Я ожидал, что мне придется предоставить сертификат при подключении следующим образом:
psql -h aws_hostname -p 5432 "dbname=mydbname user=dbuser sslrootcert=rds-combined-ca-bundle.pem sslmode=verify-full"
Однако я не понимаю, почему AWS, кажется, позволяет вам применять SSL и предоставляет способ загрузить сертификат для этого, но не использует его. Я ожидал, что мне придется предоставить сертификат при таком подключении
Сервер может заставить клиента использовать ssl для установления соединения, но не может заставить клиента проверять сертификат сервера.
Если ваш клиент основан на libpq, он проверит сертификат тогда и только тогда, когда он сможет найти файл корневого сертификата (обычно в ~ / .postgresql / root.crt, если не указано иное). Если вы укажете PGSSLMODE = verify-ca или выше на клиенте, то клиент выдаст ошибку, если не сможет найти корневой файл сертификата. Если sslmode ниже этого уровня и клиент не может найти файл корневого сертификата, он будет использовать сертификат сервера для согласования шифрования, но не будет использовать его для проверки подлинности сервера. Таким образом, вы получаете защиту от пассивного подслушивания, но не от активных атак MITM.
Postgres попытается подключиться с помощью TLS автоматически. Я предположил, что это не так. Если я включу переменную среды PGSSLMODE=disable
тогда можно проверить сбой подключения SSL, если не используется rds.force_ssl
вариант.