Background
Docker login issue를 부딪혔다. (unencrypted...)
In My Environment
현재 공부환경은 Docker engine은 AWS EC2 instaince에서 동작중인 상태
즉, AWS Security Group의 SSH Inbound-rule이 Every where
- 아무나 EC2 주소를 알고 private key를 가진다면 접속이 가능하다.
(물론 private key가 노출된다면 일단 내 잘못이겠지만...)
docker login
으로 docker hub에 사용하는 ID와 Password로 접속을 하면 local에 다음 주소로 id-password 정보가 base64로 인코딩 되어서 저장된다.
예를 들어, secret password라는 비밀번호를 인코딩하면 다음과 같이 저장된다.
"auth" : "c2VjcmV0IHBhc3N3b3Jk"
하지만 이 파일을 다시 decoding하면, 이와 같이 비밀번호가 노출된다.
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
GUI가 아닌 환경에서, rng-tools를 다음 명령어로 설치한다.
rng tools? Kernel 난수 생성과 관련된 유틸리티 set이다.
$ sudo apt-get install rng-tools -y
설치가 완료되고 나면, 필요한 entropy를 생성한다.
$ sudo rngd -r /dev/urandom
pass tool을 설치한다.
$ sudo apt-get install pass -y
이제 새로운 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를 설정하는 방법은 다음과 같다.
홈디렉터리 하위에 ~/bin 디렉터리를 생성하고 이동
$ mkdir ~/bin && cd ~/bin
생성된 디렉터리 경로를 환경변수에 추가
$ echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
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
생성된 파일에 적절한 실행 권한을 준다.
$ sudo chmod a+x docker-credential-pass
docker-credential-pass를 명령을 실행할 수 있도록 이동해준다.
$ sudo cp docker-credential-pass /usr/local/bin
기존에 docker login이 있으면
docker logout
을 통해 로그아웃한다.아마 기존에 credential로 생성된 디렉터리는 home directory하위에 생성되어있다.
만약에 기존 login을 진행하지 않았다면 다음과 같이 생성
$ mkdir ~/.docker
다음 pass tool를 초기화해야한다. 먼저 GPG ID를 다음 명령어를 통해 확인
$ gpg --list-secret-keys
생성된 GPG key의 ID로 pass를 initialize할 수 있다.
```shell
$ pass init <STRING>
```
![pass init STRING](https://i.imgur.com/qwhr1ej.png)
Credential Storage에 새로운 password를 생성한다.
$ pass insert docker-credential-helpers/docker-pass-initialized-check
password가 생성된 후, ~/.docker/config.json 생성(하거나 기존에 있으면 편집)한다.
$ vi ~/.docker/config.json
다음 내용을 생성 (or 편집)한다.
{ "experimental": "enabled" }
저장 후 종료
How to log in to Docker
기존 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
'DevOps > Docker' 카테고리의 다른 글
[Docker] Container vs Process (0) | 2021.03.17 |
---|---|
[Docker] Shell and Exec Form in dockerfile (0) | 2021.03.14 |
[Docker] docker-machine 사용해보기 with aws (0) | 2021.02.28 |
[Docker] 특정 Docker Version 설치하기 in Ubuntu 18.04 (0) | 2021.02.26 |
[Docker] Wordpress + MySQL5.7 Container (0) | 2021.02.10 |