📝 apuntes_TAI_virtualizacion_almacenamiento_postgresql
← Volver

📚 VIRTUALIZACIÓN, ALMACENAMIENTO Y POSTGRESQL

Clase magistral para el examen TAI

🎓 Cómo usar este documento: Lee la explicación de cada bloque temático y responde las preguntas antes de pasar al siguiente. Las soluciones comentadas están al final.


BLOQUE 1 — VIRTUALIZACIÓN: CONCEPTOS FUNDAMENTALES

¿Qué es la virtualización?

La virtualización consiste en crear una máquina virtual que replica completamente a una máquina real, de modo que sobre ella se pueda instalar un sistema operativo completo que "cree" que está corriendo sobre hardware real.

El software encargado de crear estas máquinas ficticias se conoce como aplicación de virtualización o hypervisor/monitor de máquina virtual.


Anfitrión (Host) e Invitado (Guest)

Concepto Descripción
Anfitrión (Host) SO del ordenador físico donde se instala el programa de virtualización. Presta recursos al invitado.
Invitado (Guest) SO que se instala dentro de la máquina virtual creada por el hypervisor.

💡 Mnemotecnia: El anfitrión es el propietario de la casa; los invitados viven dentro de particiones de esa casa. Un anfitrión puede tener varios invitados.


Requisitos hardware mínimos

Virtualización: requisitos recomendados
├── RAM            → Mínimo 2 GB (se divide entre host y guest)
├── Disco duro     → Suficiente para alojar los discos virtuales
├── Microprocesador → Potente (se divide entre los SO)
└── CPU con soporte de virtualización hardware
      ├── Intel VT (IVT — Intel Virtualization Technology)
      └── AMD-V (AMD Virtualization — socket AM3, AM2, S1, F)

⚠️ Dato clave: Sin soporte hardware en la CPU (VT o AMD-V), la virtualización es posible pero muy lenta. Aplicaciones como KVM son inutilizables sin estas extensiones.


Paravirtualización y anillos de privilegio

En la arquitectura x86, el kernel del SO se ejecuta en el anillo 0 (máximos privilegios). Al virtualizar, el kernel del SO invitado no puede ejecutarse en el anillo 0 de forma directa.

Solución Descripción Problema
Paravirtualización Recompila el SO para que no use el anillo 0 Lento, solo funciona con Linux/BSD
Emulación del anillo 0 Emula completamente el anillo 0 Aún más lento
Extensiones VT/AMD-V Crean un "anillo -1" para el hypervisor ✅ Solución óptima — velocidad idéntica al SO real

💡 Con las extensiones Intel VT o AMD-V, el hypervisor corre en el anillo -1, y los SO virtualizados corren directamente en el anillo 0. No hay que recompilar nada.


Tipos de máquinas virtuales

Máquinas virtuales de sistema (hardware)

Permiten dividir la máquina física en varias máquinas virtuales, cada una con su propio SO.

Tipo de Hypervisor Descripción Ejemplos
Tipo 1 Corre directamente sobre el hardware. No necesita SO anfitrión. VMware ESXi, Xen, Hyper-V standalone
Tipo 2 Corre sobre un SO anfitrión existente. VirtualBox, VMware Player/Workstation, KVM

Máquinas virtuales de proceso (aplicación)

Se ejecutan como un proceso normal del SO y soportan un solo proceso. Su objetivo es proporcionar un entorno de ejecución independiente de la plataforma.

💡 Ejemplo más conocido: La Máquina Virtual de Java (JVM). También la de .NET.


Técnicas de virtualización

Técnica Descripción Ejemplo
Completa / nativa Ejecuta cualquier SO compatible con el hardware real VirtualBox con Windows, Linux, macOS
Emulación de hardware / no nativa Emula una arquitectura hardware diferente Emulador de Nintendo 64 en un PC x86
A nivel de SO Divide el SO en compartimentos (entornos virtuales) Solaris Zones, IBM AIX Micro Partitioning

⚠️ La más usada es la virtualización completa. La virtualización a nivel de SO es cada vez más obsoleta.


Ventajas de la virtualización

Ventajas principales
├── Ahorro de costes          → Donde antes hacían falta 2 máquinas, ahora basta 1
├── Entornos de prueba        → Se instala software beta en el SO virtual, no en el real
├── Seguridad aislada         → Navegación segura en entorno aislado
├── Compatibilidad            → Ejecutar Windows dentro de Linux o Mac
├── Reducción de espacio      → Consolidación media estimada 10:1
├── Migración en caliente     → Mover VMs entre servidores físicos sin parada
├── Balanceo dinámico         → Distribución automática de VMs entre servidores
├── Alta disponibilidad       → Un fallo en la VM no afecta a las demás
└── Administración centralizada → Gestión del CPD como pool de recursos

