sql >> Base de Datos >  >> RDS >> PostgreSQL

Una descripción general de Trusted Extensions en PostgreSQL 13

En mi blog anterior, exploramos nuevas capacidades de replicación lógica con tablas de partición en PostgreSQL 13. No hace falta decir que hay una gran cantidad de características de este tipo en la versión mencionada que pronto mejorarán la experiencia para DBA y aplicaciones. desarrolladores por igual.

Mientras miraba PostgreSQL 13, observé una entrada que me llamó la atención:

PostgreSQL 13 introduce el concepto de una "extensión de confianza", que permite a un superusuario especificar extensiones que un usuario puede instalar en su base de datos siempre que tenga el privilegio CREAR.

Rebobinemos

Sabemos que PostgreSQL tiene poder de extensión para agregar plumas a su límite sin perturbar gran parte de su núcleo. En otras palabras, las extensiones mejoran las capacidades funcionales de PostgreSQL Server de forma no intrusiva.

De hecho, hay muchas organizaciones de terceros que han utilizado el mecanismo de extensiones para generar conjuntos de funciones sorprendentes. TimescaleDB es una de esas extensiones en las que cambia la personalidad de PostgreSQL Server para que sea más adecuado para la carga de trabajo de IOT.

Echemos un vistazo a lo que había antes de PostgreSQL 13 y por qué era un verdadero dolor de cabeza. Considere una instancia de PostgreSQL alojada que contenga dos funciones:

  • postgres (el superusuario)
  • johnsmith (un usuario normal)

Y la base de datos wooliesdb.

A John Smith le gustaría agregar la extensión hstore de postgres a wooliedb, ya que el código de su aplicación se basa en eso. Intentemos hacer eso.

 psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must be superuser to create this extension.

El error indica claramente que la extensión solo puede ser creada por un superusuario, es decir, postgres. Aunque las extensiones como hstore no tienen ningún problema de seguridad en el contexto de su uso, solo los superusuarios pueden crear esta extensión en la base de datos.

¿Y si la base de datos fuera propiedad de johnsmith o fuera creada por él? También podemos intentarlo. En el siguiente fragmento, el superusuario de postgres le permite a johnsmith crear una base de datos completamente nueva para jugar:

$ psql -U postgres 

postgres=# ALTER ROLE johnsmith CREATEDB;

postgres=# \q

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE DATABASE jsDB;

wooliesdb=>\c jsDB;

You are now connected to database "jsDB" as user "johnsmith".

jsDB=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must be superuser to create this extension.

¡Ah! No hace ninguna diferencia. Aunque johnsmith es el propietario de jsDB, todavía no puede instalar extensiones simples y relevantes en su base de datos.

Pero eso es todo en el servidor PostgreSQL 12 (y por debajo); va a cambiar con la versión 13 de PostgreSQL. Al momento de escribir este blog, la versión 13 de PostgreSQL se encuentra en la etapa Beta2 y el equipo ya está escribiendo un anuncio de lanzamiento. Voy a probar "extensiones de confianza" con binarios Beta2.

Aquí viene PostgreSQL 13

Espere un comportamiento diferente con el concepto de extensiones confiables (al menos para módulos contrib o extensiones preempaquetadas). Verifiquemos el comportamiento con PostgreSQL13 para los mismos comandos que hicimos con PostgreSQL12.

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE EXTENSION hstore;

ERROR:  permission denied to create extension "hstore"

HINT:  Must have CREATE privilege on current database to create this extension.

Que es más o menos lo mismo, es decir, johnsmith todavía no puede crear la extensión. Pero aún hay una diferencia sutil:la PISTA que sugiere que falta el privilegio CREAR. Nuestro segundo conjunto de comandos debería encargarse de eso:

$ psql -U postgres 

postgres=# ALTER ROLE johnsmith CREATEDB;

postgres=# \q

$ psql -U johnsmith -d wooliesdb

wooliesdb=>CREATE DATABASE jsDB;

wooliesdb=>\c jsDB;

You are now connected to database "jsDB" as user "johnsmith".

jsDB=>CREATE EXTENSION hstore;

jsDB=>SELECT extname from pg_extension;

 extname

---------

 plpgsql

 hstore

(2 rows)

Las cosas realmente funcionaron esta vez. El superusuario puede permitir los mismos privilegios en la base de datos de postgres ejecutando el siguiente comando:

postgres=# GRANT CREATE ON DATABASE postgres FOR johnsmith;

Pero hay más en la extensión confiable que esto, intentemos crear otra extensión:

jsDB=> create extension file_fdw;

ERROR:  permission denied to create extension "file_fdw"

HINT:  Must be superuser to create this extension.

La diferencia proviene del hecho de que mientras hstore está marcado como confiable, file_fdw NO está marcado como confiable. ¿Dónde está marcado eso? Está en el archivo de control de las extensiones.

$ cd /usr/pgsql-13/share/extension 

$ grep -l trusted hstore.control file_fdw.control;

hstore.control

De hecho, hay 24 extensiones confiables y 24 no tan confiables que vienen con postgreSQL13.

En pocas palabras, los superusuarios pueden ceder el control sobre tales extensiones confiables; y cualquier usuario con los permisos CREAR en una base de datos puede habilitar extensiones confiables sin acercarse al administrador de su base de datos.

Conclusión

Detrás de escena, el comportamiento es controlado por dos parámetros en el archivo de control de extensión:

  • superusuario, que por defecto es verdadero
  • de confianza, que por defecto es falso

Una extensión puede ser creada por alguien que no sea superusuario solo si ambos son verdaderos. De hecho, una extensión confiable es el script de instalación o actualización que se ejecuta como el superusuario de arranque, no como el usuario que llama. Recuerde que las extensiones pueden estar escritas en un idioma en el que no se confía, de ahí la necesidad.