wonder

정보보안 스터디 - 10주차 5일 - Docker 레지스트리 본문

Security/리눅스

정보보안 스터디 - 10주차 5일 - Docker 레지스트리

wonder12 2022. 12. 19. 22:59

docker를 사용하는 가장 큰이유는 과정 단축입니다.

centos의 필요한 디렉토리와 파일만 설치하는 것도 장점이지만

컨테이너 안의 설치할내용(apt-get install nginx python), 설정내용(conf) 등 과정도 만만치 않기 때문에

과정을 단축하여 이미지를 만들고 공유하면 개발자들은 과정 단축이 됩니다. 

 

 

 

 원본 이미지 위에 원하는 과정을 추가해서 이미지빌드, 구동하는 방법

1. Dockerfile 사용

첫번째로는 Dockerfile로 하는 방법이 있습니다.

가장 많이 사용하는 방법입니다.

 

 

vi Dockerfile2

FROM centos:centos7
RUN apt-get update && apt-get -y upgrade
RUN apt-get install nginx
COPY ./public-html/ /usr/local/apache2/htdocs/

ONBUILD ADD test.tar /var/www/html

CMD ["nginx", "-g", "daemon off;"]

 

FROM은 도커 허브에서 파일을 다운받아옵니다.
RUN은 apt-get install 설치 또는 명령어를 실행시킵니다. 이미지 빌드할 때 실행됩니다.
RUN은 여러번 사용가능합니다.
그에 반해 ENTRYPOINT와 CMD는 이미지를 구동시킬 때 실행됩니다.
ENTRYPOINT는 고정입니다.
CMD는 인자를 변경시킬 수 있습니다. 한번만 사용 가능합니다.


예를 들어서
top 명령어의 경우
top -d 10 이라면 고정된 프로세스페이지가 10초마다 한번씩 갱신이 됩니다.

ENTRYPOINT ["top"]
CMD ["-d", "10"]
이라고 한다면 toptest이미지 구동을 시킬 때
entrypoint는 10초가 고정되어 변경이 불가능하지만
CMD의 경우 docker container run toptest -d 4 으로 변경이 가능합니다. 
ONBUILD는 dockerfile을 사용해서 빌드할 때는 작동하지 않지만
이 이미지를 사용해서 다음 이미지를 빌드할 때는 작동합니다.
COPY로도 단순복사 작업이며
ADD은 압축을 풀 수 있고, 외부링크에서 파일을 가져와서 옮길 수 있습니다.
EXPOSE 80/udp
포트를 사용하겠다고 알립니다. 80번의 기본값은 tcp입니다.
USER
유저에 접속합니다.
예를 들어


RUN useradd user1
RUN ["whoami"] 만 했다면
root가 뜨겠지만


USER user1
RUN ["whoami"] 은
user1에 접속합니다.
WORKDIR /first
WORKDIR second 
= cd /first/second
리눅스상에서 cd라고 생각하면 쉽습니다. 경로로 이동해서 활동을 합니다.

 

docker build -t build1 . -f Dockerfile2

현재 디렉토리를 지정해주고 기본파일인 Dockerfile과 이름이 다르다면 -f로 파일이름을 지정해줍니다.

 

 

명령어 실행 방법은 3가지로 나뉩니다.

 

쉘 형식

CMD nginx -g 'daemon off;'

 

exec 형식

CMD ["nginx", "-g", "daemon off;"]

 json배열로 지정 합니다.

 

entrypoint 형식

ENTRYPOINT nginx -g 'daemon off;'

ENTRYPOINT ["nginx", "-g", "daemon off;"]

 

 

 

2. 압축파일 사용

다른 방법으로는 아카이빙 압축파일을 사용해서 이미지 빌드를 해도 됩니다.

tar cbvf Docker.tar.bz Dockerfile file1
도커 파일 설정과 추가할 파일을 포함해서 tar압축합니다.
tar tvf Docker.tar.bz
docker build -t build2 - < Docker.tar.bz

 

 

 

3. 볼륨 연결

실행할 때 볼륨으로 연결해서 사용해도 파일 공유가 되기 때문에 가능합니다. 

mkdir /test && touch /test/file1
docker run --name build3 -v /test:/usr/~ centos
docker exec -it build3 cat /usr/~
로 명령어 또는 쉘을 실행하여 확인합니다.

