Como configuro SSL/TLS para conectar-me a uma instância do Cloud SQL?

Como configuro SSL/TLS para conectar-me a uma instância do Cloud SQL?

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-cada 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-fullnão é necessário; verify-caé suficiente porque a CA é específica da instância.

Emos pgdocumentosEu consigo ver:

A diferença entre verify-cae verify-fulldepende da política da CA raiz. Se uma CA pública for usada, verify-capermite conexões a um servidor que outra pessoa possa ter registrado na CA. Neste caso, verify-fulldeve ser sempre utilizado. Se uma CA local for usada, ou mesmo um certificado autoassinado, o uso verify-cageralmente 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-fullou que faça algum sentido. A documentação sugere que verify-fullpelo 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.

informação relacionada