프로그래밍/Docker

[Docker] Docker의 이미지 변조를 막는 원리 - Docker Content Trust

Jay Tech 2019. 7. 2. 12:55
반응형

Docker Content Trust

Docker는 Docker Content Trust (DCT)라는 기능으로 악의를 가진 제3자의 행동들로 부터 사용자를 보호한다.

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

 

Content trust in Docker

When transferring data among networked systems, trust is a central concern. In particular, when communicating over an untrusted medium such as the internet, it is critical to ensure the integrity...

docs.docker.com

Docker 공식 document에서 이 내용들을 발췌하여 보았다.

 

Content trust in Docker

Trust (신뢰) 는 인터넷 상에서 통신을 할 때 아주 중요한 문제이다. Content trust, (그러니까 사용자가 받는 데이터에 대한 신뢰성이라고 이해하면 되겠다)는 사용자에게 무결성과 데이터를 만든 사람들까지 유효성을 검사할 수 있게 해준다.

Docker Content Trust (이하 DCT)는 전자 서명을 이용하여 리모트에 있는 도커 레지스트리들을 받기도 하고 보내기도 한다. 이 전자서명은 클라이언트 측에서 런타임시 내가 받은 도커 image tags 들의 무결성과 publisher(이하 제공자)들을 검증한다.

DCT를 통해서 이미지 제공자들은 이미지에 서명을 하고 이미지를 받는 사람들은 그들이 서명을 한 것들을 검증한다.

이 문장은 사실 전자서명이라는 것을 모르면 이해하기 어려울 수 있다. 대표적으로 RSA알고리즘이라는 것이 있는데 이 것을 이용하여 전자서명을 진행하게 된다. 간단히 살펴만 보자.

RSA알고리즘

RSA 알고리즘은 미국 MIT의 세 사람이 발표한 공개키 암호화 방식으로 엄청 큰 양의 정수에 대한 소인수 분해가 어렵다는 수학적 난제에 착안하여 발명한 것이다. 컴퓨터는 엄청 큰 양의 정수를 소인수 분해를 하지 못한다. 정확히 말하자면 다항시간안에 풀 수 없다. 소수의 규칙성을 증명해내는 리만가설을 풀게된다면 소인수분해가 빠른 시간안에 이루어질 것이고 전 세계 암호망은 무용지물이 될 것이다. 어찌됐건 이 알고리즘으로 서명을 할 수 있다.

RSA는 한 쌍의 공개키와 비밀키를 생성하는데 각각의 키는 public key, private key로 불린다.

public key: 모두에게 공개 되어 있으며 이 공개키를 통해 암호화를 할 수 있고 비밀키로 잠궈진 것을 풀 수도 있다.

private key: 공개 키 알고리즘에서 만들어진 공개 키, 개인 키 중 (비대칭) 공개되지 않게 사용되는 키이다. 공개키로 잠궈진 것을 풀 수 있다. 또한 비밀키로 잠궈서 데이터를 보낼수도 있다.

서명

이미지 작성자가 도커 레지스트리에 이미지를 업로드 하기 전에 로컬 환경에서 비밀키를 이용하여 서명을 한다. (즉 암호화를 하는 것이고 도커 docs에서 이 키를 offline key라고 칭한다) 그리고 클라이언트 측에서는 서명 된 이미지만을 다운받고 싶을 때 DCT를 enable시켜주면 된다. 1이 활성화이고 0이 비활성화 이다.

export DOCKER_CONTENT_TRUST = 1

 

실제로 터미널에서 DCT를 enable 이후 ubuntu의 최신 버젼을 pull 해보았다. 작성자의 비밀키로 서명을 한 것을 모두에게 공개되어 있는 공개키로 복호화를 진행하여 정말로 official 한 작성자가 이미지를 배포한 것인지 검증하는 과정이다.

 

DCT 활성화

 

서명이 되어 있는 파일만 받는 것으로 서명이 되지 않은 파일들을 자동으로 차단시켜 준다.

 

Docker official docs 에서 발췌

발행자는 특정한 tag 별로 서명을 할지 말지 결정하게 된다. 결과적으로 같은 이름의 tag 를 가진 이미지 이더라도 서명을 한 것과 하지 않은 것이 구분이 된다. 즉 someimage:latest를 서명한 것과 someimage:latest를 서명하지 않은 것은 이미지의 내용이 다를 수 있다는 말이다.

태그

위에서 태그란 것이 나왔는데, 태그란 이미지의 표식을 의미한다.

<사용자명>/이미지명:태그명

예를들어, jay/mywebserver:1.0 라는 nginx를 뜬 파일이 있다고 가정하자. 그렇다면 nginx라는 이름의 이미지에 대한 사용자가 jay이고 컨테이너명이 mywebserver이며 버전정보가 1.0이라는 것이다.

확인 명령은

docker image ls

docker image 목록

그리고 사용자가 태그를 붙여도 원래의 이미지와 완전히 일치함을 볼 수 있다.

docker image 태그

반응형