본문 바로가기
클라우드 취약점 진단 및 대응 실무

클라우드 기반 취약점 대응 및 실무 [두 번째 정리]

by 할 수 있다 ! 2024. 5. 5.

안녕하세요 ! 

 

클라우드 기반 취약점 대응 및 실무 두번 째 정리를 시작해보도록 하겠습니다. 

 

 

1. 도커 컨테이너를 활용한 로드밸런싱 

 

도커 컨테이너를 활용한 로드 밸런싱은 여러 가지 방법으로 구현할 수 있습니다. 가장 일반적인 방법 중 하나는 도커 컨테이너 오케스트레이션 툴인 도커 스웜, 쿠바네테스와 같은 플랫폼을 사용하는 것 입니다. 

 

1. 도커 이미지 작성 : 로드 밸런서 역할을 하는 컨테이너를 포함한 도커 이미지를 작성합니다. 

 

2. 도커 컴포즈 또는 쿠버네티스 매니페스트 작성 : 서비스를 정의하고 로드 밸런서 컨테이너를 여러 개 실행할 수 있는 방법을 정의합니다. 도커 컴포즈 파일 또는 쿠버네티스 매니페스트 파일을 사용하여 이 작업을 수행할 수 있습니다. 

 

3. 로드 밸런서 구성 : 로드 밸런서 컨테이너를 구성하여 백엔드 서비스의 트래픽을 분산시킵니다. 이 단계에서는 로드 밸런서의 설정을 조정하여 요청을 다수의 백엔드 서버로 라우팅 할 수 있습니다. 

 

4. 백엔드 서비스 배포 : 로드 밸런서 앞에 여러 개의 백엔드 서비스 컨테이너를 배포합니다. 이 단계에서는 백엔드 서비스의 스케일링 및 고가용성을 고려하여 구성할 수 있습니다. 

 

5. 테스트 및 모니터링 : 배포된 시스템을 테스트하고 모니터링 하여 성능 및 안정성을 확인합니다. 로드 밸런서가 요청을 올바르게 분산하고 백엔드 서비스가 적절히 처리하는지 확인합니다. 

 

이러한 단계를 따르면 도커 컨테이너를 활용한 로드 밸런싱 시스템을 구축할 수 있습니다. 도커 스웜 또는 쿠버네티스와 같은 오케스트레이션 툴을 사용하면 이러한 프로세스를 자동화하고 관리하기가 훨씬 쉬워집니다. 

 

 

 

실습을 바로 진행하도록 하겠습니다. 

 

 

 

웹서버의 볼륨 엔지니어를 잡기 위해 $ sudo docker run -itd -p 8001:80 -v /home/kali/web-vol:/user/share/nginx/html --name=web1 nginx:1.18 명령어를 수행합니다. 

 

 

그리고 웹 페이지에서 수행을 하면 페이지를 불러올 수 있습니다. 

 

웹페이지를 변경할 때 2가지 방법이 있었는데 한쪽은 엔지니엑스를 직접적으로 들어가서 수정을 했었습니다. 

 

 $ sudo docker run -itd -p 8001:80 -v /home/kali/web-vol:/usr/share/nginx/html --name=web1 nginx:1.18 의 niginx :1.18 에서 수정을 하였습니다. 그리고 다른 하나는 칼리 리눅스 밖에서 CP 명령어를 이용해서 변경을 하였습니다. 

 

 

로드밸런싱을 하기 위해서 여러 개의 서버를 만들어야 하는데 2개 더 만들었습니다. 

 

 

근데 중간에 echo 명령어가 실행이 되지 않아서 이유를 봤더니 알고 보니까 root 권한으로 설정되어 있더라고요. 

 

 

root 로 접속해서 새로 만들었습니다. 

 

 

이렇게 따로 따로 페이지를 불러올 수 있는 것을 볼 수 있습니다. 

 

만약 페이지를 불러오지 못하면 도커가 다운되어 있을 확률이 높습니다. 

 

