클라우드 기반 시스템 운영/구축 실습

올빼미·2024년 12월 24일

1일차 : docker 알아보기

  1. 도커 설치
    apt update
    apt install docker.io -y #도커설치

  2. 구동확인
    docker -h #구동 확인
    apt install apache2 -y #웹서비스 설치
    ip ad #나한테 할당된 ip를 볼수 잇음


    파이어폭스에서 ip주소를 입력하여 구동되는것 확인

  3. 이미지 검색
    docker search apache #이미지 검색
    docker search ububtu #우분투 이미지 검색 > 이미지 추출

  4. 이미지를 다운로드
    docker pull ubuntu/apache2 #이미지를 다운로드

  5. 이미지 확인
    docker images #이미지 확인

  6. 컨테이너(인스턴스) 생성 및 실행
    docker run -d --name apache_server -o 8080:80 ububtu/apache2
    #컨테이너(인스턴스) 생성 및 실행
    run #이미지 실행
    -d #백그라운드로 실행
    --name #이미지를 통해 내가 생성할 인스턴스 별칭이댐
    -p 8080:80 #로컬 8080으로 접속하면 도커환경의 80으로 포워딩

  1. 실행확인
    docker ps
    docker ps -a


    ip ad로 가상환경이 한개 더 올라와있는것을 확인

  2. 컨테이너(인스턴스) 내부 접속
    docker exec -it apache_server5 bash
    exec : 실행
    -it : 터미널 모드로 접속
    bash : 접속 시 bash셸로 실행

    exit #도커 커멘드 종료
    service apache2 stop #로컬환경에서 아파치 서비스 스탑

    접속 안댐

우분투:8080 (192.~) >>> docker:80(172.~)

!우분투는 네트워크카드가 2장이기 때문에 172대역까지 다가고
칼리는 192 대역하고만 통신할수 있는 케이블이 완성이 댓기때문에
172까지는 안감

  • 우분투:
    네트워크 카드가 두 개라서,
    192.168.x.x (로컬 네트워크)
    172.17.x.x (도커의 내부 네트워크)
    ->두 네트워크 모두 통신 가능.
  • 칼리 리눅스:
    네트워크 카드가 하나뿐이라서
    192.168.x.x (로컬 네트워크)
    여기까지만 통신 가능하고,
    172.17.x.x (도커 네트워크)
    이쪽은 도달하지 못함.
  1. 컨테이너 로그 확인
    docker logs apache_server

  2. 데이터볼륨 설정(데이터 지속성)
    docker run -d --name apache_server5 -p 6666:80 -v
    /home/jina/Desktop:/var/www/html ubuntu/apache2

  3. 컨테이너 시작/정지
    docker start apache_server
    docker stop apache_server

apt install mousepad -y #로컬에서 마우스패드 설치
mousepad test.html #파우스패드로 test.html 열기

마우스패드안에 코드 작성 + 저장
docker exec -it apache_server5 bash #다시 도커환경으로 들어감
ls
test.html

  1. 컨테이터 삭제
    docker rm apache_server2 #컨테이너삭제
    docker rmi ubuntu/apache2 #이미지 삭제
  • apache_server6 가 접속이 안되는 이유 : 파이어폭스 안에서 6666포트가 취약하다고 판단하여 > 풀어야함



    접속댐!!


    실시간 동기화!
  1. 컨테이너 백업
    docker save -o apache.tar ubutu/apache2 #이미지 백업
    docker save -o apache.tar ubutu/apache2:241224 #이미지 백업+태그붙이기
    docker export apache_server5 > apache_server5.tar #컨테이너 추출
    docker load -i apache2.tar #이미지 복원
    docker import apache_werver5.tar apache_server6 #컨테이너 임포트

  1. 컨테이터 백업 및 복원 2
    docker ps -a #컨테이너 아이디 확인
    docker commit 컨테이너ID 이미지 이름:태그 형태로 저장 가능
    docker save #추출 및 배포 가능
    docker run -d -name apache_test -p 8080:80 apache_test:241224
    docker exec -it apache_test #내부로 들어감

2일차 : voting-app 웹페이지 만들기


