brunch

매거진 Security

You can make anything
by writing

C.S.Lewis

by sokoban Dec 31. 2021

Docker Images Security #1

Docker Security, K8s Security

  본 문서에서는 도커 이미지에 대해서 알아 보고 이에 대한 보안 강화 방법에 대해서 알아 보고자 한다.

그러기 위해서는 도커 이미지를 build하고 이를 이미지로 만든 다음 도커 hub에 등록하는 기본적인 방법과 도커 Registry에 대해서 먼저 정리해 보겠다.


1. 도커 이미지 생성과 등록

 

(1). 도커 샘플 이미지 만들기

 첫번쨰는 간단하게 node js로 구동되는 간단한 웹 어플리케이션을 도커 이미지로 만들어 본다. 이 부분은 도커의 공식 문서 사이트에서 제공하는 방법을 그대로 따라 가면 손쉽게 node.js로 된 간단한 앱을 만들수 있을 것이다. 

https://nodejs.org/ko/docs/guides/nodejs-docker-webapp/

  우선 위의 메뉴얼 대로 한다면 큰 어려움 없이 node로 된 도커 이미지를 만들고 실행까지 할수 있을 것이다. 여기서는 아래와 같이 sokoban/node-web-app 이라는 이미지 이름으로 이미지를 생성 하였다.


웹 브라우저로 접속하면 아래와 같이 간단하게 Hello World 가 뜨는것을 알수 있다.

(2). 도커 hub에 등록하기

  이렇게 만든 도커 이미지를 도커 허브에 저장 할수 있게 해준다. github와 같이 자기가 만든 docker image를 타인이 다운받아 사용할수 있도록 해주는 기능으로 볼수 있다.

  계정을 만들고 들어가면 이미지를 업로드 할수 있게 만들수 있다.

  계정을 만들고 공간을 생성 하였다면 이제 도커 파일을 docker hub로 push 할 차례이다.

 push된 저장소 주소

https://hub.docker.com/r/sokoban/node-web-app

 아래와 같이 별다른 설명 없이 등록되고 push 된것을 확인 할수 있다.


  %누군지 모르지만 8개월 동안 5명이 받아 갔다.. ^^


2. 도커 이미지 분석하기



{19:53}~/git/dockertest2/sokoban/node-web-app ➭ docker image inspect sokoban/node-web-app

[

    {

        "Id": "sha256:940402c85daf56862eb347a259e88e690cd361e6dd95a212caebd19b70ee73cb",

        "RepoTags": [

            "sokoban/node-web-app:latest"

        ],

        "RepoDigests": [

            "sokoban/node-web-app@sha256:f87905278e89224fcd5c174d336458405b96935a27bbe849e3a875c785c0eff1"

        ],

        "Parent": "",

        "Comment": "buildkit.dockerfile.v0",

        "Created": "2021-04-26T04:19:09.902320504Z",

        "Container": "",

        "ContainerConfig": {

            "Hostname": "",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "Tty": false,

            "OpenStdin": false,

            "StdinOnce": false,

            "Env": null,

            "Cmd": null,

            "Image": "",

            "Volumes": null,

            "WorkingDir": "",

            "Entrypoint": null,

            "OnBuild": null,

            "Labels": null

        },

        "DockerVersion": "",

        "Author": "",

        "Config": {

            "Hostname": "",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "ExposedPorts": {

                "8080/tcp": {}

            },

            "Tty": false,

            "OpenStdin": false,

            "StdinOnce": false,

            "Env": [

                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",

                "NODE_VERSION=12.22.1",

                "YARN_VERSION=1.22.5"

            ],

            "Cmd": [

                "node",

                "server.js"

            ],

            "ArgsEscaped": true,

            "Image": "",

            "Volumes": null,

            "WorkingDir": "/usr/src/app",

            "Entrypoint": [

                "docker-entrypoint.sh"

            ],

            "OnBuild": null,

            "Labels": null

        },

        "Architecture": "amd64",

        "Os": "linux",

        "Size": 921700899,

        "VirtualSize": 921700899,

        "GraphDriver": {

            "Data": {

                "LowerDir": "/var/lib/docker/overlay2/r0bhaqw4yqkf0m16i4w2rt53t/diff:/var/lib/docker/overlay2/8kszaz6s9gwl70z2cxz59z5zz/diff:/var/lib/docker/overlay2/3havmz9xtbp1sta3gq3t6gr1e/diff:/var/lib/docker/overlay2/a1f05d5a889f9f1c7123ef4f2fdce76350392421b122e23e4f3528d513d5fca1/diff:/var/lib/docker/overlay2/61c9......"

                "MergedDir": "/var/lib/docker/overlay2/2pfwxl53uzq04gxsolnltkjtj/merged",

                "UpperDir": "/var/lib/docker/overlay2/2pfwxl53uzq04gxsolnltkjtj/diff",

                "WorkDir": "/var/lib/docker/overlay2/2pfwxl53uzq04gxsolnltkjtj/work"

            },

            "Name": "overlay2"

        },

        "RootFS": {

            "Type": "layers",

            "Layers": [

                "sha256:16fc2e3ca0323443c37e54625d11"

            ]

        },

        "Metadata": {

            "LastTagTime": "2021-04-26T04:19:09.985483685Z"

        }

    }

]



OCI 표준 (Open Container Initiative, https://opencontainers.org


https://github.com/containers/skopeo/blob/master/install.md


https://umo.ci/quick-start/getting-an-image/




(1). 도커 이미지 살펴 보기

    도커 Image에 접속하지 않고 현재 수행중인 Image의 파일 시스템을 그대로 export 할수 있는 기능을 기본으로 제공한다.

  위의 명령어를 통해서 도커 Image의 파일 시스템을 그대로 export 한다.


  실제로 확인 해보면 위와 같이 rootfs가 생성되어 있고 시스템 디렉토리를 확인 할수 있다.


  그럼 실제로 동작중인 Image도 그럴것인지를 확인해 보자. 

  아래의 명령어를 통해서 현재 동작중인 컨테이너에 접속한다.





참고 사이트 혹은 서적

http://www.yes24.com/Product/Goods/96836914?OzSrank=1

https://github.com/opencontainers/runc

https://github.com/containers/skopeo

https://docs.docker.com/get-started/

https://nodejs.org/ko/docs/guides/nodejs-docker-webapp/

https://umo.ci/quick-start/getting-an-image/


https://www.youtube.com/watch?v=iqqDU2crIEQ&t=1002s

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari