2016-09-20 1 views
4

프로덕션 서버를 재생산하는 devs 용 Docker 이미지를 만들고 싶습니다. 해당 서버는 Ansible에 의해 구성됩니다.Docker Build에 SSH 키를 안전하게 전달하는 방법은 무엇입니까?

내 아이디어는 ansible-pull을 실행하여 컨테이너 내부의 모든 구성을 적용하는 것입니다. 문제는 제가 플레이 북을 가져 오는 데 SSH 키가 필요하지만 Docker 이미지에서 SSH 키를 공유하고 싶지 않다는 것입니다.

그래서 런타임에 SSH 키를 만들지 않고 빌드 시간에 가질 수있는 방법이 있습니까?

답변

2

좋은 질문. Docker가 이미지를 레이어로 저장하기 때문에 누군가가 여전히 키가있는 이전 레이어를 찾을 수 있기 때문에 간단한 방법은 빌드에서 Ansible 항목 다음에 SSH 키를 제거하는 것입니다.

이 Dockerfile 빌드하는 경우 :

FROM ubuntu                  
COPY ansible-ssh-key.rsa /key.rsa              
RUN [ansible stuff] 
RUN rm /key.rsa 

마지막 이미지는 모든 Ansible 상태와 SSH 키 사라되지만 사람이 쉽게 모든 이미지 레이어를보고 docker history을 실행할 수 있으며,이됩니다 키가 삭제되기 전에 중간 계층에서 컨테이너를 시작한 다음 키를 가져옵니다.

트릭은 이런 식으로하고 Jason Wilder's docker-squash tool을 사용하여 최종 이미지를 스쿼시합니다. squashed 이미지에서 중간 레이어가 사라 졌으므로 삭제 된 키로 이동할 수 없습니다.

+0

바로 그게 문제였습니다. 정보가 레이어에 남아있었습니다. 당신이 스쿼시 이미지를 날릴 수 있다는 것을 몰랐습니다. 감사! –

0

런타임에 SSH 키를 컨테이너에 마운트 할 수 있습니다.

docker run -v /path/to/ssh/key:/path/to/key/in/container image command 
+2

이것을 확장 할 수 있습니까? 지금은 단지 정말로 논평 일뿐입니다. – ydaetskcoR

+0

문제는 빌드시에만 SSH 키가 필요하다는 것입니다. –

1

빌드 환경에서만 사용할 수있는 로컬 파일 제공 기능을 설치하고 싶습니다.
예. 빌드 호스트에서 lighttpd를 시작하여 로컬 클라이언트에만 pem 파일을 제공하십시오.

그리고 당신의 Dockerfile에

는 하나의 실행에/풀/정리를 추가 할 :

RUN curl -sO http://build-host:8888/key.pem && ansible-pull -U myrepo && rm -rf key.pem 

을이 하나의 계층에서 수행해야합니다이 경우, 이렇게 후 왼쪽 key.pem의 흔적이 없어야합니다 레이어 커밋.

+0

HTTP를 통해 개인 키를 보내는 것은 매우 안전하지 않습니다. – tex

+0

모든 것이 localhost (빌드 - 호스트)에서 수행됩니다. –

0

이것은이 repo를 사용하여 또 다른 해결책입니다. dockito/vault, Docker 이미지 건물에 사용되는 비밀 저장소입니다.

나는 여기에 내 Dockerfile

, 나는이 볼륨에 내 개인 키를 연결하고 사용하는 프로세스로 실행하는 서비스 dockito/금고우분투 이미지,

docker run -it -v ~/.ssh:/vault/.ssh ubuntu /bin/bash -c "echo mysupersecret > /vault/.ssh/key" 

docker run -d -p 14242:3000 -v ~/.ssh:/vault/.ssh dockito/vault 

를 만들고

FROM ubuntu:14.04 
RUN apt-get update -y && \ 
     apt-get install -y curl && \ 
     curl -L $(ip route|awk '/default/{print $3}'):14242/ONVAULT > 
     /usr/local 
     /bin/ONVAULT && \ 
     chmod +x /usr/local/bin/ONVAULT 
ENV REV_BREAK_CACHE=1 
RUN ONVAULT echo ENV: && env && echo TOKEN ENV && echo $TOKEN 
RUN ONVAULT ls -lha ~/.ssh/ 
RUN ONVAULT cat ~/.ssh/key 

당신은, 최종 빌드 크기를 줄이기 위해 고산 리눅스를 사용하고 이미지를 구축 할 수

,

그리고 끝났습니다. 이미지를 검사 할 수 있습니다. 비밀은 이미지 내부에 비어있는 것으로 저장되지 않았습니다.

docker run -it mohan08p/VaultTest ls /root/.ssh 

이 빌드 시간에 스푸핑을 전달하는 좋은 기술이다. 추가적인 Vault 서비스를 계속 실행해야하는 단점이 있습니다.

관련 문제