웹 전체 흐름

  1. app.py 만들기 #voting-app
  2. Docker file #voting-app
    • dockerfile : 이미지를 받아와서 초기셋팅을 위한 파일
      ex) app.py를 도커 내부로 복사 실행
    • dockercompose.yml : 이미 있는 이미지를 구동만 해줌
    • FROM : 이미지 다운 및 지정
  • COPY : 로컬에서 컨테이너로 데이터 복사(복사, 검증용)
  • EXPOSE : 포트를 선언하여, 다른 컨테이너와의 연결되도록 지정
  • CMD : 컨테이너 내부에서 명령어 실행 (버전이 충돌나는 경우 많이 사용됨, ex) python)
  • RUN : 컨테이너 외부에서 명령어를 입력하여 컨테이너 내부로 전달
  • WORKDIR : 컨테이너 내부에서 작업경로 지정(절대값. workdir 선언되면 그 이후 작업은 모두 workdir에서 수행됨)
  • ENV : 환경변수, 변수 선언 및 저장
  • ENTRYPOINT : 컨테이너 시작 시 실행할 기본 명령어(또는 파일) 설정
  1. 수동으로 도커빌드
    voting-app >> redis >>><<< worker >>> db(postgres) >>> result-app

docker build . -t voting-app #이미지 빌드
docker run -p 5000:80 voting-app >>>redis을 바라보게하는 옵션이 빠져있음
docker run -d --name=redis redis #redis 컨테이너 실행
docker run -p 5000:80 --link redis:redis voting-app #voting-app 컨테이너 실행
--link : 선언한 변수에 지정된 문자열로 컨테이너를 찾아 연결됨
docker run -d --name db -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres posdtgres:15-alpine #db(postgres) 컨테이너 실행

cd../worker
mousepad Dockerfile #Dockerfile 수정

ARG BUILDPLATFORM=linux/amd64
FROM ~~
ARG TARGETPLATFORM=linux
ARG TARGETARCH=x64

docker build . -t worker-app #worker-app 이미지 빌드
dockerw run -d --link redis:redis --link db:db worker-app #worker-app 컨테이너 실행

cd .../result
docker build . -t result-app #result-app 이미지 빌드
docker run -d --link db:db -p 5001:80 result-app #result-app 컨테이너 실행

  1. docker_compose
  • 순서가 중요!
    image : 컨테이너 생성을 위한 image 지정
    ports : 사용할 포트매핑
    links : 컨테이너간에 연결(상호작용)
  • docker-compose 설치
    apt install python3-pip -y
    apt install docker-compose -y
    docker-compose 실행되는지 확인
  1. docker-compose 최적화

이미지 vs 컨테이너 개념

  • 이미지(부모) : 이미 기본으로 만들어져 배포되는 것
  • 컨테이너(자식) : 이미지를 통해 내가 커스터마이징한 환경

Dockerfile : 컨테이너 내부에 설정하여 이미지로 변환
Docker-compose.yml : 컨테이너를 실행하고 연동


3일차 : 로그수집 및 분석

CloudWatch

