Docker biztonsági alapok: 10 lépés a biztonságosabb konténerekhez
A konténerek nem biztonságosak alapból — neked kell azzá tenned. Nem-root futtatás, megbízható alapképek, minimális jogosultságok, sebezhetőség-vizsgálat és további alapszabályok.
Sokan abban a tévhitben élnek, hogy a konténerek önmagukban biztonságosak, mert “el vannak szigetelve”. A valóság árnyaltabb: a konténer izoláció valós, de nem légmentes, és alapból sok beállítás a kényelem, nem a biztonság felé húz. A jó hír, hogy néhány tudatos lépéssel jelentősen csökkentheted a kockázatokat. Ebben a cikkben tíz konkrét, gyakorlati lépést mutatok, amelyekkel a konténereid sokkal biztonságosabbá tehetők — mindegyikhez kapsz copy-paste-elhető példát is.
1. Ne futtasd root felhasználóként
Alapból a konténerben a folyamat root felhasználóként fut. Ha egy támadó kitör a konténerből vagy kihasznál egy sebezhetőséget, root jogokkal sokkal többet tehet. Hozz létre és válts nem-root felhasználóra:
FROM node:22-slim
WORKDIR /app
COPY --chown=node:node . .
USER node
CMD ["node", "server.js"]
Futás közben akár felül is bírálhatod a felhasználót:
docker run --user 1000:1000 myapp
2. Használj megbízható és minimális alapképet
Csak hivatalos vagy ellenőrzött forrásból származó image-eket használj, és válaszd a lehető legkisebbet. Egy minimális alapkép (slim, alpine, vagy distroless) kevesebb csomagot tartalmaz, így kevesebb a potenciális sebezhetőség. A Docker Official Images és a Verified Publisher jelölést érdemes keresni a Docker Hubon.
# Minimális, megbízható alap
FROM python:3.12-slim
💡 Tipp: Minden csomag, ami nincs az image-ben, egy sebezhetőség, amivel nem kell foglalkoznod. A “kevesebb több” elv itt szó szerint biztonságot jelent.
3. Vizsgáld át az image-eidet sebezhetőségekre
Ne találgass, hogy biztonságos-e az image-ed — mérd meg. A Docker beépített Docker Scout eszközével vagy a népszerű Trivy-vel könnyen átvizsgálhatod:
# Docker Scout
docker scout cves myapp:latest
# Trivy
trivy image myapp:latest
Ezek megmutatják a felismert CVE-ket súlyosság szerint, és gyakran azt is, melyik csomagfrissítés oldja meg a problémát. Érdemes ezt beépíteni a CI/CD pipeline-ba, hogy egy sebezhető image be se kerülhessen élesbe.
4. Ne süsd bele a titkokat az image-be
Soha ne tedd jelszavakat, API-kulcsokat vagy tokeneket a Dockerfile-ba vagy az image rétegeibe. A rétegek megőrzik az adatot, így bárki, aki hozzáfér az image-hez, ki tudja nyerni. Erre BuildKit build secrets vagy futásidejű mechanizmusok valók. A téma részleteit a Titkok kezelése Dockerben cikkben járom körül.
5. Dobd el a felesleges capabilitiket
A Linux capabilitik finomhangolják, mit tehet egy folyamat. A konténerek alapból több capabilityt kapnak, mint amennyire szükségük van. A legbiztonságosabb, ha mindet eldobod, majd csak a feltétlenül szükségeseket adod vissza:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp
Tedd a fájlrendszert csak olvashatóvá, ha az alkalmazás nem ír a lemezre — az ideiglenes írásokhoz adj külön tmpfs-t:
docker run --read-only --tmpfs /tmp myapp
6. Korlátozd az erőforrásokat
Egy elszabadult vagy kompromittált konténer felélheti a host összes CPU- és memóriakapacitását (DoS). Állíts be limiteket:
docker run --memory="512m" --cpus="1.5" --pids-limit=200 myapp
A --memory a memóriát, a --cpus a CPU-t, a --pids-limit pedig a folyamatok számát korlátozza (ez utóbbi fork-bombák ellen véd). Compose-ban a deploy.resources.limits alatt teheted meg ugyanezt.
7. Tartsd frissen az image-eidet
A sebezhetőségek nagy része elavult csomagokból ered. Építsd újra rendszeresen az image-eidet, hogy a frissített alapképek és csomagok bekerüljenek:
docker pull python:3.12-slim
docker build --no-cache -t myapp:latest .
Egy automatizált, ütemezett újrabuildelés a CI-ben sokat segít abban, hogy ne maradj le a biztonsági javításokról.
8. Alkalmazd a legkisebb jogosultság elvét
Adj minden konténernek pontosan annyi jogot, amennyi a működéséhez kell — se többet. Ez érvényes a felhasználóra, a capabilitikre, a hálózati hozzáférésre és a felcsatolt kötetekre is. Ha egy konténernek csak olvasnia kell egy könyvtárat, csatold fel csak olvasásra:
docker run -v /data:/data:ro myapp
A :ro jelzi, hogy a kötet csak olvasható a konténer számára.
9. Kerüld a privileged módot
A --privileged kapcsoló gyakorlatilag feloldja a konténer izoláció jelentős részét, és majdnem teljes hozzáférést ad a hosthoz. Ezt kerüld, hacsak nincs nagyon konkrét és indokolt okod rá. Ha csak egy adott eszközre van szükséged, add hozzá célzottan:
# Kerülendő:
docker run --privileged myapp
# Helyette célzott hozzáférés:
docker run --device=/dev/snd myapp
⚠️ Figyelem: A
--privilegedés a Docker socket (/var/run/docker.sock) konténerbe csatolása a két leggyakoribb “lábon lőjük magunkat” hiba. Mindkettő gyakorlatilag root hozzáférést ad a hosthoz egy esetleges támadónak.
10. Szegmentáld a hálózatot
Ne kösd az összes konténert ugyanarra a hálózatra. Hozz létre dedikált hálózatokat, és csak azokat a szolgáltatásokat kösd össze, amelyeknek tényleg kommunikálniuk kell egymással. Így egy kompromittált konténer nem éri el az összes többit:
docker network create backend
docker run --network=backend --name db postgres:16
docker run --network=backend --name api myapi
A frontend felé néző szolgáltatások legyenek külön hálózaton, és csak a feltétlenül szükséges portokat publikáld a host felé a -p kapcsolóval. Egy adatbázist például soha ne tegyél ki közvetlenül a külvilág felé.
Egy gyors ellenőrzőlista
Mielőtt élesbe küldesz egy konténert, fuss végig ezeken:
- Nem-root felhasználóként fut?
- Minimális, megbízható alapképből épül?
- Átvizsgáltad sebezhetőségekre (Scout/Trivy)?
- Nincs benne semmilyen beégetett titok?
- Eldobtad a felesleges capabilitiket, csak olvasható a fájlrendszer?
- Beállítottad az erőforrás-limiteket?
- Naprakész az alapkép és a csomagok?
- A legkisebb jogosultság elve szerint van konfigurálva?
- Nem fut privileged módban?
- Megfelelően szegmentált a hálózat?
Összefoglalás
A konténerbiztonság nem egyetlen kapcsoló, hanem rétegek sora. A legfontosabb fogások: futtass nem-root felhasználóként, használj minimális és megbízható alapképet, vizsgáld át sebezhetőségekre, ne süss titkot az image-be, dobd el a felesleges jogosultságokat, korlátozd az erőforrásokat, tartsd naprakészen az image-eidet, kerüld a privileged módot, és szegmentáld a hálózatot. Ezek együtt jelentősen megnehezítik egy támadó dolgát.
Kezdd egy meglévő image átvizsgálásával a docker scout cves paranccsal, és lépésről lépésre szigorítsd a konfigurációt! Ha még az alapokat raknád le, nézd meg, miért a Docker a jó választás, és olvass tovább a Titkok kezelése Dockerben cikkben a biztonságos titokkezelésről.