source

도커 컨테이너 SSL 인증서

ittop 2023. 8. 10. 21:29
반응형

도커 컨테이너 SSL 인증서

도커 풀에서 가져온 이미지에 SSL 인증서를 추가하는 우아한 방법이 있습니까?

/etc/ssl/certs에 파일을 추가하고 update-ca-certs를 실행하는 간단하고 재현 가능한 방법을 찾고 있습니다.(Ubuntu 및 Debian 이미지를 포함해야 합니다.)

저는 코어OS에서 도커를 사용하고 있고, 코어는OS 컴퓨터는 필요한 SSL 인증서를 신뢰하지만 도커 컨테이너에는 분명히 기본 인증서만 있습니다.

사용해 보았습니다.docker run --entrypoint=/bin/bash그런 다음 인증서를 추가하고 실행합니다.update-ca-certificates하지만 이것은 진입점을 영구적으로 무시하는 것처럼 보입니다.

저도 지금 궁금해요, 그냥 설치하는 게 더 우아할까요?/etc/ssl/certs호스트 시스템의 컨테이너에 복사하시겠습니까?이렇게 하면 컨테이너가 호스트와 동일한 항목을 암묵적으로 신뢰할 수 있습니다.

저는 모든 것을 사임하는 짜증나는 대리인과 함께 일하고 있습니다 :(SSL이 깨지고 컨테이너가 작업하기에 좀 이상합니다.

다음을 사용하여 Docker 컨테이너에 인증서를 마운트합니다.-v:

docker run -v /host/path/to/certs:/container/path/to/certs -d IMAGE_ID "update-ca-certificates"

고: 더-vflag는 볼륨을 도커 컨테이너에 바인딩/삭제하는 데 사용됩니다.

저는 이것과 비슷한 것을 하려고 노력하고 있습니다.위에서했듯이, 파일(당긴 이미지로 로 새로운 하는 것이 것 .ADD에 당의증명서, 다면그렇신▁your.RUN update-ca-certificates이렇게 하면 이 새 이미지에서 컨테이너를 시작할 때마다 일관된 상태가 됩니다.

# Dockerfile
FROM some-base-image:0.1
ADD you_certificate.crt:/container/cert/path
RUN update-ca-certificates

예를 들어docker buildIMAGE_ID를 생성한 Docker 파일에 대해 설명합니다. 음에에서docker run -d [any other options] IMAGE_ID해당 명령에 의해 시작된 컨테이너에는 인증서 정보가 있습니다.단순하고 재현 가능합니다.

위의 설명에서 제안한 대로 호스트의 인증서 저장소가 게스트와 호환되는 경우 직접 마운트하면 됩니다.

Debian 호스트(및 컨테이너)에서 성공적으로 수행한 작업:

docker run -v /etc/ssl/certs:/etc/ssl/certs:ro ...

상대 경로를 사용하여 볼륨을 컨테이너에 마운트할 수 있습니다.

docker run -v `pwd`/certs:/container/path/to/certs ...

확니다합인을금뒤에 있는 뒤 합니다.pwd현재 작업 디렉토리를 제공합니다.그것은 당신이 가지고 있다고 가정합니다.certs입니다.docker run 볼 수 있습니다.지역 개발에 도움이 되고 프로젝트에서 인증서 폴더를 계속 볼 수 있습니다.

제가 대본을 다 썼어요.docker게스트에서 호스트의 SSL 인증서를 설정합니다.

추가적으로 컨테이너를 재구축할 필요가 없습니다. 바로 작동해야 합니다.

고라합니다라고 불립니다.docker그래서 당신은 그것을 당신의 어딘가에 복사할 수 있습니다.$PATH다 .docker이름을 변경하고 다른 곳에 배치합니다.

문제가 있으면 Github으로 알려주세요!

이것은 당신의 질문에 직접적으로 대답하지는 않겠지만, 이것이 제가 같은 문제를 해결한 방법입니다.

달리고 있었습니다.golang:1.16.4-buster자격증을 가지고 시도한 것은 아무것도 되지 않았습니다.는 로바습다니로 바꿨어요.golang:1.17.8-alpine3.15처음부터 인증서를 로드할 필요 없이 작동했습니다.게다가, 더 작은 배급사의 보너스.

CoreOS(Fedora)와 Ubuntu/Debian 게스트에 대해 이야기할 때 이 문제를 해결할 수 있는 좋은 방법은 없습니다.Fedora는 "신뢰 앵커"를 구성하기 위해 현대 표준을 사용하는 반면 Ubuntu/Debian은 여전히 이전 스타일을 사용합니다.그 둘은 직접적으로 양립할 수 없습니다.

이 문제의 역방향(Ubuntu의 Fedora)을 해결하기 위해 과도하게 오랜 시간을 소비한 옵션은 다음과 같습니다.

  1. 컨테이너 이미지를 가져와 환경 변수를 통해 추가할 사용자 지정 인증서에 대한 1등급 지원을 추가합니다(잘 만들어진 컨테이너에서는 일반적이지만 Ubuntu 직접 배포 이미지에서는 그렇지 않음).
  2. 유사한 호스트 시스템(일반적으로 실행 가능한 옵션이 아님)을 실행하고 게스트 시스템 위에 호스트 신뢰 앵커를 마운트하는 방법을 찾습니다.
  3. 인증서 또는 인증서 지정 지원을 추가하는 이미지의 자체 버전 회전(일반적으로 장기간 실행되는 포크를 관리할 수 없음)
  4. 추가 호스트 마운트(옵션)에서 CA 추가/설치를 추가하고 실행하는 스크립트로 엔트리 포인트를 래핑합니다(매우 문제가 있음, 아래 참조).
  5. 수정된 인수를 사용하여 컨테이너를 한 번 실행하여 호스트 마운트에서 업데이트된 신뢰 저장소의 복사본을 생성한 다음 컨테이너의 후속 실행을 통해 해당 복사본을 호스트 마운트합니다(이 작업을 수행합니다).

가장 좋은 방법은 일반적으로 컨테이너 이미지 유지 관리자(또는 PR을 직접 제출)가 환경 변수에서 추가 CA 인증서 로드 지원을 추가하도록 하는 것입니다. 이는 기업 사용자와 자체 호스트에서 매우 일반적인 사용 사례이기 때문입니다.그러나 이는 일반적으로 허용할 수 없는 원샷 컨테이너에 과도한 오버헤드를 추가하며, 이미지 관리자는 이를 수행하지 않는 다른 좋은 이유가 있을 수 있습니다.그것은 또한 그동안 당신에게 문제를 해결해주지 않습니다.

호스트를 변경하고 이미지를 회전하도록 "포킹"하는 것도 좋은 옵션이 아닙니다. 일반적으로 구현이나 유지보수성을 이유로 시작할 수 없습니다.

ENTRINEPOINT를 래핑하는 것은 기본적으로 사용자 지정 인증서를 지원하도록 컨테이너를 수정하는 임시 버전을 수행하는 것과 동일하지만 이미지 외부에서만 수행할 수 있습니다.이 기능은 이 기능을 수행하지 않는 잠재적인 이유와 컨테이너 외부에서 이 기능을 수행하는 경우의 단점이 모두 동일하지만 이미지 업데이트를 기다릴 필요가 없다는 장점이 있습니다.일반적으로 이 옵션을 권장하지 않습니다.이 솔루션은 기본적으로 CA 설정을 수행할 컨테이너에 호스트에 마운트할 스크립트를 작성한 다음 ENTRINEPOINT 및 CMD가 무엇이든 실행하는 것입니다.하지만 여기에는 몇 가지 주요 고차들이 있습니다.먼저, 동일한 진입점을 실행하도록 실행 중인 특정 컨테이너에 맞게 사용자 지정해야 합니다.일부 스크립팅을 사용하면 이를 확인할 수 있지만, pid 1 문제를 처리하기 위해 init 시스템이 있는 잘 만들어진 컨테이너를 주의해야 합니다(https://github.com/Yelp/dumb-init#why-you-need-an-init-system tl;dr: 컨테이너를 강제로 중지할 때 인터럽트와 같은 신호를 포착하고 시스템 리소스를 잃지 않도록 하려면 pid 1 init 프로세스가 필요합니다).소수의 다른 init 시스템들이 존재합니다. init 시스템을 포장할 수 없습니다.또한 도커를 사용하는 경우 명령줄에서 여러 명령으로 진입점을 재정의할 수 없습니다.다음과 같은 init 시스템이 있는 컨테이너dumb-init입니다. 따라서 진입점은 목록입니다.['/usr/bin/dumb-init', '/usr/bin/my-command']통해서만 할 수 를 할 수 Docker는 명령줄이 아닌 API를 통해서만 다중 명령 진입점을 지정할 수 있으므로,dumb-init두 번째 인수에 사용할 스크립트를 명령하고 제공합니다.

"최상의" 솔루션:장기간 실행 중인 컨테이너는 위의 옵션 #1의 이점을 크게 누릴 수 있지만, 원샷 컨테이너와 즉각적인 솔루션에 대한 최선의 방법은 게스트 신뢰 앵커의 호스트 마운트를 생성하는 것입니다.
가장 좋은 방법은 업데이트된 컨테이너 신뢰 앵커의 모양에 대한 호스트 저장 복사본을 생성하여 컨테이너 신뢰 저장소의 맨 위에 마운트하는 것입니다.가장 호환되는 방법은 대상 컨테이너 이미지 자체를 사용하여 이 작업을 수행하지만 진입점에 대한 재정의를 사용하여 컨테이너와 연결된 프로젝트 작업 공간에서 트러스트 앵커에 대한 "캐시" 폴더를 호스트에 마운트하는 것입니다.그러나 클라우드 및 CI 상황에서는 이 기능이 작동하지 않을 수 있습니다.다른 옵션은 두 가지 주요 신뢰 앵커 스타일(예: 현대식)을 각각 사용하는 별도의 컨테이너 볼륨을 유지하는 것입니다.Fedora, Arch 등 및 레거시(예: Debian, Ubuntu 등)는 해당 유형의 일반 컨테이너 이미지에서 반주기적으로 별도로 업데이트됩니다.그러면 결과 컨테이너 볼륨은 대상 컨테이너 이미지 유형을 기준으로 적절한 볼륨이 선택되는 볼륨 종속성이 됩니다.이 중 하나를 생성하는 방법은 루트 CA를 적절한 폴더에 추가하는 스크립트를 호스트 마운트하는 것입니다(FYI, 레거시 신뢰 앵커는 루트 CA 폴더를 재귀적으로 검색하지만 현대적으로는 검색하지 않음). trust-anchor update 명령을 실행한 다음 결과로 생성된 신뢰 앵커 폴더를 호스트 마운트에 복사합니다.


업데이트:

베이스 는 Ubuntu에서 사용합니다.cloud-init내부적으로 (지금은) 컨테이너 이미지에 사용자 지정 루트 CA를 추가하는 등 많은 일반적인 작업을 지원합니다. 예를 들어 이미 옵션 1을 지원합니다.
https://cloudinit.readthedocs.io/en/latest/topics/examples.html#://cloudinit.readthedocs.io/en/latest/topics/examples.html#configure-an-instances-trusted-ca-certificates

이 파일 를 수있다파추습니에 할 수 ./etc/cloud/cloud.cfg.d/예제 링크와 같은 YAML을 가지고 있으며 컨테이너 부팅 중에 픽업됩니다.원하는 추가 루트 CA 인증서를 기반으로 프로그래밍 방식으로 해당 YAML을 쉽게 생성할 수 있습니다.


EDIT1: 고정:: 것을 .저는 원래 질문에서 호스트와 게스트 중 어느 것을 반대로 했습니다.에 대한 업데이트도 추가되었습니다.cloud-init 스타일 EDIT2: 고정 스타일 오타

언급URL : https://stackoverflow.com/questions/26028971/docker-container-ssl-certificates

반응형