Por lo que puedo ver, la conexión a través de SSL/TLS siempre está disponible con Cloud SQL. Si lo hago cumplir, se vuelve obligatorio. Pero el nivel máximo de protección que pude alcanzar es verify-ca
desde la perspectiva tanto del cliente como del servidor. Eso es:
- el servidorno se asegurará (
auth-options
)el nombre común en el certificado del cliente coincide con el usuario con el que estoy intentando conectarme (se puede usar cualquier nombre común) - el clienteno se aseguraráel nombre común en el certificado del servidor coincide con el nombre de host al que me estoy conectando (se puede usar cualquier nombre de host)
Según los documentos quepuede conectarsecon sslmode=verify-full
pero no sé a qué nombre de instancia se refieren o la información en los documentos no está actualizada. (1) ¿Cómo me conecto verify-full
?
los documentostambién dice:
verify-full
No se requiere un modo SSL de ;verify-ca
es suficiente porque la CA es específica de la instancia.
Enlos pg
documentosPuedo ver:
La diferencia entre
verify-ca
yverify-full
depende de la política de la CA raíz. Si se utiliza una CA pública,verify-ca
permite conexiones a un servidor que otra persona puede haber registrado en la CA. En este caso,verify-full
siempre se debe utilizar. Si se utiliza una CA local, o incluso un certificado autofirmado, su usoverify-ca
suele proporcionar suficiente protección.
(2) ¿Qué significa esto? Si la CA es local, ¿solo las personas autorizadas pueden crear un certificado y una clave privada y firmar el certificado con el certificado raíz de la CA? Y aunque probablemente uno pueda obtener el certificado del servidor (si el servidor es público), ¿no puede obtener la clave privada? Como tal, ¿ninguna persona no autorizada puede tener un certificado válido? Como tal, si un certificado es válido, fue creado por una persona autorizada y no importa cuál sea el CN. ¿Por qué? Parece que estoy cerca, pero todavía hay algo que me falta.
(3) Si la CA es local, verify-ca
== verify-full
(sin escuchas, sin MITM)?
Se pueden encontrar más detalles sobre lo que hice exactamente.aquí.
Respuesta1
¿Cómo me conecto
verify-full
?
Primero debe averiguar el CN del certificado del 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"
Entonces puedes conectarte:
$ 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=>
No conozco otras formas de resolverlo (el CN) aparte de usar este truco. Como tal, no parece que debas usarlo verify-full
ni que tenga ningún sentido. La documentación sugiere que verify-full
al menos no es significativamente mejor que verify-ca
.
¿Qué quiere decir esto?
Con una CA local sólo las personas autorizadas pueden obtener un certificado, por lo que ninguna persona no autorizada puede falsificar el servidor de destino.
¿Si la CA es local
verify-ca == verify-full
(sin escuchas ilegales, sin MITM)?
verify-ca != verify-full
, pero supuestamente no hay mucha diferencia en términos de seguridad. En particular, no debería ser posible realizar MITM.
Puede encontrar un ejemplo de configuración de SSL/TLSaquí.