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.