En realidad, hay dos preguntas aquí: cómo autenticar a un usuario frente a un servidor web y qué usuario usar para conectarse a la base de datos como.
La verdadera pregunta es, ¿la seguridad de la base de datos debe estar a cargo del DBA o del programador web?
Los servidores de bases de datos son de larga duración y, a menudo, son compartidos por múltiples aplicaciones.
Lo ideal sería autenticar a los usuarios de su aplicación web (LAN) contra un servidor LDAP (también conocido como ActiveDirectory), a través de Kerberos + SPNEGO. Esto le brinda autenticación centralizada e inicio de sesión único en muchas aplicaciones.
También puede autenticar a los usuarios de la aplicación web directamente contra los usuarios de la base de datos, por ejemplo aquí . Si es ahí donde está toda la información de usuario de tu usuario y no usas LDAP / Kerberos, también podrías usar eso.
La siguiente pregunta es qué usuario de la base de datos usará cuando se conecte desde el servidor web:
- Conéctese como usuario avanzado y agregue información de ID de usuario "real" a sus declaraciones SQL (¡por supuesto, con parámetros!)
- Conéctese como el usuario real de db (esto elimina la agrupación de conexiones)
- Conéctese como usuario limitado y suplante al usuario real utilizando
set role
ONE es el más común, no porque sea una buena idea, sino porque la gente quería usar la agrupación de conexiones en el pasado y no entendía la suplantación. Esto patea el Principle of Least Privilege directamente en la entrepierna.
Hay vulnerabilidades increíblemente comunes, con finalización de carrera, más probables con la opción 1: Inyección de SQL y Referencias de objetos inseguros :
El servidor web se conecta a db como powerUser
, Malice inicia sesión en el sitio web como malice
y encuentra una inyección SQL y elimina su tabla payments
, ya que powerUser
tiene esa autoridad.
Sus desarrolladores web agregan el ID de usuario al sql para la URL /bank-accounts
, pero son estúpidos y se olvidan de agregar el ID de usuario para las URL de las cuentas bancarias individuales (como /bank-accounts/999
). Malice inicia sesión como malice
y ve el saldo bancario de bobs
.
Estos riesgos se pueden minimizar utilizando la suplantación y la seguridad de la fila de la base de datos (que esencialmente requiere la suplantación). PG 9.5 es compatible con la seguridad de la fila. Puedes imitarlo en versiones anteriores con security_barrier check option
vistas y activadores.
También facilita la auditoría de datos, ya que tiene el nombre de usuario real en su base de datos como current_user
Diría que una base de datos como Postgres tiene mejor seguridad que la mayoría de los marcos de seguridad web, como lo hace Fila de seguridad, Seguridad de columna y tiene un buen sistema de roles jerárquico.
He visto marcos de seguridad web que seleccionan todas las filas para una consulta determinada, luego descartan todo lo que no pertenece al usuario X. Esto arruina la paginación y es terrible para el rendimiento. Además, nunca he visto uno que haga bien la seguridad de Columna / Campo.