Skip to content

Sistema de ficheros

Linux sigue el estándar FHS (Filesystem Hierarchy Standard) que define dónde va cada tipo de archivo. Todo el sistema de archivos cuelga de una única raíz /. Entender esta jerarquía es fundamental para administración, auditoría y pentesting, saber dónde están los archivos de configuración, los logs, los binarios y los datos de las aplicaciones ahorra mucho tiempo.


1.1. 🌳 Árbol de directorios

/
├── bin/       → binarios esenciales del sistema
├── sbin/      → binarios de administración (root)
├── lib/       → librerías de bin/ y sbin/
├── lib64/     → librerías de 64 bits
├── usr/       → programas y datos de usuario
│   ├── bin/       → binarios no esenciales
│   ├── sbin/      → binarios de admin no esenciales
│   ├── lib/       → librerías de usr/bin/
│   ├── local/     → software compilado/instalado manualmente
│   │   ├── bin/
│   │   ├── sbin/
│   │   └── lib/
│   └── share/     → datos independientes de arquitectura (docs, man, icons)
├── etc/       → configuración del sistema
├── home/      → directorios personales de usuarios
├── root/      → home del superusuario
├── var/       → datos variables (logs, bases de datos, colas, cachés)
│   ├── log/
│   ├── www/
│   ├── mail/
│   └── spool/
├── tmp/       → archivos temporales (se borran al reiniciar)
├── run/       → datos de runtime (PID files, sockets)
├── dev/       → dispositivos como archivos
├── proc/      → filesystem virtual — estado del kernel y procesos
├── sys/       → filesystem virtual — dispositivos y parámetros del kernel
├── mnt/       → puntos de montaje manuales temporales
├── media/     → puntos de montaje automáticos (USB, CD...)
├── opt/       → software de terceros autocontenido
├── srv/       → datos servidos por servicios (web, ftp, nfs...)
└── boot/      → kernel, initrd y bootloader

Enlaces simbólicos

/bin, /sbin, /lib son symlinks en sistemas modernos En Ubuntu/Debian modernos y Fedora/RHEL 7+, /bin, /sbin y /lib son symlinks hacia /usr/bin, /usr/sbin y /usr/lib. La separación histórica ya no tiene sentido con los sistemas de init modernos.


1.2. 📁 Directorio etc - configuración del sistema

Es el directorio más importante para un administrador. Contiene toda la configuración del sistema y las aplicaciones instaladas. No debe contener binarios.

Gestión de cuentas

Archivo Descripción
/etc/passwd usuarios del sistema
/etc/shadow hashes de contraseñas (solo root)
/etc/group grupos del sistema
/etc/gshadow contraseñas de grupos
/etc/sudoers / /etc/sudoers.d/ permisos de sudo / fragmentos de sudoers

Resolución de nombres

Archivo Descripción
/etc/hostname nombre del equipo
/etc/hosts resolución DNS estática
/etc/resolv.conf servidores DNS
/etc/gshadow contraseñas de grupos
/etc/sudoers / /etc/sudoers.d/ permisos de sudo / fragmentos de sudoers
os-release información de la distribución

Shell y variables de entorno

Archivo Descripción
/etc/environment Variables de entorno del sistema
/etc/profile Configuración del shell para todos los usuarios
/etc/bash.bashrc Bashrc global (Debian/Ubuntu)
/etc/shells Lista de shells válidos del sistema

Repositorios

Archivo Descripción
/etc/apt/sources.list / /etc/apt/sources.list.d/ Repositorios principales / secundarios
/etc/apt/preferences Prioridades de paquetes
/etc/apt/trusted.gpg.d Claves GPG de repositorios

Red

