Permisos en PostgreSQL
En el siguiente artículo, veamos cómo Postgres gestiona los permisos sobre los objetos.
Antes de ir directamente a los GRANT/REVOKE, tenemos que tener en cuenta algunas consideraciones respecto a los permisos por defecto que brinda Postgres.
Owner: Cuando se crea un objeto de base de datos, se le asigna un owner (generalmente es quién ejecuta la sentencia de creación), por ejemplo CREATE DATABASE db_name. A este owner, Postgres le asigna por defecto todos los permisos sobre ese objeto.
Public - Existe el pseudo-rol o palabra clave Public, que se puede entender como un grupo que contiene a todos los usuarios de la instancia. Por defecto, este grupo tiene ciertos privilegios sobre los objetos de la base de datos, como ser: CONNECT y TEMPORARY (crear tablas temporales) para las bases de datos, EXCECUTE para las funciones y USAGE para los lenguajes y tipos de datos. Nota: no se asignan privilegios por defecto a Public para tablas, columnas, esquemas, secuencias, foreign data wrappers, foreign servers o large objects.
Una buena práctica de seguridad es revocar los permisos al rol Public cuando se crea un objeto de base de datos. De esta forma se asegura que ningún usuario puede tener acceso a él, a menos que cuente con los permisos adecuados.
Ejemplo:
=> CREATE DABASE db_name;
=> REVOKE ALL ON DATABASE db_name FROM public;
Una vez explayadas las consideraciones anteriores, vamos directamente a GRANT y REVOKE.
Cuando se quiere otorgar privilegios sobre un objeto, se utiliza la palabra clave GRANT (conceder) junto con una serie de parámetros, la sintáxis básica (y muy a groso modo) de la sentencia es la siguiente:
GRANT Privileges ON Object TO User;
Privileges: se especifica la lista o abreviación de privilegios a conceder (SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES, etc).
Object: se especifica el objeto sobre el cual brindar los permisos, comunmente son la base de datos, tablas/vistas o secuencias.
User: se especifica el usuario a conceder los permisos.
Por ejemplo, asignemos permisos de lectura, escritura, actualización y eliminación sobre la tabla "t1" al usuario "prueba":
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE t1 TO prueba;
Análogamente, seguimos el mismo razonamiento para quitarle los permisos a un usuario sobre un objeto, utilizando la palabra clave REVOKE (REVOCAR), sentencia que también recibe parámetros y su sintáxis básica es la siguiente:
REVOKE Privileges ON Object FROM User;
Los parámetros son exactamente los mismos que en la sentencia GRANT. Nótese que cuando revocamos permisos, cambiamos el TO (para) por FROM (desde).
Por ejemplo, quitemos los permisos antes concedidos al usuario prueba sobre la tabla "t1":
REVOKE SELECT, INSERT, UPDATE, DELETE ON TABLE t1 FROM prueba;
Antes de ir directamente a los GRANT/REVOKE, tenemos que tener en cuenta algunas consideraciones respecto a los permisos por defecto que brinda Postgres.
Owner: Cuando se crea un objeto de base de datos, se le asigna un owner (generalmente es quién ejecuta la sentencia de creación), por ejemplo CREATE DATABASE db_name. A este owner, Postgres le asigna por defecto todos los permisos sobre ese objeto.
Public - Existe el pseudo-rol o palabra clave Public, que se puede entender como un grupo que contiene a todos los usuarios de la instancia. Por defecto, este grupo tiene ciertos privilegios sobre los objetos de la base de datos, como ser: CONNECT y TEMPORARY (crear tablas temporales) para las bases de datos, EXCECUTE para las funciones y USAGE para los lenguajes y tipos de datos. Nota: no se asignan privilegios por defecto a Public para tablas, columnas, esquemas, secuencias, foreign data wrappers, foreign servers o large objects.
Una buena práctica de seguridad es revocar los permisos al rol Public cuando se crea un objeto de base de datos. De esta forma se asegura que ningún usuario puede tener acceso a él, a menos que cuente con los permisos adecuados.
Ejemplo:
=> CREATE DABASE db_name;
=> REVOKE ALL ON DATABASE db_name FROM public;
Una vez explayadas las consideraciones anteriores, vamos directamente a GRANT y REVOKE.
Cuando se quiere otorgar privilegios sobre un objeto, se utiliza la palabra clave GRANT (conceder) junto con una serie de parámetros, la sintáxis básica (y muy a groso modo) de la sentencia es la siguiente:
GRANT Privileges ON Object TO User;
Privileges: se especifica la lista o abreviación de privilegios a conceder (SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES, etc).
Object: se especifica el objeto sobre el cual brindar los permisos, comunmente son la base de datos, tablas/vistas o secuencias.
User: se especifica el usuario a conceder los permisos.
Por ejemplo, asignemos permisos de lectura, escritura, actualización y eliminación sobre la tabla "t1" al usuario "prueba":
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE t1 TO prueba;
Análogamente, seguimos el mismo razonamiento para quitarle los permisos a un usuario sobre un objeto, utilizando la palabra clave REVOKE (REVOCAR), sentencia que también recibe parámetros y su sintáxis básica es la siguiente:
REVOKE Privileges ON Object FROM User;
Los parámetros son exactamente los mismos que en la sentencia GRANT. Nótese que cuando revocamos permisos, cambiamos el TO (para) por FROM (desde).
Por ejemplo, quitemos los permisos antes concedidos al usuario prueba sobre la tabla "t1":
REVOKE SELECT, INSERT, UPDATE, DELETE ON TABLE t1 FROM prueba;
Comentarios
Publicar un comentario