fix(lab-01): align student flow and final verification

This commit is contained in:
Luca Sacchi Ricciardi
2026-04-10 13:03:43 +00:00
parent 89c8e6ae07
commit 49e15f7ea2
10 changed files with 121 additions and 55 deletions
+1
View File
@@ -73,3 +73,4 @@ config.local.*
# Note personali # Note personali
NOTE.md NOTE.md
PERSONAL.md PERSONAL.md
tbf.md
+11
View File
@@ -0,0 +1,11 @@
FROM alpine:3.19
# Crea un utente non-root
RUN addgroup -g 1000 appgroup && \
adduser -D -u 1000 -G appgroup appuser
# Passa all'utente non-root
USER appuser
# Verifica che il container gira come appuser
CMD ["sh", "-c", "whoami && sleep 3600"]
+9 -2
View File
@@ -4,12 +4,19 @@ Configura utenti Linux, permessi Docker socket, capisci i paralleli IAM.
## Avvio del Laboratorio ## Avvio del Laboratorio
Leggi prima i tutorial nell'ordine indicato sotto. Avvia il compose quando arrivi alla parte di verifica del container non-root.
```bash ```bash
cd labs/lab-01-iam cd labs/lab-01-iam
docker build . docker compose up -d --build
docker compose up -d
``` ```
## Ordine Consigliato
1. `tutorial/01-create-linux-users.md`
2. `tutorial/02-docker-group-permissions.md`
3. `tutorial/03-verify-iam-setup.md`
## Verifica Completamento ## Verifica Completamento
```bash ```bash
@@ -24,11 +24,13 @@ sudo -u nome_utente -i docker ps
I gruppi vengono valutati al login. Per attivare il nuovo gruppo immediatamente: I gruppi vengono valutati al login. Per attivare il nuovo gruppo immediatamente:
```bash ```bash
# Opzione 1: newgrp (attiva solo per questo comando) # Opzione 1: nuova sessione login del nuovo utente
sudo -u nome_utente -i groups
sudo -u nome_utente -i docker ps sudo -u nome_utente -i docker ps
# Opzione 2: su - (nuova sessione login) # Opzione 2: newgrp dentro una sessione interattiva del nuovo utente
su - nome_utente su - nome_utente
newgrp docker
docker ps docker ps
# Opzione 3: logout/login (sessione interattiva) # Opzione 3: logout/login (sessione interattiva)
@@ -95,16 +95,16 @@ su - $USER
Per reset completo dell'ambiente Docker tra i lab: Per reset completo dell'ambiente Docker tra i lab:
```bash ```bash
# Usa lo script di reset # Dalla root del repository
bash scripts/reset-env.sh bash scripts/reset-env.sh
# Oppure reset manuale # Oppure reset manuale
docker stop $(docker ps -aq) docker ps -aq | xargs -r docker stop
docker rm $(docker ps -aq) docker ps -aq | xargs -r docker rm
docker system prune -a docker system prune -af
``` ```
## Vedi Anche ## Vedi Anche
- [How-To: Ambiente Reset](../../how-to-guides/reset-docker-environment.md) - [Script reset ambiente](../../../scripts/reset-env.sh)
- [Tutorial: Permessi Docker](../tutorial/02-docker-group-permissions.md) - [Tutorial: Permessi Docker](../tutorial/02-docker-group-permissions.md)
@@ -27,7 +27,8 @@ docker top <container_name>
Guarda la colonna USER: Guarda la colonna USER:
- `0` o `root` = NON conforme - `0` o `root` = NON conforme
- Altri UID (es. `1000`) = CONFORME - Un UID non-zero (es. `1000`) = conforme
- Su alcuni host puoi vedere il nome utente host associato allo stesso UID invece del numero
## Verifica Tutti i Container ## Verifica Tutti i Container
@@ -52,4 +53,4 @@ done
## Vedi Anche ## Vedi Anche
- [Tutorial: Container Non-Root](../tutorial/03-verify-iam-setup.md) - [Tutorial: Container Non-Root](../tutorial/03-verify-iam-setup.md)
- [Test: Script Non-Root](../tests/03-non-root-test.sh) - [Test finale del lab](../tests/99-final-verification.sh)
+18 -7
View File
@@ -6,7 +6,7 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
@@ -41,11 +41,15 @@ echo ""
# Test 2: Docker access control # Test 2: Docker access control
echo -e "${BLUE}[2/3] Checking Docker access control...${NC}" echo -e "${BLUE}[2/3] Checking Docker access control...${NC}"
if sudo -u lab01_student docker ps &>/dev/null; then if ! id lab01_student &>/dev/null; then
echo -e " ${GREEN}${NC} lab01_student can access Docker socket" echo -e " ${RED}${NC} lab01_student does not exist"
all_passed=false
elif groups lab01_student 2>/dev/null | grep -q docker; then
echo -e " ${GREEN}${NC} lab01_student is configured for Docker access via docker group"
echo -e " ${YELLOW} Note:${NC} verify interactively with 'sudo -u lab01_student -i docker ps' if you want a live runtime check"
else else
echo -e " ${RED}${NC} lab01_student cannot access Docker socket" echo -e " ${RED}${NC} lab01_student is not in docker group"
echo -e " ${YELLOW} Hint: User may need to re-login for group membership to take effect${NC}" echo -e " ${YELLOW} Hint: run 'sudo usermod -aG docker lab01_student' and open a new login session${NC}"
all_passed=false all_passed=false
fi fi
echo "" echo ""
@@ -60,8 +64,15 @@ if [ ! -f "$compose_file" ]; then
else else
echo -e " ${GREEN}${NC} docker-compose.yml exists" echo -e " ${GREEN}${NC} docker-compose.yml exists"
if docker compose -f "$compose_file" config &>/dev/null; then
echo -e " ${GREEN}${NC} docker-compose.yml syntax is valid"
else
echo -e " ${RED}${NC} docker-compose.yml has syntax errors"
all_passed=false
fi
# Check for user directive in services # Check for user directive in services
if grep -A 20 "services:" "$compose_file" | grep -q "user:"; then if grep -q '^[[:space:]]*user:' "$compose_file"; then
echo -e " ${GREEN}${NC} Services configured with non-root user directive" echo -e " ${GREEN}${NC} Services configured with non-root user directive"
else else
echo -e " ${RED}${NC} No user directive found in docker-compose.yml" echo -e " ${RED}${NC} No user directive found in docker-compose.yml"
@@ -89,7 +100,7 @@ else
all_passed=false all_passed=false
fi fi
else else
echo -e " ${YELLOW}${NC} No containers running (start with docker compose up)" echo -e " ${YELLOW}${NC} No containers running (start with docker compose up -d --build)"
fi fi
fi fi
echo "" echo ""
@@ -11,6 +11,7 @@ Creare un utente Linux `lab01_student` che non ha accesso iniziale a Docker, sim
- Accesso a un terminale Linux con privilegi sudo - Accesso a un terminale Linux con privilegi sudo
- Docker Engine installato e in esecuzione - Docker Engine installato e in esecuzione
- Comandi base: `useradd`, `groups`, `id` - Comandi base: `useradd`, `groups`, `id`
- I comandi `sudo` richiedono la password del TUO utente corrente in una sessione interattiva
--- ---
@@ -21,15 +22,15 @@ Prima di creare utenti, verifichiamo che l'ambiente sia pronto.
Esegui: Esegui:
```bash ```bash
# Verifica che Docker sia in esecuzione # Verifica che Docker risponda correttamente
sudo systemctl status docker docker info >/dev/null && echo "Docker raggiungibile"
# Verifica che il gruppo docker esista # Verifica che il gruppo docker esista
getent group docker getent group docker
``` ```
Atteso: Atteso:
- Docker deve essere "active (running)" - `docker info` non deve restituire errori
- Il gruppo docker deve essere mostrato - Il gruppo docker deve essere mostrato
Se qualcosa non funziona, consulta [Troubleshooting](#troubleshooting). Se qualcosa non funziona, consulta [Troubleshooting](#troubleshooting).
@@ -39,10 +40,16 @@ Se qualcosa non funziona, consulta [Troubleshooting](#troubleshooting).
## Passo 2: Crea un nuovo utente Linux ## Passo 2: Crea un nuovo utente Linux
Creiamo un utente che simulerà un utente cloud senza permessi IAM. Creiamo un utente che simulerà un utente cloud senza permessi IAM.
Se hai gia eseguito il lab in precedenza, riparti da uno stato pulito rimuovendo l'utente prima di ricrearlo.
Esegui: Esegui:
```bash ```bash
# Se l'utente esiste già, rimuovilo e ricrealo
if id lab01_student &>/dev/null; then
sudo userdel -r lab01_student
fi
# Crea l'utente lab01_student # Crea l'utente lab01_student
sudo useradd -m -s /bin/bash lab01_student sudo useradd -m -s /bin/bash lab01_student
@@ -101,6 +108,8 @@ permission denied while trying to connect to the Docker daemon socket
``` ```
Questo è il comportamento corretto! L'utente non ha ancora permessi Docker. Questo è il comportamento corretto! L'utente non ha ancora permessi Docker.
In questo passo usiamo volutamente `sudo -u` senza `-i` per mostrare il fallimento iniziale dell'accesso al socket Docker.
L'output esatto puo cambiare leggermente in base alla versione di Docker, ma il punto chiave e che l'accesso venga negato.
--- ---
@@ -140,7 +149,9 @@ Soluzione:
```bash ```bash
# Elimina l'utente esistente e ricrealo # Elimina l'utente esistente e ricrealo
if id lab01_student &>/dev/null; then
sudo userdel -r lab01_student sudo userdel -r lab01_student
fi
sudo useradd -m -s /bin/bash lab01_student sudo useradd -m -s /bin/bash lab01_student
``` ```
@@ -153,6 +164,10 @@ sudo systemctl start docker
sudo systemctl enable docker sudo systemctl enable docker
``` ```
**Problema: `docker info` fallisce con `permission denied`**
Soluzione: il tuo utente principale non ha ancora accesso a Docker. Completa prima i prerequisiti generali del corso oppure usa una sessione in cui Docker funziona gia per il tuo utente.
**Problema: Il gruppo docker non esiste** **Problema: Il gruppo docker non esiste**
Soluzione: Soluzione:
@@ -79,6 +79,9 @@ Per rendere attivi i nuovi gruppi, l'utente deve fare una di queste operazioni:
2. Eseguire `newgrp docker` 2. Eseguire `newgrp docker`
3. Eseguire `su - lab01_student` 3. Eseguire `su - lab01_student`
Nel lab, il modo più semplice per verificare subito il nuovo accesso è usare `sudo -u lab01_student -i ...`, che apre una sessione login pulita.
Senza `-i`, un comando come `sudo -u lab01_student docker ps` puo ancora fallire anche se `groups lab01_student` mostra gia il gruppo `docker`.
--- ---
## Passo 4: Verifica l'accesso Docker ## Passo 4: Verifica l'accesso Docker
@@ -88,17 +91,31 @@ Ora verifichiamo che l'utente può accedere a Docker.
Esegui: Esegui:
```bash ```bash
# Metodo 1: Usa newgrp per attivare il gruppo nella sessione corrente # Controlla i gruppi attivi nella nuova sessione login
sudo -u lab01_student -i groups
# Verifica che docker ps ora funzioni
sudo -u lab01_student -i docker ps sudo -u lab01_student -i docker ps
``` ```
Atteso: Atteso:
``` ```
lab01_student docker
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
``` ```
Il comando funziona! L'utente ora ha accesso Docker. Il comando funziona! L'utente ora ha accesso Docker nella nuova sessione login.
Se preferisci una sessione interattiva vera e propria, puoi anche fare:
```bash
sudo -u lab01_student -i
groups
docker ps
exit
```
--- ---
@@ -165,6 +182,10 @@ groups lab01_student
# Se non vedi "docker", ripeti il Passo 2 # Se non vedi "docker", ripeti il Passo 2
``` ```
**Problema: `sudo` chiede la password**
Soluzione: e normale. Esegui i comandi in una sessione terminale interattiva e inserisci la password del tuo utente corrente quando richiesta.
**Problema: Il socket Docker ha permessi errati** **Problema: Il socket Docker ha permessi errati**
Soluzione: Soluzione:
+27 -30
View File
@@ -20,18 +20,19 @@ Il lab include uno script automatizzato per verificare tutto.
Esegui: Esegui:
```bash ```bash
bash labs/lab-01-iam/tests/99-final-verification.sh cd labs/lab-01-iam
bash tests/99-final-verification.sh
``` ```
Questo comando controllerà: Questo comando controllerà:
1. Configurazione utenti e gruppi 1. Configurazione utenti e gruppi
2. Accesso Docker 2. Accesso Docker
3. Esecuzione container non-root 3. Esecuzione container non-root
4. Documentazione completa
5. Parallelismi IAM
Se tutti i check sono verdi, sei pronto per procedere! Se tutti i check sono verdi, sei pronto per procedere!
Nota: lo script finale controlla la configurazione risultante del lab. Non sostituisce i passaggi pratici dei tutorial 1 e 2.
--- ---
## Passo 2: Verifica manuale - Accesso Docker ## Passo 2: Verifica manuale - Accesso Docker
@@ -52,35 +53,25 @@ Entrambi i comandi dovrebbero funzionare senza errori.
--- ---
## Passo 3: Crea un container NON-ROOT ## Passo 3: Usa il Dockerfile di test NON-ROOT
Ora creiamo un container che gira come utente non-root, seguendo il principio del minimo privilegio. Il lab include gia un file `Dockerfile.test` che crea un container non-root. In questo passo lo usi direttamente, senza riscriverlo.
Esegui: Esegui:
```bash ```bash
cd labs/lab-01-iam cd labs/lab-01-iam
# Crea un Dockerfile di test # Verifica che il file esista
cat > Dockerfile.test << 'EOF' ls -l Dockerfile.test
FROM alpine:3.19
# Crea un utente non-root
RUN addgroup -g 1000 appgroup && \
adduser -D -u 1000 -G appgroup appuser
# Passa all'utente non-root
USER appuser
# Verifica che il container gira come appuser
CMD ["sh", "-c", "whoami && sleep 3600"]
EOF
``` ```
Spiegazione: Spiegazione:
- Creiamo un utente `appuser` con UID 1000 - Il file crea un utente `appuser` con UID 1000
- Passiamo a questo utente con `USER` - Passa a questo utente con `USER`
- Il container ora girerà come `appuser`, non come `root` - Il container ora girera come `appuser`, non come `root`
Se vuoi eseguire i prossimi comandi come l'utente appena autorizzato, apri prima una sessione login pulita con `sudo -u lab01_student -i`.
--- ---
@@ -91,11 +82,14 @@ Ora costruiamo e facciamo partire il container.
Esegui: Esegui:
```bash ```bash
# Rimuovi eventuale container rimasto da prove precedenti
docker rm -f lab01-test-container 2>/dev/null || true
# Costruisci l'immagine # Costruisci l'immagine
docker build -f Dockerfile.test -t test-non-root . docker build -f Dockerfile.test -t test-non-root:latest .
# Fai partire il container # Fai partire il container
docker run --name lab01-test-container -d test-non-root docker run --name lab01-test-container -d test-non-root:latest
``` ```
Atteso: Atteso:
@@ -142,7 +136,8 @@ docker top lab01-test-container
``` ```
Atteso: Atteso:
- La colonna USER mostra il tuo username corrente (non `root`) - La colonna USER NON deve mostrare `root` o `0`
- A seconda dell'host puoi vedere `1000`, `appuser` oppure il nome utente host associato a UID 1000
--- ---
@@ -158,7 +153,7 @@ docker stop lab01-test-container
docker rm lab01-test-container docker rm lab01-test-container
# Rimuovi l'immagine # Rimuovi l'immagine
docker rmi test-non-root docker rmi test-non-root:latest
``` ```
--- ---
@@ -191,17 +186,19 @@ Hai completato questo tutorial quando:
**Problema: `docker exec` mostra "root"** **Problema: `docker exec` mostra "root"**
Soluzione: Verifica che il docker-compose.yml abbia la direttiva `user:` Soluzione: Verifica che il Dockerfile di test contenga `USER appuser` oppure che il `docker-compose.yml` abbia la direttiva `user:`.
```bash ```bash
# Verifica che user: sia nel docker-compose.yml # Verifica che Dockerfile.test passi all'utente non-root
grep "^USER" Dockerfile.test
# Oppure verifica che user: sia nel docker-compose.yml
grep "user:" docker-compose.yml grep "user:" docker-compose.yml
# Dovrebbe mostrare: user: "1000:1000"
``` ```
**Problema: `docker top` mostra "root" o username sbagliato** **Problema: `docker top` mostra "root" o username sbagliato**
Soluzione: Il container è stato avviato come root o da un utente diverso. Verifica con `docker inspect` o riavvia il container correttamente. Soluzione: usa `docker exec` e `docker inspect` come fonti principali. `docker top` mostra il processo visto dall'host e puo visualizzare un UID numerico o un nome utente host, ma non deve mostrare `root`.
**Problema: Il test INF-01 fallisce** **Problema: Il test INF-01 fallisce**