[AWS] 공격 환경 구성하기[AWS] 공격 환경 구성하기

[AWS] 공격 환경 구성하기

생성 일시
Sep 9, 2026 11:46 AM
최종 편집 일시
Last updated September 11, 2026
태그
AWS
terraform
Infra
작성자
@김태형
Date

🎯 목표 설정

팀 근두운 멤버들이 AWS 인프라에서 공격 시나리오를 직접 경험할 수 있도록 공통된 공격 환경을 구성하기로 하였다. 공격 환경은 동일 팀 계정 내에서 VPC를 분리하여 구축하는 것으로 결정하였다. 그리고, 공격에 활용할 서버는 EC2에 Kali Linux GUI를 이용하는 것으로 한다.
Kali Linux는 AWS Marketplace에서 Kali 공식 AMI를 무료로 활용할 수 있으며, 여러 가지 보안 실습 도구를 기본적으로 제공하고 있고, GUI 환경도 지원하기 때문에 가장 적합하다고 판단하였다.
이번 단계에서는 공격 환경 전용 VPC를 구축하고, EC2에 Kali Linux를 설치, 팀원 모두가 Kali Linux GUI에 접근할 수 있도록 구현하는 것을 목표로 한다.

🏛️ 목표 설계 아키텍처

graph TD
    subgraph AD["WHS4_ATTACK Group"]
        AD1["Admin PC</br>(Attacker)"]
    end
    INT(("Internet"))
    SSM["AWS SSM</br>(Systems Manager)"]
    IGW("Internet Gateway")
    subgraph VPC["VPC 10.180.0.0/16"]
        subgraph PB["Public Subnet 10.180.40.0/24"]
            SG["Security Group</br>Inbound 없음</br>Outbound TCP 443 허용"] -.-|"정책 적용"| EC2["EC2: Kali Linux"]
        end
    end
AD1 <-->|"SSM 세션</br>Shell and PortForwarding"| SSM
INT --> SSM
INT <--> IGW --- SG
EC2 -->|"SSM 서비스</br>HTTPS"| IGW

🧑🏻‍🔧 공격자 EC2 설계

공격자 EC2는 팀 근두운 AWS 침해사고 대응 실습 과정에서 모의 해킹을 진행할 주체로 목표 설정에서 정의한 것처럼 Kali Linux GUI를 채택하였다.
우선 EC2에 Kali Linux AMI를 사용하기 위해 팀 근두운 계정 내 AWSMarketplaceFullAccess 권한이 있는 IAM 사용자로 AWS Marketplace에서 Kali Linux를 구독한다. Kali Linux AMI는 무료로 제공되며, 구독을 통해 활성화 하면 사용이 가능하다.
AWS Marketplace Kali Linux AMI(Kali 공식) - AWS Marketplace: Kali Linux
EC2와 같은 클라우드 환경에서 Kali Linux는 기본적으로 CLI 환경으로 제공된다. 이를 GUI 환경으로 제어하기 위해 VNC를 활용할 것이다.
VNC(Virtual Network Computing)는 RFB 프로토콜을 사용해 다른 컴퓨터의 화면을 실시간으로 공유하고 제어하는 원격 접속 기술로, 로컬에서 EC2의 Kali Linux를 GUI로 접속하는 것을 가능하게 해준다.
일반적으로 VNC는 GUI를 표현해주는 서버와 이를 원격 접속하여 사용하는 VNC Viewer로 구성되어 있다. 즉, Kali Linux GUI 접속을 위해서는 로컬 환경에 별도의 VNC Viewer를 설치해주어야 한다. 그렇게 되면, 공격 실습을 위해 팀원 모두가 개인 PC에 VNC Viewer를 설치해야 하는 번거로움이 발생한다.
이를 해소하기 위해, Viewer 설치 없이 VNC 서버가 제공하는 GUI를 연결할 방법을 찾게 되었고, noVNC 오픈소스를 활용하면 가능하다는 것을 확인하였다. noVNC는 HTML5와 WebSockets 기술을 활용해 별도의 클라이언트 프로그램 설치 없이 웹 브라우저만으로 원격 접속을 지원한다.
따라서, 팀 근두운 프로젝트에서는 TigerVNC와 noVNC를 조합하여 Kali Linux GUI 접속을 구현할 예정이다.

