Soluciones

Anuncio
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
Descargar