programing

도커 컨테이너 내 SSH 키 사용

oldcodes 2023. 9. 6. 22:18
반응형

도커 컨테이너 내 SSH 키 사용

Git로 다양한 재미있는 것들을 실행하는 앱(git clone & git push 실행 등)이 있는데 도커라이즈를 하려고 합니다.

컨테이너 'user'가 사용할 SSH 키를 컨테이너에 추가할 수 있는 문제가 발생했습니다.

에 ./root/.ssh/, 삭제$HOME이 없습니다. , , , , , , .

다음은 참고용 Docker 파일입니다.

#DOCKER-VERSION 0.3.4                                                           

from  ubuntu:12.04                                                              

RUN  apt-get update                                                             
RUN  apt-get install python-software-properties python g++ make git-core openssh-server -y
RUN  add-apt-repository ppa:chris-lea/node.js                                   
RUN  echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN  apt-get update                                                             
RUN  apt-get install nodejs -y                                                  

ADD . /src                                                                       
ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa                             
RUN   cd /src; npm install                                                      

EXPOSE  808:808                                                                 

CMD   [ "node", "/src/app.js"]

app.js합니다. git를다다t를essegit pull

빌드 시 SSH를 사용해야 한다면 더 어려운 문제입니다.예를 들어 다음을 사용하는 경우git clone, 아니면 내 경우에는pip그리고.npm개인 저장소에서 다운로드할 수 있습니다.

은 가 하여 를 하는 입니다 은 입니다 을 사용하여 키를 하는 것입니다.--build-argflag.발을 할 수 . 그러면 새로운 실험을 사용할 수 있습니다.--squash를 명령(1.13 추가)하여 제거 후 키를 더 이상 사용할 수 없도록 레이어를 병합합니다.제 ..

빌드커맨드

$ docker build -t example --build-arg ssh_prv_key="$(cat ~/.ssh/id_rsa)" --build-arg ssh_pub_key="$(cat ~/.ssh/id_rsa.pub)" --squash .

도커파일

FROM python:3.6-slim

ARG ssh_prv_key
ARG ssh_pub_key

RUN apt-get update && \
    apt-get install -y \
        git \
        openssh-server \
        libmysqlclient-dev

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh
# See: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints
COPY known_hosts > /root/.ssh/known_hosts

# Add the keys and set permissions
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
    echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub && \
    chmod 600 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub

# Avoid cache purge by adding requirements first
ADD ./requirements.txt /app/requirements.txt

WORKDIR /app/

RUN pip install -r requirements.txt

# Remove SSH keys
RUN rm -rf /root/.ssh/

# Add the rest of the files
ADD . .

CMD python manage.py runserver

업데이트: 도커 1.13을 사용하고 실험적인 기능이 있다면 추가할 수 있습니다.--squash하고 SSH 키를할에 SSH를고다드다m고o를em을hhdeledgd,에 docker history.

우분투를 사용할 때 ssh_config가 올바르지 않은 것으로 나타났습니다.추가할 필요가 있습니다.

RUN  echo "    IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

당신의 ssh 키를 인식할 수 있도록 하기 위해 당신의 도커 파일에.

참고: 비공개 이미지에 대해서만 이 방법을 사용합니다.

ssh 키를 추가한 후 계층 명령에서 키를 제거해도 이미지 내에 저장된 상태로 유지됩니다( 게시물의 주석 참조).

제 경우에는 괜찮기 때문에 이렇게 사용하고 있습니다.

# Setup for ssh onto github
RUN mkdir -p /root/.ssh
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

도커 컴포지트를 사용하는 경우 SSH 에이전트를 다음과 같이 전달하는 것이 쉬운 방법입니다.

something:
    container_name: something
    volumes:
        - $SSH_AUTH_SOCK:/ssh-agent # Forward local machine SSH key to docker
    environment:
        SSH_AUTH_SOCK: /ssh-agent

또는 이와 동등하게 다음을 사용하는 경우:

$ docker run --mount type=bind,source=$SSH_AUTH_SOCK,target=/ssh-agent \
             --env SSH_AUTH_SOCK=/ssh-agent \
             some-image

피터 그레인저의 답변을 확장하며 도커 17.05부터 사용 가능한 다단계 빌드를 사용할 수 있었습니다.공식 페이지 상태:

빌드에서는 개의 의 를 의 할 의 을 사용합니다.FROM당신의 도커 파일에 있는 문장들.FROM명령어는 다른 베이스를 사용할 수 있고, 각각은 빌드의 새로운 단계를 시작합니다.최종 이미지에서 원하지 않는 모든 것을 뒤로하고 한 단계에서 다른 단계로 아티팩트를 선택적으로 복사할 수 있습니다.

서 이 을 명심하는 이 제 서 을 이 의 입니다 하는 입니다 의 이 서 하는 을 예입니다.Dockerfile3개의 빌드 단계를 포함합니다.이것은 클라이언트 웹 애플리케이션의 제작 이미지를 만들기 위한 것입니다.

# Stage 1: get sources from npm and git over ssh
FROM node:carbon AS sources
ARG SSH_KEY
ARG SSH_KEY_PASSPHRASE
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan bitbucket.org > /root/.ssh/known_hosts && \
    echo "${SSH_KEY}" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa
