[SK shieldus Rookies 19기] 클라우드 보안 기술 3일차

기록하는짱구·2024년 4월 3일
0

SK Shieldus Rookies 19기

목록 보기
25/43
post-thumbnail

📌 웹 서비스 환경 구성 실습

서비스 위주

① 네트워크 구성

①-① VPC 생성

VPC 대시보드에서 본인에게 할당된 리전을 선택, 확인하고 [VPC 생성] 버튼 클릭

①-② 서브넷 생성

①-③ 인터넷 게이트웨이 생성

①-④ 라우팅 테이블을 생성하고 인터넷 게이트웨이로의 라우팅 추가

①-⑤ 서브넷을 퍼블릭 서브넷으로 설정

인터넷 게이트웨이로의 라우팅이 정의되어 있는 라우팅 테이블과 연결된 서브넷

서브넷에서 라우팅 테이블 연결

라우팅 테이블에 서브넷 추가

①-⑥ 보안 그룹 생성

서브넷에 배치되는 인스턴스로 HTTP(80), SSH(22)만 접근을 허용하도록 설정

② 웹 서버 인스턴스 생성

②-① 웹 서버 인스턴스 만들기

나머지 설정은 그대로 유지한 상태로 사용자 데이터에 아래 내용을 추가한 후 [인스턴스 시작] 버튼 클릭

#!/bin/sh

amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
yum -y install httpd php-mbstring

# Start the web server
chkconfig httpd on
systemctl start httpd

# Install the web pages for our lab
if [ ! -f /var/www/html/immersion-day-app-php7.tar.gz ]; then
cd /var/www/html
# wget https://aws-joozero.s3.ap-northeast-2.amazonaws.com/immersion-day-app-php7.tar.gz  
wget https://github.com/myanjini/LAB-AWS/releases/download/2024-03-31/php7-app.tar.gz
tar xvfz php7-app.tar.gz
fi

# 
cat <<EOF > /var/www/html/get-index-meta-data.php
<?php
  \$hostname = gethostname();
  \$results = explode(".", \$hostname);
  echo "<table style='width:100%'>";
  echo "<tr><th style='width:30%'>Meta-Data</th><th style='width:70%'>Value</th></tr>";
  echo "<tr><td>Private IP DNS Name</td><td>".\$hostname."</td></tr>";
  echo "<tr><td>Private IP</td><td>".getHostByName(\$hostname)."</td></tr>";
  echo "<tr><td>Region</td><td>".\$results[1]."</td></tr>";
  echo "</table>";
?>
EOF

# Install the AWS SDK for PHP
if [ ! -f /var/www/html/aws.zip ]; then
cd /var/www/html
mkdir vendor
cd vendor
wget https://docs.aws.amazon.com/aws-sdk-php/v3/download/aws.zip
unzip aws.zip
fi

# Update existing packages
yum -y update

②-② 인스턴스 실행을 확인하고 해당 인스턴스로 SSH 접속

SSH 클라이언트 다운로드 후 설치

https://www.bitvise.com/ssh-client-download

키 등록

EC2 인스턴스로 SSH 접속

SSH 클라이언트로 접속이 안 되는 경우, "인스턴스에 연결" 기능을 이용해 작업

웹 루트 디렉터리로 이동해서 웹 소스 파일 설치 확인

[ec2-user@ip-10-0-10-168 ~]$ cd /var/www/html
[ec2-user@ip-10-0-10-168 html]$ ls
db-update.php            load.php          rds.conf.php        rds-write-config.php
get-cpu-load.php         menu.php          rds-initialize.php  sql
get-index-meta-data.php  php7-app.tar.gz   rds.php             style.css
index.php                put-cpu-load.php  rds-read-data.php   vendor

(파일이 존재하지 않는 경우) 웹 소스 파일을 가져와 설치

사용자 데이터에 입력한 쉘 스크립트가 실행되지 않은 경우

[ec2-user@ip-10-0-10-168 html]$ sudo wget 
https://github.com/myanjini/LAB-AWS/releases/download/2024-03-31/php7-app.tar.gz

[ec2-user@ip-10-0-10-168 html]$ sudo tar xvfz php7-app.tar.gz

[ec2-user@ip-10-0-10-168 html]$ sudo cat <<EOF > /var/www/html/get-index-meta-data.php
 <?php
   \$hostname = gethostname();
   \$results = explode(".", \$hostname);
   echo "<table style='width:100%'>";
   echo "<tr><th style='width:30%'>Meta-Data</th><th style='width:70%'>Value</th></tr>";
   echo "<tr><td>Private IP DNS Name</td><td>".\$hostname."</td></tr>";
   echo "<tr><td>Private IP</td><td>".getHostByName(\$hostname)."</td></tr>";
   echo "<tr><td>Region</td><td>".\$results[1]."</td></tr>";
   echo "</table>";
 ?>
EOF			

②-③ 웹 브라우저를 이용해 퍼블릭 IP로 접속

②-④ 트러블슈팅

⑴ VPC에서 리소스 맵에서 VPC → 서브넷 → 라우팅 테이블 → Internet Gateway로의 연결이 있는지 확인

