Docker Build 기간 기밀 관리

원본 게시자: https://hugoprudente.github.io
docker build 동안 나의 비밀을 관리하는 가장 좋은 방법은 무엇입니까?
검사hub.docker.com 중의 공식과 비공식 항목,
나는 네 개의 사용자가 그들의 비밀을 어떻게 저장하고 관리하는지에 관한 가장 흔한 사례를 수집했다.
어떤 경우, 구축 과정 중, 귀하는 영패나 기밀 파일을 사용하여 데이터베이스에서 정보를 얻을 수 있습니다
실행할 때 사용할 수 없는 설정을 설정하기 위해 리포나 다른 프로그램입니다.
그 중 일부는 pip에서 패키지를 가져오는 다중 구축에도 적합하지 않다.

줄거리


나는 이 실험실을 위해 만든 개인 pip를 하나 설치해야 한다. python이를 위해서는 pip.conf 파일을 /root/.pip/pip.conf에 추가하면 된다. 아래와 같다.
[global]
index-url = https://hugo.prudente:[email protected]/playlist
timeout=60
extra-index-url = https://pypi.python.org/simple
간단해 보이는데 어떻게 관리하는지 봅시다.

방법1


여기에서, 우리는 pip.conf 용기에 복사할 것이며, 마지막에 그것을 제거하지 않을 것이다.
FROM python:latest

COPY pip.conf /root/.pip/pip.conf

RUN pip install playlist
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker build -t secret:v1 .

on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker history secret:v1
IMAGE          CREATED              CREATED BY                                      SIZE      COMMENT
0d6589d4b95f   About a minute ago   RUN /bin/sh -c pip install playlist # bui…   14.1MB    buildkit.dockerfile.v0
<missing>      4 minutes ago        COPY pip.conf /root/.pip/pip.conf # buildkit    200B      buildkit.dockerfile.v0
<missing>      10 days ago          /bin/sh -c #(nop)  CMD ["python3"]              0B
구축이 끝났을 때의 파일이 존재하는지, 누설되었는지 확인합니다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
❯ docker run -it secret:v1 cat /root/.pip/pip.conf
[global]
index-url = https://hugo.prudente:[email protected]/playlist
timeout=60
extra-index-url = https://pypi.python.org/simple

방법2


여기에서 우리는 pip.conf 용기에 복사하고, 마지막 RUN 문장으로 삭제할 것입니다.
FROM python:latest

COPY pip.conf /root/.pip/pip.conf

RUN pip install playlist
RUN rm /root/.pip/pip.conf
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker build -t secret:v2 .

on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker history secret:v2
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
42f04cdc6577   6 seconds ago   RUN /bin/sh -c rm /root/.pip/pip.conf # buil…   0B        buildkit.dockerfile.v0
<missing>      4 minutes ago   RUN /bin/sh -c pip install playlist # bui…   14.1MB    buildkit.dockerfile.v0
<missing>      7 minutes ago   COPY pip.conf /root/.pip/pip.conf # buildkit    200B      buildkit.dockerfile.v0
<missing>      10 days ago     /bin/sh -c #(nop)  CMD ["python3"]              0B
파일이 존재하는지 다시 한 번 검사합시다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker run -it secret:v2 cat /root/.pip/pip.conf
cat: /root/.pip/pip.conf: No such file or directory

방법3


여기에서 우리는 pip.conf를 용기에 복사하고 RUN와 같은 pip install 문장에서 삭제할 것이다
FROM python:latest

COPY pip.conf /root/.pip/pip.conf

RUN pip install playlist && rm /root/.pip/pip.conf
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker build -t secret:v3 .

on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker history secret:v3
IMAGE          CREATED              CREATED BY                                      SIZE      COMMENT
a2bf2672abaf   About a minute ago   RUN /bin/sh -c pip install playlist && rm…   14.1MB    buildkit.dockerfile.v0
<missing>      17 minutes ago       COPY pip.conf /root/.pip/pip.conf # buildkit    200B      buildkit.dockerfile.v0
<missing>      10 days ago          /bin/sh -c #(nop)  CMD ["python3"]              0B
서류가 존재하는지 다시 한 번 확인해 봅시다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker run -it secret:v3 cat /root/.pip/pip.conf
cat: /root/.pip/pip.conf: No such file or directory

