반응형
1. Docker란?
Docker는 개발자가 컨테이너를 신속하게 빌드, 배포, 실행, 업데이트 및 관리할 수 있는 오픈 소스 플랫폼입니다.
1-1. 주요 특징
- 컨테이너화 : 애플리케이션을 독립적으로 실행할 수 있도록 패키징하여, 다른 애플리케이션이나 시스템과의 충돌 없이 실행
- 이식성 : Docker image를 사용하면 개발, 테스트, 배포 환경에서도 일관성을 유지하여 애플리케이션을 실행할 수 있음
- 효율성 : VM보다 가볍고 빠르며, 리소스 낭비가 적다. 여러 개의 컨테이너를 동일한 호스트에서 실행할 수 있음
- 버전 관리 : Docker image는 버전 관리가 가능하며, 필요한 버전으로 손쉽게 변경할 수 있다.
1-2. 애플리케이션을 독립적으로 실행할 수 있다는게 무슨 말일까?
특정 환경이나 다른 소프트웨어의 영향을 받지 않고, 격리된 상태에서 실행된다는 의미
- 의존성 관리 : 컨테이너는 애플리케이션이 필요로 하는 모든 라이브러리와 설정 파일을 포함합니다. 다른 애플리케이션이나 시스템에 설치된 버전과의 충돌을 피할 수 있게 되는거죠.
- 환경 일관성 : 컨테이너는 동일한 환경에서 실행되므로, 사람마다 다른 환경 또는 테스트, 개발 환경에서도 동일하게 작동합니다. 흔히 잘 발생할 수 있는 "내 컴퓨터에서는 문제 없는데?" 라는 문제가 줄어들 수 있습니다.
- 격리성 : 컨테이너는 서로 독립적으로 실행되므로, 하나의 컨테이너에서 발생한 문제가 다른 컨테이너에 영향을 미치지 않습니다.
1-3. 애플리케이션을 독립적으로 사용하지 않았을 때 발생할 수 있는 문제점
- 의존성 충돌 : 동일한 라이브러리나 패키지를 사용하는 서로 다른 애플리케이션에서 다른 버전을 요구할 경우, 이를 동시에 설치할 수 없습니다. A에서는 0.1을 필요로 하고, B에서는 1.0을 필요로 하거나 사용중일 경우 특정 기능이 작동되지 않거나, 버그 유발 및 어느 한쪽에 버전을 맞춰주는 작업이 필요할 수 있습니다.
- 환경 설정의 일관성 부족 : 환경 변수, 라이브러리 버전, 설정 파일 등의 애플리케이션 실행에 영향을 미치는 설정들로 인한 문제점이 발생할 수 있습니다. 개발 환경에서는 잘 되는 기능이 운영 환경에서는 잘 동작하지 않는다던가, A 개발자의 컴퓨터에서는 정상 작동하는 기능이 B 개발자의 컴퓨터에서는 작동하지 않는 기능의 오차가 발생할 수 있는거죠.
- 배포의 복잡성 : 배포할 때마다 필요한 라이브러리와 설정을 수종으로 관리해야 합니다.
- 보안 문제 : 하나의 애플리케이션에서 발견된 보안 취약첨이 다른 애플리케이션에 영향을 미칠 수 있습니다.
- 격리 부족 : CPU 사용량 문제, 메모리 누수 등이 다른 애플리케이션에 영향을 미칠 수 있습니다.
1-4. 격리 부족의 문제점은 DB서버, WEB서버, WAS서버 따로 두면 해결되는 문제 아니야?
서버를 각각 두면 격리 부족의 문제를 어느 정도 해결할 수 있지만, 완전한 해결책은 아닙니다.
- 장점
- 서버 간 격리 : 각 서버가 별도로 운영되기 때문에 다른 서버에 영향을 주지 않아 기본적인 리소스 격리 제공
- 보안 강화 : 서버 간의 물리적 격리가 이루어지면서, 한 서버의 보안 취약점이 다른 서버에 영향을 미치지 않습니다.
- 스케일링 용이 : 각 서버를 독립적으로 성능 향상 또는 서버 추가를 할 수 있어, 부하를 효과적으로 처리할 수 있습니다.
- 단점
- 관리 복잡성 : 여러 개의 서버를 관리해야 하므로, 설정, 업데이트, 모니터링 등의 관리가 복잡해져 운영 비용이 증가할 수 있습니다.
- 배포 및 연동 문제 : 각 서버 간의 통신이 필요할 경우, 네트워크 설정 또는 API 연동에 대해 추가적인 고려가 필요하며, 이는 배포와 통합 테스트의 복잡성을 높일 수 있습니다.
- 리소스 활용 비효율 : 각 서버가 독립적으로 운영되면서, 리소스가 비효율적으로 사용될 수 있습니다. 각 서버에 대해 일정량의 리소스가 할당되는데, 실제로는 사용량이 적은 경우에도 할당된 리소스를 소모하게 되어 낭비가 생길 수 있습니다.
- 환경 일관성 문제 : 서버 간에 환경 설정을 일관되게 유지하기가 어려워, 여전히 "내 컴퓨터에서는 문제 없는데?"와 같은 문제를 완전히 해결하지 못할 수 있습니다.
2. Docker 사용의 장점
- 재사용 및 이식성 : Docker image는 여러 환경에서 재사용할 수 있으며, 어떤 환경에서도 동일하게 실행될 수 있습니다.
- 격리성 : 각 컨테이너는 독립적으로 실행되며, 서로의 영향을 받지 않아 여러 서비스를 같은 호스트에서 안전하게 실행할 수 있습니다.
- 효율적인 리소스 사용 : 컨테이너는 가벼운 경량 가상화 기술로, 여러 개의 컨테이너를 동일한 OS에서 실행할 수 있어 CPU와 메모리를 더 효율적으로 활용할 수 있습니다.
- 빠른 배포와 롤백 : Docker image를 사용하면 배포 프로세스를 자동화할 수 있으며, CI/CD(지속적 통합/지속적 배포) 파이프라인을 쉽게 통합할 수 있어 테스트 및 배포 과정이 단순화될 수 있습니다.
- 환경 일관성 : 컨테이너는 필요한 모든 의존성과 설정을 같이 패키징하기 때문에 환경 간의 차이를 줄여 개발자와 운영팀 간의 협업이 쉬워집니다.
- Docker Image 활용 : Docker Hub에서 다양한 공식 image와 커뮤니티 image를 사용할 수 있습니다. 이는 개발 시간을 단축하고, 안정성을 높이 수 있습니다.
3. Docker 사용의 단점
- 보안 문제 : 동일한 OS를 공유하고 있기 때문에 하나의 컨테이너에서 발견된 보안 취약점이 다른 컨테이너에 영향을 미칠 수 있습니다. 공격자가 하나의 컨테이너를 통해 시스템이나 다른 컨테이너에 침투할 위험이 증가합니다.
- 복잡한 네트워크 구성 : 여러 컨테이너 간의 통신을 설정 및 관리하는 것이 복잡할 수 있습니다. 특히, 네트워크 정책과 방화벽 규칙을 관리해야할 경우 더욱 어려워집니다.
- 리소스 관리 문제 : 컨테이너는 가볍지만, 동시에 많은 컨테이너를 동시에 실행하면 CPU와 메모리 등의 리소스가 부족해 모니터링을 제대로 하지 않았을 경우 성능 저하나 서비스 중단의 문제가 발생할 수 있습니다.
- 스토리지 관리 : 컨테이너의 데이터를 지속적으로 유지하려면 외부 스토리지를 구성해야 합니다. 기본적으로 컨테이너의 파일 시스템은 휘발성이기 때문에, 컨테이너가 종료된다면 데이터가 손실될 가능성이 있습니다.
- 기술적 학습 필요 : Docker를 도입하게 된다면 교육과 학습에 대한 시간과 노력이 필요합니다.
- 장기적인 유지 관리 : 새로운 image를 업데이트하고 관리해야 하며, 불필요한 image를 청소하는 것에도 시간이 소요될 수 있습니다.
3-1. 보안 문제는 어떻게 해결해야할까?
3-1-1. 최소 권한 원칙 적용
일반적으로 Docker 컨테이너는 root 사용자로 실행됩니다. root 사용자는 시스템의 모든 파일과 프로세스 접근 권한을 가지고 있어, 공격자가 컨테이너에 침투할 경우 시스템 전체에 영향을 미칠 수 있습니다.
이를 방지하기 위해 비루트 사용자를 생성하여 비루트 사용자로 컨테이너를 실행해야 합니다.
- Dockerfile에서 사용 예시
FROM ubuntu:latest
# 새 사용자 추가
RUN useradd -m myuser
# 해당 사용자로 작업 디렉토리 설정
USER myuser
# 애플리케이션 실행 명령
CMD ["your_application"]
- 컨테이너 실행 시 사용자 지정 예시
docker run --user myuser your_image
3-1-2. image 관리
- 신뢰할 수 있는 image 사용 : 공식 image나 신뢰할 수 있는 출처의 image를 사용
- 정기적인 업데이트 : image를 최신 상태로 유지 및 보안 패치가 적용된 최신 버전을 사용
- Image Scanning : 컨테이너 image를 정기적으로 스캔하여 알려진 취약점 확인
3-1-3. 네트워크 보안 강화
- 격리된 네트워크 사용 : 컨테이너를 격리된 네트워크에서 실행 및 외부와의 불필요한 통신 차단
- 방화벽 규칙 설정 : 컨테이너 간의 통신을 제어하기 위해 방화벽 설정
3-1-4. 로그 및 모니터링
- 컨테이너 로그 기록 : 컨테이너에서 발생하는 모든 로그를 기록해 이상 징후 모니터링
- 모니터링 도구 사용 : Prometheus, Grafana 등의 모니터링 도구를 사용하여 리소스 사용량과 이상 행동을 지속적으로 감시
3-1-5. 컨테이너 보안 구성
- SELinux 또는 AppArmor 사용 : 컨테이너의 프로세스와 리소스 접근을 제어하기 위해 보안 모듈 사용
- 주기적인 보안 검토 : 컨테이너의 설정 및 보안 정책을 정기적으로 검토해 취약점 파악
3-1-6. 오케스트레이션 도구 활용
- Kubernetes와 같은 도구 사용 : 오케스트레이션 도구는 보안 기능을 제공해, 네트워크 정책, 롤 기반 액세스 제어(RBAC), 비밀 관리 등의 기능을 통해 보안 강화
- Pod Security Policies : Kubernetes에서 사용할 수 있는 정택을 통해 컨테이너의 보안 설정 관리
3-1-7. 보안 스캔 도구 활용
- 도구 사용 : Aqua Security, Twistlock, Clair와 같은 보안 스캔 도구를 사용해 image 및 실행 중인 컨테이너 보안 검사
- 자동화 : CI/CD 파이프라인에 보안 검사 단계를 추가해 코드 변경 시 자동으로 보안 검사 수행
- Docker Image Scanning 도구 Trivy 사용 예시
- Image를 사용하여 Trivy 설치
docker pull aquasec/trivy:0.56.2
- Image Scanning
docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy:0.56.2 image 이미지명:버전
- 결과
- 검출된 여러 항목 중 사용중인 Python 버전에서 검출된 결과입니다.
- 총 7건이 검출되었고, 검출된 표를 보면 Status가 fixed인 항목들은 조치가 된 항목들로 Fixed Version으로 업그레이드가 필요한 항목들입니다.
- Status가 affected인 항목은 아직 조치가 되지 않은 항목으로 우측 Title에 기재된 링크로 접속해보면 해당 취약점에 대해 상세 내용을 볼 수 있습니다.
- 접속한 페이지 하단 References에 해당 취약점 관련된 진행사항 또는 해결 방안이 기재된 페이지도 볼 수 있지만, 취약점이 해결된 버전이 나오지 않았기 때문에 참고용으로 보시면 될 것 같습니다.
참고자료
https://aws.amazon.com/ko/docker/
https://www.ibm.com/kr-ko/topics/docker
https://aquasecurity.github.io/trivy/v0.18.3/installation/
반응형
'Docker' 카테고리의 다른 글
[Docker] kubernetes pod err(image 지워지는 현상) (0) | 2024.11.04 |
---|