: 리소스(CPU, MEM, HDD 등) 의 사용률 정보 수집

  • 최종 목적 : EC2 같은 리소스로부터 생성된 로그를 Watch로 수집하기

  • 사용자 행위 정보 로그(로그인, 로그아웃, 정책생성 등) > CloudTrail

  • 시스템 행위 정보 로그(EC,RDS,...) > CloudWatch

  • 정책 생성(Role) > EC2 생성 , 서비스 설치 , EC2 연결(Role) > Access Key 생성 > EC2 접속 > AWS CLI 셋팅 > CloudWatch Agent 설치 >CloudAgent 실행 > 로그생성 > CloudWatch 검증

    • 1) 정책생성 > IAM > CloudWatchAgentServerPolicy
      final_2024로 역할을 생성함

    • 2) IAM >>> Accesskey도 생성

    • 3) EC2 생성 및 서비스 설치, EC2에 role연결
      agent설치랑 서비스 설치 동시에 진행
      yum install httpd -y
      yum install amazon-cloudwatch-agent -y
      yum install collectd -y

    • 4) aws cli 설정

    • 5) agent 설정
      /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard 입력하여 agent 마법사 실행
      1~3번 선택사항(linux, ec2, root선택 후 쭉 엔터 눌러 진행

      Do you want to monitor any log files? << 메뉴가 나오면 로그경로 입력 후 엔터

      1. yes
      2. no
        default choice: [1]:
        Log file path:
        /var/log/httpd/access_log

이후 쭉 엔터 눌르고 ,

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
final_2024 <<< role 이름

위 메시지 나오면 만든 role 이름 넣고 쭉 엔터 누르면 됨
아래 메시지가 출력되면 성공
Successfully put config to parameter store final_2024.
Program exits now.
이후 json파일을 실행

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
입력해서 json실행

amazon-cloudwatch-agent has already been stopped
Created symlink /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service → /etc/systemd/system/amazon-cloudwatch-agent.service.
가 나오면 성공

Splunk Log 수집

  • splunk 설치 >> DB생성 >> agent 설치 >> 설정파일 설정 >> 로그 수집 확인

    • 1)사전준비
      ubuntu 및 kali (둘다 MEMORY 4gb 이상 설정)

    • 2) splunk 설치 (칼리)
      dpkg -i splunk.deb

    • 3) splunk 활성화 (칼리)
      cd /opt/splunk/bin
      ./splunk enable boot-start >> 라이센스 동의 뜸 q 입력 후 아이디와 비번 입력
      ./splunk start
      링크로 파이어폭스로 들어감 > 아이디와 패스워드로 로그인 > GOT IT >

    • 4) index 생성 (칼리)
      index = DB와 구성요소 동일
      DB(index) 구성요소 : table(sourcetype) >> column(field) >> data
      + setting > indexs > new index > index이름 설정(logtest)

    • 5) Index 구성 (칼리)
      cd /opt/splunk/etc/system/local
      mousepad inputs.conf
      [splunktcp://9997]
      disabled = false
      생성 후 cd /opt/splunk/bin
      ./splunk restart 로 input.conf 실행

    • 6) fowarder 를 타겟 시스템에 설치 (칼리)
      python3 -m http.server 8080 (forwarder가 있는 경로에서)
      우분투에서 파이어폭스 실행 후 kaliip:8080 으로 접속 후 deb파일 받기

--- 여기까지는 칼리(splunk 서버)

  • 7) forwarder 설치
    apt install curl -y
    다시 dpkg -i ~~~.deb #forwarder설치
    // forward는 curl이 필요하다

  • 8) inputs.conf, outputs.conf 생성 (우분투)
    cd /opt/splunkforwarder/etc/system/local
    mousepad inputs.conf

    [monitor:///var/log/apache2/access.log]
    disabled = false
    index = logtest >>splunk 서버에서 만든 index이름 넣기
    sourcetype = apache_log >> db로 치면 table을 생성

[monitor:///var/log/apache2/error.log]
disabled = false
index = logtest
sourcetype = error_log

하나의 구문이 된다. (input file안)

mousepad outputs.conf

[tcpout]
defaultGroup = my_splunk : 그룹 이름
[tcpout:my_splunk]
server = 192.168.111.128:9997 >>>splunk serverIP:포트

  • 9) splunkforwarder 실행 (우분투)
    cd /opt/splunkforwarder/bin
    ./splunk start >>> q >> y 입력 >> id pw 입력 엔터

  • 10) 서비스 실행 및 로그 확인 (우분투)
    service apache2 start # 칼리에서 우분투 접속하여 로그 쌓기
    cat /var/log/apache2/access.log # 로그 확인
    ---여기까지 우분투 작업

  • 11) splunk 서버 index 로그 수집 확인 (칼리)
    Apps > Search&Reporting > New Search > index="logtest" 입력


[구축/운영]

기획 > 요구사항정의 >> 개발설계 > 개발 > 테스트 > 운영전환 > 유지보수 > 폐기

구축도구 : Docker, Terraform, Kubernetes, CloudFomation,...
-> 구축에 있어서 중요한것!! 네트워크 (접근제어, 통신)

  • 3 티어로 시스템을 구축
    ex) 프론트 >> 백 >> 백 (구성하기 나름)
    ex) docker >>> 총 5개의 환경을 구성
    1) voting-app >> 5000 >> 80 public (Front)
    2) redis >> private(Backend)
    3) worker-app >> private(Backend)
    4) db(postgres) >> private(Backend)
    5) result-app >>>> 5001 >> 80 public (Front)

  • 전가상화 vs 반 가상화 vs 컨테이너

    • 전가상화 : 물리서버에 OS부분에 가상화 OS를 설치하여 대시보드를 통해 가상화 시스템 배포 관리
      먼저 ) H/W 제어하기 위해 OS(Windows)를 설치함
      다음) OS에 하드웨어 성능을 분배해서 사용할 수 있게 해주는 기술
      + 물리적인 하드웨어 스펙이 논리적으로 분리가됨
      ex) cpu가 16core >>> 4core 4core 4core 4core로 나누어 총 4개의 시스템 구성이 가능

    • 반가상화 : 물리서버에 OS를 설치하고 가상화 프로그램을 설치하여 가상환경 구축
      ex) VMware, VirtualBox
      + 물리적인 성능을 논리적으로 나누어 사용됨

    • 컨테이너 : 기존의 가상화 기술의 물리적인 성능을 할당하는 문제를 해결하기 위해 나옴
      = OS위에 폴더를 설치하여 독립적인 폴더 권한을 가지면서 통신 기술을 할당해주는 기법
      + 경량화(기존 가상화는 가상환경에 OS를 올리면 실제OS설치하는 만큼 성능이나 저장공간이 필요)
      + 호스트와 리소스를 공유함(CPU, MEM, Storage)