🖥️ Kali Linux GUI 구현 with TigerVNC and noVNC

구분
역할
TigerVNC
VNC 서버, Kali Linux 내부에서 가상의 GUI 디스플레이 화면을 생성하고 관리
noVNC
웹 인터페이스(Viewer 역할)
Kali Linux GUI 원격 접속을 구현하는 데 필요한 패키지는 다음과 같다.
구분
역할
kali-desktop-xfce
Kali용 Xfce 데스크톱 구성
tigervnc-standalone-server
가상 디스플레이를 만들어주는 VNC 서버
tigervnc-tools
VNC 연결 시 암호 설정 등을 지원하는 보조 도구
novnc
웹 브라우저에서 실행되는 VNC 클라이언트
websockify
웹 소켓 통신을 TCP 통신으로 변환해주는 프록시 도구
dbus-x11
Xfce 세션 내부 프로그램 간 메시지 통신 지원
TigerVNC가 xfce를 실행하도록 설정하여, Kali Linux GUI 데스크톱에 대한 가상 디스플레이를 만들어준다.
# :1번 가상 디스플레이 생성(TCP 5901) tigervncserver :1 \ -localhost yes \ -geometry 1920x1080 \ -depth 24
이를 실행하게 되면, TigerVNC가 127.0.0.1:5901에 대한 Listening을 열게 된다.
이후 noVNC와 websockify를 실행하여 웹 브라우저의 WebSocket 통신을 내부 TigerVNC 127.0.0.1:5901로 전달해주면, 웹 브라우저에서 Kali Linux GUI 원격 접속이 성공적으로 구현된다.
novnc_proxy \ --listen 127.0.0.1:6080 \ --vnc 127.0.0.1:5901
위 과정은 Kali Linux EC2 Shell에 접근해서 수동으로 실행한 예시이고,
팀 근두운 프로젝트에서는 공격자 EC2 인스턴스가 실행되면 해당 서비스들이 자동으로 실행될 수 있도록 TigerVNC와 noVNC를 관리할 systemd를 각각 kali-vnc.service, kali-novnc.service로 데몬을 생성해 주었다.
최초 EC2 생성 시에는 TigerVNC와 Kali Linux의 비밀번호를 생성해주고, kali-vnc 및 kali-novnc 서비스를 Shell에서 수동으로 실행해 주어야 한다.
# EC2 최초 생성 시 관리자가 Shell에서 수동으로 진행 sudo -iu kali tigervncpasswd # TigerVNC 접속 비밀번호 생성 sudo passwd kali # kali User 비밀번호 설정 sudo systemctl start kali-vnc kali-novnc # TigerVNC, noVNC 서비스 실행
그리고, 팀 근두운 멤버들이 Kali Linux GUI가 구현되어 있는 EC2에 원격 접속하기 위한 방식으로는 Wazuh Dashboard 접속 방식과 동일하게 SSM 포트포워딩을 활용하여 보안그룹에 별도의 인바운드 정책을 설정하지 않고, 접속할 수 있는 구조로 설계한다.
SSM 포트포워딩 설명 - 근두운 기술 블로그근두운 기술 블로그[AWS] Terraform 코드로 Wazuh 인프라 구축
EC2에 설치된 noVNC 6080포트를 로컬의 6080포트와 포워딩 세션을 맺어주면, 세션이 유지되는 동안 웹 브라우저에서 http://localhost:6080/vnc.html로 접속하면 noVNC 인터페이스가 실행 되며, 연결 시 TigerVNC의 비밀번호를 입력받아 EC2의 Kali Linux GUI를 사용할 수 있게 된다.
http://localhost:6080/vnc.html 접속했을 때의 noVNC 인터페이스http://localhost:6080/vnc.html 접속했을 때의 noVNC 인터페이스
http://localhost:6080/vnc.html 접속했을 때의 noVNC 인터페이스
noVNC를 통해 Kali Linux GUI에 접속한 화면noVNC를 통해 Kali Linux GUI에 접속한 화면
noVNC를 통해 Kali Linux GUI에 접속한 화면

