Docker 컨테이너 내에서 보안 업데이트를 처리하는 방법은 무엇입니까?


117

응용 프로그램을 서버에 배포 할 때는 일반적으로 응용 프로그램과 함께 번들로 제공되는 것과 플랫폼 (운영 체제 및 설치된 패키지)에서 제공 할 수있는 것과 분리됩니다. 그 중 하나는 플랫폼을 응용 프로그램과 독립적으로 업데이트 할 수 있다는 것입니다. 예를 들어 전체 응용 프로그램을 다시 작성하지 않고 플랫폼에서 제공하는 패키지에 보안 업데이트를 긴급하게 적용해야하는 경우에 유용합니다.

전통적으로 보안 업데이트는 패키지 관리자 명령을 실행하여 운영 체제에 업데이트 된 버전의 패키지 (예 : RHEL의 "yum update")를 설치하여 간단하게 적용되었습니다. 그러나 컨테이너 이미지가 기본적으로 애플리케이션 플랫폼을 모두 번들로 제공하는 Docker와 같은 컨테이너 기술의 출현으로 컨테이너 가있는 시스템을 최신 상태로 유지하는 일반적인 방법은 무엇입니까? 호스트와 컨테이너에는 호스트에서 업데이트 및 업데이트가 필요한 자체의 독립적 인 패키지 세트가 있으므로 컨테이너 내부의 패키지는 업데이트되지 않습니다. Docker 컨테이너가 특히 특징 인 RHEL 7 릴리스에서는 컨테이너의 보안 업데이트를 처리하는 Redhat의 권장 방법이 무엇인지 들어 보는 것이 흥미로울 것입니다.

몇 가지 옵션에 대한 생각 :

  • 패키지 관리자가 호스트에서 패키지를 업데이트하게하면 컨테이너 내부의 패키지는 업데이트되지 않습니다.
  • 업데이트를 적용하기 위해 모든 컨테이너 이미지를 재생성해야하는 것은 애플리케이션과 플랫폼 사이의 분리를 방해하는 것 같습니다 (플랫폼을 업데이트하려면 Docker 이미지를 생성하는 애플리케이션 빌드 프로세스에 액세스해야합니다).
  • 실행중인 각 컨테이너 내에서 수동 명령을 실행하면 번거롭고 다음에 컨테이너가 애플리케이션 릴리스 아티팩트에서 업데이트 될 때 변경 사항을 겹쳐 쓸 위험이 있습니다.

따라서 이러한 접근 방식 중 어느 것도 만족스럽지 않습니다.


1
지금까지 본 가장 좋은 아이디어는 Project Atomic 입니다. 나는 생각하지 않습니다 매우 하지만 황금 시간대에 대 한 준비입니다.
마이클 햄튼

1
Valko, 어떤 워크 플로를 끝냈습니까? 장기 컨테이너 (예 : php-cgi 호스팅)를 실행 중이며 지금까지 찾은 docker pull debian/jessie것은 이미지를 업데이트 한 다음 기존 이미지를 다시 작성하고 컨테이너를 중지하고 다시 실행하는 것입니다 ( 새 이미지로). 내가 만든 이미지는 이전 이미지와 이름이 같으므로 시작은 스크립트를 통해 수행됩니다. 그런 다음 "이름이없는"이미지를 제거합니다. 더 나은 워크 플로에 감사드립니다.
miha

1
miha : 그것은 내가 한 일과 비슷하게 들립니다. 기본적으로 새로운 릴리스의 일부로 모든 이미지를 지속적으로 업데이트하고 다시 작성합니다. 새 이미지를 사용하여 컨테이너를 다시 시작하십시오.
Markus Hallmann 10

1
Johannes Ziemke가 말한 것과 정확히 일치하는 주요 명령 줄이 포함 된 스크립트가 있기 때문에 여기에 가장 좋은 대답 이 많이 도움이됩니다.
Hudson Santos

흥미로운 질문입니다. 나 자신이 궁금하다. 하나의 도커 호스트에서 20 개의 응용 프로그램을 실행중인 경우 기본 이미지를 업그레이드하고 다시 빌드하고 다시 시작해야합니다! 20 개의 응용 프로그램을 사용하면 보안 업데이트가 해당 응용 프로그램 모두에 영향을 주 었는지 아니면 그 중 하나에 만 영향을주는지도 알 수 없습니다. 예를 들어 보안 업데이트가 libpng에만 영향을주는 경우 Apache라는 이미지를 다시 작성해야합니다. 따라서 불필요한 재 구축 및 재시작이 가능합니다.
Dalibor Filus

답변:


47

Docker 이미지는 응용 프로그램과 "플랫폼"을 번들로 제공합니다. 그러나 일반적으로 이미지는 기본 이미지와 실제 응용 프로그램으로 구성됩니다.