방법


여기서 우리는 pip.conf 스크립트를 사용하여 generate.sh를 만들고 이 스크립트는 수신한다SECRETARG 옵션이 같아서 같은 --build-arg 문장에서 삭제합니다.
#!/bin/sh

SECRET=$1

mkdir -p /root/.pip
cat > /root/.pip/pip.conf << EOF
[global]
index-url = https://hugo.prudente:${SECRET}@private.pip/playlist
timeout=60
extra-index-url = https://pypi.python.org/simple
EOF
FROM python:latest

ARG SECRET

COPY generate.sh /generate.sh

RUN /generate.sh ${SECRET} && pip install playlist && rm /root/.pip/pip.conf
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker build -t secret:v4 --progress plain --build-arg SECRET=My$3cr3tP4$$ .

➜ on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker history -H secret:v4
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
d2ca3623139f   2 minutes ago   RUN |1 SECRET=My$3cr3tP4$$ /b…   14.1MB    buildkit.dockerfile.v0
<missing>      2 minutes ago   COPY generate.sh /generate.sh # buildkit        261B      buildkit.dockerfile.v0
<missing>      2 minutes ago   ARG SECRET                                      0B        buildkit.dockerfile.v0
<missing>      10 days ago     /bin/sh -c #(nop)  CMD ["python3"]              0B
마지막으로 가장 중요하지 않은 것은 문서의 존재를 확인하라는 것이다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
❯ docker run -it secret:v4 cat /root/.pip/pip.conf
cat: /root/.pip/pip.conf: No such file or directory
자격 증명은 RUN 파일에 없지만 pip.conf 프로세스에서 볼 수 있습니다.

초보적 결과


이것은 우리의 비밀 유출 지점에 관한 행렬이다.
메서드
런타임
검열
비밀
예, 그렇습니다.
아니오.
비밀
아니오.
아니오.
비밀
아니오.
아니오.
비밀
아니오.
예, 그렇습니다.
초보적인 결과에 근거하여 우리는 이미 방법 1과 4를 배제할 수 있다
증거는 어느 순간에 볼 수 있기 때문에 안전하지 않다고 생각한다.
방법4, 나도 사용했다docker history와 비밀
같은 방식으로 누설하다.

깊이 파고들다


겹쳐쓰기 레이어


연합 파일 시스템, 덮어쓰기 파일 시스템의 내부 핵 실현
파일 시스템을 보여줍니다. 파일 시스템을 덮어쓴 결과입니다.
다른 위에 있어요.

요컨대, 상기 그림을 예로 들면, 네가 두 개의 목록을 가지고 있다고 가정해라
lower와 upper, 그중 lower는
소비자는 Linux 운영 체제에서 읽어 씁니다.
위쪽에서 파일을 수정할 때 보통 변경이 발생하지만
하위 디렉토리의 파일을 변경하고
일단 수정이 끝나면, 신발 겉면은 접근하기 쉬워질 것이다
프로세스는 수정을 가져오고 다음 페이지에 쓰기를 책임진다
목록
따라서 디렉터리의 연합은 하나의 수용으로 통합된다
cgroups는 docker와 메모리 드라이버가 우리의 예시에서 사용하는 것입니다.
또한 AUFS는 파일 시스템과 함께 작동합니다.
몇몇 장소는 조금 다를 수 있지만

파일 시스템 확인


OverlayFS가 어떻게 작동하는지 알고 있는 이상 사용하는 디렉터리 (층) 를 분리합시다--build-args SECRET=${SECRET}를 통해 우리는 우리가 흥미를 느끼는 것만 필터할 수 있다
python:latest 개의 파일이 있습니다.
컨테이너를 검사하면 덮어쓰기 층에서 사용할 디렉터리를 찾을 수 있습니다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker inspect python:latest | grep Dir | grep -Eo "([a-z0-9]{25,64})"
9e7c768dda91c4fa7ed6a57c7cb784834033bff92bd11ff6d062d4de11c0f898
17bf53c98685ae36487eb55f0d2256d168f210a688ef51deef760de1a699cbdf
4cb1dbbf58a2b1ca8df6d9d977a66fe918aee21434fcd656f1a68f1f412d75ff
358dd0944f115e2a273c5259dd1432b44e36908cf223f8ce0d9f74550430f577
c034592b1a26552525742ed81e7fbce2139817b634d48db8349dbebf15a45914
19d471e0407c0f1ca14eb1cb8c46aaef9357037cad5dc170cb6a4af3c1feab40
e005796f193e62e9db78de1df20999daca1a96a0bebed19c1dd906b1b4da8542
badc6aa65b2d3f10b0cdff3fc04bf3a64b551af1dd9e01b6ecd38ed71abdc3da
8d6ff96b718838005288a94cdc9fd408d1f70d7e9cbab678ebeb4521d11b366d

on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker inspect python:latest | grep Dir | grep -Eo "([a-z0-9]{25,64})" > layers.python
파일pip.conf에 저장된 도면층이 있으면 비슷한 명령을 사용할 수 있습니다
이미 알고 있는python 층을 제외하고 구축에 추가된 층만 가져옵니다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker inspect secret:v1 | grep Dir | grep -Eo "([a-z0-9]{25,64})" | grep -v -f layers.python  | uniq
e1kq2j71b7clcwtn0lbmqa1g9
v6zy2xgzrow2mgpyq9d0vch6l

➜ docker inspect secret:v2 | grep Dir | grep -Eo "([a-z0-9]{25,64})" | grep -v -f layers.python  | uniq
v6zy2xgzrow2mgpyq9d0vch6l
e1kq2j71b7clcwtn0lbmqa1g9
oudofb9c0iaqog9sff81f8053

on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker inspect secret:v3 | grep Dir | grep -Eo "([a-z0-9]{25,64})" | grep -v -f layers.python  | uniq
e1kq2j71b7clcwtn0lbmqa1g9
hqsrze873a2uz7tjsgbqdo3sd

on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker inspect secret:v4 | grep Dir | grep -Eo "([a-z0-9]{25,64})" | grep -v -f layers.python  | uniq
78gz619okusgrq4jo4ek863ug
oq22x88p26hzqmr1w1qpf8mm4
이제 우리는 도층이 생겼다. 나는 목록을 만들었는데, 단지 그것을 더욱 간단하게 하기 위해서이다
디렉터리를 검사할 때 그것을 찾습니다.

OverlayFS 디렉토리 액세스


다음 명령 중 하나를 루트 사용자로 사용하면
Docker Storage driver는 응용 프로그램 전체에 사용되는 파일 시스템 계층을 만듭니다.
생태계.
Linux
cd /var/lib/docker/
마커스
docker run -it --rm --privileged --pid=host justincormack/nsenter1
cd /var/lib/docker/
일단 layers.python 디렉터리에 들어가면 간단한 /var/lib/docker를 사용하고 여과합니다
이전에 임시 파일에 저장된 층을 펼치면 찾을 수 있습니다ls가 있는 특정 레이어
/var/lib/docker/overlay2 
# ls | grep -f /tmp/layers | xargs find | grep pip.conf
e1kq2j71b7clcwtn0lbmqa1g9/diff/root/.pip/pip.conf
hqsrze873a2uz7tjsgbqdo3sd/diff/root/.pip/pip.conf
oudofb9c0iaqog9sff81f8053/diff/root/.pip/pip.conf
그래서 나는 그 중의 하나하나를 방문하여 파일이 존재하는지, 아니면 단지
그것의 그림자는 목록에 연합되어 남았다.
/var/lib/docker/overlay2 
# cat e1kq2j71b7clcwtn0lbmqa1g9/diff/root/.pip/pip.conf
[global]
index-url = https://hugo.prudente:My$3cr3tP4$$@private.pip/playlist
timeout=60
extra-index-url = https://pypi.python.org/simpl

