Files
2026-03-24 21:55:00 +01:00

1844 lines
50 KiB
Markdown

---
phase: 02-lab-01-iam-sicurezza
plan: 02
type: execute
wave: 1
depends_on: [02-01]
files_modified:
- labs/lab-01-iam/tutorial/01-create-linux-users.md
- labs/lab-01-iam/tutorial/02-docker-group-permissions.md
- labs/lab-01-iam/tutorial/03-verify-iam-setup.md
- labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md
- labs/lab-01-iam/how-to-guides/verify-non-root-container.md
- labs/lab-01-iam/how-to-guides/reset-docker-permissions.md
- labs/lab-01-iam/reference/docker-socket-permissions.md
- labs/lab-01-iam/reference/linux-users-groups.md
- labs/lab-01-iam/reference/iam-parallels.md
- labs/lab-01-iam/explanation/docker-iam-parallels.md
autonomous: true
requirements: [LAB-01, DOCT-01, DOCT-02, DOCT-03, DOCT-04, DOCT-05, PARA-01, PARA-03, PARA-04]
user_setup: []
must_haves:
truths:
- "Student can follow step-by-step tutorial to create Linux users with Docker permissions"
- "Tutorial follows 'little often' principle with small incremental steps"
- "How-to guides exist for common procedures independent of tutorial flow"
- "Reference documents provide technical specifications without explanation"
- "Explanation document draws clear parallels between Docker permissions and AWS IAM"
artifacts:
- path: "labs/lab-01-iam/tutorial/01-create-linux-users.md"
provides: "Step-by-step user creation guide"
min_lines: 60
- path: "labs/lab-01-iam/tutorial/02-docker-group-permissions.md"
provides: "Docker group permissions tutorial"
min_lines: 60
- path: "labs/lab-01-iam/tutorial/03-verify-iam-setup.md"
provides: "Verification and testing tutorial"
min_lines: 40
- path: "labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md"
provides: "Procedure for adding user to docker group"
min_lines: 30
- path: "labs/lab-01-iam/how-to-guides/verify-non-root-container.md"
provides: "Non-root container verification procedure"
min_lines: 25
- path: "labs/lab-01-iam/how-to-guides/reset-docker-permissions.md"
provides: "Permission reset procedure"
min_lines: 30
- path: "labs/lab-01-iam/reference/docker-socket-permissions.md"
provides: "Docker socket technical specifications"
min_lines: 40
- path: "labs/lab-01-iam/reference/linux-users-groups.md"
provides: "Linux user management reference"
min_lines: 40
- path: "labs/lab-01-iam/reference/iam-parallels.md"
provides: "IAM parallelism quick reference"
min_lines: 30
- path: "labs/lab-01-iam/explanation/docker-iam-parallels.md"
provides: "Conceptual mapping between Docker and IAM"
min_lines: 80
key_links:
- from: "tutorial/*.md"
to: "how-to-guides/*.md, reference/*.md"
via: "Cross-references for deeper dives"
pattern: "\\[.*\\]\\(\\../how-to-guides/.*\\)"
- from: "explanation/docker-iam-parallels.md"
to: "reference/iam-parallels.md"
via: "Quick reference table for concepts"
pattern: "See \\[.*\\]\\(\\../reference/iam-parallels.md\\)"
---
<objective>
Create complete Diátaxis documentation (Tutorial, How-to Guides, Reference, Explanation) for Lab 01 - IAM & Sicurezza. Students learn Linux user management and Docker permissions through step-by-step tutorials, with supporting documentation for procedures and technical specs.
Purpose: Teach IAM concepts through local Linux user management and Docker socket permissions, drawing direct parallels to AWS IAM.
Output: 10 documentation files covering all 4 Diátaxis quadrants.
</objective>
<execution_context>
@/home/luca/.claude/get-shit-done/workflows/execute-plan.md
@/home/luca/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/02-lab-01-iam-sicurezza/02-RESEARCH.md
@.planning/phases/02-lab-01-iam-sicurezza/02-VALIDATION.md
@CLAUDE.md
# Diátaxis Framework from CLAUDE.md
## 2.1 Output Didattico a 4 Quadranti
1. **Tutorials:** Guida passo-passo incrementale (*little often*) per guidare l'allievo.
2. **How-to Guides:** Procedure specifiche (es. "Come generare chiavi SSH", "Come ripulire i volumi Docker").
3. **Reference:** Specifiche tecniche nude e crude (mappe IP, tabelle porte esposte, spiegazione direttive `docker-compose`).
4. **Explanation:** Il raccordo concettuale (parallelismo tra l'ambiente locale simulato e i veri servizi Cloud managed).
## IAM Parallels from RESEARCH.md
| Concepto Linux | AWS IAM Equivalente | Spiegazione |
|----------------|---------------------|-------------|
| Utente Linux (`student1`) | IAM User | Identità che può autenticarsi |
| Gruppo Linux (`docker`) | IAM Group | Collezione di utenti con stessi permessi |
| Permessi file/socket | IAM Policy | Regole che definiscono cosa è permesso |
| `/var/run/docker.sock` | Service Endpoint | Risorsa protetta da controlli accesso |
| `sudo` elevation | IAM Role Assumption | Temporanea elevazione privilegi |
## Common Pitfalls from RESEARCH.md
- Group membership requires re-login (use `newgrp docker` OR `su - user`)
- Testing as wrong user (root bypasses permissions)
- Socket permissions may change after Docker daemon restart
## Tone Guidelines
- Direct, simple language (Italian)
- No emojis
- Technically accurate
- Step-by-step with verification at each step
</context>
<tasks>
<task type="auto">
<name>Task 1: Create Tutorial - Part 1: Linux Users</name>
<files>labs/lab-01-iam/tutorial/01-create-linux-users.md</files>
<action>
Create tutorial following Diátaxis framework - step-by-step, incremental, with verification:
```markdown
# Tutorial: Creare Utenti Linux per il Lab IAM
In questo tutorial creerai utenti Linux con permessi limitati per simulare utenti IAM in un ambiente cloud. Imparerai a creare utenti, verificare i permessi e gestire l'appartenenza ai gruppi.
## Obiettivo
Creare un utente Linux `lab01_student` che non ha accesso iniziale a Docker, simulando un utente cloud senza permessi.
## Prerequisiti
- Accesso a un terminale Linux con privilegi sudo
- Docker Engine installato e in esecuzione
- Comandi base: `useradd`, `groups`, `id`
---
## Passo 1: Verifica l'ambiente
Prima di creare utenti, verifichiamo che l'ambiente sia pronto.
Esegui:
```bash
# Verifica che Docker sia in esecuzione
sudo systemctl status docker
# Verifica che il gruppo docker esista
getent group docker
```
Atteso:
- Docker deve essere "active (running)"
- Il gruppo docker deve essere mostrato
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.
Esegui:
```bash
# Crea l'utente lab01_student
sudo useradd -m -s /bin/bash lab01_student
# Verifica che l'utente sia stato creato
id lab01_student
```
Atteso:
```
uid=1001(lab01_student) gid=1001(lab01_student) gruppi=1001(lab01_student)
```
Spiegazione:
- `-m` crea la home directory
- `-s /bin/bash` imposta la shell di default
- L'utente ha solo il proprio gruppo iniziale
---
## Passo 3: Verifica i gruppi dell'utente
Controlliamo a quali gruppi appartiene l'utente.
Esegui:
```bash
groups lab01_student
```
Atteso:
```
lab01_student : lab01_student
```
Nota: L'utente NON è nel gruppo `docker`. Questo è corretto simuliamo un utente senza permessi.
---
## Passo 4: Verifica che l'utente NON può accedere a Docker
Prova a eseguire un comando Docker come l'utente `lab01_student`.
Esegui:
```bash
# Esegui docker ps come lab01_student
sudo -u lab01_student docker ps
```
Atteso:
```
permission denied while trying to connect to the Docker daemon socket
```
Questo è il comportamento corretto! L'utente non ha ancora permessi Docker.
---
## Passo 5: Imposta una password per l'utente (opzionale)
Se vuoi poter fare login come questo utente:
Esegui:
```bash
sudo passwd lab01_student
```
Inserisci una password quando richiesto.
---
## Verifica
Hai completato questo tutorial quando:
- [ ] L'utente `lab01_student` esiste
- [ ] L'utente NON è nel gruppo docker
- [ ] L'utente NON può eseguire comandi docker
- [ ] Il comando `groups lab01_student` mostra solo il proprio gruppo
## Prossimo Passo
Nel [prossimo tutorial](./02-docker-group-permissions.md) imparerai a dare permessi Docker all'utente tramite i gruppi.
---
## Troubleshooting
**Problema: `useradd: user 'lab01_student' already exists`**
Soluzione:
```bash
# Elimina l'utente esistente e ricrealo
sudo userdel -r lab01_student
sudo useradd -m -s /bin/bash lab01_student
```
**Problema: Docker non è in esecuzione**
Soluzione:
```bash
sudo systemctl start docker
sudo systemctl enable docker
```
**Problema: Il gruppo docker non esiste**
Soluzione:
```bash
sudo groupadd docker
```
```
Key points:
- Step-by-step with verification after each step
- "Little often" - small steps, frequent verification
- Clear expected output
- Troubleshooting section
- Links to next tutorial
</action>
<verify>
<automated>test -f labs/lab-01-iam/tutorial/01-create-linux-users.md && grep -q "Passo 1\|Passo 2\|Passo 3" labs/lab-01-iam/tutorial/01-create-linux-users.md && wc -l labs/lab-01-iam/tutorial/01-create-linux-users.md | awk '{if($1>=60) print "PASS"; else print "FAIL: Tutorial too short ("$1" lines, expected 60+)"}'</automated>
</verify>
<done>Tutorial Part 1 created with step-by-step user creation guide</done>
</task>
<task type="auto">
<name>Task 2: Create Tutorial - Part 2: Docker Group Permissions</name>
<files>labs/lab-01-iam/tutorial/02-docker-group-permissions.md</files>
<action>
Create second tutorial covering Docker group permissions:
```markdown
# Tutorial: Permessi Docker tramite Gruppi Linux
In questo tutorial imparerai come dare permessi Docker a un utente tramite l'appartenenza al gruppo `docker`. Questo simula l'assegnazione di policy IAM a un utente cloud.
## Obiettivo
Aggiungere l'utente `lab01_student` al gruppo `docker`, permettendo l'accesso al socket Docker.
## Prerequisiti
- Completato [Tutorial 1: Creare Utenti Linux](./01-create-linux-users.md)
- L'utente `lab01_student` esiste e NON è nel gruppo docker
---
## Passo 1: Verifica lo stato corrente
Prima di modificare i permessi, verifichiamo lo stato attuale.
Esegui:
```bash
# Verifica i gruppi dell'utente
groups lab01_student
# Verifica i permessi del socket Docker
ls -l /var/run/docker.sock
```
Atteso:
- `groups` mostra solo `lab01_student` (NON docker)
- Il socket Docker ha permessi `srw-rw----` ed è di proprietà `root:docker`
Spiegazione: Il socket Docker (`/var/run/docker.sock`) è accessibile solo a `root` e ai membri del gruppo `docker`.
---
## Passo 2: Aggiungi l'utente al gruppo docker
Ora aggiungiamo l'utente al gruppo per dargli accesso Docker.
Esegui:
```bash
# Aggiungi lab01_student al gruppo docker
sudo usermod -aG docker lab01_student
# Verifica l'appartenenza al gruppo
groups lab01_student
```
Atteso:
```
lab01_student : lab01_student docker
```
Nota: Il gruppo `docker` ora appare nell'elenco!
Spiegazione:
- `-aG` significa "append" (aggiunge senza rimuovere altri gruppi) e "group" (modifica i gruppi)
- Questo è equivalente ad assegnare una policy IAM a un utente cloud
---
## Passo 3: Importante - Login necessario
I gruppi vengono valutati al momento del login. La sessione corrente dell'utente non vedrà ancora il nuovo gruppo.
Per verificare il gruppo membership (senza dover fare login):
```bash
# Questo mostra i gruppi anche se non sono ancora attivi nella sessione
groups lab01_student
```
Per rendere attivi i nuovi gruppi, l'utente deve fare una di queste operazioni:
1. Fare logout e login
2. Eseguire `newgrp docker`
3. Eseguire `su - lab01_student`
---
## Passo 4: Verifica l'accesso Docker
Ora verifichiamo che l'utente può accedere a Docker.
Esegui:
```bash
# Metodo 1: Usa newgrp per attivare il gruppo nella sessione corrente
sudo -u lab01_student -i docker ps
```
Atteso:
```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
```
Il comando funziona! L'utente ora ha accesso Docker.
---
## Passo 5: Verifica con un container di test
Facciamo partire un container semplice per confermare che tutto funziona.
Esegui:
```bash
# Esegui un container Alpine come lab01_student
sudo -u lab01_student -i docker run --rm alpine:3.19 whoami
```
Atteso:
```
root
```
Nota: Il container mostra "root" perché questo è l'utente di default DENTRO il container (non è l'utente che ha lanciato il comando). Nel [Tutorial 3](./03-verify-iam-setup.md) imparerai a far girare i container come utente non-root.
---
## Parallelismo con AWS IAM
| Operazione Locale | AWS IAM Equivalente |
|-------------------|---------------------|
| `usermod -aG docker user` | `AttachUserPolicy` o `AddUserToGroup` |
| Utente nel gruppo `docker` | Utente IAM con policy permessive |
| Accesso al socket Docker | Accesso alle API AWS |
---
## Verifica
Hai completato questo tutorial quando:
- [ ] L'utente `lab01_student` è nel gruppo docker
- [ ] L'utente può eseguire `docker ps`
- [ ] L'utente può fare partire container
- [ ] Capisci il parallelismo con IAM User + Policy
## Prossimo Passo
Nel [prossimo tutorial](./03-verify-iam-setup.md) imparerai a verificare l'intera configurazione e a far girare container non-root.
---
## Troubleshooting
**Problema: L'utente non può ancora eseguire docker ps**
Soluzione 1: Verifica di aver usato `sudo -u lab01_student -i`
```bash
# Il flag -i è importante per caricare l'ambiente corretto
sudo -u lab01_student -i docker ps
```
Soluzione 2: Verifica che l'utente sia nel gruppo
```bash
groups lab01_student
# Se non vedi "docker", ripeti il Passo 2
```
**Problema: Il socket Docker ha permessi errati**
Soluzione:
```bash
# Correggi i permessi del socket
sudo chmod 660 /var/run/docker.sock
sudo chown root:docker /var/run/docker.sock
```
**Problema: `usermod: user 'lab01_student' does not exist`**
Soluzione: Prima crea l'utente seguendo il [Tutorial 1](./01-create-linux-users.md).
```
Key points:
- Explain the group membership evaluation timing issue
- Show parallelism with AWS IAM
- Multiple troubleshooting scenarios
- Clear verification steps
</action>
<verify>
<automated>test -f labs/lab-01-iam/tutorial/02-docker-group-permissions.md && grep -q "IAM\|AWS\|Parallelismo" labs/lab-01-iam/tutorial/02-docker-group-permissions.md && wc -l labs/lab-01-iam/tutorial/02-docker-group-permissions.md | awk '{if($1>=60) print "PASS"; else print "FAIL: Tutorial too short ("$1" lines, expected 60+)"}'</automated>
</verify>
<done>Tutorial Part 2 created with Docker group permissions guide</done>
</task>
<task type="auto">
<name>Task 3: Create Tutorial - Part 3: Verification and Non-Root Containers</name>
<files>labs/lab-01-iam/tutorial/03-verify-iam-setup.md</files>
<action>
Create third tutorial covering verification and non-root containers:
```markdown
# Tutorial: Verifica Configurazione IAM e Container Non-Root
In questo tutorial verificherai l'intera configurazione IAM e imparerai a far girare container come utente non-root, seguendo il principio del minimo privilegio.
## Obiettivo
Verificare che la configurazione IAM funzioni e far girare container come utente non-root (INF-01).
## Prerequisiti
- Completati [Tutorial 1](./01-create-linux-users.md) e [Tutorial 2](./02-docker-group-permissions.md)
- L'utente `lab01_student` esiste ed è nel gruppo docker
---
## Passo 1: Esegui lo script di verifica
Il lab include uno script automatizzato per verificare tutto.
Esegui:
```bash
bash labs/lab-01-iam/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!
---
## Passo 2: Verifica manuale - Accesso Docker
Verifichiamo manualmente che l'utente possa accedere a Docker.
Esegui:
```bash
# Verifica che docker ps funzioni
sudo -u lab01_student -i docker ps
# Verifica informazioni sul sistema Docker
sudo -u lab01_student -i docker info
```
Entrambi i comandi dovrebbero funzionare senza errori.
---
## Passo 3: Crea un container NON-ROOT
Ora creiamo un container che gira come utente non-root, seguendo il principio del minimo privilegio.
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
```
Spiegazione:
- Creiamo un utente `appuser` con UID 1000
- Passiamo a questo utente con `USER`
- Il container ora girerà come `appuser`, non come `root`
---
## Passo 4: Build e run del container
Ora costruiamo e facciamo partire il container.
Esegui:
```bash
# Costruisci l'immagine
sudo -u lab01_student -i docker build -f Dockerfile.test -t test-non-root .
# Fai partire il container
sudo -u lab01_student -i docker run --name lab01-test-container -d test-non-root
```
Atteso:
- Build completa senza errori
- Container ID viene mostrato
---
## Passo 5: Verifica che il container NON gira come root
Verifichiamo l'utente del container in tre modi.
Esegui:
```bash
# Metodo 1: docker exec whoami
docker exec lab01-test-container whoami
```
Atteso:
```
appuser
```
Esegui:
```bash
# Metodo 2: docker inspect
docker inspect lab01-test-container --format='{{.Config.User}}'
```
Atteso:
```
appuser
```
Esegui:
```bash
# Metodo 3: docker top (mostra il processo sull'host)
docker top lab01-test-container
```
Atteso:
- La colonna USER mostra `1000` (non `0`)
---
## Passo 6: Verifica INF-01 - Nessun container root
Il requisito INF-01 richiede che NESSUN container giri come root.
Esegui:
```bash
bash labs/lab-01-iam/tests/03-non-root-test.sh
```
Questo script verificherà tutti i container e garantirà che nessuno giri come root.
---
## Passo 7: Pulisci il container di test
Dopo aver verificato, puliamo il container di test.
Esegui:
```bash
# Ferma e rimuovi il container
docker stop lab01-test-container
docker rm lab01-test-container
# Rimuovi l'immagine
docker rmi test-non-root
```
---
## Principio del Minimo Privilegio
Perché NON usare root nei container?
| Rischio Root | Mitigazione Non-Root |
|--------------|----------------------|
| Container compromesso = host compromesso | Utente limitato = danno contenuto |
| Container può leggere/scrivere qualsiasi file sull'host | Container può solo accedere ai suoi file |
| Escalation privilegi possibile | Privilegi già limitati |
Questo è lo stesso principio di IAM in cloud: dai solo i permessi minimi necessari.
---
## Verifica
Hai completato questo tutorial quando:
- [ ] Lo script di verifica passa senza errori
- [ ] Il container di test gira come utente non-root
- [ ] Tutti e tre i metodi di verifica mostrano lo stesso utente non-root
- [ ] Capisci perché INF-01 è importante per la sicurezza
---
## Troubleshooting
**Problema: `docker exec` mostra "root"**
Soluzione: Verifica che il Dockerfile abbia la direttiva `USER`
```bash
# Verifica che USER sia nel Dockerfile
grep USER Dockerfile.test
# Dovrebbe mostrare: USER appuser
```
**Problema: `docker top` mostra UID 0**
Soluzione: Il container potrebbe essere stato configurato con docker-compose. Verifica:
```bash
# Verifica la direttiva user in docker-compose
grep -A 5 "user:" labs/lab-01-iam/docker-compose.yml
```
**Problema: Il test INF-01 fallisce**
Soluzione: Assicurati che TUTTI i container abbiano la direttiva USER o user:
```bash
# Controlla tutti i container
docker ps --format "{{.Names}}" | xargs -I {} sh -c 'echo "Container: {}" && docker inspect --format="{{.Config.User}}" {}'
```
```
Key points:
- Multiple verification methods for non-root execution
- Clear explanation of security principle
- Automated test integration
- Comprehensive troubleshooting
</action>
<verify>
<automated>test -f labs/lab-01-iam/tutorial/03-verify-iam-setup.md && grep -q "INF-01\|minimo privilegio\|non-root" labs/lab-01-iam/tutorial/03-verify-iam-setup.md && wc -l labs/lab-01-iam/tutorial/03-verify-iam-setup.md | awk '{if($1>=40) print "PASS"; else print "FAIL: Tutorial too short ("$1" lines, expected 40+)"}'</automated>
</verify>
<done>Tutorial Part 3 created with verification and non-root container guide</done>
</task>
<task type="auto">
<name>Task 4: Create How-to Guides</name>
<files>labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md, labs/lab-01-iam/how-to-guides/verify-non-root-container.md, labs/lab-01-iam/how-to-guides/reset-docker-permissions.md</files>
<action>
Create three how-to guides for common procedures:
**File 1: labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md**
```markdown
# How-To: Aggiungere un Utente al Gruppo Docker
Guida rapida per aggiungere un utente Linux al gruppo Docker e dargli accesso al socket.
## Comando Rapido
```bash
# Aggiungi utente esistente al gruppo docker
sudo usermod -aG docker nome_utente
```
## Verifica
```bash
# Verifica l'appartenenza al gruppo
groups nome_utente
# Verifica l'accesso docker
sudo -u nome_utente -i docker ps
```
## Nota Importante
I gruppi vengono valutati al login. Per attivare il nuovo gruppo immediatamente:
```bash
# Opzione 1: newgrp (attiva solo per questo comando)
sudo -u nome_utente -i docker ps
# Opzione 2: su - (nuova sessione login)
su - nome_utente
docker ps
# Opzione 3: logout/login (sessione interattiva)
```
## Rimuovi Utente dal Gruppo Docker
```bash
# Rimuovi utente dal gruppo docker
sudo gpasswd -d nome_utente docker
# Oppure modifica i gruppi supplementari
sudo usermod -G nome_utente nome_utente
```
## Vedi Anche
- [Tutorial: Permessi Docker tramite Gruppi](../tutorial/02-docker-group-permissions.md)
- [Reference: Permessi Socket Docker](../reference/docker-socket-permissions.md)
```
**File 2: labs/lab-01-iam/how-to-guides/verify-non-root-container.md**
```markdown
# How-To: Verificare che un Container Giri come Non-Root
Guida rapida per verificare che un container non giri come utente root (requisito INF-01).
## Metodo 1: docker exec whoami
```bash
docker exec <container_name> whoami
```
Se mostra `root`, il container NON è conforme a INF-01.
## Metodo 2: docker inspect
```bash
docker inspect <container_name> --format='{{.Config.User}}'
```
- Se vuoto, il container gira come root (default)
- Se mostra un UID/nome, il container gira come quell'utente
## Metodo 3: docker top
```bash
docker top <container_name>
```
Guarda la colonna USER:
- `0` o `root` = NON conforme
- Altri UID (es. `1000`) = CONFORME
## Verifica Tutti i Container
```bash
# Verifica tutti i container in esecuzione
docker ps --format "{{.Names}}" | while read container; do
echo "Container: $container"
docker exec $container whoami 2>/dev/null || echo "N/A"
done
```
## Verifica con docker-compose
```bash
# Verifica tutti i servizi nel compose file
docker-compose ps --services | while read service; do
container=$(docker-compose ps -q $service)
echo "Service: $service, User: $(docker exec $container whoami)"
done
```
## Vedi Anche
- [Tutorial: Container Non-Root](../tutorial/03-verify-iam-setup.md)
- [Test: Script Non-Root](../tests/03-non-root-test.sh)
```
**File 3: labs/lab-01-iam/how-to-guides/reset-docker-permissions.md**
```markdown
# How-To: Reset dei Permessi Docker
Guida per ripristinare i permessi del socket Docker e risolvere problemi di accesso.
## Reset dei Permessi del Socket
```bash
# Ferma il demone Docker
sudo systemctl stop docker
# Ripristina la proprietà del socket
sudo chown root:docker /var/run/docker.sock
# Ripristina i permessi (660 = rw-rw----)
sudo chmod 660 /var/run/docker.sock
# Riavvia Docker
sudo systemctl start docker
```
## Verifica
```bash
# Verifica i permessi del socket
ls -l /var/run/docker.sock
```
Atteso: `srw-rw---- 1 root docker ...`
## Ricrea il Gruppo Docker
Se il gruppo docker è stato eliminato:
```bash
# Crea il gruppo docker
sudo groupadd docker
# Riavvia Docker per assicurarti che il socket appartenga al gruppo
sudo systemctl restart docker
```
## Risoluzione Problemi Comuni
### Problema: "Got permission denied while trying to connect"
**Causa:** Utente non nel gruppo docker o permessi socket errati
**Soluzione:**
```bash
# Verifica gruppi utente
groups $USER
# Aggiungi al gruppo se necessario
sudo usermod -aG docker $USER
# Verifica permessi socket
ls -l /var/run/docker.sock
# Correggi se necessario
sudo chmod 660 /var/run/docker.sock
sudo chown root:docker /var/run/docker.sock
```
### Problema: Socket non esiste
**Causa:** Docker non è in esecuzione
**Soluzione:**
```bash
# Avvia Docker
sudo systemctl start docker
# Verifica che il socket sia stato creato
ls -l /var/run/docker.sock
```
### Problema: Group membership non attiva
**Causa:** I gruppi vengono valutati al login
**Soluzione:**
```bash
# Attiva il gruppo per la sessione corrente
newgrp docker
# Oppure fai login di nuovo
su - $USER
```
## Reset Completo dell'Ambiente
Per reset completo dell'ambiente Docker tra i lab:
```bash
# Usa lo script di reset
bash scripts/reset-env.sh
# Oppure reset manuale
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker system prune -a
```
## Vedi Anche
- [How-To: Ambiente Reset](../../how-to-guides/reset-docker-environment.md)
- [Tutorial: Permessi Docker](../tutorial/02-docker-group-permissions.md)
```
Key points:
- Procedure-focused, not step-by-step learning
- Command-first structure
- Links to tutorials and reference
- Troubleshooting common issues
</action>
<verify>
<automated>test -f labs/lab-01-iam/how-to-guides/add-user-to-docker-group.md && test -f labs/lab-01-iam/how-to-guides/verify-non-root-container.md && test -f labs/lab-01-iam/how-to-guides/reset-docker-permissions.md && grep -q "##" labs/lab-01-iam/how-to-guides/*.md | wc -l | awk '{if($1>=9) print "PASS"; else print "FAIL: How-to guides need more sections"}'</automated>
</verify>
<done>Three how-to guides created for common procedures</done>
</task>
<task type="auto">
<name>Task 5: Create Reference Documents</name>
<files>labs/lab-01-iam/reference/docker-socket-permissions.md, labs/lab-01-iam/reference/linux-users-groups.md, labs/lab-01-iam/reference/iam-parallels.md</files>
<action>
Create three reference documents with technical specifications:
**File 1: labs/lab-01-iam/reference/docker-socket-permissions.md**
```markdown
# Reference: Permessi del Socket Docker
Specifiche tecniche del socket Docker Unix domain socket e controllo accessi.
## Percorso del Socket
```
/var/run/docker.sock
```
## Permessi Standard
```
srw-rw---- 1 root docker 0 Mar 24 20:00 /var/run/docker.sock
```
| Campo | Valore | Significato |
|-------|--------|-------------|
| Tipo | `s` | Socket Unix domain |
| Permessi | `rw-rw----` (660) | Owner e gruppo possono leggere/scrivere |
| Owner | `root` | Il demone Docker gira come root |
| Gruppo | `docker` | Membri del gruppo docker possono accedere |
| Altro | `---` | Nessun altro permesso |
## Controllo Accessi
L'accesso al socket è controllato dai permessi file system standard Linux:
### Chi puo accedere?
| Utente | Accesso | Motivo |
|--------|---------|--------|
| root | Si | Proprietario del socket |
| Membri del gruppo docker | Si | Permesso gruppo (rw) |
| Altri utenti | No | Nessun permesso |
### Verifica Permessi
```bash
# Mostra permessi dettagliati
stat -c "%a %U %G %n" /var/run/docker.sock
# Output: 660 root docker /var/run/docker.sock
# Verifica gruppo del socket
stat -c "%G" /var/run/docker.sock
# Output: docker
# Verifica proprietario
stat -c "%U" /var/run/docker.sock
# Output: root
```
## Modifica Permessi
```bash
# Modifica permessi (non raccomandato: 666 permette accesso a tutti)
sudo chmod 660 /var/run/docker.sock
# Modifica gruppo
sudo chown root:docker /var/run/docker.sock
# Modifica proprietario (non raccomandato)
sudo chown $USER /var/run/docker.sock
```
⚠️ **WARNING:** Non usare mai `chmod 666` o `777` sul socket Docker. Questo elimina tutti i controlli di accesso.
## Docker Daemon e Socket
### Allocazione Socket
Il demone Docker crea il socket all'avvio:
```bash
# Avvia demone (crea/ricrea socket)
sudo systemctl start docker
# Riavvia per ripristinare permessi
sudo systemctl restart docker
```
### Rootless Docker
Con rootless Docker, il socket si trova in:
```
$XDG_RUNTIME_DIR/docker.sock
# Tipicamente: /run/user/1000/docker.sock
```
## Troubleshooting
| Problema | Diagnosi | Soluzione |
|----------|----------|-----------|
| Permission denied | Utente non in gruppo docker | `sudo usermod -aG docker $USER` |
| Socket non trovato | Docker non in esecuzione | `sudo systemctl start docker` |
| Permessi errati | chmod eseguito sul socket | `sudo systemctl restart docker` |
| Gruppo errato | Chown sul socket | `sudo chown root:docker /var/run/docker.sock` |
## Comandi Rapidi
```bash
# Verifica permessi attuali
ls -l /var/run/docker.sock
# Verifica chi puo accedere
namei -l /var/run/docker.sock
# Trova processi con handle al socket
sudo lsof /var/run/docker.sock
```
## Vedi Anche
- [Reference: Utenti e Gruppi Linux](./linux-users-groups.md)
- [Explanation: Parallelismi IAM](../explanation/docker-iam-parallels.md)
```
**File 2: labs/lab-01-iam/reference/linux-users-groups.md**
```markdown
# Reference: Utenti e Gruppi Linux
Specifiche tecniche per la gestione utenti e gruppi in Linux per il lab IAM.
## Comandi Utente
### useradd - Crea utente
```bash
sudo useradd -m -s /bin/bash nome_utente
```
| Flag | Significato |
|------|-------------|
| `-m` | Crea home directory |
| `-s /bin/bash` | Imposta shell di login |
| `-G group1,group2` | Aggiunge a gruppi supplementari |
| `-u 1000` | Specifica UID |
### usermod - Modifica utente
```bash
# Aggiungi a gruppo (append)
sudo usermod -aG docker nome_utente
# Modifica shell
sudo usermod -s /bin/zsh nome_utente
# Modifica gruppi supplementari (sovrascrive)
sudo usermod -G docker,nome_utente nome_utente
```
⚠️ **IMPORTANTE:** Usa `-aG` (append) per aggiungere a un gruppo senza rimuovere gli altri.
### userdel - Elimina utente
```bash
# Elimina utente (mantieni home)
sudo userdel nome_utente
# Elimina utente e home directory
sudo userdel -r nome_utente
```
### passwd - Imposta password
```bash
# Imposta password per utente
sudo passwd nome_utente
# Cambia la tua password
passwd
```
## Comandi Gruppo
### groupadd - Crea gruppo
```bash
sudo groupadd docker
```
### groupmod - Modifica gruppo
```bash
# Rinomina gruppo
sudo groupmod -n nuovo_nome vecchio_nome
# Modifica GID
sudo groupmod -g 1001 docker
```
### gpasswd - Gestisci membri gruppo
```bash
# Aggiungi utente al gruppo
sudo gpasswd -a utente gruppo
# Rimuovi utente dal gruppo
sudo gpasswd -d utente gruppo
# Imposta amministratori gruppo
sudo gpasswd -A utente1,utente2 gruppo
```
### groupdel - Elimina gruppo
```bash
sudo groupdelete docker
```
## Comandi Informazione
### id - Mostra info utente
```bash
# Mostra UID, GID e gruppi dell'utente corrente
id
# Mostra info di un utente specifico
id nome_utente
# Solo UID
id -u nome_utente
# Solo gruppi
id -G nome_utente
```
Output esempio:
```
uid=1001(lab01_student) gid=1001(lab01_student) groups=1001(lab01_student),999(docker)
```
### groups - Mostra gruppi utente
```bash
# Gruppi dell'utente corrente
groups
# Gruppi di un utente specifico
groups nome_utente
```
### getent - Query database di sistema
```bash
# Verifica che un gruppo esista
getent group docker
# Output: docker:x:999:utente1,utente2
# nome:x:GID:lista_membri
# Verifica che un utente esista
getent passwd nome_utente
# Output: nome_utente:x:1001:1001:,,,:/home/nome_utente:/bin/bash
# nome:x:UID:GID:commento:home:shell
```
## File di Configurazione
### /etc/passwd
```bash
# Visualizza tutti gli utenti
cat /etc/passwd
# Aggiungi utente manualmente (non raccomandato)
echo "utente:x:1001:1001::/home/utente:/bin/bash" | sudo tee -a /etc/passwd
```
Formato:
```
username:x:UID:GID:commento:home:shell
```
### /etc/group
```bash
# Visualizza tutti i gruppi
cat /etc/group
# Aggiungi gruppo manualmente
echo "docker:x:999:utente1,utente2" | sudo tee -a /etc/group
```
Formato:
```
gruppo:x:GID:lista_membri
```
### /etc/shadow
```bash
# Password e scadenza (richiede root)
sudo cat /etc/shadow
```
## Valutazione Gruppi al Login
I gruppi vengono valutati quando l'utente fa login:
| Momento | Gruppi Valutati |
|---------|-----------------|
| Avvio sistema | No |
| Login interattivo | Si |
| `su - utente` | Si (nuovo login) |
| `newgrp group` | Si (solo sessione corrente) |
| `sudo -u utente cmd` | No (gruppi dell'utente originale) |
| Aggiunta gruppo con usermod | No (fino al prossimo login) |
## UID/GID Standard
| UID/GID | Utente/Gruppo |
|---------|---------------|
| 0 | root |
| 1-999 | Utenti di sistema |
| 1000-60000 | Utenti normali |
| 999 | docker (tipico) |
## Comandi Rapidi
```bash
# Lista tutti gli utenti umani
cat /etc/passwd | grep ':[1-9][0-9][0-9][0-9]:'
# Lista tutti i gruppi
cat /etc/group | cut -d: -f1
# Utenti in un gruppo
members gruppo
# Oppure:
getent group gruppo | cut -d: -f4
```
## Vedi Anche
- [Reference: Permessi Socket Docker](./docker-socket-permissions.md)
- [How-To: Aggiungi Utente al Gruppo Docker](../how-to-guides/add-user-to-docker-group.md)
```
**File 3: labs/lab-01-iam/reference/iam-parallels.md**
```markdown
# Reference: Parallelismi Docker e AWS IAM
Tabella di riferimento rapido per i parallelismi tra concetti Docker/Linux e AWS IAM.
## Tabella Parallelismi
| Concetto Locale | AWS IAM Equivalente | Descrizione |
|-----------------|---------------------|-------------|
| Utente Linux (`student1`) | IAM User | Identità che può autenticarsi |
| Gruppo Linux (`docker`) | IAM Group | Collezione di utenti con stessi permessi |
| Permessi file/socket | IAM Policy | Regole che definiscono cosa è permesso |
| `/var/run/docker.sock` | Service Endpoint | Risorsa protetta da controlli accesso |
| `sudo` elevation | IAM Role Assumption | Temporanea elevazione privilegi |
| `usermod -aG docker` | `AttachUserPolicy` | Assegna permessi a utente |
| Appartenenza gruppo `docker` | Policy attachment | Permessi attivi per utente |
## Comandi a Confronto
### Creazione Utente
| Operazione Locale | Comando AWS |
|-------------------|-------------|
| `sudo useradd -m user` | `aws iam create-user --user-name user` |
| `sudo passwd user` | `aws iam create-login-profile --user-name user --password Pass123!` |
### Gestione Permessi
| Operazione Locale | Comando AWS |
|-------------------|-------------|
| `sudo usermod -aG docker user` | `aws iam attach-user-policy --user-name user --policy-arn arn:aws:iam::aws:policy/PowerUserAccess` |
| `sudo gpasswd -d user docker` | `aws iam detach-user-policy --user-name user --policy-arn arn:aws:iam::aws:policy/PowerUserAccess` |
### Verifica Permessi
| Operazione Locale | Comando AWS |
|-------------------|-------------|
| `groups user` | `aws iam list-attached-user-policies --user-name user` |
| `id user` | `aws iam get-user --user-name user` |
| `sudo -u user docker ps` | `aws sts get-caller-identity` |
### Elevazione Privilegi
| Operazione Locale | Comando AWS |
|-------------------|-------------|
| `sudo command` | Assumere IAM Role |
| `su - root` | `aws sts assume-role` |
## Differenze Chiave
| Aspetto | Locale | Cloud AWS |
|---------|--------|-----------|
| Autenticazione | Password, SSH key | Access key, Secret key, Session token |
| Autorizzazione | Gruppi Linux, permessi file | IAM Policies, JSON document |
| Scope | Singolo host | Account AWS intero |
| Audit | `last`, `/var/log/auth.log` | CloudTrail |
| MFA | Non disponibile | Disponibile |
## Modelli di Policy
### Modello Allow
**Locale:**
```bash
# Utente nel gruppo docker puo accedere al socket
sudo usermod -aG docker utente
```
**AWS:**
```json
{
"Effect": "Allow",
"Action": "docker:*",
"Resource": "*"
}
```
### Modello Deny
**Locale:**
```bash
# Utente NON nel gruppo docker non puo accedere
# (default deny)
```
**AWS:**
```json
{
"Effect": "Deny",
"Action": "docker:*",
"Resource": "*"
}
```
## Best Practices Comuni
| Best Practice | Locale | Cloud |
|---------------|--------|-------|
| Minimo privilegio | Utenti non-root | IAM Policies restrittive |
| Separazione doveri | Gruppi distinti | Gruppi IAM distinti |
| Audit logging | auth.log | CloudTrail |
| Rotazione credenziali | `chage` | Rotate access keys |
## Comandi Utili
```bash
# Verifica membri gruppo docker
getent group docker
# Simulazione:_lista politiche IAM
aws iam list-attached-user-policies --user-name user
# Verifica permessi socket
ls -l /var/run/docker.sock
# Simulazione:_simula accesso AWS
aws sts get-caller-identity
```
## Vedi Anche
- [Explanation: Docker IAM Parallels](../explanation/docker-iam-parallels.md)
- [Tutorial: Permessi Docker](../tutorial/02-docker-group-permissions.md)
```
Key points:
- Pure reference material (no tutorial content)
- Tables and specifications
- Command comparisons
- Quick reference format
</action>
<verify>
<automated>test -f labs/lab-01-iam/reference/docker-socket-permissions.md && test -f labs/lab-01-iam/reference/linux-users-groups.md && test -f labs/lab-01-iam/reference/iam-parallels.md && grep -q "|" labs/lab-01-iam/reference/*.md | wc -l | awk '{if($1>=15) print "PASS"; else print "FAIL: Reference docs need more tables"}'</automated>
</verify>
<done>Three reference documents created with technical specifications</done>
</task>
<task type="auto">
<name>Task 6: Create Explanation Document (IAM Parallels)</name>
<files>labs/lab-01-iam/explanation/docker-iam-parallels.md</files>
<action>
Create explanation document that connects local Docker concepts to cloud IAM:
```markdown
# Explanation: Parallelismi tra Docker Permissions e AWS IAM
In questo documento esploreremo come i permessi Docker e la gestione utenti Linux simulano i concetti di Identity and Access Management (IAM) nei cloud provider come AWS. Comprendere questi parallelismi ti aiuterà a trasferire le conoscenze acquisite localmente agli ambienti cloud reali.
## Cos'è IAM?
**IAM (Identity and Access Management)** è il framework che controlla:
- **Identity:** Chi sei (autenticazione)
- **Access:** Cosa puoi fare (autorizzazione)
AWS IAM, Azure IAM, Google Cloud IAM sono tutti basati sullo stesso concetto fondamentale: le identità hanno permessi specifici su risorse specifiche.
---
## Il Parallelismo Fondamentale
### Utente Linux = IAM User
| Locale | Cloud |
|--------|-------|
| Un utente Linux (`lab01_student`) | Un IAM User (`alice`) |
| Può fare login al sistema | Può fare login ad AWS |
| Ha UID univoco | Ha User ID univoco (AIDAI...) |
| Appartiene a gruppi | Appartiene a IAM Groups |
**Similitudine:** Entrambi rappresentano un'identità umana o di servizio che può autenticarsi.
**Differenza:** Gli utenti Linux sono locali a una singola macchina, gli IAM Users sono globali all'account AWS.
### Gruppo Linux = IAM Group
| Locale | Cloud |
|--------|-------|
| Gruppo `docker` | IAM Group `Developers` |
| Membri ereditano permessi del gruppo | Membri ereditano policies del gruppo |
| Utente può essere in multipli gruppi | Utente può essere in multipli gruppi |
| `groups user` mostra membrianze | `aws iam list-groups-for-user` |
**Similitudine:** I gruppi rendono facile gestire i permessi per molti utenti. Aggiungi un utente al gruppo e ha automaticamente tutti i permessi del gruppo.
**Differenza:** I gruppi Linux sono definiti localmente, i gruppi IAM sono definiti centralmente e possono avere utenti跨-region.
### Socket Docker = Service Endpoint
| Locale | Cloud |
|--------|-------|
| `/var/run/docker.sock` | AWS API endpoint (`https://ec2.amazonaws.com`) |
| Accessibile solo con permessi corretti | Accessibile solo con credenziali valide |
| `chmod 660` limita l'accesso | IAM policies limitano l'accesso |
**Similitudine:** Entrambe sono risorse protette che richiedono autorizzazione per essere utilizzate.
**Differenza:** Il socket Docker è un file Unix locale, gli API endpoint sono servizi web remoti.
### Permessi File = IAM Policy
| Locale | Cloud |
|--------|-------|
| `rw-rw----` su socket | JSON policy con `Effect: Allow/Deny` |
| Utente deve essere nel gruppo `docker` | Utente deve avere policy permessiva |
| `chmod` cambia permessi | `AttachUserPolicy` assegna policy |
**Similitudine:** Entrambi definiscono regole esplicite su chi puo fare cosa.
**Differenza:** I permessi Linux sono semplici (read/write/execute), le IAM policies sono espressioni complesse con condizioni, wildcard, e resource-level permissions.
---
## Esempio Pratico: Setup di un Nuovo Sviluppatore
### Scenario Locale
```bash
# 1. Crea utente per il nuovo sviluppatore
sudo useradd -m -s /bin/bash mario_rossi
# 2. Aggiungi al gruppo docker (permette di lanciare container)
sudo usermod -aG docker mario_rossi
# 3. Verifica
groups mario_rossi
# Output: mario_rossi : mario_rossi docker
# 4. Mario ora puo lanciare container
sudo -u mario_rossi docker run alpine whoami
```
### Scenario Cloud AWS (Equivalente)
```bash
# 1. Crea IAM User per il nuovo sviluppatore
aws iam create-user --user-name mario_rossi
# 2. Crea gruppo per sviluppatori (se non esiste)
aws iam create-group --group-name Developers
# 3. Allega policy al gruppo (permette di usare EC2/containers)
aws iam attach-group-policy \
--group-name Developers \
--policy-arn arn:aws:iam::aws:policy/PowerUserAccess
# 4. Aggiungi utente al gruppo
aws iam add-user-to-group \
--group-name Developers \
--user-name mario_rossi
# 5. Verifica
aws iam list-groups-for-user --user-name mario_rossi
# Output: Groups: [Developers]
# 6. Mario ora puo lanciare istanze EC2 (equivalente a container)
aws ec2 run-instances --image-id ami-12345 ...
```
**Parallelismo:**
- Entrambi iniziano creando un'identità
- Entrambi usano gruppi per gestire i permessi
- Entrambi verificano l'appartenenza al gruppo
- Entrambi ora possono lanciare risorse (container/EC2)
---
## Il Principio del Minimo Privilegio
### Locale: Non-Root Containers
**Perché non root?**
- Root in container = root sull'host (se vulnerabilità kernel)
- Root puo leggere/scrivere qualsiasi file
- Root puo modificare configurazioni di sistema
**Soluzione locale:**
```dockerfile
# Dockerfile con utente non-root
FROM alpine:3.19
RUN adduser -D -u 1000 appuser
USER appuser
CMD ["sh", "-c", "whoami"]
```
**Verifica:**
```bash
docker exec container whoami
# Output: appuser (NON root)
```
### Cloud: IAM Policies Restrittive
**Perché policy minime?**
- Chiave compromessa = danno limitato
- Principio di least privilege
- Audit e compliance requirements
**Soluzione cloud:**
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
```
**Verifica:**
```bash
# Simula accesso dell'utente
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:user/mario_rossi \
--action-names s3:DeleteBucket \
# Output: Decision: Deny (policy non permette DeleteBucket)
```
**Parallelismo:**
- Entrambi limitano cosa l'identità puo fare
- Entrambi riducono la superficie di attacco
- Entrambi sono verificabili tramite test
---
## Differenze tra Locale e Cloud
### 1. Scope dei Permessi
| Locale | Cloud |
|--------|-------|
| Permessi validi solo su questa macchina | Permessi validi per tutto l'account AWS |
| Utente locale accede solo a risorse locali | IAM user accede a risorse globali |
| Gruppi definiti in `/etc/group` | Gruppi definiti in IAM (centralizzato) |
**Implicazione:** Nel cloud, un utente con permessi S3 puo accedere a tutti i bucket S3 nell'account, non solo a quelli "vicini" come nel filesystem locale.
### 2. Complessità delle Policy
| Locale | Cloud |
|--------|-------|
| Semplice: lettura/scrittura/esecuzione | Complesso: conditions, IP restrictions, MFA |
| Basato su owner/group/other | Basato su JSON con wildcards |
| Binario: o hai permesso o no | Granulare: resource-level, tag-based, time-based |
**Esempio Cloud (non possibile localmente):**
```json
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"IpAddress": {
"aws:SourceIp": ["203.0.113.0/24"]
},
"DateGreaterThan": {
"aws:CurrentTime": "2024-01-01T00:00:00Z"
},
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
```
**Implicazione:** Le IAM policies sono piu potenti ma anche piu complesse da capire e debuggare.
### 3. Audit e Logging
| Locale | Cloud |
|--------|-------|
| `/var/log/auth.log` per login sudo | CloudTrail per tutte le chiamate API |
| `last` mostra ultimi login | IAM Access Analyzer mostra attivita |
| Manuale correlare eventi | Ricerche automatiche su CloudTrail Logs |
**Implicazione:** Nel cloud hai audit trail automatico, completo e ricercabile. Localmente devi configurare e mantenere i log.
### 4. Autenticazione
| Locale | Cloud |
|--------|-------|
| Password, SSH key | Access Key ID, Secret Access Key, Session Token |
| Password scade mai (default) | Access keys devono essere ruotate regolarmente |
| MFA non disponibile | MFA obbligatorio per root/users in molte organizzazioni |
**Implicazione:** Nel cloud, l'autenticazione e piu sicura di default (rotazione automatica, MFA, sessioni temporanee).
---
## Comandi Equivalenti: Quick Reference
| Operazione | Locale | Cloud AWS |
|------------|--------|-----------|
| **Crea utente** | `sudo useradd -m user` | `aws iam create-user --user-name user` |
| **Aggiungi a gruppo** | `sudo usermod -aG docker user` | `aws iam add-user-to-group --group-name Developers --user-name user` |
| **Verifica permessi** | `groups user` | `aws iam list-attached-user-policies --user-name user` |
| **Test accesso** | `sudo -u user docker ps` | `aws sts get-caller-identity` |
| **Eleva privilegi** | `sudo command` | `aws sts assume-role` |
| **Revoca permessi** | `sudo gpasswd -d user docker` | `aws iam detach-user-policy --user-name user --policy-arn ...` |
| **Elimina utente** | `sudo userdel user` | `aws iam delete-user --user-name user` |
---
## Best Practices Transferibili
### 1. Mai Usare Root per Lavoro Normale
**Locale:**
```bash
# SBAGLIATO: Log in come root
ssh root@server
# GIUSTO: Log in come utente normale, usa sudo quando serve
ssh user@server
sudo command
```
**Cloud:**
```bash
# SBAGLIATO: Usa root account AWS (l'email con cui ti sei registrato)
# Mai usare root account per operazioni quotidiane
# GIUSTO: Crea IAM User con permessi limitati
aws iam create-user --user-name daily-ops-user
aws iam attach-user-policy --user-name daily-ops-user --policy-arn ...
```
### 2. Usa Gruppi per Gestire Permessi
**Locale:**
```bash
# Invece di dare permessi a ogni singolo utente
sudo usermod -aG docker user1
sudo usermod -aG docker user2
sudo usermod -aG docker user3
# Tutti automaticamente ereditano i permessi del gruppo docker
```
**Cloud:**
```bash
# Invece di attachare policy a ogni singolo utente
aws iam create-group --group-name Developers
aws iam attach-group-policy --group-name Developers --policy-arn ...
aws iam add-user-to-group --group-name Developers --user-name user1
aws iam add-user-to-group --group-name Developers --user-name user2
# Tutti automaticamente ereditano le policies del gruppo Developers
```
### 3. Verifica i Permessi
**Locale:**
```bash
# Verifica che l'utente abbia i permessi corretti
groups user
id user
sudo -u user docker ps
```
**Cloud:**
```bash
# Verifica che l'utente abbia le policies corrette
aws iam list-attached-user-policies --user-name user
aws iam simulate-principal-policy --policy-source-arn ... --action-names s3:GetObject
```
---
## Conclusione
I concetti che hai imparato in questo lab - utenti, gruppi, permessi - si applicano direttamente ad AWS IAM e altri cloud provider. La differenza principale e la scala e la complessita: nel cloud, questi concetti sono potenziati con condizioni granulari, audit automatico, e credenziali ruotabili.
Quando lavorerai con AWS IAM, ricorda:
- IAM User = Utente Linux (identità)
- IAM Group = Gruppo Linux (raccolta di utenti con stessi permessi)
- IAM Policy = Permessi file/socket (regole di accesso)
- Service Endpoint = Socket Docker (risorsa protetta)
Comprendendo questi parallelismi, sarai in grado di applicare le conoscenze locali al cloud con fiducia.
---
## Approfondimenti
- [AWS IAM Documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)
- [IAM Best Practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)
- [Tutorial: Permessi Docker](../tutorial/02-docker-group-permissions.md)
- [Reference: Tabella Parallelismi](../reference/iam-parallels.md)
```
Key points:
- Clear explanation of IAM concepts
- Side-by-side comparisons
- Practical examples
- Best practices transferable to cloud
- Links to AWS documentation
- Covers PARA-01 (Docker mapped to IAM), PARA-03 (differences documented), PARA-04 (commands shown)
</action>
<verify>
<automated>test -f labs/lab-01-iam/explanation/docker-iam-parallels.md && grep -q "IAM\|AWS\|differenza\|difference" labs/lab-01-iam/explanation/docker-iam-parallels.md && wc -l labs/lab-01-iam/explanation/docker-iam-parallels.md | awk '{if($1>=80) print "PASS"; else print "FAIL: Explanation too short ("$1" lines, expected 80+)"}'</automated>
</verify>
<done>Explanation document created with IAM parallels and local-cloud differences</done>
</task>
</tasks>
<verification>
1. All 4 Diátaxis document types exist: tutorial/, how-to-guides/, reference/, explanation/
2. Tutorial follows "little often" principle (small incremental steps)
3. How-to guides are procedure-focused (not tutorial-style)
4. Reference documents are technical specifications without tutorial content
5. Explanation document draws clear parallels between Docker and IAM (PARA-01, PARA-03, PARA-04)
6. All documents use Italian language without emojis
7. All documents have cross-references to related content
</verification>
<success_criteria>
1. Tutorial has 3 parts covering user creation, Docker permissions, and verification
2. How-to guides cover common procedures independent of tutorial flow
3. Reference documents provide technical specifications in quick-reference format
4. Explanation document clearly maps Docker concepts to AWS IAM concepts
5. All requirement IDs satisfied: LAB-01, DOCT-01, DOCT-02, DOCT-03, DOCT-04, DOCT-05, PARA-01, PARA-03, PARA-04
</success_criteria>
<output>
After completion, create `.planning/phases/02-lab-01-iam-sicurezza/02-02-SUMMARY.md`
</output>