alt round

Docker 이미지는 애플리케이션이 동작할 수 있는 독립된 환경을 제공해서 이미 많은 개발자가 사용하고 있는데요.

이미 누군가 만들어둔 Docker 이미지를 사용하기도 하지만, 직접 Dockerfile을 작성해서 Docker 이미지를 빌드하는 경우도 많죠.

더욱 안전한 Docker 이미지를 제작할 수 있는 Dockerfile 작성 팁이 있다는 사실, 알고 계셨나요?

⚠️Dockerfile을 작성할 때 보안에 신경써야 하는 이유

오늘날 대부분의 웹 서비스는 마이크로서비스 아키텍처를 따르고 있습니다. 하나의 커다란 서비스를 배포하는 것이 아닌, 기능이나 성격에 따라 나눠진 작은 서비스 여러 개를 배포 및 운영하는 방식을 마이크로서비스 아키텍처라고 하는데요.

이때 마이크로서비스를 각각의 Docker 컨테이너 내부에서 동작하도록 구성하는 것이 일반적입니다. 하지만 이렇게 실제로 배포된 컨테이너 이미지가 외부 공격에 취약하다면… 생각만 해도 아찔한 보안 사고로 이어지겠죠.

그래서 우리는 ==Dockerfile==을 작성할 때부터 보안에 신경써야 합니다.

🔒더욱 안전한 이미지를 만드는 Dockerfile 작성 팁 5가지

그렇다면 Dockerfile을 어떻게 작성하면 좋을까요? 여기 보안에 강한 Dockerfile 작성 팁 5가지를 소개해드립니다.

Multi-Stage 방식으로 빌드

  • Dockerfile 내에서 애플리케이션 빌드 명령어 실행 후 나오는 최종 산출물또다른 Base Image로 복사하고, 해당 Base Image를 최종 Docker Image로 빌드하는 기법을 Multi-Stage라고 하는데요.
  • Multi-Stage 방식으로 빌드된 Docker 이미지 내에는 애플리케이션 구동에 필요한 최소한의 요소만 담겨있으므로, 자연스럽게 잠재된 보안 취약점도 더 적어집니다.

필요없는 패키지 제거

  • Docker 컨테이너 내 애플리케이션 구동에 필요없는 패키지를 제거하는 것 역시 잠재 보안 취약점을 줄여주기 때문에 권장됩니다.

Root가 아닌 별도의 사용자를 생성 및 사용

  • Container 내에 Root 계정이 사용될 경우, 침입 사고 발생 시 피해가 커질 수 있습니다. 그래서 권한이 제한된 별도의 사용자를 생성하고 사용하는 것이 안전합니다.

Container 내 민감한 파일들은 Read Only로

  • 배포 이후 Docker Container 내에서 추후 수정이 필요하지 않는 파일들을 Read Only로 설정하면 보안성을 높일 수 있습니다.

Shell 접근 제거

  • 컨테이너 안에서 실행 가능한 shbash 등의 Shell은 동작 중인 컨테이너 내 애플리케이션을 디버깅할 때 사용되는 경우가 있지만, 이런 통로를 제거하면 컨테이너 내부 침입이 어려워져 보안성이 높아집니다.
  • 하지만 Shell 접근을 제거할 땐 아래 주의사항에 대해 고려해야 합니다.
    • 컨테이너 이미지에서 동작하는 ==애플리케이션이 Shell을 사용하고 있지 않은지 확인==해야 합니다.
    • ==해당 이미지를 배포한 뒤에 애플리케이션 디버깅할 수 있는 다른 대안을 미리 마련==해야 합니다.

🔎컨테이너 보안을 지킬 수 있는 또다른 방법

지금까지 Dockerfile을 작성할 때 보안성을 높이기 위한 작성 팁에 대해 알아봤는데요. Docker 이미지를 직접 빌드하는 경우가 아닌, 이미 누군가 제작한 Docker 이미지를 사용할 때 그 이미지가 안전한지는 어떻게 알 수 있을까요?

이럴 때 사용할 수 있는 방법이 바로 컨테이너 보안 스캐닝입니다. 대표적인 컨테이너 보안 스캐닝 툴로는 TrivyClair가 있는데요.

컨테이너 이미지 보안 스캐닝에 대해서는 지난 글에서 다룬 적이 있기 때문에 혹시 관심 있으시다면 확인해보시기 바랍니다.😊

References