💡 Dato clave: Un servidor con un solo SO deja sin usar un 70% de su capacidad. La virtualización aprovecha ese desperdicio.


Soluciones de virtualización

Solución Tipo Coste Características principales
VirtualBox Tipo 2, virtualización completa Gratuito (uso doméstico) Fácil de usar, multiplaforma
VMware Player Tipo 2, virtualización completa Gratuito Ligero, buen rendimiento
VMware Workstation Tipo 2, virtualización completa De pago Instantáneas, clonado en caliente
VMware ESXi Tipo 1, virtualización completa Gratuito Sin SO anfitrión, hardware limitado
VMware vSphere/ESX Tipo 1, virtualización completa De pago Infraestructuras complejas, más hardware soportado
VMware ThinApp VM de proceso De pago Ejecuta aplicaciones sin instalar
VMware Fusión Tipo 2 para Mac De pago Hypervisor para macOS
VMware vCenter No es hypervisor Gratuito Administración centralizada de VMware
VMware Converter Herramienta P2V Gratuito Virtualiza una máquina física existente
Virtual PC Tipo 2 Gratuito Hypervisor Microsoft para escritorio, limitado
KVM Tipo 2, máquina completa Gratuito Integrado en Linux ≥ 2.6.20, necesita VT/AMD-V
Xen Tipo 1 + paravirtualización Gratuito Open source, migración en caliente, Universidad de Cambridge
Hyper-V Tipo 1 (standalone) / Tipo 2 (con Windows Server) Versión incluida con Windows Server Particiones, paravirtualización Linux

💡 Sobre Xen: Citrix adquirió XenSource en 2007 por 500 millones de dólares. XenServer Express Edition es gratuito pero limitado a 4 VMs.

💡 Sobre KVM: Usa Virt-Manager como administrador gráfico y Qemu como hypervisor subyacente.

💡 Sobre Hyper-V: Trabaja con particiones. Hay una partición raíz (Windows Server 2008) con acceso directo al hardware, y particiones hijas para los SO virtualizados.


🧪 TEST — BLOQUE 1: Virtualización

1. ¿Cómo se denomina el SO que alberga la aplicación de virtualización y cede recursos a las máquinas virtuales?


2. ¿Qué problema resuelven las extensiones Intel VT y AMD-V en la virtualización?


3. ¿Qué tipo de hypervisor es VMware ESXi?


4. ¿Cuál de las siguientes soluciones NO es un hypervisor, sino una herramienta de administración?


5. ¿Qué técnica de virtualización recompila el sistema operativo para que no haga uso del anillo 0?


BLOQUE 2 — ALMACENAMIENTO: DAS, NAS Y SAN

Los tres tipos de almacenamiento en red

Tipos de almacenamiento
├── DAS (Direct Attached Storage)  → Almacenamiento directamente conectado al servidor
├── NAS (Network Attached Storage) → Almacenamiento accesible a través de red IP
└── SAN (Storage Area Network)     → Red dedicada de almacenamiento a nivel de bloque

DAS — Direct Attached Storage

El almacenamiento está directamente conectado al servidor mediante un bus SCSI. Es el modelo más sencillo y tradicional.

Arquitectura DAS
Computer System
├── Application
├── File System
├── Volume Manager
├── SCSI Device Driver
└── SCSI Bus Adapter
         │
      [Block I/O]
         │
      [SCSI bus]
         │
      [Disco]
Característica DAS
Protocolo SCSI (bus directo)
Nivel de acceso Bloque (Block I/O)
Conexión SCSI Bus Adapter local
Ventaja Simplicidad, bajo coste, alto rendimiento local
Inconveniente No compartible entre servidores, escalabilidad limitada

NAS — Network Attached Storage

El almacenamiento se conecta a través de red IP y presenta un sistema de archivos completo a los clientes mediante protocolos NFS (Linux/Unix) o CIFS/SMB (Windows).

Arquitectura NAS Gateway
Computer System (Cliente)
├── Application
├── File System
├── I/O Redirector
├── NFS/CIFS
├── TCP/IP Stack
└── NIC
         │
      [File I/O sobre IP]
         │
NAS Gateway (Servidor de almacenamiento)
├── NIC
├── TCP/IP Stack
├── File System
├── FC HBA
└── FC
         │
      [Disco]
