[구축/운영] 5일차 Terraform - docker

djEjgrpgksmsrjwl·2025년 1월 3일

SK shieldus Rookies 23기

목록 보기
17/24

[5일차]
도커 + 테라폼 = 웹 취약점 진단 플랫폼 구축

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

#!/bin/bash
└> sh 처음 선언해줘야 할 것 쉐뱅(Shebang)이라고 불리는 특별한 구문으로, 스크립트가 어떤 해석기(interpreter)를 사용해 실행될지 지정하는 역할을 합니다.

127.0.0.1
└> 루프백(Loopback) 주소라고 하며, 자신의 컴퓨터를 가리키는 특수한 로컬 주소입니다. 이것을 localhost라고도 합니다. 예를 들어, 127.0.0.1에 접근하면 자신의 컴퓨터에서 실행 중인 서버나 애플리케이션과 통신하게 됩니다.

docker run --add-host <호스트명>:<IP주소> <이미지명>
--add-host
└> 신뢰할수 있게 지정하는 옵션 ( 컨테이너 내부의 /etc/hosts 파일에 특정 호스트 이름과 해당 IP 주소를 추가하는 역할 )

NFS(Network File System)는 네트워크를 통해 파일을 공유할 수 있게 해주는 파일 시스템입니다.

#!/bin/bash

set -e  # error 발생시 중단 [ 선택사항 ]

sudo apt update
sudo apt install docker.io -y
sudo systemctl enable docker  # 도커가 시스템 reboot 후에도 docker 데몬 자동 실행
sudo systemctl start docker
sudo apt install netcat  # nc 설치
sudo apt install net-tools
mkdir -p /tmp/test/share
mkdir -p /tmp/test/nfsshare
mkdir -p /tmp/test/servershare
mkdir -p /tmp/test/johnshare
mkdir -p /tmp/test/bobshare
sudo chmod -R 777 /tmp/test  # test 하위디렉토리 권한 모두 777 준다
echo secretpass > /tmp/test/share/password.txt
echo secretpass > /tmp/test/nfsshare/password.txt

# Docker Network Check
if ! docker network inspect local-network > /dev/null 2>&1; then      # 기본으로 있는 네트워크를 치우고
     docker network create local-network        # 현 상황에 맞도록 로컬 네트워크 새로생성
fi

# Docker JuiceShop Install
sudo docker pull bkimminich/juice-shop  # pull 이미지를 다운로드함
sudo docker run -d --restart always -p 80:3000 bkimminich/juice-shop  # docker exec

# Docker DVWA Install
sudo docker pull vulnerables/web-dvwa
sudo docker run --name dvwa -d -p 81:80 --restart always --network local-network vulnerables/web-dvwa

# Docker XVWA Install
sudo docker pull bitnetsecdave/xvwa
sudo docker run --name xvwalocal -d -p 127.0.0.1:8082:80 --restart always --network local-network --add-host dvwa:127.0.0.1 bitnetsecdave/xvwa # dvwa를 통해서 xvwa에 들어가는
sudo docker run --name xvwa -d -p 82:80 --restart always bitnetsecdave/xvwa # port 식별해야지만 scan 식별이 되서 xvwa에 접속

# Docker dvga Install
sudo docker pull frost19k/dvga
sudo docker run --name dvga -d --restart always -p 84:5013 frost19k/dvga

# Docker vampi Install
sudo docker pull erev0s/vampi
sudo docker run --name vampi -d --restart always -p 85:5000 erev0s/vampi

# Docker samba Install
# -u : 이옵션은 유저를 설정해주는것임.
# -S : 표준모드로 동작, 자체적으로 인증정차 거침
# -p : 인증없이 접근 가능하게
# no;no;no;bob : 읽기쓰기설정;브라우징, 게스트접근,접근가능 사용자
sudo docker pull dperson/samba
sudo docker run --name samba -d --restart always -p 139:139 -p 445:445 -p 137:137/udp -p 138:138 -v /tmp/test/share:/share:ro -v /tmp/test/servershare:/servershare:ro -v /tmp/test/johnshare:/johnshare:ro -v /tmp/test/bobshare:/bobshare:ro dperson/samba -S -p \
    -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"

# Docker Backdoored Install
sudo docker pull uexpl0it/vulnerable-packages:backdoored-vsftpd-2.3.4
sudo docker run --name vsftpd -d --restart always -p 21:21 -p 6200:6200 uexpl0it/vulnerable-packages:backdoored-vsftpd-2.3.4

# Docker SMTP-relay Install
sudo docker pull turgon37/smtp-relay
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

# Docker snmp Install    #네트워크를 관리해주는
sudo docker pull ehazlett/snmpd:latest
sudo docker run --name snmpd -d --restart always -p 161:161/udp -p 199:199 ehazlett/snmpd:latest

# Docker NFS Server Install          --privileged => 권한 부여 옵션
sudo docker pull itsthenetwork/nfs-server-alpine
sudo docker run --name nfs -d --restart always --privileged -v /tmp/test/nfsshare:/nfsshare -e SHARED_DIRECTORY=/nfsshare -p 2049:2049 itsthenetwork/nfs-server-alpine

