diff --git a/.gitignore b/.gitignore index 1db8a8c..72589d5 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,4 @@ config.local.* # Note personali NOTE.md PERSONAL.md +tbf.md diff --git a/labs/lab-01-iam/Dockerfile.test b/labs/lab-01-iam/Dockerfile.test new file mode 100644 index 0000000..d49e2af --- /dev/null +++ b/labs/lab-01-iam/Dockerfile.test @@ -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"] diff --git a/labs/lab-01-iam/README.md b/labs/lab-01-iam/README.md index 03f873d..241524d 100644 --- a/labs/lab-01-iam/README.md +++ b/labs/lab-01-iam/README.md @@ -4,12 +4,19 @@ Configura utenti Linux, permessi Docker socket, capisci i paralleli IAM. ## 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 cd labs/lab-01-iam -docker build . -docker compose up -d +docker compose up -d --build ``` +## 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 ```bash @@ -21,4 +28,4 @@ bash tests/99-final-verification.sh - [Tutorial](tutorial/) - Guida passo-passo - [How-to Guides](how-to-guides/) - Procedure specifiche - [Reference](reference/) - Documentazione tecnica -- [Explanation](explanation/) - Paralleli cloud \ No newline at end of file +- [Explanation](explanation/) - Paralleli cloud diff --git a/labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md b/labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md index 85537d0..d63d73a 100644 --- a/labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md +++ b/labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md @@ -24,11 +24,13 @@ sudo -u nome_utente -i docker ps I gruppi vengono valutati al login. Per attivare il nuovo gruppo immediatamente: ```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 -# Opzione 2: su - (nuova sessione login) +# Opzione 2: newgrp dentro una sessione interattiva del nuovo utente su - nome_utente +newgrp docker docker ps # Opzione 3: logout/login (sessione interattiva) diff --git a/labs/lab-01-iam/how-to-guides/reset-docker-permissions.md b/labs/lab-01-iam/how-to-guides/reset-docker-permissions.md index d199ceb..3ecd20a 100644 --- a/labs/lab-01-iam/how-to-guides/reset-docker-permissions.md +++ b/labs/lab-01-iam/how-to-guides/reset-docker-permissions.md @@ -95,16 +95,16 @@ su - $USER Per reset completo dell'ambiente Docker tra i lab: ```bash -# Usa lo script di reset +# Dalla root del repository bash scripts/reset-env.sh # Oppure reset manuale -docker stop $(docker ps -aq) -docker rm $(docker ps -aq) -docker system prune -a +docker ps -aq | xargs -r docker stop +docker ps -aq | xargs -r docker rm +docker system prune -af ``` ## 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) diff --git a/labs/lab-01-iam/how-to-guides/verify-non-root-container.md b/labs/lab-01-iam/how-to-guides/verify-non-root-container.md index eb83edb..7ccdad7 100644 --- a/labs/lab-01-iam/how-to-guides/verify-non-root-container.md +++ b/labs/lab-01-iam/how-to-guides/verify-non-root-container.md @@ -27,7 +27,8 @@ docker top Guarda la colonna USER: - `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 @@ -52,4 +53,4 @@ done ## Vedi Anche - [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) diff --git a/labs/lab-01-iam/tests/99-final-verification.sh b/labs/lab-01-iam/tests/99-final-verification.sh index 6f3b949..241da93 100755 --- a/labs/lab-01-iam/tests/99-final-verification.sh +++ b/labs/lab-01-iam/tests/99-final-verification.sh @@ -6,7 +6,7 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" RED='\033[0;31m' GREEN='\033[0;32m' @@ -41,11 +41,15 @@ echo "" # Test 2: Docker access control echo -e "${BLUE}[2/3] Checking Docker access control...${NC}" -if sudo -u lab01_student docker ps &>/dev/null; then - echo -e " ${GREEN}✓${NC} lab01_student can access Docker socket" +if ! id lab01_student &>/dev/null; then + 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 - echo -e " ${RED}✗${NC} lab01_student cannot access Docker socket" - echo -e " ${YELLOW} Hint: User may need to re-login for group membership to take effect${NC}" + echo -e " ${RED}✗${NC} lab01_student is not in docker group" + echo -e " ${YELLOW} Hint: run 'sudo usermod -aG docker lab01_student' and open a new login session${NC}" all_passed=false fi echo "" @@ -60,8 +64,15 @@ if [ ! -f "$compose_file" ]; then else 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 - 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" else echo -e " ${RED}✗${NC} No user directive found in docker-compose.yml" @@ -89,7 +100,7 @@ else all_passed=false fi 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 echo "" diff --git a/labs/lab-01-iam/tutorial/01-create-linux-users.md b/labs/lab-01-iam/tutorial/01-create-linux-users.md index 4e08aee..8fb0670 100644 --- a/labs/lab-01-iam/tutorial/01-create-linux-users.md +++ b/labs/lab-01-iam/tutorial/01-create-linux-users.md @@ -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 - Docker Engine installato e in esecuzione - 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: ```bash -# Verifica che Docker sia in esecuzione -sudo systemctl status docker +# Verifica che Docker risponda correttamente +docker info >/dev/null && echo "Docker raggiungibile" # Verifica che il gruppo docker esista getent group docker ``` Atteso: -- Docker deve essere "active (running)" +- `docker info` non deve restituire errori - Il gruppo docker deve essere mostrato 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 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: ```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 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. +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 # Elimina l'utente esistente e ricrealo -sudo userdel -r lab01_student +if id lab01_student &>/dev/null; then + sudo userdel -r lab01_student +fi sudo useradd -m -s /bin/bash lab01_student ``` @@ -153,6 +164,10 @@ sudo systemctl start 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** Soluzione: diff --git a/labs/lab-01-iam/tutorial/02-docker-group-permissions.md b/labs/lab-01-iam/tutorial/02-docker-group-permissions.md index 3154308..d4cb3f8 100644 --- a/labs/lab-01-iam/tutorial/02-docker-group-permissions.md +++ b/labs/lab-01-iam/tutorial/02-docker-group-permissions.md @@ -79,6 +79,9 @@ Per rendere attivi i nuovi gruppi, l'utente deve fare una di queste operazioni: 2. Eseguire `newgrp docker` 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 @@ -88,17 +91,31 @@ Ora verifichiamo che l'utente può accedere a Docker. Esegui: ```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 ``` Atteso: ``` +lab01_student docker + 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 ``` +**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** Soluzione: diff --git a/labs/lab-01-iam/tutorial/03-verify-iam-setup.md b/labs/lab-01-iam/tutorial/03-verify-iam-setup.md index 49289a4..5f1776e 100644 --- a/labs/lab-01-iam/tutorial/03-verify-iam-setup.md +++ b/labs/lab-01-iam/tutorial/03-verify-iam-setup.md @@ -20,18 +20,19 @@ Il lab include uno script automatizzato per verificare tutto. Esegui: ```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à: 1. Configurazione utenti e gruppi 2. Accesso Docker 3. Esecuzione container non-root -4. Documentazione completa -5. Parallelismi IAM 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 @@ -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: ```bash cd labs/lab-01-iam -# Crea un Dockerfile di test -cat > Dockerfile.test << 'EOF' -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 +# Verifica che il file esista +ls -l Dockerfile.test ``` Spiegazione: -- Creiamo un utente `appuser` con UID 1000 -- Passiamo a questo utente con `USER` -- Il container ora girerà come `appuser`, non come `root` +- Il file crea un utente `appuser` con UID 1000 +- Passa a questo utente con `USER` +- 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: ```bash +# Rimuovi eventuale container rimasto da prove precedenti +docker rm -f lab01-test-container 2>/dev/null || true + # 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 -docker run --name lab01-test-container -d test-non-root +docker run --name lab01-test-container -d test-non-root:latest ``` Atteso: @@ -142,7 +136,8 @@ docker top lab01-test-container ``` 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 # 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"** -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 -# 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 -# Dovrebbe mostrare: user: "1000:1000" ``` **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**