Característica NAS
Protocolo NFS (Linux) / CIFS-SMB (Windows) sobre TCP/IP
Nivel de acceso Fichero (File I/O)
Conexión Red IP estándar (Ethernet)
Ventaja Fácil de compartir entre múltiples clientes, bajo coste
Inconveniente Rendimiento limitado por la red IP, latencia mayor

💡 Mnemotecnia NAS: Network = red de ficheros (NFS/CIFS)


SAN — Storage Area Network

Red dedicada de almacenamiento de alta velocidad que permite acceso a nivel de bloque mediante Fibre Channel (FC) o iSCSI.

Arquitectura SAN
Computer System
├── Application
├── File System
├── Volume Manager
├── SCSI Device Driver
└── FC HBA (Host Bus Adapter Fibre Channel)
         │
      [Block I/O]
         │
      [Red SAN]
         │
      [FC — Fibre Channel]
         │
      [Disco]
Característica SAN
Protocolo Fibre Channel (FC) / iSCSI
Nivel de acceso Bloque (Block I/O)
Conexión Red dedicada FC o iSCSI
Ventaja Altísimo rendimiento, escalabilidad, compartición entre servidores
Inconveniente Coste elevado, complejidad de administración

💡 Mnemotecnia SAN: Storage Area Network = red dedicada de bloques (FC/iSCSI)


Tabla comparativa DAS / NAS / SAN

DAS NAS SAN
Nivel de acceso Bloque Fichero Bloque
Red Bus SCSI local Red IP (Ethernet) Red dedicada FC/iSCSI
Protocolo SCSI NFS / CIFS Fibre Channel / iSCSI
Compartición No (local al servidor) Sí (múltiples clientes) Sí (múltiples servidores)
Rendimiento Alto (local) Medio (depende de red IP) Muy alto
Coste Bajo Bajo-Medio Alto
Complejidad Baja Media Alta
Caso de uso Servidor individual Compartición de ficheros Bases de datos, virtualización crítica

🧪 TEST — BLOQUE 2: Almacenamiento

6. ¿Qué tipo de almacenamiento accede a los datos a nivel de fichero a través de una red IP estándar?


7. Una empresa necesita compartir almacenamiento entre varios servidores de virtualización con el máximo rendimiento posible y usa Fibre Channel. ¿Qué solución es la más adecuada?


8. ¿Qué protocolo utiliza NAS para compartir ficheros con clientes Linux/Unix?


9. ¿Cuál es la principal diferencia entre DAS y SAN en términos de arquitectura?


10. En una arquitectura NAS, ¿a qué nivel del stack del cliente se realiza la redirección del acceso al almacenamiento?


BLOQUE 3 — POSTGRESQL: INTRODUCCIÓN Y ARQUITECTURA

¿Qué es PostgreSQL?

PostgreSQL es un servidor de bases de datos relacionales y objetos, de software libre distribuido bajo licencia BSD desde 1996.

Hito Año Descripción
POSTGRES 1986 Proyecto original en la Universidad de Berkeley (Michael Stonebraker)
Post-Ingres Continuación del SGBD Ingres (de ahí el nombre)
Postgres95 1994 Se añade intérprete SQL; código distribuido como Postgres95
PostgreSQL 1996 SQL sustituye a PostQUEL; se renombra como PostgreSQL
Versiones 9.x Versión principal indicada con dos cifras (ej: 9.6)
Versión 10+ 2017+ Nuevo esquema: un número para versión principal (10, 11, 12…)

💡 PGDG: El grupo de publicación informal se llama PostgreSQL Developer Group. Tiene un "core team" y "committers" con acceso al repositorio GIT.


Límites de PostgreSQL

Elemento Límite
Tamaño de un campo 1 GB
Tamaño de un registro 1,6 TB
Tamaño de una tabla 32 TB
Número máximo de columnas por tabla 250 a 1.600 (según tamaño de bloque)
Puerto TCP por defecto 5432
Tamaño de bloque de datos por defecto 8 KB
Tamaño de segmento de tabla por defecto 1 GB
Tamaño de bloque WAL por defecto 8 KB
Tamaño de archivo WAL por defecto 16 MB

Instalación desde fuentes

# 1. Verificar la suma de control del archivo descargado
md5sum postgresql-10.0.tar.bz2

# 2. Descomprimir
tar xf postgresql-10.0.tar.bz2

# 3. Configurar (opciones principales)
./configure --prefix=/usr/local/pgsql \
            --with-python --with-openssl \
            --with-systemd --enable-debug \
            --with-pgport=5432        # Puerto TCP (def: 5432)

# 4. Compilar e instalar
make world
sudo make install-world

# 5. Exportar rutas
export PATH=$PATH:/usr/local/pgsql/bin
export LD_LIBRARY_PATH=/usr/local/pgsql/lib

