프로젝트를 진행하며 발견된 도커의 보안 취약점 정리

 

inter-container communication(icc)

icc는 네트워크의 옵션으로 네트워크의 컨테이너간 통신을 사용/미사용 처리하는 옵션
컨테이너간 불필요한 통신을 제한하도록 권고 (필요 사유 기입시 허용)

icc: true = 컨테이간 통신가능
icc: false = 컨테이너간 통신 불가능

 

디폴트 브릿지 icc 적용전 후 테스트

 

디폴트 브릿지를 사용한 통신

디폴트 브릿지를 사용시 DNS사용이 불가능하기에 컨테이너 이름이 아닌 컨테이너 IP 사용

# nginx 컨테이너 생성
docker run -d --name test-nginx nginx

# nginx의 컨테이너 아이피 확인
docker inspect test-nginx | grep IPAdd
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

# nginx 컨테이너로 통신
docker run --rm --name test-curl curlimages/curl curl http://172.17.0.2:80

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   615  100   615    0     0   145k      0 --:--:-- --:--:-- --:--:--  150k
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

디폴트 브릿지의 icc 적용

icc 적용

/etc/docker/daemon.json

{
  ...
  "icc": false
  ...
}

 

icc 확인

docker network inspect bridge | grep enable_icc
  "com.docker.network.bridge.enable_icc": "false",

 

icc 적용 후 디폴트 브릿지를 통신 테스트

# 기존 컨테이너 삭제후 재기동
docker stop test-nginx ; docker rm test-nginx
docker run -d --name test-nginx nginx

# 컨테이너 아이피 확인
docker inspect test-nginx | grep IPAdd
  "SecondaryIPAddresses": null,
  "IPAddress": "172.17.0.2",
          "IPAddress": "172.17.0.2",

# 컨테이너간 통신 테스트
docker run --rm --name test-curl curlimages/curl curl http://172.17.0.2:80

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:02:13 --:--:--     0
curl: (28) Failed to connect to 172.17.0.2 port 80 after 133158 ms: Could not connect to server

 


 

커스텀 네트워크 icc 적용전 후 테스트

icc 적용 전 테스트

# 네트워크 생성
docker network create \
  --opt com.docker.network.bridge.enable_icc=true \
  icc-net

# 네트워크 옵션 확인
docker network inspect icc-net | grep icc
      "Name": "icc-net",
          "com.docker.network.bridge.enable_icc": "true"

# nginx 컨테이너에 네트워크 할당.
docker stop test-nginx ; docker rm test-nginx
docker run -d --name test-nginx --network icc-net nginx

# nginx 와 동일한 네트워크 할당후 컨테이너 명으로 통신
docker run --rm --name ltest-cur --network icc-net curlimages/curl curl http://test-nginx:80

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   615  100   615    0     0   183k      0 --:--:-- --:--:-- --:--:--  300k
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>

 

icc 적용 후 테스트

# nginx 컨테이너 삭제
docker stop test-nginx ; docker rm test-nginx

# 네트워크 삭제
docker network rm icc-net

# icc false로 네트워크 재생성
docker network create \
  --opt com.docker.network.bridge.enable_icc=false \
  icc-net

# 네트워크 옵션 확인
docker network inspect icc-net | grep icc
        "Name": "icc-net",
            "com.docker.network.bridge.enable_icc": "false"

# 네트워크 할당 된 nginx 컨테이너 생성
docker run -d --name test-nginx --network icc-net nginx

# 같은 네트워크에서 통신
docker run --rm --name ltest-cur --network icc-net curlimages/curl curl http://test-nginx:80
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:02:12 --:--:--     0
curl: (28) Failed to connect to test-nginx port 80 after 132533 ms: Could not connect to server

 

docker compose에 적용하는 방법

docker-compose.yml

...
networks:
  icc-net:
    name: icc-net
    driver_opts:
      com.docker.network.bridge.enable_ic: "false"

+ Recent posts