/var/lib/docker/overlay2 
# cat hqsrze873a2uz7tjsgbqdo3sd/diff/root/.pip/pip.conf
cat: can\'t open 'hqsrze873a2uz7tjsgbqdo3sd/diff/root/.pip/pip.conf': No such device or address

/var/lib/docker/overlay2 
# cat oudofb9c0iaqog9sff81f8053/diff/root/.pip/pip.conf
cat: can\'t open 'oudofb9c0iaqog9sff81f8053/diff/root/.pip/pip.conf': No such device or address
3층 중 1층에 파일이 있어서 어떤 용기를 검사했습니다
이 층은 이 층에 속하고, 여기는 서프라이즈입니다.
이 층은 우리가 만든 4개의 구축 중 3개와 공유된다는 것은pip.conf 누출 기간에 세 개의 다른 용기가 누출될 수 있음docker pull비밀.

결실


업데이트된 행렬은 우리의 비밀 유출 지점의 결과를 한데 모았다.
메서드
런타임
검열
겹쳐쓰기 레이어
비밀
예, 그렇습니다.
아니오.
예, 그렇습니다.
비밀
아니오.
아니오.
예, 그렇습니다.
비밀
아니오.
아니오.
예, 그렇습니다.
비밀
아니오.
예, 그렇습니다.
아니오.
따라서 파일이 용기에서 직접 접근할 수 없다는 것을 알면서도
너는 완전한 읽기와 쓰기 시스템에서 용기를 끌어올릴 권리가 있다
비밀을 찾을 수 있다.
그러나 지금은 용기를 구축하는 가장 좋은 방법이 무엇인지, 그리고 이런 문제가 없다.

솔루션


18.09 또는 업데이트 버전부터 Docker가 Docker BuildKit를 출시하여
Docker가 구성하는 추가 기능입니다.
BuildKit 를 사용하는 구문은 기존 구문과 달리 사용할 수 있습니다.pip.conf, 런타임 시 파일을 바인딩할 수 있음
우리가 사용한 --secret 옵션으로 이루어진 전통적인 운행과 유사하다.
그것의 사용법은 매우 간단하다. 우리는 용기를 구축한 후에 다시 테스트를 실행할 것이다.
FROM python:latest

RUN --mount=type=secret,id=pip.conf,dst=/root/.pip/pip.conf \
      pip install playlist
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker build --file Dockerfile  --secret id=pip.conf,src=pip.conf -t secret:v5 .
이제 -v버전이 생겼으니 확인해 봅시다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
➜ docker history secret:v5
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
266a21bb36ae   36 seconds ago   RUN /bin/sh -c pip install playlist # bui…   14.1MB    buildkit.dockerfile.v0
<missing>      11 days ago      /bin/sh -c #(nop)  CMD ["python3"]              0Bi
본 안건의 역사 기록은 깨끗한데, 심지어secret:v5까지 언급하지 않은 탈것
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
❯ docker run -it secret:v5 cat /root/.pip/pip.conf
cat: /root/.pip/pip.conf: No such file or directory
시스템에도 파일이 없습니다.
on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
❯ docker inspect secret:v5 | grep Dir | grep -Eo "([a-z0-9]{25,64})" | grep -v -f layers.python  | uniq
cnpw0dw9o05lmdz3j9j62jzpt

on ⛵ k3s (nerdweek) ~/post via 🐍 v3.9.1 (osx)
/var/lib/docker/overlay2 # 
ls cnpw0dw9o05lmdz3j9j62jzpt | xargs find | grep pip.conf
find: committed: No such file or directory
find: diff: No such file or directory
find: link: No such file or directory
find: lower: No such file or directory
find: work: No such file or directory
가장 중요한 것은 우리가 방금 만든 층/디렉터리에 파일이 존재하지 않는다는 것이다
이것은 우리가 기초 이미지에서 사용한다면 우리의 콘크리트는 안전하다는 것을 의미한다.

도구책

  • https://docs.docker.com/develop/develop-images/build_enhancements/
  • https://www.kernel.org/doc/html/latest/filesystems/overlayfs.html
  • https://docs.docker.com/storage/storagedriver/overlayfs-driver/
  • 좋은 웹페이지 즐겨찾기