Instalación en Debian/Ubuntu (paquetes)

# Añadir repositorio oficial de PostgreSQL
wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
# Añadir la línea en /etc/apt/sources.list.d/pgdg.list
apt-get update

# Instalar
apt-get install postgresql-10

# Arrancar la instancia (Debian)
pg_ctlcluster 10 main start
# O con SystemD:
systemctl start postgresql@10-main

Scripts específicos Debian

Script Función
pg_lsclusters Lista instancias existentes con su configuración
pg_createcluster Crea una nueva instancia (usa initdb internamente)
pg_ctlcluster Controla instancias (start/stop/restart/reload/promote)
pg_upgradecluster Actualiza una instancia a otra versión de PostgreSQL
pg_dropcluster Elimina una instancia y todos sus archivos

🧪 TEST — BLOQUE 3: PostgreSQL Introducción

11. ¿Bajo qué licencia se distribuye PostgreSQL?


12. ¿Cuál es el puerto TCP por defecto de PostgreSQL?


13. ¿Cuál es el tamaño máximo de una tabla en PostgreSQL?


14. ¿Qué script de Debian permite listar todas las instancias PostgreSQL existentes en el sistema con su estado y configuración?


BLOQUE 4 — POSTGRESQL: INICIALIZACIÓN Y ARCHIVOS

El comando initdb

initdb inicializa el grupo de bases de datos (también llamado cluster o instancia). Crea todos los directorios y archivos necesarios para arrancar el servidor.

# Ejemplo de inicialización completa
initdb -A trust -E UTF8 --locale=es_ES \
       -D /var/lib/postgresql/10/data \
       -X /pgxlog/10/wals

Opciones principales de initdb

Opción Descripción
-D, --pgdata=DIR Ruta del directorio de datos (obligatorio)
-A, --auth=METHOD Método de autenticación por defecto (trust, md5, ident)
-X, --xlogdir=DIR Ubicación de los archivos WAL (no modificable después)
-E, --encoding=ENC Juego de caracteres por defecto (UTF8, LATIN1, etc.)
--locale=LOCALE Argumento regional (es_ES, en_US, etc.)
-k, --data-checksums Activa sumas de control de datos (no activo por defecto)
-U, --username=NAME Nombre del superusuario de la instancia
-W, --pwprompt Solicita la contraseña del superusuario interactivamente

⚠️ Datos críticos: Las opciones -X (ubicación WAL) y -E (encoding) no se pueden cambiar una vez arrancada la instancia.


Directorios creados por initdb

Directorio Contenido
base/ Todas las bases de datos (tablas e índices). Espacio de tablas por defecto
global/ Tablas globales accesibles desde toda la instancia
pg_wal/ Archivos de traza de transacciones (WAL)
pg_xact/ Estado de las transacciones en curso
pg_logical/ Datos para la descodificación lógica (replicación)
pg_replslot/ Datos de los slots de replicación
pg_tblspc/ Enlaces simbólicos a los espacios de tablas creados
pg_stat/ Archivos permanentes de estadísticas
pg_stat_tmp/ Archivos temporales de estadísticas

Archivos de configuración creados por initdb

Archivo Descripción
postgresql.conf Archivo principal de configuración del servidor
postgresql.auto.conf Configuración escrita por ALTER SYSTEM. Se lee siempre en último lugar
pg_hba.conf Archivo de autenticación (Host-Based Authentication)
pg_ident.conf Archivo de correspondencias de usuarios
PG_VERSION Archivo de texto con la versión principal de PostgreSQL

Control del servidor: pg_ctl

# Arrancar el servidor
pg_ctl -D /var/lib/postgresql/10/data -l logfile start

# Detener el servidor
pg_ctl -D /var/lib/postgresql/10/data stop

# Reiniciar el servidor
pg_ctl -D /var/lib/postgresql/10/data restart

# Recargar configuración (sin reiniciar)
pg_ctl -D /var/lib/postgresql/10/data reload

💡 reload aplica cambios en postgresql.conf y pg_hba.conf sin detener el servidor.


Juegos de caracteres principales

Nombre Descripción Alias
SQL_ASCII No especificado (tabla ASCII)
UTF8 Unicode 8-bit (recomendado) Unicode
LATIN1 ISO 8859-1, Europa occidental ISO88591
LATIN9 ISO 8859-15 (LATIN1 + Euro) ISO885915
WIN1252 Windows CP1252

⚠️ El valor por defecto si no se especifica es SQL_ASCII, que no es recomendable para aplicaciones. Usar UTF8.