"$PWD" 로 볼륨할 경우 루트 디렉토리입니다.

 

 

 

 multistage 배포환경

컨테이너를 만들어 개발 환경에서 개발을 하고

남은 도구들(php, java, 컴파일러 등)이 남아있다면 개발된 애플리케이션을 포함하기 때문에 용량이 쓸데없이 클 것입니다.

그렇다고 일일이 남아있는 도구를 찾아서 삭제한다면 그것 또한 시간을 잡아먹는 될 것이구요. 

그렇기 때문에 애초에 컨테이너를 두군데 만들어 multistage를 만드는 것입니다.

도구 전용인 개발환경, 깔끔하게 배포할 수 있는 환경인 배포환경을 구분합니다.

 

 

 

multistage일 경우 Dockerfile

(singlestage 일경우)
(+)
FROM busybox
WORKDIR /opt/greet/bin
COPY --from=builder /go/src/github.com/test/hello/ .
개발 환경의 결과물(hello)을 프로덕션 환경으로 복사
ENTRYPOINT ["./hello"]

docker images로 이미지를 비교했을 때

용량이 매우 작아진 것을 확인할 수 있습니다.

 

 

 

 

 

 레지스트리 저장소 구축

일반적으로 docker 허브를 기본적으로 많이 쓰지만 일반적으로 웹에 올려놓은 정보에 대해서 보안에 취약 할 수 있으니 

따로 외부 저장소에 저장해두고 가져다가 쓸 수 있습니다.

같은 네트워크 대역을 쓰는 클라이언트가 Docker 공유 서버에 접속해서 받을 수도 있습니다.

registry 입니다.

 

일단 registry 를 도커허브에서 받아와준 후 구동까지 시켜 리슨 상태로 만들어줍니다.

docker run --name registrytest -d -p 5000:5000 registry

 

netstat -ntpl | grep 5000

5000번이 리슨되어있는 것을 확인할 수 있습니다.

 

 

registry에 올려면 태그를 설정해줘야합니다.

설정하지 않고 그냥 하면 도커 허브에 올리기 때문입니다.

docker pull docker.io/hello-world 
docker tag docker.io/hello-world localhost:5000/hello-world
로 태그를 바꿔줍니다.
docker image push localhost:5000/hello-world
docker rmi localhost:5000/hello-world

docker run --name test1 localhost:5000/hello-world

 

 

localhost:5000로 표현하는 것보다 DNS를 사용해서 레지스트리 저장소임을 밝혀주는 게 좋을 것 같으니

docker1, 2 모두 가상 호스트를 설정해줍니다.

vi /etc/hosts > 192.168.2.20    myregistry.com

 

 

☞ 보안 강화

정보를 그냥 주고 받으면 암호화하지 않아 보안에 취약할 수 있습니다.

그래서 방법이 두가지가 있습니다.

 

 

1. 암호화

alpine/openssl 이미지를 이용해 개인키 myregistry.com.key와 인증서(public key) myregistry.com.crt 파일을 생성합니다.

개인키, 공개키를 두고 pull할 때 암호화를 거쳐 전달받습니다.

리눅스본체로 키를 받아와야하기 때문에 볼륨으로 키 디렉토리를 마운트시키면 생성됩니다.

 

registry를 구동시켜 키를 넣고 리슨 상태이면

 

hello-world 테스트 이미지를 가져와 태그를 설정하고 레지스트리에 등록합니다.

 

기존 이미지는 삭제하고 registry에서 다시 구동해오면 암호화로 됩니다.

 

scp를 통해 docker1 클라이언트에도 인증서를 보내고 레지스트리에서 받아 테스트합니다.

 

 

2. 로그인설정

 docker에서 교환할 때 로그인이 필요하게 설정

 

htpasswd 설정 파일이 필요합니다.

htpasswd 설정 파일을 만들고 registry를 구동시켜 파일을 넣습니다.

 

docker login myregistry.com(192.168.2.20) 

클라이언트에서 로그인 후 이미지 구동합니다.

 

 

 

 

docker history ~
이미지 실행 시 어떤 명령어 사용 확인

 

 

 

 

 

Comments