WORKDIR /app/
COPY package*.json yarn.lock /app/
RUN eval `ssh-agent -s` && \
    printf "${SSH_KEY_PASSPHRASE}\n" | ssh-add $HOME/.ssh/id_rsa && \
    yarn --pure-lockfile --mutex file --network-concurrency 1 && \
    rm -rf /root/.ssh/

# Stage 2: build minified production code
FROM node:carbon AS production
WORKDIR /app/
COPY --from=sources /app/ /app/
COPY . /app/
RUN yarn build:prod

# Stage 3: include only built production files and host them with Node Express server
FROM node:carbon
WORKDIR /app/
RUN yarn add express
COPY --from=production /app/dist/ /app/dist/
COPY server.js /app/
EXPOSE 33330
CMD ["node", "server.js"]

.dockerignore.gitignorefile) (이것은일단)을 방지합니다.node_modules 그 결과으로dist복사할 수 없는 프로젝트의 디렉토리)

.idea
dist
node_modules
*.log

이미지를 빌드하는 명령 예제:

$ docker build -t ezze/geoport:0.6.0 \
  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" \
  --build-arg SSH_KEY_PASSPHRASE="my_super_secret" \
  ./

빈 SSH 에 하십시오 가 하십시오 에 을 지정하십시오.SSH_KEY_PASSPHRASE논쟁.

작동 방식은 이렇습니다.

첫에서만 1). 첫번째 스테이지에서만.package.json,yarn.lock 및 일인및 SSH는된째간로다첫이다로간는esidtee일ddeoe및hy첫h인sources 키 가 더 표시되지 으로 에 됩니다. SSH 키 암호는 . SSH 키 암호 메시지에 됩니다.ssh-agent.마침내.yarn명령어는 NPM에서 필요한 모든 종속성을 설치하고 SSH를 통해 Bitbucket에서 개인 깃 저장소를 복제합니다.

. 웹2)에 2단계는 웹 애플리케이션의 소스 코드를 구축하고 최소화하여 배치합니다.dist간의리리의d된it라는 이름의 다음 중간 이미지의 디렉터리productioninstallated.의 는 . 의 가 되어 을 합니다 합니다 을 되어 가 .node_modules이름이 지정된 이미지에서 복사됩니다.sources첫번째 스테이지에서 다음 라인에 의해 제작되었습니다.

COPY --from=sources /app/ /app/

아마도 다음 줄일 수도 있습니다.

COPY --from=sources /app/node_modules/ /app/node_modules/

저희가 가지고 있는node_modules, no기째간의리요,요리째y기SSH_KEY그리고.SSH_KEY_PASSPHRASE더이상 논쟁은 없습니다.빌드에 필요한 나머지는 모두 저희 프로젝트 디렉토리에서 복사됩니다.

세 3) 가 될 의 를 에서 입니다 를 의 ezze/geoport:0.6.0dist 이름은이된두째서리간리서y이emd된간두ieproductionNode Express를 설치하여 웹 서버를 시작합니다.

영상을 나열하면 다음과 같은 출력이 나타납니다.

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ezze/geoport        0.6.0               8e8809c4e996        3 hours ago         717MB
<none>              <none>              1f6518644324        3 hours ago         1.1GB
<none>              <none>              fa00f1182917        4 hours ago         1.63GB
node                carbon              b87c2ad8344d        4 weeks ago         676MB

여기서 비선택 이미지는 첫 번째 및 두 번째 중간 빌드 단계에 해당합니다.

뛰면

$ docker history ezze/geoport:0.6.0 --no-trunc

은 입니다 도 입니다 은 도 SSH_KEY그리고.SSH_KEY_PASSPHRASE마지막 이미지로

ssh 키를 주입하기 위해 컨테이너 내에 다음과 같은 여러 솔루션이 있습니다.

  1. 에서 과 함께 도커 ADD의 빌드 프로세스 할 수 .은드정안을다할수어다수할tttr을,,ng은 .

  2. 단순히 이런 일을 하는 것은cat id_rsa | docker run -i <image> sh -c 'cat > /root/.ssh/id_rsa'

  3. 을 해서.docker cp컨테이너가 실행되는 동안 파일을 주입할 수 있는 명령어입니다.

이것은 18.09 릴리스 이후로 사용할 수 있습니다!

문서에 의하면 다음과 같습니다.

도커 빌드에는 도커 엔진이 SSH 에이전트 연결을 전달할 수 있도록 하는 --sssh 옵션이 있습니다.

컨테이너에 SSH를 사용하는 도커 파일의 예는 다음과 같습니다.

# syntax=docker/dockerfile:experimental
FROM alpine

# Install ssh client and git
RUN apk add --no-cache openssh-client git

# Download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Clone private repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

되면 이 을 합니다.--sshSSH 에이전트와의 연결 옵션:

$ docker build --ssh default .

또한 https://medium.com/ @tonistiigi/build-build-design-and-forward-in-designer-18-09-ae8161d066도 보십시오.

크로스 플랫폼 솔루션 중 하나는 바인딩 마운트를 사용하여 호스트의 데이터를 공유하는 것입니다..ssh컨테이너 폴더:

docker run -v /home/<host user>/.ssh:/home/<docker user>/.ssh <image>