Host vs Guest

  • host = local : 물리적인 HW에 설치된 OS가 돌아가는 환경
    Q : 우분투에 도커를 설치해놨음 >>> 어디가 호스트일까?
    A : 도커입장의 HOST는 우분투, 우분투입장의 HOST는 윈도우

  • guest 환경 = 가상화 환경(가상화or 컨테이너 모두)

  • host와 guest간에 통신 이해

    • bridged : host에서 상속받음
    • NAT : 가상의 Network 할당(사설 IP대역으로 우선 할당됨)

같은 NAT여도 IP대역이 달라지면 통신이 안됨.

인터넷 이라는것은 라우터나 스위치에서 테이블(라우팅)을 구성해줘야함.(해당IP가 누구의 어디 에 있는지 알아야 패킷을 전달해줌)

가 : C,A
나 : 불가능, A가 라우터 역활이 되면 가능, 포트포워딩 socat 명령어를 통해 가능
다 : B


[운영]

: 개발이 끝나고 테스트에 이상이 없어 운영계로 넘어와 실업무에 활용 하는 단계

1) 시스템에 대한 안정성 확보

  • 장애나, 재해 발생 시 우리 시스템은 안전하다! 보장
    장애 : 버그, 외부공격, 고장 등
    재해 :화제, 홍수, 지진 등...
  • 대응방안 : 이중화, 시큐어코딩, 백업, 정기점검, 대응훈련
    • 이중화 : 200km이상 떨어진 물리적인 장소
      Hot, Warm, Cold , Mirror site , 풀백업, 차등백업

2) 협조가 잘되어야함


[Splunk]

DB(index) 구성요소 table(sourcetype) >> column(field) >> data
botsv1 suricata,...

  • SIEM : 로그를 전달받아 위협데이터를 분석할 수 있는 관리 시스템
    -> SPlunk로 대체되고있음
    -> 이유 : Splunk는 현재 정형화되어 있는 모든 로그를 수집하고 쿼리 및 저장할 수 있기 때문에
    -> 이기종간에 로그를 모두 한곳으로 모아 연관성을 분석 가능

  • 이미 다른 스플렁크에서 저장된 데이터를 >> 강제로 압축해서 추출 >> 강제로 데이터 영역에 붙여넣기

  • /opt/splunk/etc/apps/ 에 저장된 데이터(결국 여기가 인덱스 만들면 저장되는 경로)


문제


index 파악은 어렵지 않다.
sourcetype은 별도로 파악 >> 어떤 데이터들이 저장되어 있는지 파악
index="botsv1" earliest=0
*splunk는 시단단위로 검색

suricata
stream:http
stream:dns
Xml~~~sysmon
ftg_utm

dedup : 중복제거
table : 필드 내용 출력


1)
index="botsv1" earliest=0 sourcetype="suricata" alert.signature ="*"
-> 출력 결과에 따라 CVE가 표시된 필드 확인 > 가장 빈도가 높은 CVE확인

2)
index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com

3)
index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com
-> agent 필드에서 확인 가능

4)
index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com
-> dest ip 확인

5)
index="botsv1" earliest=0 imreallynotbatman.com "http.http_user_agent"="Python-urllib/2.7" src_ip="23.22.63.114"
user_agent가 WEB이 아닌것 중 빈도가 높은것
mozilla 문자열이 붙음

6)
index="botsv1" earliest=0 imreallynotbatman.com "http.http_user_agent"="Python-urllib/2.7" src_ip="23.22.63.114"
/joomla/administrator/index.php >> CMS 관리자 로그인페이지