그렇다면 sudo ip link set dev docker0 down, sudo ip link set dev docker0 up 을 입력합니다. 

 

그런 다음 sudo service docker stop , sudo service docker start 를 눌러줍니다. 

 

sudo docker start web01 

 

sudo docker start web02 

 

sudo docker start web03 

 

 

 # sudo service apache2 stop 명령어를 사용하여서 아파치를 일단 멈추고 nginx 를 설치하기 위해 apt 업데이트 그리고 install nginx 설치합니다. 

 

 

 

그리고 sudo service nginx start 명령어를 입력하면 됩니다. 

 

 

 

그리고 80포트를 입력하면 기본 디폴트 값 페이지가 출력되는 것을 확인할 수 있습니다. 

 

 

칼리리눅스 ( 웹서버 - nginx LB 역할, WAF ) --> web01, web02, web03  

 

 

그리고 cd 로 etc 디렉토리로 이동하고 nginx 파일로 이동한 뒤에 sudo vim nginx.conf 라는 명령어를 입려합니다. 

 

 

그런 다음에 http 부분에서 새로운 내용을 추가하고 나머지 부분은 주석처리를 합니다. 

 

여기서 upstream 라는 명령어는 일반적으로 웹 서버 소프트웨어나 리버스 프록시와 같은 네트워크 서비스에서 사용됩니다. 이 용어는 다른 서버 또는 서비스에 대한 연결을 나타냅니다. 

 

backend_lb 는 로드 밸런서에서 사용되는 백엔드 서버 그룹을 나타냅니다. 로드 밸런서는 클라이언트로부터 요청을 받아서 여러 대의 백엔드 서버로 분산시켜주는 서비스 입니다. backend_lb 는 이러한 백엔드 서버 그룹을 구성하는데 이 그룹에는 동일한 서비스를 제공하는 여러 대의 서버가 포함될 수 있습니다. 

 

즉, 로드 밸런서의 설정에서 사용되며 이것을 통해 로드 밸런서가 트래픽을 분산시킬 대상 서버 그룹을 지정할 수 있습니다. 따라서 이 용어는 로드 밸런서의 구성을 설명하고 트래픽 관리에 관련된 정보를 제공합니다. 

 

 

그리고 restart 를 입력하면 됩니다. 

 

 

 

복습 퀴즈 ! 

 

1. 네트워크를 3개 대역 ( 다른 대역이 된다. ) 를 만듭니다. 

 

2. 볼륨을 3개 만듭니다. 

 

3. 3개의 웹 서버에 볼륨과 네트워크를 연결한다. 

 

4. 로드 밸런싱을 구축하여 웹 서버 3개에 분배한다. 

 

 

 

먼저 볼륨을 새로 만들고 네트워크도 새로 만듭니다. 그리고 $ sudo docker run -itd -p 8001:80 -v vol-web01:/usr/share/nginx/html --net=net-web01 --name=web01 nginx:1.18 를 입력하여서 nginx 컨테이너를 실행시킵니다. 

 

여기서 itd 는 컨테이너를 대화형으로 실행하고 백그라운드에서 실행하며, 컨테이너에 대한 터미널을 붙입니다. 

 

호스트의 8001 포트를 컨테이너의 80 포트로 포워딩합니다. 이렇게 하면 호스트의 8001 포트로 접속하게 되고 컨테이너 내부의 nginx 서버로 연결이 됩니다. 

 

그 다음 vol-web01 볼륨을 컨테이너의 /usr/share/nginx/html 경로에 마운트 합니다. 이렇게 하면 호스트의 파일이나 디렉토리를 컨테이너 내부에 연결할 수 있습니다. 또한,  --net=net-web01 이라는 이름의 도커 네트워크에 연결합니다. 이것을 통해 다른 컨테이너와 통신할 수 있습니다. 

 

--name=web01 컨테이너의 이름을 web1 으로 지정합니다. 그리고 nginx 는 1.18 버전으로 사용합니다. 

 

