PostgreSQL es un DBMS de código abierto que a su vez utiliza SQL. Es una herramienta muy potente que se utiliza para gestionar aplicaciones y alojar datos web en VPS. En este tutorial, aprenderá a gestionar permisos en PostgreSQL. Le ayudará a proporcionar a los roles de su aplicación los permisos necesarios. Realizaremos este tutorial utilizando PostgreSQL en un Ubuntu 18.04 servidor en la nube en CloudSigma.
Instalación de PostgreSQL
Para descargar e instalar PostgreSQL, ejecute los siguientes comandos:
|
1 2 |
sudo apt-get update sudo apt-get install postgresql postgresql-contrib |
El instalador creará un usuario por defecto – “Postgres” para operar. Utilizaremos este usuario durante la mayor parte de este tutorial. Puede iniciar sesión con este usuario con este comando:
|
1 |
sudo su - postgres |
Ahora que PostgreSQL está instalado, aprenderá cómo maneja los permisos. También puede seguir nuestro tutorial sobre cómo configurar PostgreSQL en Ubuntu para obtener una guía detallada paso a paso del proceso de instalación.
Conceptos de permisos de PostgreSQL
Postgres gestiona los permisos a través del concepto de “roles”. Con los roles, no hay distinción entre usuarios y grupos. Los roles son más flexibles que el sistema Unix tradicional de usuarios y grupos. Por ejemplo, un rol puede actuar como miembro de otro rol, heredando sus permisos.
Visualización de roles en PostgreSQL
Para ver los roles en PostgreSQL, primero debe iniciar sesión en la consola utilizando el siguiente comando:
|
1 |
psql |
A continuación, ejecute lo siguiente para ver los roles:
|
1 |
\du |

Por ahora, solo hay un rol predeterminado con todos los privilegios.
Cómo crear roles en PostgreSQL
Puede crear roles para Postgres ya sea desde la línea de comandos o desde la consola de Postgres. Puede probar los siguientes dos enfoques, tras lo cual verá cómo gestionar permisos y accesos en PostgreSQL.
Cómo crear roles desde dentro de PostgreSQL
La forma más sencilla de crear roles es desde la consola de Postgres. Puede hacerlo con el siguiente comando:
|
1 |
CREATE ROLE demo_role; |
Para comprobar si se ha creado, ejecute el comando:
|
1 |
\du |

Especifica que el nuevo rol no tiene permisos de inicio de sesión. Aprenderá cómo cambiar eso más adelante en el tutorial.
Cómo crear roles desde la línea de comandos
La alternativa al método anterior es crear el usuario desde la línea de comandos. Para salir de la consola de PostgreSQL, escriba lo siguiente:
|
1 |
\q |
Puede crear un rol llamado “test” con el siguiente comando:
|
1 |
createuser test |
Una vez que haya ejecutado el comando anterior, inicie sesión en psql y enumere los roles utilizando los siguientes comandos:
|
1 2 |
psql \du |

Puede observar que el usuario creado de esta manera no tiene los mismos atributos.
Cómo eliminar roles en PostgreSQL
Puede eliminar roles fácilmente en PostgreSQL utilizando la siguiente sintaxis:
|
1 |
DROP ROLE role_name; |
Puede eliminar el rol de demostración que creamos anteriormente utilizando el comando:
|
1 |
DROP ROLE demo_role; |

Si intentamos eliminar un rol que no existe, simplemente arrojará un error. Para ver eso, puede intentar eliminar el mismo rol de nuevo:
|
1 |
DROP ROLE demo_role; |

Si desea que el comando no arroje un error cuando el rol no exista, puede agregar ‘IF EXISTS’ en el comando:
|
1 |
DROP ROLE IF EXISTS role_name; |
Puede volver a intentar eliminar el rol con este comando:
|
1 |
DROP ROLE IF EXISTS demo_role; |
Cómo definir privilegios al crear un rol
Hasta ahora, ha creado y eliminado roles. En esta sección, creará roles con permisos modificados. Puede hacerlo especificando los permisos para el rol con el comando de creación:
|
1 |
CREATE ROLE role_name WITH optional_permissions; |
Para ver las opciones de esto, puede abrir la ayuda usando este comando:
|
1 |
\h CREATE ROLE |

Si desea crear un rol con permisos de inicio de sesión, puede formular el comando de esta manera:
|
1 |
CREATE ROLE demo_role WITH LOGIN; |

