Primero algunos antecedentes.
El proyecto LedgerSMB es un proyecto de software de contabilidad financiera de código abierto que se ejecuta en PostgreSQL. Implementamos una gran cantidad de lógica de negocios en funciones definidas por el usuario, que actúan como la herramienta principal de mapeo entre los métodos de objeto de programa y el comportamiento de la base de datos. Actualmente utilizamos usuarios de la base de datos como usuarios de autenticación, en parte por elección (esto permite una lógica de seguridad centralizada, de modo que se pueden escribir otras herramientas y reutilizar los permisos otorgados a los usuarios), y en parte por necesidad (después de bifurcar desde SQL-Ledger, hay no había muchas opciones para actualizar la seguridad en esa base de código).
Esto nos da acceso a un número razonable de opciones de inicio de sesión único a las que PostgreSQL tiene acceso, desde LDAP hasta Kerberos 5. Incluso podemos usar PAM cuando se trata de contraseñas. También nos permite reutilizar los permisos al integrarnos con otras aplicaciones o al permitir otras interfaces de clientes. Para una aplicación de contabilidad financiera, esto parece una ganancia neta.
Hay costos obvios involucrados. Para la aplicación web, estamos muy limitados a los tipos de autenticación http que pueden admitirse. DIGEST, por ejemplo, está completamente fuera. BASIC funciona, y podríamos implementar KRB5 con bastante facilidad (planeo tener esto soportado y trabajar fuera de la caja para 1.4). Las medidas de autenticación muy sólidas no se pueden gestionar correctamente en esto directamente, aunque probablemente podríamos imponerlas si es necesario (por ejemplo, el certificado SSL BASIC + del lado del cliente con un cn que coincida con el nombre de usuario y una raíz raíz específica).
Al mismo tiempo, nos hemos encontrado con una buena cantidad de críticas, principalmente de la multitud de desarrollo y, más ocasionalmente, de los dba que me dicen que la aplicación debería ser la barrera de seguridad, no la base de datos. Mi opinión sigue siendo que un perímetro de seguridad más pequeño es generalmente mejor, que la reutilización de la lógica empresarial y la lógica de seguridad van juntas, y que me parece peligroso reutilizar la lógica empresarial sin reutilizar la lógica de seguridad en el mismo nivel Del programa.
¿Me estoy perdiendo algunas compensaciones importantes aquí? ¿Hay problemas que no estoy considerando?
fuente