🧪 TEST — BLOQUE 4: Inicialización y archivos

15. ¿Qué archivo de configuración de PostgreSQL controla qué usuarios pueden conectarse, desde qué IP y con qué método de autenticación?


16. ¿Qué directorio contiene el grueso de los datos de PostgreSQL (tablas e índices)?


17. ¿Cuál es el juego de caracteres que PostgreSQL usa por defecto si no se especifica ninguno en initdb?


18. ¿Qué opción de pg_ctl recarga los archivos de configuración sin detener el servidor PostgreSQL?


BLOQUE 5 — POSTGRESQL: CONEXIONES Y pg_hba.conf

Métodos de conexión

PostgreSQL acepta conexiones mediante dos métodos:

Método Descripción Disponibilidad
Socket Unix Comunicación local mediante archivo de socket Solo en el mismo host (Linux/Unix)
TCP/IP Conexión de red estándar (puerto 5432 por defecto) Local y remota; obligatorio en Windows

💡 Una sesión abierta solo afecta a una única base de datos y a una única cuenta de usuario.


El archivo pg_hba.conf

Cada línea del archivo es una regla de acceso con 4 o 5 campos:

tipo_conexión   base_de_datos   usuario   origen_red   método_autenticación

Tipos de conexión

Tipo Descripción
local Conexión por socket Unix
host Conexión TCP/IP (con o sin SSL)
hostssl Conexión TCP/IP con SSL obligatorio
hostnossl Conexión TCP/IP sin SSL

Palabras clave especiales para base de datos y usuario

Palabra clave Significado
all Cualquier base de datos / cualquier usuario
sameuser La base de datos tiene el mismo nombre que el usuario
samerole El usuario debe ser miembro del rol con el nombre de la BD

Métodos de autenticación

Método Descripción Seguridad
trust Sin contraseña. Conexión siempre aceptada ⚠️ Peligroso
md5 Contraseña cifrada con MD5 ✅ Preferido en versiones antiguas
scram-sha-256 Intercambio seguro (desde v10). Estándar actual ✅✅ Recomendado
cert Certificado SSL (como SSH) ✅ Muy seguro
reject Rechaza siempre la conexión
gssapi Kerberos Entornos empresariales
ldap Directorio LDAP Entornos empresariales

Ejemplo de pg_hba.conf

# Tipo      BD        Usuario     Origen              Método
local       all       postgres                        trust
host        all       postgres    192.168.0.0/24      md5
host        clients   clientes    192.168.1.2/32      trust
host        clients   clientes    0.0.0.0/0           md5

⚠️ El orden importa. Las reglas se leen de arriba a abajo. La primera regla que coincide se aplica. Las reglas más específicas deben ir primero.


Opciones de conexión con psql

Opción Descripción
-h host Nombre o IP del servidor
-p port Puerto TCP (por defecto: 5432)
-U usuario Nombre del rol de conexión
-d base_datos Nombre de la base de datos
-W Solicita contraseña interactivamente
-l Lista las bases de datos del servidor
-f archivo.sql Ejecuta instrucciones desde un archivo
-c 'consulta' Ejecuta una consulta directamente
# Conexión básica por socket Unix
psql -U postgres -d postgres

# Conexión remota con contraseña
psql -h 192.168.1.10 -p 5432 -U postgres -d clientes

# URI de conexión
psql "postgresql://postgres@localhost:5432/postgres"

# Múltiples hosts (desde v10)
psql "host=server1,server2,server3 user=postgres dbname=postgres"

Variables de entorno para conexión

Variable Descripción
PGDATABASE Nombre de la base de datos
PGHOST / PGHOSTADDR Nombre o IP del servidor
PGPORT Puerto TCP
PGUSER Nombre del usuario
PGPASSWORD Contraseña
PGSERVICE Nombre del servicio en .pg_service.conf

Archivo de contraseñas ~/.pgpass

# formato: nombrehost:puerto:database:usuario:contraseña
*:*:*:postgres:passpg
192.168.0.2:5432:*:postgres:pgpass_especifico

⚠️ El archivo debe tener permisos 600 (chmod 600 ~/.pgpass). Si no, PostgreSQL lo ignora.


Comandos internos de psql (backslash commands)

Comando Función
\l o \l+ Lista las bases de datos
\c nombre_bd Cambia la conexión a otra base de datos
\conninfo Muestra información de la conexión actual
\du o \dg Lista todos los roles y grupos
\d tabla Muestra la estructura de una tabla
\dt Lista todas las tablas del esquema actual
\di Lista los índices
\ds Lista las secuencias
\dn Lista los esquemas (namespaces)
\db Lista los tablespaces
\dp Lista los permisos
\timing Activa/desactiva el tiempo de ejecución
\i archivo.sql Ejecuta un archivo SQL
\q Sale de psql
\? Ayuda de comandos backslash
\h COMANDO Ayuda del comando SQL