에이전트 전달과 마찬가지로 컨테이너에 공용 키를 액세스할 수 있습니다.루트가 아닌 사용자와도 작동하며 GitHub에 연결할 수 있다는 점도 장점입니다.① ③ ④ ⑤ ⑥ ⑥ ⑦인츠든가함키은의나야한할인)e가e함s(l키)(tger,,met나.ssh폴더가 공유되니 이 방법은 개발에만 적합하고 신뢰할 수 있는 컨테이너 이미지에만 적합합니다.

시작docker API 1.39+(은 (API전인 )로 합니다docker version는 ) 을 --ssh도커 엔진이 SSH 에이전트 연결을 전달할 수 있도록 에이전트 소켓 또는 키가 있는 옵션.

빌드 명령

export DOCKER_BUILDKIT=1
docker build --ssh default=~/.ssh/id_rsa .

도커파일

# syntax=docker/dockerfile:experimental
FROM python:3.7

# Install ssh client (if required)
RUN apt-get update -qq
RUN apt-get install openssh-client -y

# Download public key for github.com
RUN --mount=type=ssh mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# Clone private repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

추가 정보:

이 줄은 문제입니다.

ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa

이미지에 복사할 파일을 지정할 때 도커 파일이 있는 디렉토리에 상대적인 경로만 사용할 수 있습니다.따라서 대신 다음을 사용해야 합니다.

ADD id_rsa /root/.ssh/id_rsa

그리고 id_rsa 파일을 도커 파일이 있는 디렉토리에 넣습니다.

자세한 내용은 http://docs.docker.io/reference/builder/ #add

도커 컨테이너는 그 자체의 '서비스'로 간주되어야 합니다.관심사를 분리하려면 기능을 분리해야 합니다.

1) 데이터는 데이터 컨테이너에 있어야 합니다. 연결된 볼륨을 사용하여 레포토를 복제합니다.그러면 해당 데이터 컨테이너를 필요로 하는 서비스에 연결할 수 있습니다.

2) 컨테이너를 사용하여 git 복제 작업을 실행합니다. 즉, 데이터 컨테이너를 실행할 때 데이터 컨테이너를 연결합니다.

3) ssh-key도 마찬가지입니다. (위에 제시된 대로) 볼륨으로 넣고 필요할 때 git 클론 서비스에 연결합니다.

이렇게 하면 복제 작업과 키 모두 일시적이고 필요할 때만 활성화됩니다.

이제 앱 자체가 깃 인터페이스라면 깃허브나 비트버킷 REST API를 직접 고려하여 작업을 수행하는 것이 좋습니다.

도커 빌드 시간에 npm 설치를 할 때도 비슷한 문제가 있었습니다.

Daniel van Flymen의 솔루션에서 영감을 받아 gitur rewrite와 결합하여 개인 github repos에서 npm 설치를 인증하는 조금 더 간단한 방법을 찾았습니다. 키 대신 oauth2 토큰을 사용했습니다.

우리의 경우, npm 의존성은 "git+https://github.com/ ..."로 명시되었습니다.

컨테이너에서 인증을 받으려면 ssh 인증(https://git@github.com /) 또는 토큰 인증(https://${GUTB_TOKEN}@gubit.com/)에 적합하도록 URL을 다시 작성해야 합니다.

빌드 명령:

docker build -t sometag --build-arg GITHUB_TOKEN=$GITHUB_TOKEN . 

유감스럽게도 저는 도커 1.9를 사용하고 있기 때문에 --스쿼시 옵션은 아직 없습니다. 결국 추가해야 합니다.

도커 파일:

FROM node:5.10.0

ARG GITHUB_TOKEN

#Install dependencies
COPY package.json ./

# add rewrite rule to authenticate github user
RUN git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"

RUN npm install

# remove the secret token from the git config file, remember to use --squash option for docker build, when it becomes available in docker 1.13
RUN git config --global --unset url."https://${GITHUB_TOKEN}@github.com/".insteadOf

# Expose the ports that the app uses
EXPOSE 8000

#Copy server and client code
COPY server /server 
COPY clients /clients

ssh 인증 소켓을 컨테이너로 전달합니다.

docker run --rm -ti \
        -v $SSH_AUTH_SOCK:/tmp/ssh_auth.sock \
        -e SSH_AUTH_SOCK=/tmp/ssh_auth.sock \
        -w /src \
        my_image

스크립트는 다음과 같은 작업을 수행할 수 있습니다.git clone.

: 된 을 에게 해야 해야 에게 을 된 chown컨테이너 안에서 루트가 아닌 다른 사용자를 사용하면git실패하다.

컨테이너 환경에 다음과 같은 몇 가지 추가 변수를 게시할 수 있습니다.

docker run ...
        -e OWNER_USER=$(id -u) \
        -e OWNER_GROUP=$(id -g) \
        ...

에는 한 에는 해야 를 해야 합니다.chown $OWNER_USER:$OWNER_GROUP -R <source_folder>컨테이너 밖에 있는 루트가 아닌 사용자가 파일에 액세스할 수 있도록 컨테이너를 떠나기 전에 적절한 소유권을 설정합니다.

다단 빌드를 사용하여 컨테이너를 만들있습니다. 이것이 여러분이 취할 수 있는 접근법입니다 :-

1단계 ssh로 이미지 구축

FROM ubuntu as sshImage
LABEL stage=sshImage
ARG SSH_PRIVATE_KEY
WORKDIR /root/temp

RUN apt-get update && \
    apt-get install -y git npm 

RUN mkdir /root/.ssh/ &&\
    echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa &&\
    chmod 600 /root/.ssh/id_rsa &&\
    touch /root/.ssh/known_hosts &&\
    ssh-keyscan github.com >> /root/.ssh/known_hosts

COPY package*.json ./

RUN npm install

RUN cp -R node_modules prod_node_modules

2단계: 컨테이너 제작

FROM node:10-alpine

RUN mkdir -p /usr/app

WORKDIR /usr/app

COPY ./ ./

COPY --from=sshImage /root/temp/prod_node_modules ./node_modules

EXPOSE 3006

CMD ["npm", "run", "dev"] 

작성 파일에 env 속성 추가:

   environment:
      - SSH_PRIVATE_KEY=${SSH_PRIVATE_KEY}

그런 다음 빌드 스크립트에서 다음과 같이 아르그를 전달합니다.

docker-compose build --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"

그리고 보안을 위해 중간 컨테이너를 제거합니다.이게 응원을 도와줄 겁니다.

저는 오늘 같은 문제에 부딪혔고 이전 게시물에 약간 수정된 버전이 있습니다. 이 방법이 더 유용하다고 생각했습니다.

docker run -it -v ~/.ssh/id_rsa:/root/.my-key:ro image /bin/bash

(읽기 전용 플래그는 컨테이너가 어떤 경우에도 내 ssh 키를 엉망으로 만들지 않도록 합니다.)

이제 내부 컨테이너를 실행할 수 있습니다.

ssh-agent bash -c "ssh-add ~/.my-key; git clone <gitrepourl> <target>"

는 그것을 ㅜㅜBad owner or permissions on /root/.ssh/..@kross에 의해 지적된 오류

처음에는 메타 노이즈가.

여기에 고도로 지지된 두 개의 답변에 위험할 정도로 잘못된 조언이 있습니다.

댓글을 달았지만, 이 일로 많은 날을 잃었으므로, 부디 주의해 주시기 바랍니다:

를 에 에 를 ).echo "$ssh_prv_key" > /root/.ssh/id_ed25519). 제 한 줄 형식을 적어도 제 경우에는 필요한 줄 형식이 파괴됩니다.