# Docker SSL Vuln Install
sudo docker pull vulhub/openssl:1.0.1c-with-nginx
sudo docker run --name heartbleed -d -p 443:443 -p 8080:80 -v /var/www/html:/var/www/html vulhub/openssl:1.0.1c-with-nginx

sh 구문 작성 시
칼리 도커 설치
apt install docker.io -y
해서 명령어 한줄 씩 검증하며 작성 진행함
원래 TEST는 설치하고자 하는 환경에서 진행
여기서는 아마존 EC2에서 test 해야함

2. 테라폼 파일 생성

terraform apply --auto-approve
--auto-approve
└ 설치 할때 -y 안써도 되도록 자동화

provider "aws" {
  region     = "us-east-1"
  access_key = "AKI*****************"
  secret_key = "W5Yv***********************************"
}

# sh exec(실행)
data "template_file" "install_script" {
    template = "${file("terralab.sh")}"
}

# ip check(확인)  # 내 아이피만 접속 할 수 있게 하려고 -> SG add
data "http" "myip" {
    url = "http://ipv4.icanhazip.com"  #내가 사용하는 공인아이피 알려주는 사이트
}

# ssh connections
# ssh-keygen -q -t rsa -N '' -f ~/.ssh/terralab <<<y >/dev/null 2>&1
# resource "aws_key_pair" "terralab" {
#     key_name = "lab021"
#     public_key = file("~/.ssh/terralab.pub")
  
# }

resource "aws_vpc" "lab_vpc021" {
    cidr_block = "10.0.0.0/16"   # change 알맞게 변경해서 사용할 것

    tags = {
        Name = "lab_vpc021"
    }
}

resource "aws_subnet" "lab_sub021" {
    vpc_id = aws_vpc.lab_vpc021.id
    cidr_block = "10.0.0.0/24"   # change 알맞게 변경해서 사용할 것
    availability_zone = "us-east-1a"

    tags = {
        Name = "lab_sub021"
    }
}

resource "aws_internet_gateway" "lab_igw021" {
    vpc_id = aws_vpc.lab_vpc021.id

    tags = {
      Name = "lab_igw021"
    }
}

resource "aws_route_table" "lab_rt021" {
    vpc_id = aws_vpc.lab_vpc021.id

    route{
        cidr_block = "0.0.0.0/0"
        gateway_id = aws_internet_gateway.lab_igw021.id
    }
    tags = {
      Name = "lab_rt021"
    } 
}
resource "aws_route_table_association" "lab_rta021" {
    subnet_id = aws_subnet.lab_sub021.id
    route_table_id = aws_route_table.lab_rt021.id  
}


resource "aws_security_group" "lab_sg021" {
    name_prefix = "lab_sg021"
    description = "Leb Security Group Allow/Denny"
    vpc_id = aws_vpc.lab_vpc021.id

# port allow 22,80,81,82,84,85,139,445,137(udp),138,21,25,161(udp),199,2049,443,8080,6200
# chomp가 data 가져오는것임 ex)150.123.110.11 >> 확장성 고려하여 변수로 넣음
    ingress {
        from_port = 22
        to_port = 22
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 80
        to_port = 80
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 81
        to_port = 81
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 82
        to_port = 82
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 84
        to_port = 84
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 85
        to_port = 85
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 139
        to_port = 139
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 445
        to_port = 445
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 137
        to_port = 137
        protocol = "udp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 138
        to_port = 138
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 21
        to_port = 21
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 25
        to_port = 25
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 161
        to_port = 161
        protocol = "udp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 199
        to_port = 199
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 2049
        to_port = 2049
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 443
        to_port = 443
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 8080
        to_port = 8080
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    ingress {
        from_port = 6200
        to_port = 6200
        protocol = "tcp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]  
    }
    # ping
    ingress {
        from_port = 0
        to_port = 0
        protocol = "icmp"
        cidr_blocks = ["${chomp(data.http.myip.response_body)}/32"]
    }
    egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"   # -1 = all protocol
    cidr_blocks      = ["0.0.0.0/0"]
    }
    tags = {
      Name = "lab_sg021"
    }
}

resource "aws_network_interface" "lab_eni021" {
  subnet_id       = aws_subnet.lab_sub021.id
  private_ips     = ["10.0.0.50"]
  security_groups = [aws_security_group.lab_sg021.id]

}

resource "aws_eip" "lab_eip021" {
  domain                    = "vpc"
  network_interface         = aws_network_interface.lab_eni021.id
  associate_with_private_ip = "10.0.0.50"
  depends_on = [aws_instance.lab_ins021]
}

resource "aws_instance" "lab_ins021" {
    ami = "ami-007855ac798b5175e" # ubuntu 24.04 버전이 높아서 안돼서 낮은 우분투 버전으로 작성함
    instance_type = "t2.medium" # docker가 많이 돌아가서 사양이 micro보다 더 필요함
    key_name = "lab021"

      network_interface {
      network_interface_id = aws_network_interface.lab_eni021.id
      device_index = 0
    }
    
    

    user_data = "${data.template_file.install_script.rendered}" # sh를 받아올건데 rendered해서 받아오기

    tags = {
      Name = "lab_ins021"
    }
}
profile
sunseonghwan

0개의 댓글