🧪 TEST — BLOQUE 5: Conexiones

19. En el archivo pg_hba.conf, ¿qué método de autenticación rechaza siempre la conexión sin importar usuario ni contraseña?


20. ¿Qué permisos debe tener el archivo ~/.pgpass para que PostgreSQL lo utilice?


21. ¿Qué comando interno de psql lista todos los roles y grupos de la instancia?


22. En pg_hba.conf, si una misma conexión coincide con varias reglas, ¿cuál se aplica?


BLOQUE 6 — POSTGRESQL: ROLES, PERMISOS Y SEGURIDAD

Gestión de roles

En PostgreSQL, usuario y grupo son el mismo concepto: un rol. Un rol es un objeto global válido para toda la instancia.

-- Crear un rol usuario (con LOGIN)
CREATE ROLE slardiere LOGIN PASSWORD 'password' CREATEDB;

-- Crear un grupo (sin LOGIN)
CREATE ROLE admingroup ROLE slardiere;

-- Crear usuario con herencia de permisos del grupo
CREATE ROLE slardiere LOGIN PASSWORD 'password' INHERIT IN ROLE admingroup;

-- Modificar un rol
ALTER ROLE slardiere NOLOGIN;
ALTER ROLE slardiere PASSWORD 'nuevapassword';
ALTER ROLE slardiere RENAME TO sebl;

-- Eliminar un rol
DROP ROLE slardiere;

Opciones principales de CREATE ROLE

Opción Descripción
LOGIN Permite conectarse al servidor (convierte el rol en usuario)
PASSWORD 'pass' Define la contraseña
SUPERUSER Permisos ilimitados sobre toda la instancia
CREATEDB Puede crear bases de datos
CREATEROLE Puede crear otros roles
INHERIT Hereda los permisos de los roles de los que es miembro
REPLICATION Puede iniciar la replicación
BYPASSRLS Ignora las reglas de seguridad a nivel de fila (RLS)
CONNECTION LIMIT n Número máximo de conexiones simultáneas (-1 = sin límite)
VALID UNTIL 'fecha' Caducidad de la contraseña
IN ROLE grupo El nuevo rol es miembro de grupo

Gestión de permisos: GRANT y REVOKE

-- Conceder permisos
GRANT SELECT, INSERT, UPDATE, DELETE
  ON TABLE clientes, contactos, facturas
  TO sebl;

-- Conceder con posibilidad de delegar
GRANT SELECT ON TABLE facturas TO sebl WITH GRANT OPTION;

-- Revocar permisos
REVOKE SELECT ON TABLE clientes FROM sebl;

-- Revocar en cascada (incluye permisos delegados)
REVOKE SELECT ON TABLE facturas FROM sebl CASCADE;

-- Permisos por defecto para futuros objetos
ALTER DEFAULT PRIVILEGES
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO sebl;

Resumen de permisos por tipo de objeto

Objeto Permisos disponibles
Tabla SELECT, INSERT, UPDATE, DELETE, REFERENCES, TRIGGER, RULE, ALL
Columna SELECT, INSERT, UPDATE
Base de datos CREATE (crear esquemas), TEMPORARY/TEMP (tablas temporales)
Esquema CREATE (crear tablas), USAGE (acceder a objetos)
Función EXECUTE
Tablespace CREATE (crear tablas e índices)
Lenguaje USAGE

💡 PUBLIC como destinatario en GRANT aplica el permiso a todos los roles, incluidos los que se creen en el futuro.


Row Level Security (RLS) — Seguridad a nivel de fila

Desde la versión 9.5, es posible controlar qué filas devuelve una consulta según el rol que la ejecuta.

-- Activar RLS en una tabla
ALTER TABLE prestaciones ENABLE ROW LEVEL SECURITY;