사용하다COPY아니면ADD대신.자세한 내용은 도커 로드"/root/.ssh/id_rsa": 잘못된 형식을 참조하십시오.

이는 다른 사용자에 의해서도 확인되었습니다.

키 "/root/.ssh/id_ed25519"를 로드하는 중 오류가 발생했습니다. 잘못된 형식입니다.Echo가 새 줄을 제거해 줄 것입니다.이것은 우분투만을 위한 것입니까 아니면 알파인: 3.10.3을 위한 다른 것이 있습니까?


1. 개인 키를 이미지에 그대로 유지하는 작업 방식 (좋지 않음!)

개인 키가 이미지에 저장되어 있는 경우 git 웹 사이트에서 공개 키를 삭제하거나 이미지를 게시하지 않도록 주의해야 합니다.당신이 이 일을 처리한다면, 이건 안전합니다."주의를 기울이는 것을 잊어버릴" 수 있는 더 나은 방법에 대해서는 아래 (2)를 참조하십시오.

도커 파일은 다음과 같습니다.

FROM ubuntu:latest
RUN apt-get update && apt-get install -y git
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
COPY /.ssh/id_ed25519 /root/.ssh/id_ed25519
RUN chmod 600 /root/.ssh/id_ed25519 && \
    apt-get -yqq install openssh-client && \
    ssh-keyscan -t ed25519 -H gitlab.com >> /root/.ssh/known_hosts
RUN git clone git@gitlab.com:GITLAB_USERNAME/test.git
RUN rm -r /root/.ssh

2. 개인키를 영상에 유지하지 않는 작업 방식 (good!)

다음은 "멀티 스테이지 빌드" 대신 동일한 것을 보다 안전하게 사용하는 방법입니다.계층하나에 개인 키가 저장되지 않은 깃레포 디렉토리가 있는 이미지가 필요하다면 두 개의 이미지가 필요하고 마지막에는 두 번째 이미지만 사용합니다.그 말은, 당신이 필요하다는 뜻입니다.FROM 번, 첫 번째 이미지에서 두 번째 이미지로 깃레포 디렉토리만 복사할 수 있습니다. 공식 가이드 "다단계 빌드 사용"을 참조하십시오.

는 "을 는 " "을 " 한 " " " 합니다 " 로 " " " 합니다 " 를 한 가장 사용합니다.apk에 대신에apt-get; 사용할 수도 있습니다.apt-get의 코드 신를여위여를h신g을 사용하여FROM ubuntu:latest.

도커 파일은 다음과 같습니다.

# first image only to download the git repo
FROM alpine as MY_TMP_GIT_IMAGE

RUN apk add --no-cache git
RUN mkdir -p /root/.ssh &&  chmod 700 /root/.ssh
COPY /.ssh/id_ed25519 /root/.ssh/id_ed25519
RUN chmod 600 /root/.ssh/id_ed25519

RUN apk -yqq add --no-cache openssh-client && ssh-keyscan -t ed25519 -H gitlab.com >> /root/.ssh/known_hosts
RUN git clone git@gitlab.com:GITLAB_USERNAME/test.git
RUN rm -r /root/.ssh


# Start of the second image
FROM MY_BASE_IMAGE
COPY --from=MY_TMP_GIT_IMAGE /MY_GIT_REPO ./MY_GIT_REPO