Archivo Descripción
/etc/hosts Resolución estática IP → nombre
/etc/resolv.conf Servidores DNS del sistema
/etc/nsswitch.conf Orden de resolución: files dns mymachines
/etc/network/interfaces Config de red con ifupdown (Debian legacy)
/etc/netplan/*.yaml Config de red en Ubuntu moderno
/etc/NetworkManager/system-connections/ Perfiles de red de NetworkManager
/etc/systemd/network/*.network Config de red con systemd-networkd
/etc/iptables/rules.v4 Reglas de iptables persistentes (IPv4)
/etc/iptables/rules.v6 Reglas de iptables persistentes (IPv6)

1.2. 📁 Directorio var - datos variables

Datos que cambian en tiempo de ejecución: logs, bases de datos, colas de correo, cachés.

/var/
├── log/                → logs del sistema y aplicaciones
│   ├── syslog          → log general del sistema (Debian/Ubuntu)
│   ├── messages        → log general (CentOS/RHEL)
│   ├── auth.log        → autenticaciones, sudo, SSH (Debian/Ubuntu)
│   ├── secure          → equivalente de auth.log (CentOS/RHEL)
│   ├── kern.log        → mensajes del kernel
│   ├── dmesg           → mensajes de arranque del kernel
│   ├── faillog         → intentos de login fallidos
│   ├── lastlog         → último login de cada usuario
│   ├── wtmp            → historial de logins (binario, leer con `last`)
│   ├── btmp            → intentos de login fallidos (binario, leer con `lastb`)
│   ├── nginx/          → logs de Nginx (access.log, error.log)
│   ├── apache2/        → logs de Apache
│   ├── mysql/          → logs de MySQL
│   └── journal/        → journal binario de systemd
│
├── www/                → datos de servidores web (alternativa a /srv/www)
│   └── html/           → DocumentRoot por defecto en Debian/Ubuntu
│
├── lib/                → datos persistentes de aplicaciones y servicios
│   ├── dpkg/           → base de datos de paquetes instalados (Debian/Ubuntu)
│   │   ├── info/           → scripts de instalación y listas de archivos
│   │   └── status          → estado de todos los paquetes
│   ├── rpm/            → base de datos RPM (CentOS/RHEL)
│   ├── mysql/          → datos de MySQL
│   ├── postgresql/     → datos de PostgreSQL
│   └── docker/         → imágenes y contenedores Docker
│
├── cache/              → cachés de aplicaciones (pueden borrarse)
│   ├── apt/            → paquetes descargados por APT
│   └── man/            → páginas de manual cacheadas
│
├── spool/              → colas de trabajos pendientes
│   ├── cron/           → crontabs de usuarios
│   │   └── crontabs/
│   ├── mail/           → correos locales
│   └── cups/           → colas de impresión
│
├── tmp/                → temporal persistente entre reinicios (a diferencia de /tmp)
└── backups/            → backups automáticos del sistema (dpkg, etc.)

1.3. 📁 Directorio proc - estado del kernel y procesos

Filesystem virtual en RAM. No ocupa espacio en disco.

/proc/
├── <PID>/              → directorio de cada proceso
│   ├── cmdline             → comando de arranque
│   ├── environ             → variables de entorno (separadas por \0)
│   ├── exe                 → symlink al ejecutable
│   ├── fd/                 → descriptores de archivo abiertos
│   ├── maps                → regiones de memoria
│   ├── status              → estado: UIDs, memoria, señales
│   ├── net/                → estado de red del proceso
│   └── cwd                 → directorio de trabajo (symlink)
├── cpuinfo             → información de CPUs
├── meminfo             → información de RAM y swap
├── mounts              → filesystems montados actualmente
├── net/                → estado de la red del sistema
│   ├── tcp                 → conexiones TCP activas
│   ├── udp                 → conexiones UDP
│   └── arp                 → tabla ARP
├── sys/                → parámetros del kernel (modificables via sysctl)
│   ├── kernel/
│   │   ├── hostname
│   │   ├── pid_max
│   │   └── randomize_va_space  → ASLR (0=off, 1=parcial, 2=completo)
│   └── net/
│       └── ipv4/
│           ├── ip_forward       → enrutamiento IP (0/1)
│           └── tcp_syncookies   → protección SYN flood
├── version             → versión del kernel
├── uptime              → tiempo encendido y tiempo idle
├── loadavg             → carga media (1, 5, 15 minutos)
├── filesystems         → filesystems soportados por el kernel
├── partitions          → particiones detectadas
├── swaps               → swap activa
└── modules             → módulos del kernel cargados

1.4. 📁 Directorio sys - dispositivos y parámetros del kernel

Filesystem virtual que expone la jerarquía de dispositivos y permite modificar parámetros en caliente.

/sys/
├── class/              → dispositivos agrupados por clase
│   ├── net/                → interfaces de red
│   ├── block/              → dispositivos de bloque
│   └── power/              → gestión de energía
├── bus/                → buses de hardware (PCI, USB...)
├── devices/            → árbol completo de dispositivos
├── fs/                 → parámetros de filesystems
│   └── cgroup/             → jerarquía de cgroups
├── kernel/             → parámetros del kernel en caliente
│   └── security/           → módulos de seguridad (SELinux, AppArmor)
└── module/             → parámetros de módulos del kernel cargados

1.5. 📁 Directorio dev - dispositivos como archivos

En Linux, los dispositivos son archivos. Todo en /dev es una interfaz hacia hardware o dispositivos virtuales.

/dev/
├── sda, sdb...         → discos duros / SSDs SATA
├── nvme0n1...          → discos NVMe
├── vda, vdb...         → discos virtuales (VMs)
├── sda1, sda2...       → particiones
├── sr0                 → lector CD/DVD
├── tty                 → terminal actual
├── tty0..63            → terminales virtuales (consolas)
├── pts/                → pseudoterminales (SSH, tmux, xterm)
│   └── 0, 1, 2...
├── stdin → /proc/self/fd/0   → entrada estándar
├── stdout → /proc/self/fd/1  → salida estándar
├── stderr → /proc/self/fd/2  → salida de errores
├── null                → agujero negro (descarta todo lo escrito)
├── zero                → fuente de bytes \0 infinitos
├── random              → bytes aleatorios (bloquea si no hay entropía)
├── urandom             → bytes aleatorios (no bloquea, menos seguro)
├── mem                 → memoria física del sistema (acceso directo)
├── kmem                → memoria del kernel
├── loop0..7            → dispositivos de bucle (para montar imágenes)
└── mapper/             → dispositivos de device mapper (LVM, LUKS)
    ├── ubuntu--vg-ubuntu--lv  → volumen LVM
    └── sda5_crypt             → volumen LUKS

1.6. 📁 Directorios personales

/home/<usuario>/
├── .bashrc             → configuración del shell bash (interactivo no-login)
├── .bash_profile       → configuración del shell bash (login)
├── .bash_logout        → ejecutado al cerrar sesión
├── .bash_history       → historial de comandos ⚠️ puede contener contraseñas
├── .profile            → configuración genérica (sh, bash, dash)
├── .ssh/               → claves y configuración SSH del usuario
├── .gnupg/             → claves GPG del usuario
├── .config/            → configuración de aplicaciones (XDG)
├── .local/             → datos locales de aplicaciones (XDG)
│   ├── share/
│   └── bin/            → binarios de usuario (en PATH en distros modernas)
├── .cache/             → cachés de aplicaciones (se puede borrar)
├── .env                → variables de entorno de proyectos ⚠️ puede contener secretos
├── .netrc              → credenciales para FTP/HTTP ⚠️ en texto claro
├── .mysql_history      → historial de MySQL ⚠️ puede contener contraseñas
└── .psql_history       → historial de PostgreSQL

1.7. 📁 Directorio boot - arranque del sistema

/boot/
├── vmlinuz-<versión>           → kernel comprimido
├── initrd.img-<versión>        → initramfs (sistema de archivos inicial en RAM)
├── config-<versión>            → configuración con la que se compiló el kernel
├── System.map-<versión>        → tabla de símbolos del kernel
└── grub/                       → configuración del bootloader GRUB
    ├── grub.cfg                    → config generada automáticamente (no editar)
    └── grub.d/                     → fragmentos de config de GRUB

Editar GRUB

Nunca editar grub.cfg directamente. Editar /etc/default/grub y ejecutar update-grub (Debian/Ubuntu) o grub2-mkconfig (RHEL/Fedora).


2. 🔑 Permisos y capacidades

2.1. Permisos Unix (DAC)

Linux usa un modelo de control de acceso discrecional (DAC) basado en tres entidades y tres tipos de permiso:

-rwxr-xr--  1  jessica  developers  4096  may 12  archivo.sh
│└──┘└──┘└──┘
        └── otros (others)
     └────── grupo propietario
  └────────── propietario (user)
└───────────── tipo: - archivo / d directorio / l symlink
Permiso Permiso numérico Archivo Directorio
r +4 Leer contenido Listar contenido (ls)
w +2 Modificar contenido Crear/eliminar archivos dentro
x +1 Ejecutar Entrar al directorio (cd)

Los permisos se pueden asignar de modo letra para cada uno separado (Ej. chmod u+x, el propietario puede ejecutarlo) o por número (Ej. chmod 777, todo el mundo tiene permiso de todo)

Luego tenemos los bits especiales

Bit Sobre ejecutable Sobre directorio
SUID (s en user, 4xxx) Se ejecuta con el UID del propietario, no del invocador. Sin efecto especial
SGID (s en group, 2xxx) Se ejecuta con el GID del propietario Archivos nuevos heredan el grupo del directorio
Sticky (t en others, 1xxx) Sin efecto especial Solo el propietario puede borrar sus archivos (ej: /tmp)

⚠️ Si un binario tiene SUID y pertenece a root, cualquier usuario puede ejecutarlo con privilegios de root.


2.2. ACLs (Access Control Lists)

Las ACLs extienden el modelo Unix clásico permitiendo permisos por usuario concreto sobre un archivo, sin cambiar el propietario ni el grupo.

Acción Comando
Ver ACLs de un archivo getfacl archivo.txt
Dar permisos a un usuario/grupo concreto setfacl -m u:jessica:r archivo.txt (grupo g:developers:rw)
Eliminar ACL de un usuario setfacl -x u:jessica archivo.txt
Eliminar todas las ACLs setfacl -b archivo.txt

2.3. Capabilities — el equivalente a privilegios Windows

Las capabilities dividen los privilegios de root en unidades más pequeñas, permitiendo dar a un proceso una capacidad específica sin darle UID 0.

Capability Permite Riesgo
cap_setuid Cambiar el UID del proceso a cualquier valor, incluyendo 0 🔴 Escalada directa a root
cap_sys_admin Casi equivalente a root: montar filesystems, namespaces, ptrace... 🔴 Muy alto
cap_sys_ptrace Depurar y acceder a la memoria de cualquier proceso 🔴 Alto
cap_dac_read_search Leer cualquier archivo ignorando permisos 🔴 Alto
cap_net_raw Crear sockets raw (sniffing, spoofing) 🟡 Medio
cap_net_bind_service Bind a puertos < 1024 sin ser root 🟢 Bajo (legítimo)
cap_sys_module Cargar módulos del kernel → rootkit 🔴 Crítico
cap_chown Cambiar el propietario de cualquier archivo 🔴 Alto

Por tanto tenemos estos comandos para gestionarlas:

Acción Comando
Ver capabilities de un binario getcap /usr/bin/python3
Ver todos los binarios con capabilities en el sistema getcap -r / 2>/dev/null
Asignar capability a un binario setcap cap_net_raw+ep /usr/bin/ping

Capabilities en binarios interpretados

Si un intérprete como Python o Ruby tiene cap_setuid, cualquier script que ejecute puede cambiar su UID a 0 y obtener una shell root. Es una de las técnicas de escalada más silenciosas.

Ej python, con cap_setuid → python3 -c "import os; os.setuid(0); os.system('/bin/bash')"


2.4. Atributos extendidos

El sistema de ficheros de Linux permite además activar ciertos atributos especiales. Estos se listan con lsattr <archivo>

Para cambiar estos permisos especiales se utiliza sudo chattr +i archivo.txt (para hacerlo inmutable).

Atributos comunes:

  • i (Inmutable): El archivo no puede ser modificado, eliminado, renombrado ni enlazado. Ni siquiera por root.

  • a (Append Only): El archivo solo puede abrirse en modo escritura para añadir información.