⑵ 보안 그룹

  • 인바운드 규칙
    IPv4 프로토콜을 사용하는 모든 소스(0.0.0.0/0)로부터 80번 포트와 22번 포트로 접속을 허용

  • 아웃바운드 규칙
    IPv4 프로토콜을 사용하는 모든 트래픽을 Anywhere(0.0.0.0/0)으로 나가는 것을 허용

⑶ EC2 인스턴스

  • ⑴에서 점검한 서브넷에 인스턴스가 생성되었는지 확인
  • ⑵에서 점검한 보안그룹이 인스턴스에 설정되어 있는지 확인

⑷ SSH 접속이 안되는 경우
→ KeyPair가 유효하지 않거나 잘못 지정된 경우이니 인스턴스를 새로 생성하면서 KeyPairs를 새롭게 생성, 지정

⑸ EC2 인스턴스에 /var/www/html 디렉터리가 존재하지 않을 때 사용자 데이터에 입력한 쉘 스크립트의 LAMP 패키지 설치에 실패하고 이후 모든 스크립트가 실패
→ AMI 이미지의 버전(Amazon Linux 2 AMI - Kernel 5.10 ...)이 일치하지 않아서 발생한 문제

③ 웹 서버 인스턴스 추가

③-① (웹 서버 설정이 끝나고 정상적으로 동작하는 것을 확인했다면) 해당 인스턴스를 이용해 AMI 생성

③-② 생성한 AMI를 이용해 웹 서버 인스턴스를 다른 서브넷에 생성

사용자 데이터 항목에 입력했던 쉘 스크립트 생략 가능

③-③ 새롭게 추가한 인스턴스의 퍼블릭 IP 주소를 확인한 후 웹 브라우저로 접속

④ 로드밸런서 구성

동일한 내용의 서비스를 제공하는 인스턴스가 두 개 실행되고 있음

개별 인스턴스의 주소로 접속하는 경우, 이용이 불편하고 부하가 집중되는 문제가 발생할 수 있음
→ 로드밸런서를 이용해 부하를 분산시키고 쉽게 서비스를 이용할 수 있도록 수정

4-1 애플리케이션 로드밸런서 생성

로드밸런서는 SSH 접속이 필요 없으므로, 80 포트의 접속만 허용하는 보안 그룹을 새롭게 생성

나머지 설정을 그대로 유지한 상태에서 [로드밸런서 생성] 버튼 클릭

④-② 로드밸런스가 활성되면 DNS 이름을 확인하고 웹 브라우저로 접속

④-③ 다른 서브넷에 있는 EC2 인스턴스가 돌아가면서 응답하는 것을 확인

⑤ 로드밸런서를 통해서만 서비스를 이용할 수 있도록 제한

현재는 사용자 로드밸런서를 이용하지 않고 개별 인스턴스로 직접 접근하는 것이 가능

모든 요청은 로드밸런서를 통해 처리하도록 수정

보안 그룹을 개별 인스턴스에 로드밸런서로부터 오는 HTTP(80)만 허용하도록 수정

기존에 있던 HTTP 유형의 규칙을 삭제하고 새롭게 규칙 추가

⑤-① 브라우저를 이용해 개별 인스턴스의 퍼블릭 주소와 로드밸런서의 퍼블릭 주소로 접속되는지 확인

→ 로드밸런서로의 접속은 원활하나, 개별 인스턴스의 퍼블릭 주소는 접속되지 않는 것을 확인

📌 Amazon SNS(Simple Notification Service)

애플리케이션과 애플리케이션 또는 애플리케이션과 사용자 간 통신을 위한 완전 관리형 메세징 서비스

게시자에서 구독자(생산자 및 소비자라고도 함)로 메시지를 전송하는 관리형 서비스

https://docs.aws.amazon.com/ko_kr/sns/latest/dg/welcome.html

⑥ 모니터링 기능 추가

⑥-① SNS 콘솔에서 주제(topic) 생성

나머지 설정은 그대로 유지한 상태에서 [주제 생성] 버튼 클릭

⑥-② 구독 생성

본인 이메일로 온 메일 확인

⑥-③ EC2 인스턴스에 경보 설정

⑥-④ 브라우저를 이용해 로드밸런서 주소로 접속 후 LOAD TEST 링크 클릭

⑥-⑤ 이메일 수신함 확인

⑥-⑥ CloudWatch 대시보드 확인

⑥-⑦ 로드밸런서 주소로 접속했던 브라우저 창 종료

⑦ 오토 스케일링(Auto Scaling)

애플리케이션의 부하(load)를 처리할 수 있도록 EC2 인스턴스를 자동으로 증가 또는 감소시켜주는 서비스

Auto Scaling Group

EC2 인스턴스의 모음
Auto Scaling 그룹의 최소/최대 인스턴스 수 지정

⑦-① 시작 템플릿 생성

⑦-② 대상 그룹에 등록된 대상 제거

⑦-③ AutoScaling Group 생성

⑦-④ 로드밸런스 주소로 접속

⑦-⑤ LOAD TEST 링크를 클릭한 후 인스턴스 개수가 증가하는 것을 확인

📌 리소스 중지

① 서비스 중지

ASG에서 용량을 0으로 설정

② EC2 인스턴스 중 개별적으로 생성한 인스턴스 종료

③ LOAD TEST 테스트가 끝나면 반드시 브라우저 종료

④ 최종적으로 모든 EC2가 종료 상태로 나오면 끝

0개의 댓글