우리는 이것을 봅니다.FROM는 네임스페이스일 뿐이며, 그 아래 행에 대한 헤더와 같으며 별칭을 사용하여 주소를 지정할 수 있습니다.,,--from=0첫 번째 이미지가 될 것입니다(=FROMnamespace).

이제 개인 키가 계층에 없으므로 두 번째 이미지를 게시하거나 공유할 수 있으며 한 번 사용 후 git 웹 사이트에서 공개 키를 제거할 필요가 없습니다!따라서 Repo를 복제할 때마다 새 키 쌍을 생성할 필요가 없습니다.물론 암호가 없는 개인 키는 다른 방식으로 사용자의 데이터에 접근할 수 있는 경우에도 여전히 안전하지 않습니다.사용 후 서버에서 공용 키를 제거하고 실행할 때마다 새 키 쌍을 갖는 것이 좋습니다.


도커 파일에서 이미지를 작성하는 방법 안내

  • Docker Desktop을 설치하거나, WSL2 또는 Linux 내부의 Docker를 VirtualBox에 사용하거나, 독립 실행형 Linux 파티션/하드 드라이브에 Docker를 사용합니다.

  • 명령 프롬프트(PowerShell, terminal, ...)를 엽니다.

  • 도커 파일의 디렉토리로 이동합니다.

  • 하위 폴더 ".ssh/"를 만듭니다.

  • 보안상의 이유로 각 도커 파일이 실행될 마다 다른 SSH 키 쌍이 이미 있는 경우에도 공용 및 개인 SSH 키 쌍을 새로 만듭니다.명령 프롬프트의 도커 파일 폴더에 다음과 같이 입력합니다(mind, 요청 없이 덮어씁니다).

      Write-Output "y" | ssh-keygen -q -t ed25519 -f ./.ssh/id_ed25519 -N '""'
    

    (PowerShell을 사용하는 경우) 또는

      echo "y" | ssh-keygen -q -t ed25519 -f ./.ssh/id_ed25519 -N ''
    

    (PowerShell을 사용하지 않는 경우).

    이제 키 쌍이 .ssh/ 하위 폴더에 있습니다.그 하위 폴더를 사용하는지 여부는 사용자에게 달려 있습니다. 코드를 다음으로 변경할 수 있습니다.COPY id_ed25519 /root/.ssh/id_ed25519; 그러면 개인 키가 사용자가 있는 도커 파일의 디렉토리에 있어야 합니다.

  • 편집기에서 공용 키를 열고 내용을 복사하여 서버에 게시합니다(예: GitHub / GitLab --> 프로파일 --> SSH 키).이름과 종료 날짜 중 원하는 것을 선택할 수 있습니다. 수 있는 개키의로을수석로름터우은지()로름터e우f석a지u은( )-C의 매개 변수로 논평합니다ssh-keygen중요하지 않습니다. 그냥 그대로 두십시오.

  • 시작(빌드 컨텍스트인 마지막의 "."를 잊지 마십시오):

    도커 빌드-t 테스트.

1개에 한함):

  • 실행 후 서버에서 공용 키를 제거합니다(가장 중요하고 기껏해야 한 번에).이 스크립트는 이미지에서 개인 키를 제거하며, 다시는 키 쌍을 사용하지 않아야 하므로 로컬 컴퓨터에서 개인 키를 제거할 수도 있습니다.그 이유는 누군가는 이미지에서 개인 키를 제거하더라도 이미지에서 개인 키를 얻을 수 있었기 때문입니다.사용자 의견 인용:

    누군가 당신의 이미지를 손에 넣는다면 열쇠를 회수할 수 있습니다...나중 계층에서 해당 파일을 삭제하더라도 추가할 때 b/c는 7단계로 돌아갈 수 있습니다.

    공격자는 키 쌍을 다시 사용할 때까지 이 개인 키를 사용하여 기다릴 수 있습니다.

2개에 한함):

  • 실행 후 두 번째 이미지만 빌드 후에 남아 있으므로 클라이언트와 호스트에서 키 쌍을 제거할 필요는 없습니다.암호가 없는 개인 키를 로컬 컴퓨터 어딘가에서 가져올 위험이 여전히 작습니다.그렇기 때문에 git 서버에서 공용 키를 제거할 수 있습니다.저장된 개인 키를 모두 제거할 수도 있습니다.그러나 이미지 구축을 자동화하고 보안을 줄이는 것이 주된 목표인 많은 프로젝트에서는 이러한 작업이 필요하지 않을 것입니다.

마침내, 메타 노이즈가 좀 더 많아졌습니다.

여기서 문제가 되는 사적 키의 에코 방식을 사용하는 고도로 지지된 두 답변에서 위험할 정도로 잘못된 조언에 대해서는 다음과 같이 작성 당시의 투표가 있습니다.

여기서 우리는 상위 1개의 답변표가 적어도 질문표 수준은 아니기 때문에 답변에서 뭔가 잘못된 것이 있음을 봅니다.

상위 1개 답변의 댓글 목록 끝에 동일한 개인 키 에코 문제(이 답변에서도 인용됨)를 명명하는 작은 무투표 댓글이 단 하나 있었습니다.그리고: 그 비판적인 논평은 답변으로부터 3년 후에 이루어졌습니다.

