DevOps/Docker

[Docker] set up secure credential storage for Docker

Background


Docker login issue를 부딪혔다. (unencrypted...)

docker login issue


In My Environment


현재 공부환경은 Docker engine은 AWS EC2 instaince에서 동작중인 상태
즉, AWS Security Group의 SSH Inbound-rule이 Every where

  • 아무나 EC2 주소를 알고 private key를 가진다면 접속이 가능하다.
    (물론 private key가 노출된다면 일단 내 잘못이겠지만...)

docker-machine : my environment


docker login으로 docker hub에 사용하는 ID와 Password로 접속을 하면 local에 다음 주소로 id-password 정보가 base64로 인코딩 되어서 저장된다.

unencrypted login info


예를 들어, secret password라는 비밀번호를 인코딩하면 다음과 같이 저장된다.

"auth" : "c2VjcmV0IHBhc3N3b3Jk"

하지만 이 파일을 다시 decoding하면, 이와 같이 비밀번호가 노출된다.

decode example password


What to Do?


Docker login의 credential한 정보가 평문(plain text)로 저장되는 것이 아닌 credentail storage를 이용해 encrypted한 정보로 저장될 수 있도록 한다.

  • Ubuntu 16.0.4 (하지만, Version은 상관 없다. Docker engine만 설치되어 있으면 진행 가능.)

Need to do

  • Docker가 실행되고 있는 instance (현재는 docker-machine을 통해 생성된 ec2 instance에서 진행중)
  • sudo 권한이 있는 User

기존 Server 환경 즉, Headless Server Platform 환경에서는 보안 절차를 진행하기 위해 entropy를 생성하는데 도움을 주는 tool을 먼저 설치 해야한다. 하지만, 아래의 방법에서는 GPG key를 통해 entropy를 생성하는 방법을 이용한다.

Installation, entropy, and keys

  1. GUI가 아닌 환경에서, rng-tools를 다음 명령어로 설치한다.

    • rng tools? Kernel 난수 생성과 관련된 유틸리티 set이다.

      $ sudo apt-get install rng-tools -y

  2. 설치가 완료되고 나면, 필요한 entropy를 생성한다.

     $ sudo rngd -r /dev/urandom

  3. pass tool을 설치한다.

     $ sudo apt-get install pass -y

  4. 이제 새로운 GPG key를 생성할 수 있다.

     $ gpg --gen-key

    아래와 같이 설정,

    • default 값으로 생성하고
    • name, e-mail, comment를 입력해준다.
![gpg key 1](https://i.imgur.com/OGtgzkN.png)

![gpg key 2](https://i.imgur.com/fXB61wf.png)



How to set up credential storage

secure credential storage를 설정하는 방법은 다음과 같다.

  1. 홈디렉터리 하위에 ~/bin 디렉터리를 생성하고 이동

     $ mkdir ~/bin && cd ~/bin

  2. 생성된 디렉터리 경로를 환경변수에 추가

     $ echo 'export PATH=$PATH:~/bin' >> ~/.bashrc

  3. docker-credentail-pass를 다운로드하고 압축해제한다.

     $ wget https://github.com/docker/docker-credential-helpers/releases/download/v0.6.3/docker-credential-pass-v0.6.3-amd64.tar.gz && 
     tar xvzf docker-credential-pass-v0.6.3-amd64.tar.gz

  4. 생성된 파일에 적절한 실행 권한을 준다.

     $ sudo chmod a+x docker-credential-pass

  5. docker-credential-pass를 명령을 실행할 수 있도록 이동해준다.

     $ sudo cp docker-credential-pass /usr/local/bin

  6. 기존에 docker login이 있으면 docker logout을 통해 로그아웃한다.

    • 아마 기존에 credential로 생성된 디렉터리는 home directory하위에 생성되어있다.

    • 만약에 기존 login을 진행하지 않았다면 다음과 같이 생성

        $ mkdir ~/.docker

  7. 다음 pass tool를 초기화해야한다. 먼저 GPG ID를 다음 명령어를 통해 확인

     $ gpg --list-secret-keys

    gpg list


생성된 GPG key의 ID로 pass를 initialize할 수 있다.

```shell
$ pass init <STRING>
```

![pass init STRING](https://i.imgur.com/qwhr1ej.png)

  1. Credential Storage에 새로운 password를 생성한다.

     $ pass insert docker-credential-helpers/docker-pass-initialized-check
  2. password가 생성된 후, ~/.docker/config.json 생성(하거나 기존에 있으면 편집)한다.

    $ vi ~/.docker/config.json

    다음 내용을 생성 (or 편집)한다.

    {
        "experimental": "enabled"
    }

    저장 후 종료


How to log in to Docker


기존 docker login 명령어로 로그인을 진행한다.

$ docker login

docker login

기존에 평문으로 저장되었던 내용이 이제는 암호화되어서 저장된 것을 확인할 수 있다.

ubuntu@aws-sandbox:~/.docker$ cat config.json
{
    "auths": {
        "https://index.docker.io/v1/": {}
    },
    "credsStore": "pass",
    "experimental": "enabled"
}



Solved Error

  • Credential Store 적용 후 docker login하고서 push나 pull이 안되는 상황

      $ docker push iamjjanga/echo_test:v1
      ...
      ...
      denied: requested access to the resource is denied

    보통 push denied는 login을 하지 않았거나, tag에 docker hub상 Username의 일치가 안되서 생기는 문제이다. 하지만 Credential 적용후에는 GPG key로 설정한 passphrase를 terminal에서 로그인하지 않아서 생긴 문제이다.

      export GPG_TTY=$(tty)

    를 실행하면 GPG key 생성시 적용했던 Passphrasse를 입력하라는 화면이 나오는데 입력 후 정상적인 push, pull이 동작한다.



Ref