¿Cuáles son las mejores prácticas para cifrar una base de datos Postgres?

Dado que mi conocimiento de seguridad es algo informado pero no a nivel experto, mencionaré algunas “peores prácticas” para evitar en lugar de afirmar que conozco las mejores prácticas.

Con el archivo de configuración predeterminado, postgres solo aceptará conexiones locales y no escuchará los intentos de inicio de sesión desde otras computadoras. Este valor predeterminado de “no confianza” es generalmente una buena idea para mantener, y puede agregar excepciones de otras computadoras para permitir el inicio de sesión a través de líneas “hostssl” en su pg_hba.conf. Es necesario agregar excepciones con “hostssl” en lugar de “host” si su tráfico va a través de Internet, porque, por supuesto, un intento de inicio de sesión contendrá una contraseña que obviamente debería estar encriptada. La última vez que estaba usando clientes remotos de Postgres, noté que Postgres no tenía soporte SSL por defecto y necesitaba recompilarlo con una opción de tiempo de compilación, lo que realmente debería hacer en lugar de ser flojo si desea inicios de sesión remotos.

Además de encriptar conexiones a su base de datos, también puede encriptar columnas específicas de sus tablas. Un caso de uso común es almacenar hashes de contraseñas en lugar de contraseñas sin formato cuando la base de datos tiene información de tipo “cuenta de usuario”. Si no conocía mejor, podría usar un hash md5 porque una función md5 está incluida en postgres de forma predeterminada. Pero md5 no es seguro (es vulnerable a ataques de colisión en escalas de tiempo sorprendentemente cortas), por lo que en lugar de usar md5 es mejor instalar la extensión “pg_crypto” y usar una función hash segura más moderna. Cuando hice esto, fue tan fácil como “CREAR EXTENSIÓN pgcrypto”, pero es posible que deba hacer más trabajo dependiendo de su distribución.

Además de utilizar funciones hash seguras para evitar el almacenamiento de información, pero poder verificar que otra persona conozca la información, puede hacer un cifrado de propósito más general con pgcrypto. Las funciones pgp_sym_encrypt y pgp_sym_decrypt pueden usarse en sentencias SQL, por ejemplo, “SELECCIONAR información no segura, pgp_sym_decrypt (secure_information, ‘my_password’) FROM table”, para realizar cifrado simétrico y descifrado de datos sobre la marcha. Mirando la documentación, parece que aes128 es el cifrado predeterminado. En aras de esta pregunta, busqué cuál es el pensamiento actual sobre la seguridad de aes128, y parece que NIST estima que debería ser una opción razonable hasta el año 2030 más o menos. Si está preocupado, siempre puede usar un tamaño de clave más grande no predeterminado como aes256 en su lugar.

De los documentos de PostgreSQL Documentación: 8.1: Opciones de cifrado

Iría con cifrado de disco completo. Las infracciones de datos ocurren con demasiada frecuencia y sus datos deben estar seguros