결론은 nginx 가 호스트의 8001 포트에서 실행이 되고 호스트의 vol-web01 볼륨이 컨테이너의 /usr/share/nginx/html 디렉토리에 마운트 되고 net-web01 이라는 네트워크에 연결이 됩니다. 

 

 

80 포트는 하나만 동작하고 있기 때문에 혼자서 정상 동작이 되고 있는 것을 알 수 있습니다. 

 

 

 

그 다음은 root 로 접속을 하여서 cd /var/lib/docker/volumes/vol-web01/_data 디렉토리로 이동합니다. 

 

그리고 목록에 index.html 이 있는 것을 볼 수 있는데 이 파일을 삭제하고 다시 새로 생성합니다. 

 

똑같이 반복해서 vol-web02 로 이동해서 수정하고 vol-web03 으로 이동해서 수정합니다. 

 

 

 

 

 

 

새로고침 버튼을 누르면 페이지가 바뀌는 것을 확인할 수 있었습니다. 

 

다음에는 nginx 로드 밸런싱도 도커로 만들고 도커를 여러개로 분산할 수 있는 실습을 해보겠습니다. 

 

즉, 칼리 리눅스는 포워딩 역할만 하고 도커는 여러개가 구성이 됩니다. 이것이 하나의 솔루션이 되는 것 입니다.

 

 

2. 도커 파일 및 자동화 

 

도커 파일은 도커 이미지를 빌드하기 위한 지침을 포함하는 텍스트 파일입니다. 도커 파일을 사용하면 도커 이미지를 자동화하고 반복 가능하게 빌드할 수 있습니다. 도커 파일을 사용하여 이미지를 생성하고 실행하는 프로세스를 자동화 할 수 있습니다. 이것을 통해 개발, 테스트 및 배포 프로세스를 효율적으로 관리할 수 있씁니다. 

 

1. 도커 파일 작성 : 도커 파일을 작성하여 도커 이미지를 빌드하는데 필요한 모든 단계를 정의합니다. 이 단계에는 기본 이미지 선택, 소프트웨어 설치, 설정, 애플리케이션 코드 복사 등이 포함될 수 있습니다. 

 

2. 도커 이미지 빌드 : 작성한 도커 파일을 사용하여 도커 이미지를 빌드합니다. 이 작업은 "docker build" 명령을 사용하여 수행됩니다. 도커는 각 단계를 실행하고 중간 이미지를 캐시하여 빌드 시간을 최소화 합니다. 

 

3. 도커 컨테이너 실행 : 빌드된 도커 이미지를 사용하여 도커 컨테이너를 실행합니다. 이 작업은 "docker run" 명령을 사용하여서 수행합니다. 필요에 따라서 포트 매핑, 볼륨 마운트 등의 추가 설정을 할 수 있습니다. 

 

자동화를 통해 도커 파일을 사용하면 일관된 환경을 유지하고 코드와 설정 변경을 쉽게 관리할 수 있습니다. 또한, 이러한 자동화를 통해 개발자와 운영팀이 협업하여서 소프트웨어를 더 신속하게 제공할 수 있습니다. 

 

 

도커 파일 

 

도커 허브 : 이미 이미지가 완성된 것을 제공한다. docker pull 

 

nginx 파일 다운로드 -> usr/share/www/ -> index.html ... 

 

우분투 -> apache2 설치 -> /var/www/html/ -> index.html ... 

 

 

실습을 시작하도록 하겠습니다. 

 

 

 

우선 mkdir 명령어를 사용해서 ubuntu_web 를 만듭니다.

 

그리고 cd 명령어를 입력해서 ubuntu_web 로 이동한 뒤에 sudo vime Dockerfile 을 입력해서 수정합니다. 

 

 

FROM ubuntu:14.04

 

이 명령어는 ubuntu 14.04 베이스 이미지를 사용하여 새로운 이미지를 빌드하기 시작함을 나타냅니다. 

 

MAINTAINER "boanproject"

 

이 명령어는 이미지의 유지 관리자를 지정합니다. 

 

LABEL title "Web Application"

 

