이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Docker

12. DCT를 사용해서 Docker Hub에 서명된 Trust Image Push 하기

이쿠우우 2020. 11. 8. 11:47
반응형

 

 

 

 

DCT를 사용해서 Docker Hub에 서명된 Trust Image Push 하기

 


[Container image 인증 관련 글 목록]

Notary Service 란?

Docker Notary : Docker Content Trust (DCT)

DCT를 사용해서 Dcoker Hub에 서명된 Trust Image Push 하기

Notary와 DCT를 사용해서 Private Registry에 서명된 Trust Image Push하기

개인 인증서를 사용해서 Notary Service 구동

kubernetes image인증 - Portieris


 

 

미리 Pull 받아놓았던 nginx 이미지를 서명해서 

Private Registry 에 Push 하겠음.

 

Docker Hub 에 login

[명령어]

docker login [Docker Hub ID]

 

 

DCT 사용 설정

[명령어]

export DOCKER_CONTENT_TRUST=1 

 

 

Image tag 설정

Private Registry 에 Push 해야해서

Image Tag 를 변경 작업을 해야함. 

 

[명령어]

docker tag [대상 image id] [Docker Hub ID]/nginx_iksoon:1.0.0

 

 

Docker Hub 로 Image Push

[명령어]

docker push [Image]

 

DCT를 Enable 한 후 

처음으로 Docker Hub로 Push 하면 root key를 생성함.

여기서의 Root Key는 Notary에서 설명했던 Root Key를 의미함

한번 최초로 생성한 이후로는 처음 생성한 password를 계속 사용하게 됨.

 

 

Docker Hub에 있는 Image의 상세 내용 조회

[명령어]

docker trust inspect --pretty docker.io/[docker hub id]/[image name]

 

서명이 되어있는 image의 경우 아래와 같이

Image의 SIGNERS(서명자)가 해당 Repository의 관리자라고 나오는 것을 확인할 수 있고

Repository Key와 Root Key 정보를 확인할 수 있음

 

서명이 안된 일반 image 의 경우

아래와 같이 나옴

 

 

 

Docker Hub에 Push한 서명된 Image Pull Test

 

DCT 가 Enable 되어있는 상태라서

아래와 같이 서명이 안되있는 image는 pull 해오지 못함

 

방금전에 서명해서 올린 image pull test를 진행하기 위해

기존의 동일한 image를 삭제하고 다시 pull 해봄

 

[결과]

정상적으로 pull 받아옴

 

 

권한을 위임받은 사용자 Delegation Key 생성하기

 

상위는 repository의 관리자가 image를 서명하고 push 한 것이고

이번에는 권한을 위임받아서 image를 서명하는 절차를 알아보겠음

 

[Delegation Key 생성 명령어]

docker trust key generate user_iksoon

상위 Notary service 에서 설명했던 Delegation Key 를 생성

 

[생성한 공개키 확인]

상위 명령 결과에 나와있는 경로에 생성이 됨

예제에서는 /var/lib/docker/user_iksoon.pub

 

[생성한 개인키 확인]

개인키가 생성되는 default 경로 : /root/.docker/trust/private

확인해보면 

role : root

role : target 

개인키와

이번에 생성한 user_iksoon 의 개인키가 있음

 

Delegation Key를 Repository 에 등록하기

[명령어]

docker trust signer add --key [생성된 delegation 공개키 경로] [delegation key 이름] docker.io/[Repository 이름]

예)docker trust signer add --key user_iksoon.pub user_iksoon docker.io/peksoon/nginx_iksoon

 

 

권한을 위임받은 사용자가 image 서명해서 push 하기

먼저 이전에 push 한 image와 중복이 되지 않게

tag를 1.0.1로 동일한 image 생성

 

해당 image 를 docker push 해보기

이제부터는 user_iksoon로 sign 하는것을 확인 할 수 있음

 

[push 한 이미지 상세조회 결과]

SIGNERS = user_iksoon 

으로 되어있는것을 확인할 수 있음

 

 

 

 

 

권한을 위임받은 사용자를 삭제해보기 

delegation key로 생성했던 user_iksoon 을

Repository 에서 삭제하기

 

[명령어]

docker trust signer remove user_iksoon peksoon/nginx_iksoon

 

 

[pull 결과]

Repository에서 user_iksoon 권한을 삭제 한 후 

user_iksoon 으로 서명해서 push 했던 image를 pull 해보면

서명과 일치하지 않는 이미지라고 오류가 발생하며  image가 pull 되지 않음

 

 

[push 결과]

Repository에 user_iksoon 권한을 삭제 한 후 push 해보면

아래와 같이 no valid singing keys 라며 서명에 실패함.

 

하지만 Repository 에 image는 push 되어있음

해당 image는 서명이 안되어 있어서 DCT사용 시 pull 받지 못함

 

 

 

결과 정리

push 할때 개인키로 서명해서 push를 하고

Repository 에 해당 개인키에 대한 공개키를 가지고 있어서

개인키를 공개키로 검증을 함.

 

DCT를 통해서 생성된 Notary Key 값들은

~/.docker/trust/tuf/ 경로에 생성되어있음

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

참고

[DCT]

https://docs.docker.com/notary/

https://docs.docker.com/engine/security/trust/content_trust/

https://docs.docker.com/notary/running_a_service/

https://pjh3749.tistory.com/253

https://gruuuuu.github.io/cloud/docker-notary2/#

https://cloud.ibm.com/docs/Registry?topic=Registry-registry_trustedcontent&locale=ko

https://docs.docker.com/engine/reference/commandline/trust_inspect/

https://help.sonatype.com/repomanager3/formats/docker-registry/docker-content-trust

 

 

 

 

 

 

반응형