Como vimos anteriormente, si desea crear roles con permiso de inicio de sesión, también puede utilizar el siguiente comando:
|
1 |
CREATE USER role_name; |
La única diferencia entre los dos comandos es que ‘CREATE USER’ otorga permiso de inicio de sesión al rol de forma predeterminada.
Cómo cambiar los privilegios de los roles en PostgreSQL
Hasta ahora, ha probado cómo otorgar permisos al crear el usuario. En esta sección, modificará los permisos de los usuarios ya creados. La sintaxis para el comando alter es:
|
1 |
ALTER ROLE role_name WITH attribute_options; |
Por ejemplo, si lo desea, puede cambiar los permisos de inicio de sesión de demo_role a ‘iniciar sesión’ con este comando:
|
1 |
ALTER ROLE demo_role WITH NOLOGIN; |

Para permitir que el usuario vuelva a iniciar sesión, puede modificar los permisos con el siguiente comando:
|
1 |
ALTER ROLE demo_role WITH LOGIN; |
Cómo iniciar sesión como un usuario diferente en PostgreSQL
PostgreSQL le permite iniciar sesión solo localmente de forma predeterminada si su nombre de usuario coincide con el nombre de usuario del sistema. Para evitar esto, puede cambiar el tipo de inicio de sesión o configurar PostgreSQL para usar la interfaz de red de bucle de retorno (loopback). Esta interfaz cambiaría el tipo de conexión a remota, incluso si la conexión es local.
En esta sección, probará la segunda opción. Para empezar, puede establecer la contraseña del usuario, de modo que la autenticación sea posible.
Establezca la contraseña de ‘demo_user’ con el siguiente comando:
|
1 |
\password test |
Cuando se le solicite, introduzca y confirme la contraseña. Una vez hecho esto, puede salir de la interfaz de PostgreSQL y volver a su usuario normal de la máquina:
|
1 2 |
\q exit |
PostgreSQL requiere que inicie sesión con un nombre de usuario que coincida con el nombre de usuario de su sistema operativo y también que se conecte a la base de datos con el mismo nombre de usuario. Dado que no está haciendo eso en este caso, tendrá que especificar explícitamente las opciones que desea utilizar. Puede utilizar la siguiente sintaxis:
|
1 |
psql -U <span class="highlight">usuario</span> -d <span class="highlight">bd</span> -h 127.0.0.1 -W |
usuario: El nombre de usuario con el que desea conectarse
BD: Una base de datos existente a la que tenga acceso
-h 127.0.0.1: Especifica a PostgreSQL que se conectará a través de una interfaz de red a la máquina local. Esta opción nos permite la autenticación aunque el nombre de usuario no coincida con el nombre de usuario del sistema.
-W: Indica a PostgreSQL que introducirá una contraseña
Para iniciar sesión con nuestro “test_user”, podemos ejecutar el siguiente comando:
|
1 |
psql -U test -d postgres -h 127.0.0.1 -W |

Una vez que introduzca la contraseña, iniciará sesión en la consola. En nuestro ejemplo, utilizamos la base de datos ‘postgres’, la base de datos predeterminada que se configura automáticamente durante la instalación.
En esta sesión, según el usuario que haya seleccionado para iniciar sesión, se enfrentará al problema de que no tiene los permisos adecuados para realizar diversas acciones. La razón de este problema es que aún no ha otorgado al usuario los permisos suficientes para administrar las cosas.
En la siguiente sección, otorgará los permisos necesarios a los usuarios. Primero, deberá volver a cambiar el usuario a uno administrativo:
|
1 2 3 |
\q sudo su - postgres psql |
Gestionar permisos en PostgreSQL: Cómo otorgar permisos en PostgreSQL
En PostgreSQL, si un rol particular crea una base de datos o una tabla, solo ese rol tiene permisos para modificarla. La excepción a esto serían los roles que tienen permisos de superusuario. En esta sección, otorgará permisos a otros roles. Puede otorgar permisos a otros roles utilizando la sentencia ‘GRANT’. La sintaxis es:
|
1 |
GRANT permission_type ON table_name TO role_name; |
Puedes crear una tabla simple para ejecutar el comando:
|
1 2 3 4 |
CREATE TABLE demo ( name varchar(25), id serial, start_date date); |
Para ver la tabla creada, ejecuta el comando:
|
1 |
\d |

