Pelo que posso ver, a conexão via SSL/TLS está sempre disponível com o Cloud SQL. Se eu aplicá-lo, ele se tornará obrigatório. Mas o nível máximo de proteção que consegui alcançar é verify-ca
da perspectiva do cliente e do servidor. Aquilo é:
- o servidornão vou ter certeza (
auth-options
)o nome comum no certificado do cliente corresponde ao usuário com o qual estou tentando me conectar (qualquer nome comum pode ser usado) - o clientenão vou ter certezao nome comum no certificado do servidor corresponde ao nome do host ao qual estou me conectando (qualquer nome de host pode ser usado)
De acordo com os documentos que eupode se conectarcom sslmode=verify-full
, mas não sei o nome da instância que eles significam ou as informações nos documentos estão desatualizadas. (1) Como posso me conectar com verify-full
?
Os documentostambém diz:
Um modo SSL
verify-full
não é necessário;verify-ca
é suficiente porque a CA é específica da instância.
Emos pg
documentosEu consigo ver:
A diferença entre
verify-ca
everify-full
depende da política da CA raiz. Se uma CA pública for usada,verify-ca
permite conexões a um servidor que outra pessoa possa ter registrado na CA. Neste caso,verify-full
deve ser sempre utilizado. Se uma CA local for usada, ou mesmo um certificado autoassinado, o usoverify-ca
geralmente fornece proteção suficiente.
(2) O que isso significa? Se a CA for local, apenas pessoas autorizadas poderão criar um certificado e uma chave privada e assinar o certificado com o certificado raiz da CA? E embora provavelmente seja possível obter o certificado do servidor (se o servidor for público), mas não é possível obter a chave privada? Como tal, nenhuma pessoa não autorizada pode ter um certificado válido? Assim, se um certificado é válido, foi criado por uma pessoa autorizada, e não importa qual seja o CN? Por que? Parece que estou perto, mas ainda falta algo.
(3) Se a CA for local, verify-ca
== verify-full
(sem escuta, sem MITM)?
Mais detalhes sobre o que exatamente eu fiz podem ser encontradosaqui.
Responder1
Como posso me conectar com
verify-full
?
Primeiro você precisa descobrir o CN do certificado do servidor:
$ 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"
Então você pode conectar:
$ 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=>
Não conheço outras maneiras de descobrir isso (o CN) além de usar esse truque. Como tal, não parece que você deva usar verify-full
ou que faça algum sentido. A documentação sugere que verify-full
pelo menos não significativamente melhor que o verify-ca
.
O que isto significa?
Com uma CA local, apenas pessoas autorizadas podem obter um certificado, portanto, nenhuma pessoa não autorizada pode falsificar o servidor de destino.
Se a CA for local
verify-ca == verify-full
(sem espionagem, sem MITM)?
verify-ca != verify-full
, mas supostamente não há muita diferença em termos de segurança. Particularmente, nenhum MITM deveria ser possível.
Exemplo de configuração de SSL/TLS pode ser encontradoaqui.