이 명령어는 이미지에 레이블을 추가하여 이미지에 대한 정보를 제공합니다. 

 

RUN apt-get update && apt-get -y install apache2 php5

 

이 명령어는 apt-get update 를 통해 패키지 목록을 업데이트 하고 그 다음에 아파치 2 와 PHP 5 를 설치합니다. 

 

RUN echo 'Docker Web Application' > /var/www/html/index.html

 

이 명령어는 아파치 웹 서버의 기본 문서 루트인 ' /var/www/html ' 에 'index.html' 파일을 생성하고 그 안에 "Docker Web Application " 이라는 텍스트를 작성합니다. 

 

RUN echo '<?php phpinfo(); ?>' > /var/www/html/phpinfo.php

 

이 명령어는 아파치 웹 서버의 기본 문서 루트인 ' /var/www/html ' 에 'phpinfo.php' 파일을 생성하고 PHP 정보를 출력하는 'phpinfo()' 함수를 이 파일에 작성합니다. 

 

EXPOSE 80

 

이 명령어는 도커 컨테이너가 80번 포트를 외부에 노출시킬 것임을 지정합니다. 

 

WORKDIR /var/www/html

 

이 명령어는 다음에 실행할 명령이 실행될 디렉토리를 지정합니다. 

 

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

 

이 명령어는 컨테이너가 시작될 때 실행되는 명령을 지정합니다. 아파치를 백그라운드에서 실행하는 대신 이 명령은 아파치를 포그라운드로 실행하도록 설정합니다. 

 

 

 

$ sudo docker build -t ubuntu_web . 명령어를 실행시켜서 도커 이미지를 빌드 합니다. 

 

이 명령어는 현재 디렉토리에 있는 도커파일을 사용하여서 도커 이미지를 빌드하고 우본투 웹이라는 태그를 붙입니다.

 

이 이미지는 나중에 docker run 명령어로 실행할 수 있습니다. 

 

 

$ sudo docker run -itd -p 8888:80 --name=ubuntu_web ubuntu_web 명령어를 입력해서 ubuntu _web 이미지를 사용하여서 컨테이너를 실행하고 호스트의 8888 포트를 컨테이너의 80 포트로 매핑합니다. 이렇게 하면 호스트에서 웹 서버에 접속할 수 있습니다. 컨테이너는 백그라운에서 실행되며, ubuntu_web 이름으로 식별됩니다. 

 

 

 

Docker Web Application 을 불러온 것을 확인할 수 있습니다. 

 

 

 

여기서 phpinfo.php 를 입력하면 phpinfo.php 페이지를 확인할 수 있습니다. 즉, 정상적으로 지금 PHP 환경까지 구성됐다는 것을 알 수 있습니다. 

 

 

여기서 퀴즈 !!! 

 

nginx 서버 도커 파일로 구현한다. 

 

- ubuntu 최신 버전 

 

- nginx 설치 

 

- index.html 페이지 수정 

 

- 80 포트 오픈 

 

- 데몬 살향 : nginx -g deamon off 

 

(deamon off 는 nginx 서버를 foreground 에서 실행한다.)

 

 

 

mkdir nginx_web 폴더를 만들어 줍니다. 그리고 sudo vime 명령어를 사용해서 도커 파일의 내용을 수정합니다. 

 

그리고 $sudo docker build -t nginx_web . 명령어를 사용해서 빌드를 합니다. 

 

 

이번에는 도커 파일을 이용해서 도커 이미지가 만들어지는곳에 추가하려고 합니다. 

 

 

앞에 내용과 똑같이 $sudo docker build -t webapp . 빌드를 합니다. 

 

 

그리고 호스트의 포트 8088 을 입력해주면 이렇게 고래 사진이 뜬 것을 확인할 수 있습니다. 

 

 

$ sudo apt update 를 하고 $sudo apt install docker-compose 를 설치합니다. 

 

 

3. 도커 컴포즈 자동화 

 