-- Crear una política de acceso
CREATE POLICY nombre ON tabla
  [ AS { PERMISSIVE | RESTRICTIVE } ]
  [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
  [ TO { rol | PUBLIC | CURRENT_USER } ]
  [ USING (expresion_filtro) ];

⚠️ Las reglas RLS no se aplican a los roles con SUPERUSER o BYPASSRLS. No genera errores: simplemente no devuelve las filas no autorizadas.


🧪 TEST — BLOQUE 6: Roles y permisos

23. ¿Qué opción de CREATE ROLE permite que un usuario se conecte al servidor?


24. Un rol tiene el permiso SELECT sobre la tabla facturas. El administrador ejecuta REVOKE SELECT ON TABLE facturas FROM rol_a CASCADE. ¿Qué ocurre con los permisos que rol_a había delegado a terceros con WITH GRANT OPTION?


25. ¿Cuál de las siguientes afirmaciones sobre ALTER DEFAULT PRIVILEGES es correcta?


26. ¿Qué sentencia permite a un usuario adoptar temporalmente la identidad de un grupo del que es miembro para obtener sus permisos?



✅ SOLUCIONES COMENTADAS


1 → c) El anfitrión (host) es el SO del ordenador físico donde se instala el programa de virtualización. El invitado (guest) es el SO que corre dentro de la máquina virtual. El hypervisor de tipo 1 no necesita SO anfitrión.

2 → b) Intel VT y AMD-V introducen un "anillo -1" para el hypervisor. Así, los SO virtualizados corren directamente en el anillo 0 sin necesidad de paravirtualización ni recompilación. La velocidad es prácticamente idéntica al SO real.

3 → b) VMware ESXi es un hypervisor de tipo 1: corre directamente sobre el hardware sin necesitar un SO anfitrión. Por eso es el más adecuado para servidores de virtualización en empresas.

4 → c) VMware vCenter no es un hypervisor sino una herramienta de administración centralizada de otras soluciones VMware. ESXi, Player y VirtualBox sí son hypervisores.

5 → d) La paravirtualización consiste en recompilar el SO invitado para que no use el anillo 0. XEN usa esta técnica para Linux y BSD. Las extensiones VT/AMD-V resuelven el problema de forma mucho más eficiente.

6 → c) NAS (Network Attached Storage) presenta el almacenamiento como un sistema de archivos accesible a través de red IP estándar, usando protocolos NFS (Linux) o CIFS/SMB (Windows). El acceso es a nivel de fichero.

7 → c) SAN con Fibre Channel es la solución diseñada específicamente para compartir almacenamiento de alto rendimiento entre múltiples servidores. FC proporciona la mayor velocidad y es el protocolo estándar en entornos de virtualización crítica.

8 → d) NFS (Network File System) es el protocolo que utiliza NAS para compartir ficheros con clientes Linux/Unix. Para clientes Windows se usa CIFS/SMB. Fibre Channel e iSCSI son protocolos de SAN (nivel de bloque).

9 → b) La diferencia fundamental es la arquitectura de conexión: DAS usa un bus SCSI local directamente conectado al servidor; SAN usa una red dedicada de alta velocidad (Fibre Channel o iSCSI). Ambos acceden a nivel de bloque.

10 → c) En arquitectura NAS, el stack del cliente incluye una capa I/O Redirector que intercepta las operaciones de fichero y las redirige a través de NFS o CIFS sobre TCP/IP hacia el servidor NAS. El cliente ve el sistema de archivos remoto como si fuera local.

11 → c) PostgreSQL se distribuye bajo licencia BSD desde 1996. Es una de las licencias más permisivas del software libre: permite usar, modificar y redistribuir el software, incluso en productos comerciales.

12 → c) El puerto TCP por defecto de PostgreSQL es 5432. Se puede cambiar en postgresql.conf (parámetro port). MySQL usa 3306, Oracle usa 1521.

13 → c) El tamaño máximo de una tabla en PostgreSQL es 32 TB. Un campo tiene un límite de 1 GB, y un registro de 1,6 TB. PostgreSQL no impone límite al tamaño total de la base de datos.

14 → b) pg_lsclusters lista todas las instancias PostgreSQL en un sistema Debian/Ubuntu, mostrando la versión, el nombre, el puerto TCP, el estado (online/down), el propietario, el directorio de datos y el archivo de logs.

15 → c) pg_hba.conf (Host-Based Authentication) es el archivo que controla las reglas de acceso: qué usuarios se pueden conectar, desde qué orígenes y con qué método de autenticación. postgresql.conf es la configuración general del servidor.

16 → d) El directorio base/ contiene el grueso de los datos: todas las bases de datos con sus tablas e índices. Es el espacio de tablas por defecto. pg_wal/ contiene solo los archivos de transacciones WAL.

17 → c) Si no se especifica ningún encoding en initdb, PostgreSQL usa SQL_ASCII por defecto. Este valor no interpreta caracteres superiores a 127 y no es adecuado para la mayoría de aplicaciones. Se recomienda usar UTF8.

18 → b) La opción reload de pg_ctl hace que PostgreSQL vuelva a leer los archivos de configuración (postgresql.conf y pg_hba.conf) sin detener el servidor. restart detiene y vuelve a arrancar el servidor.