🧑🏻‍💻 Terraform 코드 작성

공격자 환경은 attacker라는 별도의 폴더에서 리소스별로 분리하여 테라폼 코드를 작성하였다.
공격자 EC2도 위에서 언급한 대로 SSM 포트포워딩으로 접속해야 하기 때문에, EC2에 SSM 서비스 관련 권한 정책을 붙여 주어야 한다. 이는 Wazuh 구축 시 만들었던 SSM 권한 정책을 활용한다.
이전 단계 victim 환경 구성 시 활용했던 terraform_remote_state를 통해 platform/wazuh의 state를 보관하는 S3 백엔드 버킷에서 해당 권한 정책의 arn을 불러 와서 연결해 준다.
platform/wazuh/outputs.tf
# platform/wazuh 모듈 output "ssm_policy_arn" { value = aws_iam_policy.ssm_role.arn }
 
attacker 모듈 Terraform 코드 구성
  • versions.tf - terraform과 aws provider 버전을 명시하는 코드
  • providers.tf - provider를 정의하는 코드
  • variables.tf - attacker 모듈에서 사용할 변수를 정의하는 코드
  • backend.tf - terraform apply 시 테라폼이 관리할 state를 보관하는 곳을 정의하는 코드
  • remote_state.tf - 다른 모듈의 state data를 사용하기 위해 원격 저장소를 불러오는 코드
  • main.tf - 공격자용 네트워크를 구축하고, Kali Linux EC2를 생성, 보안그룹을 정의하는 코드
  • iam.tf - 공격자 EC2의 IAM Role을 생성하고, SSM 서비스를 위한 권한 정책을 정의하는 코드
