Eseguire i contenitori Docker come utenti non rootDocker containers are often run as the root user by default. However, running containers as root can pose security risks. It is recommended to run containers as non-root users whenever possible. This can be achieved by specifying a non-root user in the Dockerfile or by using the -u flag when running the container.
Docker has revolutionized the way we build, manage, and deploy applications. However, running containers as the root user can pose significant security risks. In this article, we’ll explore the importance of running Docker containers as non-root users, the steps required to set it up, and some best practices to ensure your applications are secure.
Comprendere Docker e i permessi utente
Cos'è Docker?
Docker è una piattaforma open-source che automatizza la distribuzione di applicazioni all'interno di contenitori leggeri. Questi contenitori incapsulano tutto ciò che serve per eseguire l'applicazione, inclusi il codice, il runtime, gli strumenti di sistema, le librerie e le impostazioni.
Perché usare utenti non root?
Quando un container Docker viene eseguito come utente root, possiede gli stessi permessi e privilegi dell'utente root sulla macchina host. Se una vulnerabilità viene sfruttata all'interno del container, un attaccante potrebbe ottenere l'accesso root al sistema host, portando a gravi implicazioni di sicurezza. Eseguendo i container come utenti non-root, limitiamo la portata dei potenziali danni, rendendo più difficile per gli attaccanti compromettere il sistema host.
Configurazione di un utente non-root in container Docker
Passo 1: Creare un utente non root nel Dockerfile
Il primo passo per eseguire il container come utente non-root è creare un utente nel tuo Dockerfile. Di seguito un esempio su come farlo durante la costruzione di una semplice applicazione Node.js.
# Start with a base image
FROM node:14
# Create a non-root user
RUN groupadd -g 1001 appuser &&
useradd -u 1001 -g appuser -m appuser
# Set the working directory
WORKDIR /home/appuser/app
# Copy package.json and install dependencies
COPY package.json ./
RUN npm install
# Copy the rest of your application code
COPY . .
# Switch to the non-root user
USER appuser
# Start the application
CMD ["node", "app.js"]Nel Dockerfile sopra:
- Creiamo un utente non root.
appusere un gruppoappusercon ID specifici. - Impostiamo la directory di lavoro su un percorso all'interno del
appuser’la directory home di. - Infine, passiamo al
appuserprima di eseguire l'applicazione.
Step 2: Building the Docker Image
Dopo aver creato il tuo Dockerfile, puoi compilare la tua immagine con il Docker CLI.
docker build -t mia-app-node .Fase 3: Esecuzione del contenitore Docker
Una volta che l'immagine viene creata, puoi avviarla e verrà eseguita come utente non-root specificato nel Dockerfile.
docker run -d my-node-appVerifying Non-Root Execution
Per verificare che il tuo container sia in esecuzione come utente non-root, puoi eseguire un comando all'interno del container:
docker exec -it whoamiThe output should return appuser, confirming that the application is running as a non-root user.
Best Practices for Running Docker Containers as Non-Root Users
1. Specify User and Group IDs
When creating a non-root user, always specify both user and group IDs. This practice helps avoid conflicts with existing users and groups on the host system. Using 1001 come mostrato nell'esempio precedente è comune, ma assicurati di controllare gli ID esistenti che potrebbero causare sovrapposizioni.
2. Utilizzare filesystem di sola lettura
Running containers with read-only filesystems enhances security. You can achieve this by specifying the read-only opzione quando esegui il tuo container.
docker run --read-only -d my-node-appQuesto limita le scritture a directory specifiche se necessario (come /tmp o volumi montati).
3. Limit Container Capabilities
Per impostazione predefinita, i container vengono eseguiti con un set di capacità che possono essere eccessive per molte applicazioni. È possibile rimuovere le capacità non necessarie per minimizzare ulteriormente i rischi per la sicurezza.
docker run --cap-drop ALL -d my-node-appQuindi, aggiungi esplicitamente tutte le funzionalità di cui la tua applicazione ha bisogno, come NET_BIND_SERVICE per il binding su porte inferiori.
4. Utilizzare il namespace utente di Docker
Docker provides a feature called user namespaces that allows you to remap user and group IDs in the container to different ones on the host. This adds another layer of security by ensuring that even if an attacker gains access to the container, they are still limited by the remapped IDs.
To enable user namespaces, you need to modify the Docker daemon configuration. On Linux, this is typically done in /etc/docker/daemon.json. Add the following configuration:
{
"userns-remap": "default"
}5. Regularly Update Images
Mantenere aggiornate le immagini di base è fondamentale per la sicurezza. Abituati a scaricare regolarmente le ultime versioni delle tue immagini di base e ricostruire i tuoi container.
docker scarica node:14
docker costruisci -t my-node-app .6. Utilizza Docker Compose per lo Sviluppo
Using Docker Compose can simplify managing multiple services. You can define user settings in your docker-compose.yml file per garantire che i container vengano eseguiti come utenti non root
versione: '3'
services:
app:
build: .
user: appuser
read_only: true7. Monitor and Audit Containers
L'implementazione di soluzioni di monitoraggio e audit può aiutare a rilevare problemi nei tuoi container. Strumenti come Prometheus, Grafana o strumenti di sicurezza dei container più specializzati possono assistere nel monitoraggio dell'utilizzo delle risorse, nella gestione dei log e nei controlli di conformità.
Sfide nell'eseguire container come utente non root
While running Docker containers as non-root users enhances security, there are challenges you may encounter:
1. Permission Issues
Se la tua applicazione tenta di scrivere in directory o file per i quali l'utente non root non ha i permessi, riscontrerai errori di permessi.
Per risolvere questo, assicurati che tutte le directory di cui l'applicazione ha bisogno per scrivere abbiano i permessi corretti impostati nel Dockerfile o in fase di esecuzione.
2. Compatibilità con le applicazioni esistenti
Alcune applicazioni potrebbero non essere progettate per essere eseguite senza privilegi di root. Potrebbe essere necessario rifattorizzare alcuni aspetti delle vostre applicazioni per farle funzionare correttamente con un utente non privilegiato.
3. Limited Capabilities
L'esecuzione come utente non root limita determinate operazioni, come il binding su porte privilegiate (porte inferiori a 1024). Potrebbe essere necessario modificare la propria applicazione o utilizzare un proxy inverso per instradare il traffico in modo appropriato.
Conclusione
Eseguire i container Docker come utenti non root è una pratica fondamentale che migliora la sicurezza delle tue distribuzioni di applicazioni. Creando un utente dedicato nel tuo Dockerfile, sfruttando le best practice come l'utilizzo di filesystem di sola lettura, limitando le capacità e impiegando gli spazi dei nomi utente, puoi ridurre significativamente la superficie di attacco dei tuoi container.
While there may be challenges in transitioning existing applications to run as non-root users, the benefits far outweigh the risks associated with running containers as root. By implementing the strategies discussed in this article, you’re taking a proactive approach to securing your Dockerized applications.
Risorse aggiuntive
Comprendendo e applicando questi principi, puoi garantire che i tuoi container Docker funzionino in modo sicuro ed efficiente, minimizzando i rischi.