도커 컴포즈는 다중 컨테이너 애플리케이션을 관리할 수 있는 실행 도구 입니다. 여러 개의 독립적인 컨테이너를 함께 묶어서 하나의 구성 요소로 만들어 줍니다. 이를 통해서 여러 개의 컨테이너를 간편하게 관리할 수 있습니다. 

 

도커 컴포즈는 YAML (야물) 파일에 애플리케이션을 정의합니다. 이 YAML 파일은 애플리케이션의 모든 구성 요소를 포함하고 있으며, 컨테이너, 네트워크, 볼륨, 환경 변수 등을 정의할 수 있습니다. 이러한 정의를 통해 애플리케이션의 배포 및 관리를 자동화 할 수 있습니다. 

 

도커 컴포즈를 사용하면 컨테이너를 간단하게 관리할 수 있으며 여러 개의 컨테이너를 함께 묶어서 하나의 구성 요소로 만들어 줍니다. 따라서 개발자는 애플리케이션을 보다 쉽게 관리할 수 있습니다. 

 

도커 컴포즈를 활요한 웹 서비스 구축 

 

다중 컨테이너 애플리케이션을 관리할 수 있는 실행 도구 ( 프로젝트 단위로 만들어진다. ) 

 

1. 웹 서버 컨테이너 2개를 만들어서 연결성 !! 

 

2. 데이터베이스 컨테이너 1개를 만들어 웹 서버와 연결 

 

 

그러면 바로 도커 컴포즈 실습하도록 하겠습니다. 

 

 

$ sudo docker stop $(sudo docker ps -q -f status=running)

 

$ sudo docker rm $(sudo docker ps -q -f status=exited) 

 

$ sudo docker system prume -a

 

우선 실습을 하기 전에 명령어를 사용해서 기존에 있던 파일들을 깔끔하게 지웠습니다.

 

 

이전에 했던 도커 파일 및 자동화처럼 vim 명령어를 사용해서 도커 컴포즈 파일에 내용을 수정하고 $ sudo docker-compose up 명령어를 입력해서 실행합니다. 

 

 

 

실행하면 mydb 라고 실행하고 있는 내용들을 출력하게 됩니다. 여기서 중지 시키지 말고 콘솔 창을 하나 더 띄웁니다.

 

 

도커 컴포즈 파일을 실행하려면 그 디렉토리로 이동을 해야 실행할 수 있습니다. 그리고 $sudo docker-compose ps 명령어를 입력하면 컴포즈 파일만 실행하고 있다는 것을 확인할 수 있습니다. 여기서 $sudo docker exec -it websever_mydb bash 명령어를 입력해서 root 권한으로 접속합니다. 그리고 mysql -u root -p 를 입력해서 로그인까지 해서 성공하면 끝입니다. 

 

 

$sudo docker-compose down 을 입력하면 도커 컴포즈에 있던 컨테이너 파일들이 전부 다 중지된다는 것을 알 수 있습니다. 

 

 

$sudo docker-compose up 을 입력해서 다시 실행시킵니다. 

 

 

 

그리고 호스트 주소를 입력하면 이렇게 화면이 출력되는 것을 볼 수 있습니다. 

 

 

로그인을 하면 워드프레스 페이지로 접속된 것을 확인할 수 있습니다. 

 

이번 시간에는 도커 컨테이너 nginx conf ---> 1, 2, 3번 컨테이너 서버 로드 밸런싱 ( 도커 파일로 생성 !!! ) 

 

LB_WEB -------- nginx_lb   web01   web02   web03 

                               conf       index       index        index

compose                                                                 

 

 

1. nginx 도커 이미지를 다운로드 하고 로드밸런서가 적용된 conf 로 수정을 해서 새로운 이미지로 생성합니다. 

 

2. 1, 2, 3 기본 nginx 이미지를 다운받아서 index.html 페이지들을 수정하고 새로운 이미지로 생성합니다. 

 

3. 도커 컴포즈에서 4개의 생성된 이미지들을 자동으로 배포하고 관리합니다. 

 

 

