Defensor de seguridad vs Invocador de seguridad
El término definitivo de seguridad se refirió a algunas funciones excepcionales utilizadas para realizar tareas únicas y privilegiadas sobre la seguridad de la base de datos en Postgresql. Estas tareas son tan oficiales y privilegiadas que no todos los usuarios pueden realizarlas o usarlas si es sana y sana. Esto se puede usar como propiedad en la consulta PostgreSQL mientras realiza algunas transacciones desde la base de datos PostgreSQL. Cuando se ha llamado a una función con los privilegios del usuario que ha estado llamando a esta función, se dice que es la propiedad de las funciones de Seguridad Invoker de las funciones. Por otro lado, cuando se ha llamado a una función con los derechos de su verdadero propietario (que creó esta función), se dice que es la propiedad definitora de seguridad de la función.
Quien puede usarlo?
La mayoría de las veces, la función definitora de seguridad se puede ejecutar con los derechos de su propietario I.mi., El propietario de la función definitora de seguridad será la única que usa la misma en la parte de ejecución. Por otro lado, las funciones normales incorporadas o definidas por el usuario pueden ser ejecutadas por cualquier usuario I.mi., público, si no se especifican como definitivos de seguridad. Como la base de datos PostgreSQL siempre acepta el uso de bases de datos y tablas del sistema por parte de los empleadores locales y remotos de PostgreSQL, este uso puede influir en la ejecución de la función definitora de seguridad y también perjudica la seguridad de una base de datos. Existe la posibilidad de que un usuario externo pueda tener la oportunidad de administrar o controlar toda la base de datos de PostgreSQL y sus tablas, agregar datos corruptos dentro de la base de datos utilizando los mismos derechos que el propietario de la función definitora de seguridad que tiene el propietario. De esta manera, ese usuario externo puede ejecutar consultas y códigos que él/ella no debería ser. Al usar esta propiedad dentro de la consulta PostgreSQL, hemos estado permitiendo a los usuarios realizar las funciones llevadas a cabo con los derechos del usuario que la ha creado y no utilizará los derechos del usuario que lo ha estado llamando. Por lo tanto, debemos ser más cautelosos que antes, mientras usamos la base de datos después del uso de la definición de seguridad. Echemos un vistazo a algunos ejemplos ahora.
Ejemplo 01
Echemos un vistazo a un ejemplo simple para generar una función con la propiedad definitora de seguridad. Intentaremos hacer que nuestra función sea lo más segura posible pero usar la función definitora de seguridad en ella. Por lo tanto, hemos comenzado con el inicio de sesión en la herramienta PGADmin GUI de la base de datos PostgreSQL. Consulte la pestaña "Funciones" dentro de su base de datos específica. Haga clic con el botón derecho en él, pasee la opción "Crear" y seleccione "Función".
Se abrirá la pantalla llamada Create-Function. Agregue el nombre de una función como "inofensivo", seleccione su propietario y esquema. Como esta función será un definidor de seguridad, solo sería ejecutado por los derechos del usuario "Aqsayasin".
Desde la sección Definición, agregue el tipo de retorno, el idioma y agregue el tipo de datos del argumento que se dará en la función.
Dentro del área del código, escriba un código simple. Como puede ver, no estamos usando ninguna tabla aquí, por lo que parece ser ileso cuando se trata de su ejecución.
En el área de opciones, active "Security of Definder" para habilitar la propiedad definitora de seguridad.
Dentro de la sección SQL, obtendrá toda su consulta para crear una nueva función con la propiedad definitora de seguridad. El propietario de esta función será el usuario "Aqsayasin".
Después de ejecutar la instrucción selecta para llamar a la función inofensiva que pasa 15 como valor, tenemos el valor 25 como salida. Aunque se ve sano y sano, el uso de un esquema público permitirá a los accesorios/usuarios externos crear nuevos objetos y tener acceso a esta función.
Para obtener la información sobre la función definitora de seguridad recién creada "inofensiva", debemos usar la instrucción seleccionada que se muestra a continuación en el área de consulta de Pgadmin 4. La columna "proname" muestra el nombre de una función i.mi., inofensivo, "nspname" muestra el nombre de un esquema i.mi., público, y la columna "Usname" pertenece al propietario para esta función I.mi., "Aqsayasin". Así es como obtenemos la información sobre la función definitora de seguridad.
Ejemplo 02
La función definitora de seguridad también se puede utilizar para crear un procedimiento por un usuario en particular. Creemos un nuevo procedimiento "SEC_DEF" utilizando la propiedad definitora de seguridad dentro de ella. Este procedimiento se utiliza para obtener valores de la tabla "FTEST" con el esquema "público". Debe saber que la tabla "ftest" se ha guardado en la base de datos "aqsayasin" y su propietario es el usuario "aqsayasin".
Ahora, debe iniciar sesión desde el terminal de shell PostgreSQL para agregar algunos comandos simples. Entonces, hemos iniciado sesión desde la base de datos "aqsayasin" primero. Después de esto, hemos intentado conectar la base de datos "Aqsayasin" con el usuario "Outsider" utilizando el comando "\ c" junto con el nombre de la base de datos y el usuario que se conectará. El usuario del usuario "externo" está conectado a la base de datos "Aqsayasin".
Ahora, es hora de llamar al procedimiento "sec_def ()" utilizando la función de llamada () incorporada en la carcasa terminal. Lanzará una excepción que demuestre que el "público.Ftest "no existe para nuestro extraño de usuarios. Esto se debe a que el procedimiento se ha creado con los derechos del usuario "aqsayasin", y el "extraño" del usuario no tiene tales derechos.
Si desea evitar las mal funcionamiento por parte de los extraños y usuarios no confiables de la base de datos PostgreSQL en su sistema, es posible que deba restringir o prohibir los derechos de "escribir" para que esos usuarios inserten registros en su base de datos dentro del parámetro "Search_Path". Usando de esta manera, los usuarios externos no podrán generar objetos mal funcionados para manipular el sistema de su base de datos, sus datos y sus derechos. Puede usar el esquema temporal "PG_Temp" al final que se busca para hacer una gestión segura dentro del "Search_Path" en la consulta.
Conclusión
El uso de la propiedad definitora de seguridad en las funciones para hacer una tarea especial es una técnica bastante potente pero también muy arriesgada. Para que nuestros usuarios entiendan el concepto de definitivo de seguridad, hemos intentado crear una función y un procedimiento que tenga una función de definición de seguridad como propiedad. Hemos visto cómo ocurre un error cuando un usuario sin derechos de propietario de "definidor de seguridad" intenta llamar a la función o un procedimiento. Para resumir, generalmente preferimos no usarlo a menudo dentro de la base de datos, ya que puede ser no salvado para la base de datos PostgreSQL.