19 → c) El método reject rechaza siempre el intento de conexión que coincide con esa regla. Es útil para bloquear explícitamente ciertas combinaciones usuario/IP. trust acepta sin contraseña; deny no es una palabra clave válida en PostgreSQL.

20 → b) El archivo ~/.pgpass debe tener permisos 600 (lectura y escritura solo para el propietario). Si tiene permisos más permisivos (por ejemplo 644), PostgreSQL lo ignora por razones de seguridad.

21 → c) \du (o también \dg) lista todos los roles (usuarios y grupos) de la instancia PostgreSQL. \l lista las bases de datos, \dt lista las tablas, \dn lista los esquemas.

22 → c) PostgreSQL aplica la primera regla que coincide con los parámetros de la conexión (tipo, base de datos, usuario, origen). Por eso las reglas más específicas deben estar antes que las generales en el archivo.

23 → b) La opción LOGIN es la que convierte un rol en una cuenta de usuario capaz de conectarse al servidor. Sin LOGIN, el rol existe como grupo pero no puede iniciar sesiones. SUPERUSER da privilegios ilimitados pero no implica LOGIN por sí solo.

24 → b) La cláusula CASCADE en REVOKE elimina también los permisos que el rol había delegado a terceros mediante WITH GRANT OPTION. Sin CASCADE, PostgreSQL generaría un error si el rol había delegado permisos.

25 → b) ALTER DEFAULT PRIVILEGES define los permisos que se asignarán automáticamente a los objetos que se creen en el futuro. No modifica los permisos de los objetos ya existentes, para los cuales hay que usar GRANT directamente.

26 → c) El comando SET ROLE admingroup permite al usuario adoptar temporalmente la identidad de un rol del que es miembro para obtener sus permisos. RESET ROLE o SET ROLE NONE devuelve al usuario a su identidad original.


📊 TABLA FLASH FINAL — Datos clave Virtualización, Almacenamiento y PostgreSQL

Concepto Valor / Respuesta clave
Extensión de virtualización Intel IVT (Intel Virtualization Technology)
Extensión de virtualización AMD AMD-V
Hypervisor tipo 1 (sin SO anfitrión) VMware ESXi, Xen, Hyper-V standalone
Hypervisor tipo 2 (sobre SO anfitrión) VirtualBox, VMware Player, KVM
VM de proceso más conocida JVM (Java Virtual Machine)
Herramienta para info del procesador (VT/AMD-V) CPU-Z (cpuid.com)
KVM: versión de Kernel que lo incluye ≥ 2.6.20
KVM: administrador gráfico Virt-Manager
KVM: hypervisor subyacente Qemu
Xen: universidad de origen Universidad de Cambridge
Xen: empresa que lo compró (2007) Citrix (500 M$)
DAS: protocolo SCSI (bus directo)
DAS: nivel de acceso Bloque
NAS: protocolos NFS (Linux) / CIFS-SMB (Windows) sobre TCP/IP
NAS: nivel de acceso Fichero
SAN: protocolos Fibre Channel / iSCSI
SAN: nivel de acceso Bloque
PostgreSQL: licencia BSD
PostgreSQL: año de creación 1996
PostgreSQL: universidad de origen Berkeley, California
PostgreSQL: fundador Michael Stonebraker
PostgreSQL: grupo de publicación PGDG (PostgreSQL Developer Group)
Puerto TCP por defecto de PostgreSQL 5432
Tamaño máximo de tabla en PostgreSQL 32 TB
Tamaño máximo de campo en PostgreSQL 1 GB
Tamaño máximo de registro en PostgreSQL 1,6 TB
Encoding por defecto de PostgreSQL SQL_ASCII (recomendado: UTF8)
Comando de inicialización de instancia initdb -D /ruta/data
Archivo de autenticación PostgreSQL pg_hba.conf
Archivo de configuración principal PostgreSQL postgresql.conf
Control del servidor PostgreSQL pg_ctl start/stop/restart/reload
Directorio de datos principales base/
Directorio de archivos WAL pg_wal/
Permisos requeridos para ~/.pgpass 600
Permiso que permite conectarse al servidor LOGIN
Permisos ilimitados sobre la instancia SUPERUSER
Comando para ver roles en psql \du o \dg
Comando para ver bases de datos en psql \l
Comando para ver estructura de tabla en psql \d tabla
RLS: activar seguridad a nivel de fila ALTER TABLE t ENABLE ROW LEVEL SECURITY
Scripts específicos Debian para PostgreSQL pg_lsclusters, pg_ctlcluster, pg_createcluster