versions.tf
terraform { required_version = ">=1.11" required_providers { aws = { source = "hashicorp/aws" version = ">=5.31" } } }
providers.tf
provider "aws" { region = "ap-northeast-2" }
variables.tf
# ======================================================= # Project Name 변수 (tags 에 활용) # ======================================================= variable "project_name" { description = "tags 에 명시할 프로젝트 이름" type = string default = "kintoun-secops-infra" } # ======================================================= # IAM Role 경로 접두사 # ======================================================= variable "iam_role_path_prefix" { description = "IAM Role 경로 접두사" type = string default = "/project/" validation { condition = startswith(var.iam_role_path_prefix, "/project/") && endswith(var.iam_role_path_prefix, "/") error_message = "iam_role_path_prefix는 /project/ 로 시작하고 / 로 끝나야 한다." } } # ======================================================= # 팀 근두운 권한경계 # ======================================================= variable "permissions_boundary_arn" { description = "IAM Role에 붙일 권한경계" type = string default = "arn:aws:iam::446413909569:policy/KintounGuardrailBoundary" } # ======================================================= # 공격자용 VPC 주소 범위 변수 # ======================================================= variable "attacker_vpc_cidr" { description = "Attacker용 VPC IPv4 CIDR 대역" type = string default = "10.180.0.0/16" validation { condition = can(cidrnetmask(var.attacker_vpc_cidr)) error_message = "attacker_vpc_cidr는 올바른 IPv4 CIDR 형식이어야 한다." } } # ======================================================= # Attacker EC2 배치할 Public Subnet 주소 범위 변수 # ======================================================= variable "attacker_public_subnet_cidr" { description = "Attacker EC2 용 퍼블릭 서브넷 IPv4 CIDR 대역" type = string default = "10.180.40.0/24" validation { condition = can(cidrnetmask(var.attacker_public_subnet_cidr)) error_message = "attacker_public_subnet_cidr는 올바른 IPv4 CIDR 형식이어야 한다." } } # ======================================================= # Kali Linux AMI ID 변수 # ======================================================= variable "kali_ami_id" { description = "AWS Marketplace에서 확인한 Kali Linux AMI ID" type = string default = "ami-0e135ab9f8f216efd" # 2026.2-amd64 버전 }
backend.tf
terraform { backend "s3" { bucket = "kintoun-tfstate" key = "platform/attacker/terraform.tfstate" region = "ap-northeast-2" use_lockfile = true encrypt = true } }
remote_state.tf
# ======================================================= # platform/wazuh 모듈 가져오기 # ======================================================= data "terraform_remote_state" "wazuh" { backend = "s3" config = { bucket = "kintoun-tfstate" key = "platform/wazuh/terraform.tfstate" region = "ap-northeast-2" } } # ======================================================= # platform 모듈의 EC2용 SSM 권한 정책 사용(Portforwarding/session manager) # ======================================================= locals { ec2_ssm_policy_arn = data.terraform_remote_state.wazuh.outputs.ssm_policy_arn }
main.tf
# ============================ Network 설정 ============================ # # ======================================================= # VPC 생성 for Attacker # ======================================================= resource "aws_vpc" "attacker_vpc" { cidr_block = var.attacker_vpc_cidr enable_dns_hostnames = true enable_dns_support = true tags = { Name = "${var.project_name}-attacker-vpc" ManagedBy = "Terraform" } } # ======================================================= # Internet Gateway 생성 for Attacker # ======================================================= resource "aws_internet_gateway" "attacker_igw" { vpc_id = aws_vpc.attacker_vpc.id tags = { Name = "${var.project_name}-attacker-igw" ManagedBy = "Terraform" } } # ======================================================= # Public Subnet 생성 for Attacker # ======================================================= resource "aws_subnet" "attacker_public_subnet" { vpc_id = aws_vpc.attacker_vpc.id cidr_block = var.attacker_public_subnet_cidr map_public_ip_on_launch = false tags = { Name = "${var.project_name}-attacker-public-subnet" ManagedBy = "Terraform" } } # ======================================================= # Route Table 생성 및 라우팅 # ======================================================= resource "aws_route_table" "attacker_rt" { vpc_id = aws_vpc.attacker_vpc.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.attacker_igw.id } tags = { Name = "${var.project_name}-attacker-rt" ManagedBy = "Terraform" } } resource "aws_route_table_association" "attacker_rt_association" { subnet_id = aws_subnet.attacker_public_subnet.id route_table_id = aws_route_table.attacker_rt.id } # ============================ EC2 생성 =============================== # # ======================================================= # Attacker EC2 (Kali Linux) 생성 # ======================================================= resource "aws_instance" "attacker_ec2" { ami = var.kali_ami_id instance_type = "t3.medium" subnet_id = aws_subnet.attacker_public_subnet.id vpc_security_group_ids = [ aws_security_group.attacker_sg.id ] iam_instance_profile = aws_iam_instance_profile.attacker_ec2_profile.name associate_public_ip_address = true user_data = file("${path.module}/files/kali-install.sh") user_data_replace_on_change = false root_block_device { volume_type = "gp3" iops = 3000 throughput = 125 encrypted = true delete_on_termination = true } metadata_options { http_endpoint = "enabled" http_tokens = "required" http_put_response_hop_limit = 1 } lifecycle { ignore_changes = [ ami, associate_public_ip_address ] } tags = { Name = "${var.project_name}-kali-attacker-ec2" ManagedBy = "Terraform" } volume_tags = { Name = "${var.project_name}-kali-attacker-ec2-root-volume" ManagedBy = "Terraform" } } # ============================ 보안그룹 설정 ============================ # # ======================================================= # Security Group 생성 for Attacker EC2 # ======================================================= resource "aws_security_group" "attacker_sg" { name = "${var.project_name}-attacker-sg" description = "Security Group for Attacker EC2" vpc_id = aws_vpc.attacker_vpc.id tags = { Name = "${var.project_name}-attacker-sg" ManagedBy = "Terraform" } } resource "aws_vpc_security_group_egress_rule" "attacker_ec2_https" { security_group_id = aws_security_group.attacker_sg.id cidr_ipv4 = "0.0.0.0/0" from_port = 443 to_port = 443 ip_protocol = "tcp" description = "SSM Service and Package Install and ALB access" }
files/kali-install.sh
#!/bin/bash set -Eeuo pipefail exec > >(tee -a /var/log/kali-bootstrap.log \ | logger -t kali-bootstrap -s 2>/dev/console) 2>&1 trap 'echo "[ERROR] 설치 실패: line=$LINENO"' ERR echo "[INFO] Kali Linux GUI 및 SSM 설치 시작" export DEBIAN_FRONTEND=noninteractive # Kali apt 패키지 저장소 기본 주소를 https://로 변경 KALI_APT_SOURCE="/etc/apt/sources.list.d/kali.sources" if [[ ! -f "${KALI_APT_SOURCE}" ]]; then echo "[ERROR] Kali APT 저장소 파일이 없습니다: ${KALI_APT_SOURCE}" exit 1 fi # 현재 AMI가 어떤 저장소를 사용하는지 변경 전에 로그로 남김 echo "[INFO] 변경 전 Kali APT 저장소:" grep -E '^(Types|URIs|Suites|Components|Signed-By):' \ "${KALI_APT_SOURCE}" || true # 기존 URI의 주소 무시, URIs 행 전체를 공식 HTTPS 주소로 교체 sed -i -E \ 's#^[[:space:]]*URIs:[[:space:]].*$#URIs: https://http.kali.org/kali/#' \ "${KALI_APT_SOURCE}" # 변경 결과를 bootstrap 로그에 출력 echo "[INFO] 변경 후 Kali APT 저장소:" grep -E '^(Types|URIs|Suites|Components|Signed-By):' \ "${KALI_APT_SOURCE}" # 공식 HTTPS 주소가 정확하게 설정됐는지 검증 if ! grep -Eq \ '^URIs:[[:space:]]+https://http\.kali\.org/kali/?[[:space:]]*$' \ "${KALI_APT_SOURCE}"; then echo "[ERROR] Kali 공식 HTTPS 저장소 설정에 실패했습니다." exit 1 fi apt-get update apt-get install -y --no-install-recommends \ ca-certificates \ wget install -d -m 0755 /tmp/amazon-ssm-agent # Debian x86_64용 SSM Agent 다운로드 wget --https-only --secure-protocol=TLSv1_2 \ "https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb" \ -O /tmp/amazon-ssm-agent/amazon-ssm-agent.deb apt-get install -y /tmp/amazon-ssm-agent/amazon-ssm-agent.deb systemctl enable --now amazon-ssm-agent echo "[INFO] SSM Agent 설치 완료" # Kali Xfce GUI와 브라우저 원격 접속에 필요한 프로그램 설치 apt-get install -y \ kali-desktop-xfce \ dbus-x11 \ tigervnc-standalone-server \ tigervnc-tools \ novnc \ websockify # TigerVNC 설정 및 비밀번호 파일을 저장할 디렉터리 생성 install -d \ -m 0700 \ -o kali \ -g kali \ /home/kali/.config/tigervnc # TigerVNC는 모니터가 없는 서버에 가상 화면을 만들어 줌 # 가상화면 :1은 내부적으로 TCP 5901 포트 사용 cat > /etc/systemd/system/kali-vnc.service <<'EOF' [Unit] Description=Kali TigerVNC virtual desktop After=network-online.target Wants=network-online.target # VNC 암호 파일이 없으면 서비스 실행하지 않도록 설정 ConditionPathExists=/home/kali/.config/tigervnc/passwd [Service] Type=simple # GUI와 VNC 서버를 root가 아닌 kali 사용자로 실행 User=kali Group=kali WorkingDirectory=/home/kali Environment=HOME=/home/kali Environment=USER=kali # localhost yes: EC2 외부에 공개하지 않고 로컬 접속만 허용 # SecurityTypes VncAuth: 비밀번호 인증을 반드시 사용하도록 설정 # xstartup: 접속 시 Kali Xfce 데스크톱 실행 ExecStart=/usr/bin/tigervncserver :1 \ -fg \ -localhost yes \ -SecurityTypes VncAuth \ -PasswordFile /home/kali/.config/tigervnc/passwd \ -geometry 1920x1080 \ -depth 24 \ -xstartup /usr/bin/startxfce4 # 서비스 종료 시 가상화면 :1(tcp 5901)도 종료 ExecStop=-/usr/bin/tigervncserver -kill :1 # 정상/비정상 종료 시 5초 후 다시 시작 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF # noVNC 관리할 systemd 서비스 생성 # noVNC는 VNC 화면을 웹 브라우저가 이해할 수 있는 형태로 변환 cat > /etc/systemd/system/kali-novnc.service <<'EOF' [Unit] Description=Kali noVNC browser gateway # TigerVNC 가상 화면이 시작된 뒤 noVNC 실행 After=network-online.target kali-vnc.service Wants=network-online.target Requires=kali-vnc.service ConditionPathExists=/home/kali/.config/tigervnc/passwd [Service] Type=simple User=kali Group=kali WorkingDirectory=/home/kali Environment=HOME=/home/kali Environment=USER=kali # noVNC는 EC2의 127.0.0.1:6080 에서만 접속 ExecStart=/usr/share/novnc/utils/novnc_proxy \ --listen 127.0.0.1:6080 \ --vnc 127.0.0.1:5901 # 정상/비정상 종료 시 5초 후 다시 시작 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF # 새로 만든 서비스 설정을 systemd에 반영 systemctl daemon-reload systemctl enable kali-vnc.service systemctl enable kali-novnc.service rm -f /tmp/amazon-ssm-agent/amazon-ssm-agent.deb echo "[INFO] SSM + noVNC 패키지 설치 완료" echo "[INFO] Kali 한글 설치 및 Timezone 설정" timedatectl set-timezone Asia/Seoul apt install -y fonts-nanum fc-cache -f echo "[INFO] Kali 한글 설치 및 Timezone 설정 완료" touch /var/lib/kali-bootstrap-complete echo "[SUCCESS] 전체 설치 완료"
iam.tf
# 공격자용 Attacker EC2에 접속하기 위한 SSM 정책과 # 해당 EC2에 대한 포트포워딩을 열 수 있도록 정책 생성(연결은 identity 모듈에서) # 그리고, 서버 초기 세팅을 위해 EC2 Shell에 접근할 수 있는 정책 생성 # ======================================================= # IAM Role 생성 for Attacker EC2 # ======================================================= data "aws_iam_policy_document" "attacker_role_trust" { statement { sid = "AssumeRoleForAttackerEC2" effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["ec2.amazonaws.com"] } } } resource "aws_iam_role" "attacker_ec2_role" { name = "${var.project_name}-attacker-ec2-role" path = "${var.iam_role_path_prefix}attacker/" assume_role_policy = data.aws_iam_policy_document.attacker_role_trust.json permissions_boundary = var.permissions_boundary_arn tags = { Name = "${var.project_name}-attacker-ec2-role" ManagedBy = "Terraform" } } # ======================================================= # IAM Role 프로파일 생성 for Attacker EC2 # ======================================================= resource "aws_iam_instance_profile" "attacker_ec2_profile" { name = "${var.project_name}-attacker-ec2-profile" role = aws_iam_role.attacker_ec2_role.name } # ======================================================= # SSM 서비스 권한 정책 for Attacker EC2(platform/wazuh 모듈 활용) # ======================================================= resource "aws_iam_role_policy_attachment" "attacker_ssm" { role = aws_iam_role.attacker_ec2_role.name policy_arn = local.ec2_ssm_policy_arn } # ======================================================= # Kali Linux GUI(noVNC 사용을 위한 포트포워딩 정책 생성 for user) # ======================================================= data "aws_caller_identity" "current" {} data "aws_iam_policy_document" "kali_port_forwarding" { statement { sid = "StartKaliPortForwarding" effect = "Allow" actions = ["ssm:StartSession"] resources = [ aws_instance.attacker_ec2.arn, "arn:aws:ssm:ap-northeast-2::document/AWS-StartPortForwardingSession" ] } statement { sid = "SessionManage" effect = "Allow" actions = [ "ssmmessages:OpenDataChannel", "ssm:ResumeSession", "ssm:TerminateSession" ] resources = [ "arn:aws:ssm:ap-northeast-2:${data.aws_caller_identity.current.account_id}:session/&{aws:username}-*" ] } } resource "aws_iam_policy" "kali_ssm_port_forwarding" { name = "${var.project_name}-kali-ssm-port-forwarding" description = "Allow PortForwarding to Kali Linux GUI" policy = data.aws_iam_policy_document.kali_port_forwarding.json tags = { Name = "${var.project_name}-kali-ssm-port-forwarding" ManagedBy = "Terraform" } } # ======================================================= # Kali Linux 초기 설정을 위한 Shell 접속 정책 생성 for user # ======================================================= data "aws_iam_policy_document" "kali_shell_access" { statement { sid = "StartKaliShellSession" effect = "Allow" actions = ["ssm:StartSession"] resources = [ aws_instance.attacker_ec2.arn, "arn:aws:ssm:ap-northeast-2:${data.aws_caller_identity.current.account_id}:document/SSM-SessionManagerRunShell" ] } } resource "aws_iam_policy" "kali_shell_access" { name = "${var.project_name}-kali-shell-access" description = "Allow Shell Access to Kali Linux" policy = data.aws_iam_policy_document.kali_shell_access.json tags = { Name = "${var.project_name}-kali-shell-access" ManagedBy = "Terraform" } }