실습을 진행하기 전에 우선 디렉토리 LB_WEB 을 생성하고 LB_WEB 안에 nginx_lb, web01, web02, web03 디렉토리를 생성합니다. 각 웹 서버의 도커 파일 입니다. 

 

 

web01, web02, web03 에 각각의 도커파일을 복사하고 인덱스 파일을 만들어 줍니다. 

 

 

FROM 은 nginx 공식 이미지를 기반으로 새로운 이미지를 만든다는 것이고 RUN rm 은 default.conf 를 삭제하겠다는 것입니다. COPY 는  /etc/nginx/conf.d/default.conf 경로로 복사하겠다는 것 입니다. 참고로 도커 파일의 수정 내용입니다. 

 

 

 

web01, web02, web03 에는 1.18 버전을 입력해야 실행이 됩니다. 

 

 

이번에는 nginx_lb 디렉토리로 이동해서 똑같이 sudo vim 명령어를 입력해서 도커 파일을 수정합니다.

 

 

그리고 nginx.conf 파일도 수정합니다.

 

 

 

nginx.conf 수정의 내용은 nginx 서버가 로드 밸런싱을 수행하는 방법입니다.

 

 

여러 백엔드 서버로 요청을 분산하기 위해서 업스트림 블록이 정의되었고 그 다음에 이것을 사용해서 프록시 패스를 설정합니다. 

 

 

정리하자면 이 설정은 nginx 서버가 로드 밸런싱을 수행하고 들어오는 요청을 여러 백엔드 서버로 분산하는 기본적인 구성을 정의합니다. 

 

 

tree 명령어를 입력하면 정리가 되어 있는 것을 확인할 수 있습니다. 

 

 

 

이제 실행을 하기 전에 도커 컴포즈 yaml 파일을 더 만들어 줍니다. 

 

 

$ sudo vim docker-compose.yaml 명령어를 입력합니다. 

 

 

docker-compose.yaml 파일에는 web1, web02, web03 서비스를 bulid 키워드를 사용해서 도커 파일이 위치한 디렉토리를 지정합니다. 그리고 ports 키워드를 사용해서 호스트와 컨테이너 간의 포트 매핑을 정의합니다. 

 

nginx_lb 에는 로드 밸런서 build 키워드를 통해서 지정합니다. 그리고 로드 밸런서의 포트 80을 호스트의 포트 8080으로 매핑합니다. 

 

정리하자면 도커 컴포즈 파일은 여러 웹 서버를 실행하고 nginx 로드 밸러너를 사용하여서 요청을 분산하는 간단한 로드 밸런싱 환경을 구성합니다. 

 

 

 

이제 $sudo docker-compose up 명령어를 입력하면 실행이 되는 것을 확인할 수 있습니다. 

 

 

 

 

 

 

 

이렇게 자동화로 페이지가 로드밸런싱 하는 것을 확인할 수 있었습니다. 

 

 

 

참고로 인덱스 파일에서 이미 기존의 이미지가 생성되어 있다면 다시 그 이미지를 삭제시키고 실행을 시켜야 새로운 이미지를 생성할 수 있습니다. 

 

 

 

$ sudo docker-compose down 정지 시키고 $ sudo docker system prune -a 다시 깔끔하게 정리합니다.  

 

 

$ curl -o docker-compose.yml https://raw.githubusercontent.com/OWASP/crAPI/main/deploy/docker/docker-compose.yml

 

$ sudo docker-compose pull 

 

$ docker-compose -f docker-compose.yml --compatibility up -d 

 

$ sudo docker-compose -f docker-compose.yml --compatibility up -d 

 

명령어를 입력하고 파이어폭스에서 localhost:8888 을 입력합니다.

 

 

 

 

그러면 이렇게 페이지를 불러오는 것을 확인할 수 있습니다. 

 

이 페이지 안에서도 취약점들이 있는지 확인할 수 있겠죠 ? 

 

아무튼 오늘은 여기까지 글을 쓰도록 하겠습니다.