← Vissza a bloghoz Biztonság

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:

  1. Nem-root felhasználóként fut?
  2. Minimális, megbízható alapképből épül?
  3. Átvizsgáltad sebezhetőségekre (Scout/Trivy)?
  4. Nincs benne semmilyen beégetett titok?
  5. Eldobtad a felesleges capabilitiket, csak olvasható a fájlrendszer?
  6. Beállítottad az erőforrás-limiteket?
  7. Naprakész az alapkép és a csomagok?
  8. A legkisebb jogosultság elve szerint van konfigurálva?
  9. Nem fut privileged módban?
  10. 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.