Prácticas de Administración de PostgreSQL Boletín 04 - Soluciones Objetivos: o Seguridad: acceso de clientes o Seguridad: acceso a los objetos de la base de datos 1. Supongamos que se nos ha olvidado la contraseña del superusuario postgres, ¿qué debemos hacer para poder acceder a la base de datos y cambiar la contraseña. tendríamos que entrar al servidor y modificar el fichero pg_hba.conf, añadiendo la siguiente línea como la primera: local all postgres trust salvaríamos el fichero y reiniciariamos el servidor: $ pg_ctl reload $ psql postgres=> alter user postgres password ‘nuevapassword’; luego comentaríamos la línea que hemos añadido y volveríamos a recargar el servidor. 2. Nuestro servidor acepta conexiones TCP/IP, ¿por qué?. Configurar el fichero de accesos para permitir cualquier acceso sin necesidad de introducir contraseñas. pueden acceder a nuestro servidor porque hemos modificado el fichero postgresql.conf: listen_addresses = ‘*’ (también se puede poner la IP de nuestro servidor) port = 5432 se trata de añadir la siguiente línea como la primera host all all 0.0.0.0/0 trust 3. Modificar el fichero de accesos para que el usuario postgres se conecte sin contraseña y los usuarios de la red del servicio de informática se puedan conectar a la base de datos “bdnueva” pidiendo password. local all host all host bdnueva postgres postgres all 127.0.0.1/32 147.156.2.0/24 trust trust md5 4. .¿Qué problema de seguridad tiene la anterior configuración? Resolver el problema, y además, queremos impedir que los usuarios que se encuentran en nuestra misma fila de mesas no puedan acceder a ninguna de nuestras bases de datos desde sus máquinas. ¡es un problema grave! cualquier usuario de sistema del servidor se puede conectar como superusuario de la base de datos se trata de añadir la siguiente línea como la primera local all host all host bdnueva postgres postgres all 127.0.0.1/32 147.156.2.X/32 1 ident sameuser ident sameuser reject José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 04 - Soluciones 5. .Por último, resulta que tenemos varios usuarios de sistema especiales, como postgres, por ejemplo el usuario backup al que debemos permitir que se conecte a la base de datos como superusuario para realizar determinadas operaciones sin validarse. Además, queremos que los operadores, operval, opercas y operali, si se conectan localmente sólo puedan conectarse con un usuario llamado “consultamax” y si es remotamente, dentro de nuestra red, con un usuario llamado “consultamin” en el fichero pg_hba.conf añadimos local host local host host all all all all all postgres postgres consultamax consultamax consultamin 127.0.0.1/32 127.0.0.1/32 146.152.2.0/24 ident ident ident ident ident dbbackup dbbackup acclocal acclocal accred en el fichero pg_ident.conf añadimos # MAPNAME dbbackup acclocal acclocal acclocal accred accred accred IDENT-USERNAME backup operval opercas operali operval opercas operali PG-USERNAME postgres consultamax consultamax consultamax consultamin consultamin consultamin 6. Vamos a crear una base de datos, ‘curso’ sobre un tablespace ‘tbscurso’ con codificación LATIN9 y lenguaje ‘es_ES’. Sobre esa base de datos, tenemos que crear dos esquemas, ‘coches’ y ‘empresa’. Además crearemos cuatro usuarios, ‘mgrcoches’, ‘modcoches’, ‘mgrempresa’ y ‘modempresa’, siendo los ‘mgr*’ los propietarios de los esquemas. En cada esquema, creamos una tabla con la siguiente estructura: CREATE TABLE marcas( cifm VARCHAR(4) not null, nombre VARCHAR(10) not null, ciudad VARCHAR(10) not null, CONSTRAINT pk_marcas PRIMARY KEY (cifm) ); CREATE TABLE departamentos ( numdept NUMERIC (2) NOT NULL, nomdept VARCHAR (14) NOT NULL, localidad VARCHAR (13) NOT NULL, jefe NUMERIC(4), CONSTRAINT pk_departamentos PRIMARY KEY ( numdept )); se trata de asignar los permisos necesarios tal como se cumple en esta tabla: coches empresa mgrcoches S,I,U,D S modcoches S,U 2 mgrempresa S S,I,U,D modempresa S,U José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 04 - Soluciones conectamos con una bd que ya exista, template1 y creamos el tablespace, la base de datos y los usuarios: $ mkdir /mnt/diskrapido/data/tbscurso $ psql template1 < crear.sql donde crear.sql contiene: -- Creamos un tablespace CREATE TABLESPACE tbscurso OWNER postgres LOCATION '/mnt/diskrapido/data/tbscurso'; -- Creamos la base de datos donde permitimos como maximo 5 conexiones CREATE DATABASE "curso" WITH ENCODING='latin9' OWNER=postgres TEMPLATE=template1 TABLESPACE=tbscurso CONNECTION LIMIT = 5; -- Creamos los usuarios CREATE USER mgrcoches PASSWORD 'mgrcoches' NOINHERIT VALID UNTIL 'infinity'; CREATE USER modcoches PASSWORD 'modcoches' NOINHERIT VALID UNTIL 'infinity' CONNECTION LIMIT 2; CREATE USER mgrempresa PASSWORD 'mgrempresa' NOINHERIT VALID UNTIL 'infinity'; CREATE USER modempresa PASSWORD 'modempresa' NOINHERIT VALID UNTIL 'infinity' CONNECTION LIMIT 2; conectamos con la base de datos nueva y creamos los esquemas y las tablas $ psql curso < esquemas_tablas.sql; donde esquemas_tablas contiene: CREATE SCHEMA coches AUTHORIZATION mgrcoches; COMMENT ON SCHEMA coches IS 'Tablas para la gestion de las ventas y distribucion de coches'; CREATE SCHEMA empresa AUTHORIZATION mgrempresa; COMMENT ON SCHEMA empresa IS 'Tablas para la gestion de los empleados y departamentos de una empresa'; GRANT GRANT GRANT GRANT GRANT GRANT ALL ALL USAGE USAGE USAGE USAGE ON ON ON ON ON ON SCHEMA SCHEMA SCHEMA SCHEMA SCHEMA SCHEMA coches empresa coches empresa coches empresa TO TO TO TO TO TO mgrcoches; mgrempresa; mgrempresa; mgrcoches; modcoches; modempresa; -- Y asignamos las variables SEARCH_PATH ALTER USER mgrcoches SET search_path = 'coches','empresa'; ALTER USER mgrempresa SET search_path = 'empresa','coches'; 3 José Manuel Alarcón Medina Prácticas de Administración de PostgreSQL Boletín 04 - Soluciones ALTER USER modcoches SET search_path = 'coches','empresa'; ALTER USER modempresa SET search_path = 'empresa','coches'; SET search_path = coches, pg_catalog; -- Creando la tabla MARCAS ... CREATE TABLE marcas (cifm VARCHAR(4) not null, nombre VARCHAR(10) not null, ciudad VARCHAR(10) not null, CONSTRAINT pk_marcas PRIMARY KEY (cifm) ); ALTER TABLE marcas OWNER TO mgrcoches; GRANT SELECT,UPDATE ON MARCAS TO modcoches; GRANT SELECT ON MARCAS TO mgrempresa; SET search_path = empresa, pg_catalog; CREATE TABLE departamentos ( numdept NUMERIC (2) NOT NULL, nomdept VARCHAR (14) NOT NULL, localidad VARCHAR (13) NOT NULL, jefe NUMERIC(4), CONSTRAINT pk_departamentos PRIMARY KEY ( numdept )); ALTER TABLE departamentos OWNER TO mgrempresa; GRANT SELECT,UPDATE ON departamentos TO modempresa; GRANT SELECT ON departamentos TO mgrcoches; Ahora se trata de probar que todos los usuarios cumplen los requisitos de la tabla inicial. 4 José Manuel Alarcón Medina