Skip to content

Docker Security Basics đŸ›Ąī¸ ​

āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻžāχāĻœā§‡āĻļāύ⧇āϰ āϝ⧁āϗ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āĻĄāĻ•āĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ āĻ•āĻŋāϛ⧁āϟāĻž āφāχāϏ⧋āϞ⧇āĻŸā§‡āĻĄ āĻĨāĻžāĻ•āϞ⧇āĻ“, āĻĒā§‚āĻ°ā§āĻŖ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻ•āĻŋāϛ⧁ āĻŦ⧇āϏāĻŋāĻ• āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻŽā§‡āϜāĻžāϰāϏ (Security Measures) āύ⧇āĻ“ā§ŸāĻž āĻĒā§āĻ°ā§Ÿā§‹āϜāύāĨ¤


ā§§. āϰ⧁āϟ āχāωāϜāĻžāϰ āĻā§œāĻŋā§Ÿā§‡ āϚāϞāĻž (Run as Non-Root) ​

āĻĄāĻ•āĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ āϰ⧁āϟ (Root) āχāωāϜāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āϰāĻžāύ āĻ•āϰ⧇āĨ¤ āϝāĻĻāĻŋ āϕ⧋āύ⧋ āĻšā§āϝāĻžāĻ•āĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ āĻĒāĻžā§Ÿ, āϤāĻŦ⧇ āϏ⧇ āĻĒ⧁āϰ⧋ āĻšā§‹āĻ¸ā§āϟ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻāĻ•ā§āϏ⧇āϏ āĻĒā§‡ā§Ÿā§‡ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

  • āϏāĻŽāĻžāϧāĻžāύ: Dockerfile-āĻ āĻāĻ•āϟāĻŋ āύāύ-āϰ⧁āϟ āχāωāϜāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϏ⧇āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤
dockerfile
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

⧍. āϰāĻŋāĻĄ-āĻ…āύāϞāĻŋ āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ (Read-Only File System) ​

āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āϰāĻžāύāϟāĻžāχāĻŽā§‡ āϝāĻĻāĻŋ āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻ•āĻŋāϛ⧁ āϞ⧇āĻ–āĻžāϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āύāĻž āĻĨāĻžāϕ⧇, āϤāĻŦ⧇ āϏ⧇āϟāĻŋāϕ⧇ āϰāĻŋāĻĄ-āĻ…āύāϞāĻŋ āĻšāĻŋāϏ⧇āĻŦ⧇ āϏ⧇āϟ āĻ•āϰ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āϏāĻŦāĻšā§‡ā§Ÿā§‡ āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤ āĻāϤ⧇ āĻšā§āϝāĻžāĻ•āĻžāϰāϰāĻž āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āϭ⧇āϤāϰ⧇ āϕ⧋āύ⧋ āĻ•ā§āώāϤāĻŋāĻ•āϰ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϏ⧇āĻ­ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āύāĻžāĨ¤

bash
docker run --read-only my-image

ā§Š. āĻ•ā§āϝāĻžāĻĒāĻžāĻŦāĻŋāϞāĻŋāϟāĻŋāϜ āĻ•āĻŽāĻžāύ⧋ (Drop Capabilities) ​

āĻĄāĻ•āĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϕ⧇ āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ āĻ•āĻŋāϛ⧁ āϞāĻŋāύāĻžāĻ•ā§āϏ āĻ•ā§āϝāĻžāĻĒāĻžāĻŦāĻŋāϞāĻŋāϟāĻŋāϜ (Capabilities) āĻĻ⧇āĻ“ā§ŸāĻž āĻšā§Ÿ āϝāĻž āĻšā§ŸāϤ⧋ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āύ⧇āχāĨ¤ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒā§āĻ°ā§Ÿā§‹āϜāύ⧀āϝāĻŧ āϏāĻŦ āĻ•ā§āϝāĻžāĻĒāĻžāĻŦāĻŋāϞāĻŋāϟāĻŋāϜ āĻĄā§āϰāĻĒ āĻ•āϰ⧇ āĻĻāĻŋāύāĨ¤

bash
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-image

ā§Ē. āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻ¸ā§āĻ•ā§āϝāĻžāύāĻŋāĻ‚ (Security Scanning) ​

āχāĻŽā§‡āϜ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻĒāϰ āϏ⧇āϟāĻŋāϤ⧇ āϕ⧋āύ⧋ āĻĒāϰāĻŋāϚāĻŋāϤ āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻšā§‹āϞ (Vulnerability) āφāϛ⧇ āĻ•āĻŋāύāĻž āϤāĻž āύāĻŋ⧟āĻŽāĻŋāϤ āĻ¸ā§āĻ•ā§āϝāĻžāύ āĻ•āϰ⧁āύāĨ¤

  • Docker Scout: āĻĄāĻ•āĻžāϰ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻ¸ā§āĻ•ā§āϝāĻžāύāĻŋāĻ‚ āϟ⧁āϞāĨ¤
  • Trivy: āĻāĻ•āϟāĻŋ āϜāύāĻĒā§āϰāĻŋ⧟ āĻ“āĻĒ⧇āύ āϏ⧋āĻ°ā§āϏ āχāĻŽā§‡āϜ āĻ¸ā§āĻ•ā§āϝāĻžāύāĻžāϰāĨ¤