제가 직접 상위 1위를 투표했습니다.나는 그것이 나에게 효과가 없다는 것을 나중에야 깨달았습니다.그래서, 스웜 인텔리전스는 효과가 있지만, 낮은 화염에서는 효과가?개인 키를 반향하는 것이 다른 사람에게는 효과가 있지만 저에게는 효과가 없는 이유를 설명해 줄 수 있는 사람이 있다면 댓글을 달아주세요.그렇지 않으면 326k 뷰(댓글 2개 제외 ;)가 상위 1개 답변의 오류를 무시하거나 무시했을 것입니다.개인 키의 에코 코드 라인이 인터넷의 모든 것에서 완전히 좌절감을 주는 코드를 선택하는 데 많은 작업일이 들지 않았다면 저는 여기에 그렇게 긴 글을 쓰지 않았을 것입니다.

이 문제는 정말 성가신 문제입니다.도커 파일 컨텍스트 외부에 파일을 추가/복사할 수 없기 때문에 ~/.ssh/id_rsa를 이미지의 /root/.ssh/id_rsa에 연결할 수 없습니다. 그리고 개인 레포 링크에서 깃 클론과 같은 작업을 수행하기 위해 키가 필요할 때 도커 이미지를 빌드하는 동안...

어쨌든, 저는 해결책을 찾았는데, 그렇게 설득하는 것이 아니라 저를 위해 효과가 있었습니다.

  1. 도커 파일에 저장할 수 있습니다.

    • 이 파일을 /root/.graphics/id_graphics로 추가합니다.
    • 깃 클론이나 작곡가 같은 당신이 하고 싶은 일을 하세요.
    • rm/root/.limit/id_limit 끝에
  2. 한 번에 할 수 있는 대본:

    • 도커 파일을 보유하고 있는 폴더에 키를 입력합니다.
    • 도커 빌드
    • 복사한 키를 rm합니다.
  3. 몇 가지 ssh 요구 사항이 있는 이 이미지에서 컨테이너를 실행해야 할 때는 다음과 같이 run 명령에 -v를 추가하면 됩니다.

    docker run -v ~/.docker/id_docker:/root/.docker/id_docker --name container image 명령

이 솔루션을 사용하면 프로젝트 소스와 빌드된 도커 이미지 모두에 개인 키가 없으므로 더 이상 걱정할 보안 문제가 없습니다.