Respuestas:
Creo que estás combinando autenticación y autorización .
Estoy completamente de acuerdo en que es aconsejable mantener el modelo de seguridad en la base de datos, especialmente porque LedgerSMB está diseñado teniendo en cuenta el acceso de varios clientes. A menos que planee ir a 3 niveles con una capa de middleware, tiene mucho sentido tener usuarios como roles de base de datos, especialmente para algo como una aplicación de contabilidad.
Esto no significa que deba autenticar usuarios en la base de datos utilizando un método de autenticación compatible con PostgreSQL. Los usuarios, roles y subvenciones de su base de datos pueden usarse para autorización solo si lo desea.
Así es como funciona para una interfaz de usuario web, por ejemplo:
janese conecta al servidor web ui y se autentica utilizando el método que desee, por ejemplo, el protocolo de enlace de cliente HTTPS X.509 y la autenticación DIGEST. El servidor ahora tiene una conexión de un usuario que acepta es realmentejane.El servidor se conecta a PostgreSQL usando un nombre de usuario / contraseña fijos (o Kerberos o lo que quiera), autenticándose en el servidor db como el usuario
webui. El servidor de db confíawebuien autenticar a sus usuarios, por lo quewebuise le ha otorgado el correo electrónico apropiadoGRANT(ver más abajo).En esa conexión, el servidor utiliza
SET ROLE jane;para asumir el nivel de autorización del usuariojane. Hasta que se ejecuteRESET ROLE;u otroSET ROLE, la conexión está operando con los mismos derechos de acceso quejaneySELECT current_user()etc. informarájane.El servidor mantiene la asociación entre la conexión de base de datos en la que tiene
SET ROLEajaney la sesión de la web para el usuariojane, que no permite que la conexión PostgreSQL para ser utilizado por otras conexiones con otros usuarios sin un nuevoSET ROLEintermedio.Ahora se está autenticando fuera del servidor, pero mantiene la autorización en el servidor. Pg necesita saber qué usuarios existen, pero no necesita contraseñas o métodos de autenticación para ellos.
Ver:
SET SESSION AUTHORIZATIONSET ROLEGRANTDetalles
El servidor webui controla la ejecución de las consultas, y no permitirá
janeejecutar SQL sin procesar (¡espero!), Por lojaneque no puede hacerlo aRESET ROLE; SET ROLE special_admin_user;través de la interfaz de usuario web. Para mayor seguridad, agregaría un filtro de declaración al servidor que rechazóSET ROLEy, aRESET ROLEmenos que la conexión estuviera o ingresara a un grupo de conexiones no asignadas.Todavía puede usar la autenticación directa a Pg en otros clientes; Puedes mezclar y combinar libremente. Solo tiene que tener los derechos
GRANTdelwebuiusuarioSET ROLEpara los usuarios que pueden iniciar sesión a través de la web y luego otorgar a esos usuarios losCONNECTderechos normales , contraseñas, etc. que desee. Si desea hacerlos solo web,REVOKEsusCONNECTderechos en la base de datos (y desdepublic).Para hacer una fracción de esa autenticación / autorización fácil que tengo un papel especial
assume_any_userqueGRANTtodos los recién creados por el usuario. LuegoGRANT assume_any_userutilizo el nombre de usuario real utilizado por cosas como un front-end web confiable, dándoles los derechos para convertirse en el usuario que deseen.Es importante hacer
assume_any_userunNOINHERITrol, para que elwebuiusuario o lo que sea no tenga privilegios por sí mismo y solo pueda actuar en la base de datos una vez que seaSET ROLEpara un usuario real. Bajo ninguna circunstancia debewebuiser un superusuario o propietario de DB .Si está agrupando conexiones, puede usarlo
SET LOCAL ROLEpara establecer el rol solo dentro de una transacción, de modo que pueda devolver las conexiones al grupo despuésCOMMIToROLLBACK. Tenga en cuenta queRESET ROLEtodavía funciona, por lo que todavía no es seguro dejar que el cliente ejecute el SQL que quiera.SET SESSION AUTHORIZATIONes la versión relacionada pero más fuerte de este comando. No requiere membresía de roles, pero es un comando solo de superusuario. No desea que su interfaz de usuario web se conecte como superusuario. Se puede revertir conRESET SESSION AUTHORIZATION,SET SESSION AUTHORIZATION DEFAULToSET SESSION AUTHORIZATION theusernamepara recuperar los derechos de superusuario, por lo que tampoco es una barrera de seguridad de privilegio.Un comando que funcionó de manera similar
SET SESSION AUTHORIZATIONpero que era irreversible y que funcionaría si fuera un miembro de rol pero no un superusuario sería genial. En este punto no hay ninguno, pero aún puede separar la autenticación y la autorización bastante bien si tiene cuidado.Ejemplo y explicacion
Ahora conéctate como
webui. Tenga en cuenta que no puede hacer nada,test_tablepero puedeSET ROLEhacerlojaney luego puede acceder atest_table:Tenga en cuenta que
webuipuedeSET ROLEquejim, incluso cuando yaSET ROLED parajaney aunquejaneno se haGRANTcado el derecho de asumir el papeljim.SET ROLEestablece su identificación de usuario efectiva, pero no elimina su capacidad paraSET ROLEotros roles, esa es una propiedad del rol al que se conectó, no su rol efectivo actual. En consecuencia, debe controlar cuidadosamente el acceso a los comandosSET ROLEyRESET ROLE. AFAIK, no hay formaSET ROLEde una conexión permanente , convirtiéndose realmente en el usuario objetivo, aunque ciertamente sería bueno tenerlo.Comparar:
a:
Esto significa que
SET ROLEno es exactamente lo mismo que iniciar sesión como un rol determinado, algo que debe tener en cuenta.webuipuede noSET ROLEadbowner, ya que no se haGRANTed ese derecho:así que por sí mismo es bastante impotente, solo puede asumir los derechos de otros usuarios y solo cuando esos usuarios tienen habilitado el acceso web.
fuente
pgbouncerfunciona para algunos detalles.DISCARD ALLes otra forma de que los derechos vuelvan a sus valores predeterminados. Realmente desearía que Pg tuviera unaSET ROLE NORESETo similar ...