따라서 보안 업데이트를 처리하는 일반적인 방법은 기본 이미지를 업데이트 한 다음 응용 프로그램 이미지를 다시 작성하는 것입니다.


3
고마워요, 이것은 합리적으로 들립니다. 여전히 플랫폼을 업데이트하여 전체 응용 프로그램의 재 패키징을 트리거하지 않아도됩니다 (예 : 단일 기본 이미지가 업데이트되어 100 개의 다른 응용 프로그램 이미지를 다시 작성해야한다고 생각하십시오). 그러나 이것은 단일 이미지 안에 모든 것을 하나로 묶는 Docker 철학으로 불가피합니다.
Markus Hallmann

3
@ValkoSipuli 프로세스를 자동화하는 스크립트를 항상 작성할 수 있습니다.
dsljanus

컨테이너 내부에서 apt-get upgrade, dnf upgrade, pacman-syu 등을 사용하는 것이 어떻습니까? 컨테이너를 시작하고 다시 시작할 때 모든 패키지를 업그레이드하도록이 를 수행하는 셸 스크립트를 만든 다음 응용 프로그램 실행 한 다음 컨테이너의 진입 점으로 사용할 수도 있습니다.
Arthur Kay

8
@ArthurKay 두 가지 이유 : 1) 오래된 패키지를 이미지에 유지하면서 업그레이드되는 모든 패키지가 컨테이너 계층에 추가되므로 컨테이너 크기가 증가합니다. 2) (컨테이너) 이미지의 가장 큰 장점을 상실합니다. 실행하는 이미지는 런타임에 패키지를 변경하기 때문에 빌드 / 테스트와 동일하지 않습니다.
Johannes 'fish'Ziemke

7
내가 이해하지 못하는 한 가지가 있습니다. 도커 컨테이너로 제공되는 소프트웨어를 구매하는 회사 인 경우 보안 문제가 발생할 때마다 소프트웨어 제조업체가 응용 프로그램 패키지를 다시 빌드 할 때까지 기다려야합니다 ? 어떤 회사가 공개 취약점에 대한 통제권을 포기할 것인가?
Sentenza

7

컨테이너는 가볍고 상호 교환 가능해야합니다. 컨테이너에 보안 문제가있는 경우 패치 된 컨테이너 버전을 다시 빌드하고 새 컨테이너를 배포하십시오. (많은 컨테이너는 apt-get과 같은 표준 패키지 관리 도구를 사용하여 종속성을 설치하는 표준 기본 이미지를 사용하며, 재구성하면 리포지토리에서 업데이트를 가져옵니다)

컨테이너 내부를 패치 할 수는 있지만 확장 성이 떨어집니다.



0

우선, 과거에 전통적으로 실행했던 많은 업데이트는 컨테이너 자체에 포함되지 않습니다. 컨테이너는 과거에 보았던 익숙한 전체 파일 시스템의 매우 가볍고 작은 하위 집합이어야합니다. 업데이트해야하는 패키지는 DockerFile의 일부인 패키지 일 것이며 DockerFile이 있으므로 업데이트가 필요한 패키지 및 컨테이너 ID를 추적 할 수 있어야합니다. Cloudstein의 UI는 곧 출시 될 DockerFile 구성 요소를 추적하여 컨테이너에 가장 적합한 업데이트 구성표를 작성할 수 있습니다. 도움이 되었기를 바랍니다


-1

일반적으로 제공 한 세 가지 선택보다 더 나쁩니다. 대부분의 도커 이미지는 패키지 관리자로 빌드되지 않으므로 도커 이미지에 쉘을 적용하여 업데이트를 실행할 수 없습니다. 도커 이미지를 다시 작성하거나 다시 가져와야합니다.

보안 패치를 재 구축하기 위해 재 구축해야하거나 다른 사람들에게보고 있다는 사실은 대부분의 경우에 비합리적입니다.

도커 컨테이너에 sonarr과 radarr를 배포하는 것을 고려하고 있었지만 컨테이너가 정기적으로 보안 업데이트를 얻지 못할 것이라는 것은 거래 차단기입니다. 컨테이너의 보안 업데이트 관리는 각 도커 이미지에 개별적으로 보안 업데이트를 수동으로 적용 할 필요없이 번거 롭습니다.


1
질문에 대한 답변을 제공하지 않으므로 게시물이 답변으로 간주되지 않습니다. 질문에 의견으로 추가하고 "답변"을 제거하십시오. StackExchange는 포럼이 아니지만 전문가가 도움을 줄 수있는 질문에 답변하는 Q & A로 간주되어야합니다.
Phillip -Zyan K Lee- Stockmann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.