Flymen의했듯이, 하고 eczajk Daniel van Flymen 에서 했듯이 를 하고 하는 은 하지 의 하지 은 --squash에( , 은 에서 이기 에 에 이기 에서 (docker history --no-trunc).

도커 18.09 대신 "빌드 시크릿" 기능을 사용할 수 있습니다.제 경우에는 호스트 SSH 키를 사용하여 개인 깃 레포를 도커 파일에 다음과 같이 복제했습니다.

# syntax=docker/dockerfile:experimental

[...]

RUN --mount=type=ssh git clone [...]

[...]

이를 사용하려면 실행하기 전에 새 BuildKit 백엔드를 활성화해야 합니다.docker build:

export DOCKER_BUILDKIT=1

그리고 당신은 추가할 필요가 있습니다.--ssh default에 매개 변수를 지정합니다.docker build.

이에 대한 자세한 정보는 여기: https://medium.com/ @tonistiigi/build-design-and-forward-in-designer-18-09-ae8161d066

원격 서버에서 로컬 ssh-에이전트가 서버에서 실행되는 것처럼 액세스하도록 선택적으로 허용할 수 있습니다.

https://developer.github.com/guides/using-ssh-agent-forwarding/

호스트와 컨테이너 사이에 .ssh 디렉토리를 연결할 수도 있습니다. 이 방법이 보안에 영향을 미치는지는 모르겠지만 가장 쉬운 방법일 수 있습니다.이와 같은 것이 효과가 있을 것입니다.

$ sudo docker run -it -v /root/.ssh:/root/.ssh someimage bash

도커는 sudo와 함께 실행된다는 것을 기억하십시오(그렇지 않은 경우). 이 경우 루트 ssh 키를 사용하게 됩니다.

도커 컨테이너 내부의 SSH 과제에 대한 간략한 개요가 여기에 자세히 설명되어 있습니다.비밀을 누설하지 않고 컨테이너 내에서 신뢰할 수 있는 원격에 연결하려면 다음과 같은 몇 가지 방법이 있습니다.

  • SSH 에이전트 전달(Linux 전용, 단순하지 않음)
  • BuildKit이 포함된 내장 SSH(실험용, Composition에서 아직 지원되지 않음)
  • 바인딩 마운트를 사용하여 노출~/.ssh컨테이너로. (개발만, 잠재적으로 안전하지 않음)
  • 도커 시크릿(크로스 플랫폼, 복잡성 추가)

이 외에도 Composer를 사용할 때 런타임에 액세스할 수 있는 별도의 도커 컨테이너에서 실행되는 키 저장소를 사용할 수 있습니다.여기서 단점은 볼트 by HashiCorp와 같은 키 저장소를 생성하고 관리하는 데 필요한 기계로 인해 복잡성이 가중된다는 것입니다.

독립형 도커 컨테이너에서 SSH 키를 사용하는 경우 위에 링크된 방법을 참조하고 특정 요구사항에 따라 각각의 단점을 고려합니다.그러나 Composition(작곡) 내부에서 실행 중이고 실행 중에 (OP의 실용성을 반영하여) 앱에 키를 공유하고 싶다면 다음을 시도해 보십시오.

  • 만들기docker-compose.env파일을 작성하여 당신의 파일에 추가합니다..gitignore파일.파일.
  • docker-compose.yml키가 필요한 서비스를 위해 추가합니다.
  • 애플리케이션 실행 시 환경에서 공개 키에 액세스합니다.process.node.DEPLOYER_RSA_PUBKEYNode.js 응용 프로그램의 경우.

위의 접근 방식은 개발 및 테스트에 이상적이며, 생산 요건을 충족할 수는 있지만, 생산 시에는 위에서 확인한 다른 방법 중 하나를 사용하는 것이 좋습니다.

추가 리소스:

SSH 키의 보안에 신경 쓰지 않는다면 여기에 좋은 답이 많이 있습니다.만약 그렇다면, 제가 찾은 최고의 답은 위 댓글의 링크에서 디곡샌드림의 이 GitHub 댓글에 대한 이었습니다.다른 사람들이 더 많이 볼 수 있도록 하기 위해, 그리고 만일 그 레포가 사라질 경우를 대비하여, 다음은 그 답변의 편집된 버전입니다:

대부분의 솔루션은 이미지에 개인 키를 남겨 둡니다.이미지에 액세스할 수 있는 모든 사용자는 개인 키에 액세스할 수 있으므로 이는 좋지 않습니다.우리는 그들의 행동에 대해 충분히 알지 못하기 때문에squash이할 수 를 하고 를 됩니다 는 됩니다 는 를 하고 .

우리는 aws s3 cli로 키에 접근하기 위한 사전 서명 URL을 생성하고 약 5분간 접근을 제한하며, 이 사전 서명 URL을 repo 디렉토리에 있는 파일에 저장한 후 도커 파일에 이미지에 추가합니다.

도커 파일에는 다음과 같은 모든 단계를 수행하는 RUN 명령이 있습니다. pre-sing URL을 사용하여 ssh 키를 가져오고 npm install을 실행한 후 ssh 키를 제거합니다.

한 번의 명령어로 이 작업을 수행하면 ssh 키가 어떤 계층에도 저장되지 않지만 사전 서명 URL이 저장되며 5분 후에는 URL이 유효하지 않기 때문에 문제가 되지 않습니다.

빌드 스크립트는 다음과 같습니다.

# build.sh
aws s3 presign s3://my_bucket/my_key --expires-in 300 > ./pre_sign_url
docker build -t my-service .

도커 파일은 다음과 같습니다.

FROM node

COPY . .

RUN eval "$(ssh-agent -s)" && \
    wget -i ./pre_sign_url -q -O - > ./my_key && \
    chmod 700 ./my_key && \
    ssh-add ./my_key && \
    ssh -o StrictHostKeyChecking=no git@github.com || true && \
    npm install --production && \
    rm ./my_key && \
    rm -rf ~/.ssh/*

ENTRYPOINT ["npm", "run"]

CMD ["start"]

Docker 이미지 레이어에 키를 저장하거나 ssh_agent 체조를 거치지 않고도 이를 수행할 수 있는 간단하고 안전한 방법은 다음과 같습니다.

  1. 당신의 로서 의 단계 중로.Dockerfile, 창조하다, 창안.ssh디렉토리 추가:

    RUN mkdir -p /root/.ssh

  2. 아래는 ssh 디렉토리를 볼륨으로 마운트하려는 것을 나타냅니다.

    VOLUME [ "/root/.ssh" ]

  3. 컨테이너가 다음 위치에 있는지 확인합니다.ssh_config는 다음 있습니다:는음다를고용을를여을다고를se:yos을edegs .

    RUN echo " IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config

  4. 를 표시합니다..ssh실행 시 컨테이너에 대한 디렉토리:

    docker run -v ~/.ssh:/root/.ssh -it image_name

    아니면 당신의dockerCompose.yml서비스의 볼륨 키 아래에 추가합니다.

    - "~/.ssh:/root/.ssh"

당신의 기말고사Dockerfile다음과 같은 내용이 포함되어야 합니다.

FROM node:6.9.1

RUN mkdir -p /root/.ssh
RUN  echo "    IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config

VOLUME [ "/root/.ssh" ]

EXPOSE 3000

CMD [ "launch" ]

저는 "빌더" 도커 이미지를 사용하여 별도로 배포되는 실행 파일을 구축하는 매우 간단한 솔루션을 제공했습니다.즉, 제 "빌더" 이미지는 로컬 머신을 떠나지 않으며 빌드 단계에서 개인 저장소/의존 관계에 대한 액세스만 필요합니다.

이 솔루션을 위해 도커 파일을 변경할 필요가 없습니다.

를 장착합니다.~/.ssh디렉터리(이를 통해 키를 이미지에 직접 굽지 않아도 되지만 빌드 단계에서 짧은 기간 동안은 단일 컨테이너 인스턴스에서만 사용할 수 있습니다.)제 경우에는 구축을 자동화하는 여러 빌드 스크립트가 있습니다.

안에 build-and-package.sh스크립트 I는 컨테이너를 다음과 같이 실행합니다.

# 대본을 쓰기 전에 몇 가지구요.
...
도커 실행 --rm \-v ~/.lot:/root/.lot \-v "$π":/π \-w /w/builder \bash -cl "/messages/build-init.sh $despectable"
...

# 다음에 스크립트 작업을 수행합니다(예: 내장된 실행 파일을 워크스페이스에서 꺼내는 등).

build-init.sh스크립트는 다음과 같습니다.

#!/bin/bash

set -eu

executable=$1

# start the ssh agent
eval $(ssh-agent) > /dev/null

# add the ssh key (ssh key should not have a passphrase)
ssh-add /root/.ssh/id_rsa

# execute the build command
swift build --product $executable -c release

하는 에 에를 swift build는령 는접할된드령을다수과자다)을d수e령nd(sryd는할령(접orndocker run령,에는합니다.build-init.shssh-agent하고, 으로 ssh 를 실행합니다.swift build지휘.

1:이 1: 하려면 을 에 ssh 가 해야 에 해야 가 하려면 그렇지 않으면ssh-add /root/.ssh/id_rsa라인은 패스프레이즈를 요청하고 빌드 스크립트를 중단합니다.

참고 2: 스크립트 파일을 실행할 수 있도록 적절한 파일 권한을 설정해야 합니다.

이를 통해 유사한 사용 사례를 가진 다른 사용자에게 간단한 솔루션을 제공할 수 있기를 바랍니다.

이후 버전의 도커(17.05)에서는 다단계 빌드를 사용할 수 있습니다.이전 빌드는 다음 빌드에서만 사용할 수 있고 이후에는 파괴되므로 가장 안전한 옵션은 무엇입니까?

자세한 내용은 스택 오버플로 질문에 대한 답변 참조

이미지에 공개 ssh 키를 추가하는 다른 방법으로 문제를 해결하려고 합니다.하지만 제가 시도해 본 결과, "docker cp"는 컨테이너에서 호스트로 복사하기 위한 것임을 알게 되었습니다.크리크에 의한 답변의 항목 3은 도커 cp를 사용하여 컨테이너에 파일을 주입할 수 있다고 말하는 것 같습니다.https://docs.docker.com/engine/reference/commandline/cp/ 참조

발췌한

컨테이너의 파일 시스템에서 호스트 경로로 파일/폴더를 복사합니다.경로는 파일 시스템의 루트에 상대적입니다.

  Usage: docker cp CONTAINER:PATH HOSTPATH

  Copy files/folders from the PATH to the HOSTPATH

도커 컴포지터를 사용하여 이미지를 빌드하는 동안 ssh 키를 사용하는 방법은 다음과 같습니다.

.env

SSH_PRIVATE_KEY=[base64 encoded sshkey]

도커-디젤.yml

version: '3'
services:
  incatech_crawler:
    build:
      context: ./
      dockerfile: Dockerfile
      args:
        SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY} 

도커 파일: ...

# Set the working directory to /app
WORKDIR /usr/src/app/
ARG SSH_PRIVATE_KEY 
 
RUN mkdir /root/.ssh/  
RUN echo -n ${SSH_PRIVATE_KEY} | base64 --decode > /root/.ssh/id_rsa_wakay_user

다음과 같이 공유 폴더를 사용하여 인증된 키를 컨테이너에 전달하고 도커 파일을 사용하여 권한을 설정할 수 있습니다.

FROM ubuntu:16.04
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
EXPOSE 22
RUN cp /root/auth/id_rsa.pub /root/.ssh/authorized_keys
RUN rm -f /root/auth
RUN chmod 700 /root/.ssh
RUN chmod 400 /root/.ssh/authorized_keys
RUN chown root. /root/.ssh/authorized_keys
CMD /usr/sbin/sshd -D

그리고 도커 실행에는 호스트의 auth 디렉토리(authenticated_keys 유지)를 컨테이너와 공유한 다음 호스트의 포트 7001을 통해 액세스할 수 있는 ssh 포트를 여는 다음과 같은 것이 포함되어 있습니다.

-d -v /home/thatsme/dockerfiles/auth:/root/auth -–publish=127.0.0.1:7001:22

컨테이너의 셸을 열고 컨테이너 내에서 명령을 실행하는 또 다른 방법으로 보이는 https://github.com/jpetazzo/nsenter 을 살펴볼 수도 있습니다.

파티에 늦었지만, 호스트 운영 체제 키를 컨테이너 내부에서 즉시 루팅할 수 있게 해주는 것은 어떨까요?

docker run -v ~/.ssh:/mnt -it my_image /bin/bash -c "ln -s /mnt /root/.ssh; ssh user@10.20.30.40"

나는 당신의 컨테이너를 반복적으로 설치할 경우 개인 키가 남아있을 수 있기 때문에 Docker 파일을 사용하여 키를 설치하는 것에 찬성하지 않습니다.

실행 시 컨테이너에 필요한 중요 데이터를 관리하기 위해 비밀을 사용할 수 있지만 다음과 같은 이미지 또는 소스 제어에 저장하지 않을 수 있습니다.

  • 사용자 이름 및 암호
  • TLS 인증서 및 키
  • SSH 키
  • 데이터베이스 또는 내부 서버의 이름과 같은 기타 중요한 데이터
  • 일반 문자열 또는 이진 콘텐츠(최대 500kb 크기)

https://docs.docker.com/engine/swarm/secrets/

런타임(빌드가 아닌) 동안 사용할 컨테이너에 서명 키를 추가하는 방법을 파악하던 중 이 질문을 발견했습니다.도커 비밀이 제 사용 사례에 대한 해결책인 것 같은데, 아직 아무도 언급하지 않았기 때문에 추가하겠습니다.

언급URL : https://stackoverflow.com/questions/18136389/using-ssh-keys-inside-docker-container

반응형