Ahora que tienes una tabla demo, puedes otorgar privilegios sobre la tabla ‘demo’ a ‘demo_role’. Puedes darle al rol el privilegio ‘UPDATE’ con este comando:
|
1 |
GRANT UPDATE ON demo TO demo_role; |
Puedes otorgar todos los permisos a un rol especificando el permiso como ‘ALL’:
|
1 |
GRANT ALL ON demo TO demo_role; |
Si deseas otorgar un permiso específico a todos los roles del sistema, puedes usar la palabra clave ‘public’ en lugar del rol, como en el siguiente comando:
|
1 |
GRANT INSERT ON demo TO PUBLIC; |
Puedes ver todos los permisos otorgados usando el siguiente comando:
|
1 |
\z |
Gestionar permisos en PostgreSQL: Cómo eliminar permisos en PostgreSQL
Puedes eliminar fácilmente los permisos de un rol usando el comando ‘REVOKE’. Es muy similar al comando grant:
|
1 |
REVOKE tipo_permiso ON nombre_tabla FROM nombre_usuario; |
Al igual que con GRANT, podemos usar las palabras clave – ‘ALL’ y ‘PUBLIC’ para otorgar todos los permisos u otorgar permisos a todos los roles:
|
1 |
REVOKE INSERT ON demo FROM PUBLIC; |
Cómo usar roles de grupo en PostgreSQL
Para permitir un control de permisos generalizado, los roles son lo suficientemente flexibles como para permitir la agrupación con otros roles. Por ejemplo, puedes crear un rol – ‘temporary_role’ y luego agregar ‘demo_role’ y ‘test_user’ a ese rol:
|
1 2 3 |
CREATE ROLE temporary_role; GRANT temporary_role TO demo_role; GRANT temporary_role TO test_user; |
Ahora puedes gestionar los permisos de estos dos roles simplemente gestionando los permisos del rol ‘temporary_role’. Esto permite una gestión de permisos más sencilla. Puedes ver la información de pertenencia al rol con este comando:
|
1 |
\du |

Cualquier miembro del grupo puede actuar como el grupo usando el comando ‘set role’. Como el usuario ‘postgres’ es un superusuario, puedes usar ‘set role’ incluso si no eres miembro del grupo:
|
1 |
SET ROLE temporary_role; |
Cualquier tabla que crees ahora será propiedad de temporary_role:
|
1 2 3 4 |
CREATE TABLE hello ( name varchar(25), id serial, start_date date); |
Para verificar la propiedad de la tabla, ejecuta el siguiente comando:
|
1 |
\d |

Puedes ver que el rol ‘temporary_role’ es el propietario de la nueva tabla y de la secuencia asociada con el tipo de datos serial. Para volver a los permisos del rol original, ejecuta el siguiente comando:
|
1 |
RESET ROLE; |
Si deseas que el rol tenga todos los privilegios del rol al que pertenece, puedes especificar la propiedad ‘inherit’ con el comando ‘alter role’:
|
1 |
ALTER ROLE test_user INHERIT; |
Con el comando anterior, ‘test_user’ ha obtenido todos los privilegios de los roles a los que pertenece. Para eliminar un rol, puedes usar el comando ‘drop role’:
|
1 |
DROP ROLE temporary_users; |

El comando anterior arroja un error porque tenemos algunos objetos, como la tabla ‘hello’, que dependen de él. Para eliminarlo, puedes transferir la propiedad de la tabla a un rol diferente:
|
1 |
ALTER TABLE hello OWNER TO demo_role; |
Puedes verificar que temporary_role ya no es propietario de ninguna tabla con el siguiente comando:
|
1 |
\d |

Puedes eliminar el ‘temporary_role’ ahora, ya que no tiene ninguna dependencia:
|
1 |
DROP ROLE temporary_users; |
Aunque el comando anterior eliminará el rol temporary_users, los antiguos miembros del grupo de roles no se eliminan.
Conclusión
Has completado el tutorial y ahora sabes cómo administrar los permisos en PostgreSQL. Puedes administrar los permisos fácilmente. Saber cómo administrar los permisos garantiza que tus aplicaciones tengan acceso a las bases de datos requeridas y, al mismo tiempo, no tengan acceso a ninguna otra base de datos utilizada por una aplicación diferente.
¡Feliz computación!


Comentarios
Aún no hay comentarios. Sea el primero.