🚥 Trivy로 Misconfiguration 점검

attacker 모듈의 Terraform 코드도 Trivy 도구를 사용해 설정오류를 점검하였다.
notion imagenotion image
 
main.tf에서 Misconfigurations이 총 2건 탐지된 것을 확인할 수 있다.
  1. [CRITICAL] 보안그룹 규칙이 모든 IPv4 주소를 허용하고 있음
notion imagenotion image
앞선 단계에서도 자주 보던 보안그룹의 아웃바운드 정책이 “0.0.0.0/0”을 허용하고 있어 발생한 보안 경고이다. 해당 설정은 공격자 EC2 설계 단계에서도 동일한 목적(Kali Linux EC2 패키지 설치 및 SSM Session Manager 관리)으로 위험을 수용한다.
  1. [MEDIUM] 모든 VPC에 대한 Flow 로그 활성화 요구
notion imagenotion image
VPC 생성 시 VPC Flow 로그를 활성화하지 않고 있어서 보안 경고가 발생하였다. https://avd.aquasec.com/misconfig/aws-0178에서 해당 Misconfiguration을 자세히 보면, 모든 VPC에 대한 Flow 로그를 활성화 하여 네트워크 트래픽에 대한 가시성을 확보하는 것을 권장한다.
하지만, 팀 근두운은 공격자 환경을 실습하기 좋게 AWS에 구현한 것으로 실제 공격자 환경이라고 가정하기 때문에 해당 VPC에 Flow 로그를 활성화 하는 것은 실습 목적에 불필요하다고 판단하여 Flow 로그 비활성화를 유지한다.
Victim EC2의 서브넷 영역만 Flow 로그를 활성화 하여 트래픽을 관찰할 것이다.
 

💁 마무리

공격자 환경 구축을 통해, 팀 근두운에서 공격 시나리오를 적용할 인프라 설계를 마쳤다. 이제 AWS 보안 서비스들을 활용해, SecOps를 적용해 나가면서 보안 시스템의 역할과 보안 사고 대응 과정 등을 이해하는 시간으로 확대해 나갈 예정이다.
다음 단계에서는 공격 시나리오를 직접 인프라에 적용해 보고, 공격 단계별 IoC를 분석하는 과정을 진행할 것이다. 그렇게 되면, 분석 결과를 통해 이를 탐지하고 대응할 수 있는 SIEM 탐지룰 설계가 가능할 것으로 기대한다.