bash
docker scout cves my-image:latest

ā§Ģ. āĻĄāĻ•āĻžāϰ āĻ•āĻ¨ā§āĻŸā§‡āĻ¨ā§āϟ āĻŸā§āϰāĻžāĻ¸ā§āϟ (Docker Content Trust) ​

āϏāĻŦāϏāĻŽā§Ÿ āϭ⧇āϰāĻŋāĻĢāĻžāχāĻĄ āĻāĻŦāĻ‚ āĻ…āĻĢāĻŋāϏāĻŋ⧟āĻžāϞ āχāĻŽā§‡āϜ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤ DOCKER_CONTENT_TRUST=1 āϏ⧇āϟ āĻ•āϰāϞ⧇ āĻĄāĻ•āĻžāϰ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĄāĻŋāϜāĻŋāϟāĻžāϞāϞāĻŋ āϏāĻžāχāύ āĻ•āϰāĻž āχāĻŽā§‡āϜāϗ⧁āϞ⧋āχ āϰāĻžāύ āĻ•āϰāĻŦ⧇āĨ¤


ā§Ŧ. āϏāĻŋāĻ•ā§āϰ⧇āϟāϏ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ (Secrets Management) ​

āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ, āĻāĻĒāĻŋāφāχ āĻ•āĻŋ (API Key) āĻŦāĻž āϏ⧇āύāϏāĻŋāϟāĻŋāĻ­ āĻĄā§‡āϟāĻž āĻ•āĻ–āύ⧋ Dockerfile-āĻāϰ ENV āĻŦāĻž āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄā§‡ āϰāĻžāĻ–āĻŦ⧇āύ āύāĻžāĨ¤ āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻĄāĻ•āĻžāϰ āϏāĻŋāĻ•ā§āϰ⧇āϟāϏ (Docker Secrets) āĻŦāĻž āĻāύāĻ­āĻžāϝāĻŧāϰāύāĻŽā§‡āĻ¨ā§āϟ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻž āϰāĻžāύāϟāĻžāχāĻŽā§‡ āχāύāĻœā§‡āĻ•ā§āϟ āĻ•āϰāĻž āĻšā§ŸāĨ¤


ā§­. āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āĻ• āφāχāϏ⧋āϞ⧇āĻļāύ (Network Isolation) ​

āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϗ⧁āϞ⧋āϕ⧇ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻŦā§āϰāĻŋāϜ āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āϕ⧇ āύāĻž āϰ⧇āϖ⧇ āĻ•āĻžāĻ¸ā§āϟāĻŽ āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āϕ⧇ āϰāĻžāϖ⧁āύāĨ¤ āĻāϤ⧇ āĻ…āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻāϕ⧇ āĻ…āĻĒāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āύāĻž, āϝāĻž āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻŦāĻžā§œāĻžā§ŸāĨ¤


ā§Ž. āϰāĻŋāϏ⧋āĻ°ā§āϏ āϞāĻŋāĻŽāĻŋāϟ (Resource Limits) ​

āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āϝāĻžāϤ⧇ āĻĒ⧁āϰ⧋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻŽā§‡āĻŽāϰāĻŋ āĻŦāĻž āϏāĻŋāĻĒāĻŋāχāω āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻšā§‹āĻ¸ā§āϟ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϕ⧇ āĻĄāĻžāωāύ (DoS attack) āύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϏ⧇āϜāĻ¨ā§āϝ āϰāĻŋāϏ⧋āĻ°ā§āϏ āϞāĻŋāĻŽāĻŋāϟ āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤

bash
docker run --memory="512m" --cpus="1" my-image

āϏāĻžāϰāϏāĻ‚āĻ•ā§āώ⧇āĻĒ (Summary) ​

āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āϕ⧋āύ⧋ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ¸ā§āĻŸā§‡āĻĒ āύ⧟, āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ•āĻ¨ā§āϟāĻŋāύāĻŋāωāϝāĻŧāĻžāϏ āĻĒā§āϰāϏ⧇āϏāĨ¤ āφāĻĒāύāĻžāϰ Docker-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āωāĻĒāϰ⧇āϰ āϧāĻžāĻĒāϗ⧁āϞ⧋ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻŽā§‡āύ⧇ āϚāϞ⧁āύāĨ¤


CAUTION

āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻ…āĻŦāĻšā§‡āϞāĻž āĻ•āϰāϞ⧇ āφāĻĒāύāĻžāϰ āĻĒ⧁āϰ⧋ āχāύāĻĢā§āϰāĻžāĻ¸ā§āĻŸā§āϰāĻžāĻ•āϚāĻžāϰ āĻā§āρāĻ•āĻŋāϰ āĻŽā§āϖ⧇ āĻĒ⧜āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϏāĻŦāϏāĻŽā§Ÿ "Principle of Least Privilege" āĻŽā§‡āύ⧇ āϚāϞ⧁āύāĨ¤

Released under the MIT License.