Saltar al contenido

Práctica 2 — Comandos Básicos


Ejercicio 2.1 — Análisis de logs del servidor web

Sección titulada “Ejercicio 2.1 — Análisis de logs del servidor web"

Un servidor web guarda un registro de todas las peticiones que recibe. Tu misión es analizar ese log con herramientas de terminal para extraer información útil: qué IPs se conectan más, cuántos errores hay, etc.

ventana terminal
# Crea los directorios de trabajo
mkdir -p ~/practica2/logs ~/practica2/backup
# Descarga un log real de un servidor nginx (~50.000 líneas)
wget -q \
"https://raw.githubusercontent.com/elastic/examples/master/Common%20Data%20Formats/nginx_logs/nginx_logs" \
-O ~/practica2/logs/access.log
# Comprueba que se descargó correctamente
wc -l ~/practica2/logs/access.log

Deberías ver un número cercano a 51.462 líneas. Si ves 0 o un error, el servidor de GitHub puede estar caído — espera unos minutos y vuelve a intentarlo.

Cada línea tiene este formato:

216.46.173.126 - - [04/Jan/2015:05:13:42 +0000] "GET /blog/ HTTP/1.1" 200 9459 "-" "Mozilla/5.0"

Los campos son: IP - - [fecha] "MÉTODO /ruta HTTP/versión" CÓDIGO bytes "referer" "agente"

¿Cuántas IPs diferentes han accedido al servidor?

ventana terminal
awk '{print $1}' ~/practica2/logs/access.log | sort -u | wc -l

awk '{print $1}' extrae el primer campo (la IP).
sort -u ordena y elimina duplicados.
wc -l cuenta las líneas resultantes.

Anota el resultado.

¿Quién ha hecho más peticiones?

ventana terminal
awk '{print $1}' ~/practica2/logs/access.log | sort | uniq -c | sort -rn | head -10

uniq -c cuenta las repeticiones de cada IP.
sort -rn ordena numéricamente en orden descendente.

Guarda el resultado en un archivo:

ventana terminal
awk '{print $1}' ~/practica2/logs/access.log | sort | uniq -c | sort -rn | head -10 \
> ~/practica2/backup/top10_ips.txt
cat ~/practica2/backup/top10_ips.txt

Los errores 404 significan que el cliente pidió una página que no existe:

ventana terminal
grep ' 404 ' ~/practica2/logs/access.log | wc -l

Anota cuántos hay.

ventana terminal
grep ' 404 ' ~/practica2/logs/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -10

$7 es el campo de la ruta (el URL).

ventana terminal
tar -czvf ~/practica2/backup/access.log.tar.gz ~/practica2/logs/access.log
# Verifica que el archivo existe y su tamaño
ls -lh ~/practica2/backup/

Un log de 10 MB comprimido suele reducirse a 1-2 MB. Comprueba la diferencia.


Ejercicio 2.2 — Permisos y estructura de archivos

Sección titulada “Ejercicio 2.2 — Permisos y estructura de archivos"

Vas a crear la estructura de directorios de un proyecto web compartido entre dos desarrolladores. Cada directorio tiene requisitos de acceso diferentes.

ventana terminal
# Crea los usuarios (si ya existen, el error es inofensivo)
sudo useradd -m alice
sudo useradd -m bob
# Establece contraseñas simples para las pruebas
echo "alice:linux123" | sudo chpasswd
echo "bob:linux123" | sudo chpasswd
# Crea la estructura de directorios del proyecto
sudo mkdir -p /var/www/proyecto/{public,private,logs}
# Crea el grupo del equipo de desarrollo
sudo groupadd webdevs 2>/dev/null || echo "El grupo ya existe"
# Verifica el estado inicial (permisos por defecto)
ls -la /var/www/proyecto/
DirectorioPropietarioGrupoPermisos¿SGID?¿Por qué?
public/rootwebdevs775✅ SíEl equipo puede leer y escribir; los archivos nuevos heredan el grupo
private/rootroot700❌ NoSolo root puede entrar
logs/rootwebdevs754❌ NoEl equipo solo puede leer los logs, no escribirlos
ventana terminal
sudo usermod -aG webdevs alice
sudo usermod -aG webdevs bob
# Verifica que están en el grupo
getent group webdevs

Deberías ver algo como: webdevs:x:1002:alice,bob

ventana terminal
# public: propietario root, grupo webdevs, permisos 775
sudo chown root:webdevs /var/www/proyecto/public
sudo chmod 775 /var/www/proyecto/public
# private: solo root
sudo chmod 700 /var/www/proyecto/private
# logs: grupo puede leer pero no escribir
sudo chown root:webdevs /var/www/proyecto/logs
sudo chmod 754 /var/www/proyecto/logs

El bit SGID (Set Group ID) hace que cualquier archivo creado dentro de public/ herede automáticamente el grupo webdevs, aunque lo cree un usuario diferente:

ventana terminal
sudo chmod g+s /var/www/proyecto/public
# Verifica: debe aparecer una 's' en los permisos del grupo
ls -la /var/www/proyecto/

El resultado de ls -la para public/ debe ser: drwxrwsr-x root webdevs
La s en la posición del bit de ejecución del grupo confirma que el SGID está activo.

Tarea 4 — Verificar que los permisos funcionan

Sección titulada “Tarea 4 — Verificar que los permisos funcionan"
ventana terminal
# Prueba que alice puede escribir en public
sudo -u alice touch /var/www/proyecto/public/prueba-alice.txt
ls -la /var/www/proyecto/public/
# El grupo del archivo debe ser 'webdevs', no 'alice'
# Prueba que alice NO puede escribir en private
sudo -u alice touch /var/www/proyecto/private/intento.txt
# Debe dar: Permission denied
# Prueba que alice puede leer logs pero no escribir
sudo -u alice ls /var/www/proyecto/logs/ # Debe funcionar
sudo -u alice touch /var/www/proyecto/logs/a.txt # Debe fallar

Ejecuta esto y lleva la salida al profesor:

ventana terminal
echo "=== ENTREGA PRÁCTICA 2 ===" && \
echo "" && \
echo "--- 2.1: Top 10 IPs ---" && \
cat ~/practica2/backup/top10_ips.txt && \
echo "" && \
echo "--- 2.1: Errores 404 ---" && \
grep ' 404 ' ~/practica2/logs/access.log | wc -l && \
echo "" && \
echo "--- 2.1: Archivo comprimido ---" && \
ls -lh ~/practica2/backup/access.log.tar.gz && \
echo "" && \
echo "--- 2.2: Permisos del proyecto ---" && \
ls -la /var/www/proyecto/ && \
echo "" && \
echo "--- 2.2: Grupos de alice y bob ---" && \
groups alice && groups bob