7)
index="botsv1" earliest=0 imreallynotbatman.com "http.http_user_agent"="Python-urllib/2.7" src_ip="23.22.63.114"
data가 서버로 전송되었다.


8)
index="botsv1" earliest=0 imreallynotbatman.com src_ip="23.22.63.114" form_data="username=admin" POST http_user_agent="Mo"

9)
index="botsv1" earliest=0 imreallynotbatman.com form_data="username=admin*" src_ip="23.22.63.114" python

10)
index="botsv1" earliest=0

40.80.148.42

11)
index="botsv1" earliest=0 sourcetype="Xml*" 3791.exe


12)

13)
index="botsv1" earliest=0 imreallynotbatman.com prankglassinebracket.jumpingcrab.com

14)
index="botsv1" earliest=0 earlist=0 sourcetype="fgt_utm" 40.80.148.42 SQL

15)


4일차 : 테라폼 + 웹서버 배포

1. 테라폼 설치

2. VSC 테라폼 기능 확장

  • 확장기능을 통해 테라폼 설치
  • 오픈폴더를 통해 프로젝트 폴더 지정
  • 새 파일(terra.tf)생성

3. AWS 클라우드 기능 확인

  • IAM,EC2,VPC
  • IAM : 정책,사용자 계정 관리, 엑세스키, 보안관리 >> 엑세스 키 생성
  • EC2 : 서버(OS,서버 성능,볼륨,EIP,퍼블릿,SG,서버이름,키페어)
    • OS : AMI ID
    • 성능 : t2.micro
    • 키페어: ~.pem
    • VPC : EIP,퍼블릿모드,SG,Subnet
  • VPC : 태그, CIDR
    • 서브넷 : 이름, 가용영역, CIDR, VPC ID
    • 라우팅테이블 : 이름, VPC, CIDR,LGW
    • 인터넷게이트웨이(IGW) : 이름, VPC
    • EIP : 리전정보
    • SG : 이름,태그,설명,VPC,인/아웃바운드 규칙
    • ENI=네트워크 인터페이스=프라이빗 IP를 할당 : 서브넷,SG,IP

4. 테라폼 파일 구문 이해

terraform init #문제점 체크
terraform plan #변수 내용들 출력
terraform apply #배포 및 구축 작업 수행
terraform destroy #배포된 인프라 삭제

  • 구문작성 할때 : 큰틀 > 작은틀로 작성하는 것이 best!
    -> vpc가 ec2보다 큰틀 !

5. 웹서버 배포작업

  • 인스턴스 배포 + 자동으로 apache1(httpd)서버가 설치되고 실행되도록 설정 + 코드작성 후 웹 서버 접속 후 테스트
    • 접속이 안되는 이유 1 : 명령어 실행이 안되는 경우
    • 접속이 안되는 이유 2 : 설치가 늦는 경우
    • 접속이 안되는 이유 2-2: 설치는 되었지만 파일을 지정하지 않은 경우

6. state 내용 확인

  • terraform state list
  • terraform state show 변수명

7. 삭제


5일차 : 웹 취약점 진단 플랫폼 구축

= 도커+테라폼

1. 도커를 실행하기 위한 sh파일 생성

2. 테라폼 파일 생성

sudo docker run --name smtpd -d --restart always -p 25:25 -e "RELAY_POSTMASTER=postmaster@darkrelay.io" -e \
"RELAY_MYHOSTNAME=smtp-relay.darkrelay.io" -e "RELAY_MYDOMAIN=darkrelay.io" -e "RELAY_HOST=[127.0.0.1]:25" \
turgon37/smtp-relay

sudo docker run --name samba -d --restart always -p 139:139 -p 445:445 -p 137:137/udp -p 138:138 dperson/samba -v \
/tmp/test/share:/share:r -v /tmp/test/servershare:/servershare:r -v /tmp/test/johnshare:/johnshare:r -v /tmp/test/bobshare:/bobshare:r \
-u "john;password1" \
-u "bob;password2" \
-s "public;/share" \
-s "servershare;/tmp/test/servershare;no;no;no;john,bob" \
-s "johnshare;/tmp/test/johnshare;yes;no;no;john" \
-s "bobshare;/tmp/test/bobshare;yes;no;no;bob" \

-S : 표준모드로 동작, 자체적으로 인증절차 거침
-p : 인증없이 접근 가능하게

no;no;no;bob : 읽기쓰기설정, 브라우징, 게스트접근, 접근가능 사용자

profile
시들시들한 올빼미

0개의 댓글