¿Qué tan sensibles son los datos? Usted no dijo Eso hace que sea imposible calcular cuál es el nivel apropiado de riesgo. Eso es crucial. "Lo suficientemente seguro" siempre es relativo al riesgo y su presupuesto para el proyecto.
Esto suena como una de esas situaciones de "probar que algo no existe". Lógicamente, eso es imposible de hacer. Solo puedes probar cuando algo existe existe. Así que no voy a tener éxito. Pero, de todos modos, intentaré convencerlo de que para datos típicos, "el acceso directo seguro a las bases de datos para usuarios no confiables" realmente no existe.
La conexión es solo una parte del problema del "acceso seguro". Supongamos que ha tratado con todas las posibles vulnerabilidades de negociación, así como otras. Incluso si la conexión está cifrada con un conjunto criptográfico TLS libre de errores que está correctamente configurado, ¿qué datos son los usuarios no confiables que envían a través de o antes del canal cifrado, incluido (como Craig Ringer mencionado) autenticación? ¿Lo estás limpiando antes de que llegue a la base de datos?
Obviamente, se requieren parches, pero no lo suficientemente remotos. Para una base de datos que podría tener personas explotándola en cualquier momento, incluidos los datos de otros usuarios en la base de datos, probablemente querría DAM (auditoría y monitoreo de la base de datos) y protección de IPS y DoS para aplicaciones. Hay una razón por la que la mejor práctica es poner la base de datos detrás de una puerta de enlace de algún tipo, y no exponerla directamente de esa manera.
La ejecución en un puerto no predeterminado es la seguridad a través de la ofuscación. No detendrá a nadie que sepa cómo ejecutar un escáner de puertos y la toma de huellas dactilares, y definitivamente no a nadie que lo esté apuntando. Dado que no confías en tus usuarios, probablemente deberías asumir que uno está apuntando a ti.
Las limitaciones del rango de IP tampoco serán útiles si no confías en ninguna IP de usuario. Los hosts de confianza son útiles solo para permitir IP confiables y bloquear el resto ... que en su caso suena como bloquear todas las IP en Internet. No es muy útil.
Suponiendo que haya manejado todo eso, lo que sugeriría es transacciones, copias de seguridad y cifrado enérgico de los datos de cada usuario dentro de la base de datos con sus propias claves privadas que su servidor no tiene acceso a, por lo que incluso si un usuario malintencionado comprometiera la base de datos, un volcado de datos de otros usuarios sería básicamente inútil para el atacante. Tenga una VM de servidor en espera lista para funcionar en todo momento, y no estaría de más tener un almacenamiento separado para que pueda deshacerse periódicamente de esa VM y abrir una nueva. Eso no evitaría que alguien sea el propietario del servidor, pero al menos ayudaría a proteger los datos en sí y ofrecería una rápida respuesta y recuperación de incidentes.
Pero eso es incluso antes de que entres en los detalles específicos de PostgreSQL.
Como puede ver, una seguridad más fuerte se vuelve costosa y consume mucho tiempo. Si los datos son garabatos de gato en servilletas, probablemente no valga la pena. Le serviría un mejor método de acceso.