Насколько я могу судить, соединение через SSL/TLS всегда доступно с Cloud SQL. Если я его принудительно применяю, оно становится обязательным. Но максимальный уровень защиты, которого мне удалось достичь, — это verify-ca
с точки зрения как клиента, так и сервера. То есть:
- серверне буду уверен (
auth-options
)общее имя в клиентском сертификате соответствует пользователю, от имени которого я пытаюсь подключиться (можно использовать любое общее имя) - клиентне будет уверенобщее имя в сертификате сервера совпадает с именем хоста, к которому я подключаюсь (можно использовать любое имя хоста)
Согласно документам яможет подключитьсяс, sslmode=verify-full
но либо я не знаю, какое имя экземпляра они имеют в виду, либо информация в документации устарела. (1) Как мне подключиться к verify-full
?
Документытакже говорит:
Режим SSL
verify-full
не требуется;verify-ca
его достаточно, поскольку ЦС специфичен для конкретного экземпляра.
Вдокументыpg
Я вижу:
Разница между
verify-ca
иverify-full
зависит от политики корневого CA. Если используется публичный CA,verify-ca
разрешает подключения к серверу, который кто-то другой мог зарегистрировать в CA. В этом случаеverify-full
всегда следует использовать. Если используется локальный CA или даже самоподписанный сертификат, использованиеverify-ca
часто обеспечивает достаточную защиту.
(2) Что это значит? Если CA локальный, только уполномоченные лица могут создать сертификат и закрытый ключ, а также подписать сертификат корневым сертификатом CA? И хотя, вероятно, можно получить сертификат сервера (если сервер публичный), но нельзя получить закрытый ключ? Таким образом, ни одно неуполномоченное лицо не может иметь действительный сертификат? Таким образом, если сертификат действителен, он был создан уполномоченным лицом, и неважно, какой у него CN? Почему? Кажется, я близок к разгадке, но все еще что-то упускаю.
(3) Если CA локальный, verify-ca
== verify-full
(без подслушивания, без MITM)?
Более подробную информацию о том, что именно я сделал, можно найти здесь.здесь.
решение1
Как мне связаться с
verify-full
?
Сначала вам необходимо выяснить CN-номер сертификата сервера:
$ psql -h xx.yyy.xx.yyy -U postgres sslmode=verify-full
psql: error: connection to server at "xx.yyy.xx.yyy", port 5432 failed: server certificate for "31-0628fb91-0e3b-4c89-adca-ad557023a699.europe-central2.sql.goog" (and 1 other name) does not match host name "xx.yyy.xx.yyy"
Затем вы можете подключить:
$ psql -U postgres 'sslmode=verify-full hostaddr=xx.yyy.xx.yyy host=xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.europe-central2.sql.goog'
Password for user postgres:
psql (15.4, server 11.19)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
Я не знаю других способов выяснить это (CN), кроме как с помощью этого трюка. Таким образом, это не похоже на то, что вы должны использовать verify-full
или что это имеет какой-либо смысл. Документация предполагает, что verify-full
по крайней мере не значительно лучше, чем verify-ca
.
Что это значит?
При использовании локального центра сертификации получить сертификат могут только уполномоченные лица, поэтому ни одно неуполномоченное лицо не сможет подделать целевой сервер.
Если CA локальный
verify-ca == verify-full
(без подслушивания, без MITM)?
verify-ca != verify-full
, но, предположительно, в плане безопасности особой разницы нет. В частности, не должно быть возможности MITM.
Пример настройки SSL/TLS можно найти здесь.здесь.