SK shieldus Rookies 16기 (클라우드 보안 기술 #07)

만두다섯개·2023년 12월 8일

SK 루키즈 16기

목록 보기
29/52

주요 정보

  • 교육 과정명 : 클라우드기반 스마트융합보안 과정 16기
  • 교육 회차 정보 : '23. 12. 08. 클라우드 보안 기술 #07

학습 내용 요약

(#이전회차)
1. AWS 리소스로 서버리스 웹 애플리케이션 구현

  • 서버리스 아키텍처 개요 및 특징
  • Lambda 함수 실습 3종(런타임 2종, S3 버킷을 사용해 썸네일 이미지 저장)
  • AWS 서버리스 웹 애플리케이션 구현
  • AWS 리소스 정리
  1. Deployment 개요
    • Deployment란?
    • AWS CodeDeploy
  2. CodeDeploy으로 앱 배포 실습
    • CodeDeploy으로 앱 배포 실습 보완
    • 리소스 정리
  3. 2023 SK Shielders AWS 취약점 보고서 소개

Deployment 개요

Deployment란?

  1. 빅뱅 배포
  • 앱 전체 또는 대부분을 한 번에 업데이트
  1. 무중단 배포
  • Rolling = 단계적 배포 = 현재 위치 배포(In-place Deployment)
  • 블루/그린 배포

    각 색깔별로 장비가 별도의 2개로 구성된다.
    서비스 주소를 변경 블루 -> 그린
    그린이 서비스되면 개발자들은 블루를 새로운 버전으로 작업
    장점 : 업데이트 / 롤백 시간이 짧다. 모든 사용자가 한 번에 다음 버전을 사용 가능하다
    단점 : 리소스가 2배로 필요하다(장비 등)
  • 카나리아 배포

장점 : 문제를 겪는 사용자가 적다
단점 : 많은 양의 하드웨어 필요

AWS CodeDeploy

  • EC2 인스턴스, 온프레미스 인스턴스, 서버리스 Lambda 함수 또는 Amazon ECS 서비스로 애플리케이션 배포를 자동화하는 배포 서비스

Code Deploy사용 애플리케이션 배포 실습

1. Code Depoly 역할 생성(2개)

Code Depoly 역할 생성

  • IAM 에서 Code Depoly 역할(Policy)을 생성하자.
  • 이 역할의 권한의 용도는 배포 시 필요하다. (인스턴스 접근 시 등..)
  • 권한 : AWSCodeDeployRole
  • 역할 이름 : CodeDeployRole-015

  • Action 을 확인하면, autoscaling 관련한 ation이 존재한다.

EC2 역할 생성

  • IAM 역할을 생성한다.
  • 권한 : CodeDeployEC2Policy-015
  • 역할 이름 : CodeDeployEC2Policy-015

2. VPC 생성

  • 기본 VPC를 생성해보자
  • VPC - 작업 - 기본 VPC 생성

3. EC2 인스턴스 생성

  • EC2 인스턴스 - 인스턴스 시작
  • 인스턴스 이름 : MyWebServer-015
  • 네트워크 설정은 아래와 같이 진행한다
  • 네트워크 설정 아래 고급 설정에서 사용자 데이터에 아래 코드를 추가한다.
#!/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  
tar xvfz immersion-day-app-php7.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

4. EC2 인스턴스 SSH 접속

  • Bitvise 로 생성한 인스턴스에 접속한다
  • 인스턴스에 설치된 기존 소스코드를 모두 삭제한다.
[ec2-user@ip-172-31-12-248 ~]$ ls /var/www/html
[ec2-user@ip-172-31-12-248 ~]$ sudo rm -rf /var/www/html/*
[ec2-user@ip-172-31-12-248 ~]$ ls /var/www/html

4-1. CodeDeploy Agent 설치

4-1-1. CodeDeploy 에이전트 설치 관리자 다운로드 주소 찾기

  • 아래 URL은 CodeDeploy 에이전트 설치 관리자 다운로드 주소 예시이다
https://bucket-name.s3.region-identifier.amazonaws.com/latest/install
  1. bucket-name : 해당 리전의 CodeDeploy 리소스 키트 파일이 포함된 Amazon S3 버킷의 이름
  2. region-identifier : 리전의 식별자

  • 내 계정은 싱가포르 리전을 사용해야 한다. 따라서 아래와 같이 버킷이름과 리전 식별자를 사용한다.
  1. bucket-name : aws-codedeploy-ap-southeast-1
  2. region-identifier : ap-southeast-1
  • 이를 사용해 CodeDeploy 에이전트 설치 관리자 다운로드 주소를 생성하면 아래와 같다.
https://aws-codedeploy-ap-southeast-1.s3.ap-southeast-1.amazonaws.com/latest/install

4-1-2. CodeDeploy 에이전트 설치 관리자 다운로드

  • 다시 EC2 터미널로 돌아가자.
  1. 현재 패키지를 업데이트하고 ruby, wget 을 다운로드한다.
[ec2-user@ip-172-31-12-248 ~]$ sudo yum update
[ec2-user@ip-172-31-12-248 ~]$ sudo yum install ruby
[ec2-user@ip-172-31-12-248 ~]$ sudo yum install wget
  1. ec2-user 디렉터리로 이동해 CodeDeploy 에이전트 설치 관리자 설치
[ec2-user@ip-172-31-12-248 ~]$ cd /home/ec2-user
[ec2-user@ip-172-31-12-248 ~]$ wget https://aws-codedeploy-ap-southeast-1.s3.ap-southeast-1.amazonaws.com/latest/install
[ec2-user@ip-172-31-12-248 ~]$ ls
install

[ec2-user@ip-172-31-12-248 ~]$ chmod +x ./install
[ec2-user@ip-172-31-12-248 ~]$ ls -l
total 20
-rwxr-xr-x. 1 ec2-user ec2-user 17892 Apr  4  2023 install
[ec2-user@ip-172-31-12-248 ~]$ sudo ./install auto
  1. CodeDeploy 에이전트 실행을 확인한다.
[ec2-user@ip-172-31-12-248 ~]$ sudo service codedeploy-agent status
[ec2-user@ip-172-31-12-248 ~]$ systemctl status codedeploy-agent

5. EC2 AMI 생성

  • 이제 생성한 EC2로부터 EC2 AMI 이미지를 생성하자.

  • 이제 인스턴스를 삭제해준다. (추후 배포 시 오류 발생) 이미지만 사용한다.

6. AMI로 시작 템플릿 생성

  • EC2 좌측 메뉴에서 시작 템플릿 - 시작 템플릿 생성을 누른다

  • 시작 템플릿 이름 : MyWebServerTemplate-015

  • 시작 템플릿 콘텐츠는 이전 단계에서 만든 EC2 AMI 를 사용한다.

  • 인스턴스 유형 : t2.micro, 키 페어 : MyKeyPair-015

  • 네트워크 설정 :

  1. 서브넷은 AutoScaling Group에서 지정한다. 따라서 [시작 템플릿에 포함하지 않음] 에 체크한다.
  2. 기존 생성한 보안그룹 사용. 네트워크 인터페이스 추가를 눌러 퍼블릭 IP 자동 할당에 체크한다
  • 시작 템플릿 생성 버튼을 눌러 시작 템플릿 생성한다.

7. 대상 그룹 생성

7-1. 대상 그룹 생성

  • EC2 좌측 메뉴에서 로드 밸런싱 - 대상 그룹 - 대상 그룹 생성을 누른다.
  1. 그룹 세부 정보 지정
  • 대상 유형 선택 : 인스턴스
  • 대상 그룹 이름 : MyWebServerTG-015
  1. 대상 등록
  • 기존 생성한 인스턴스를 등록한다. (사진 참고)
  • 보류 중인 대상 등록을 눌러 대상 그룹 생성한다.

7-2. 대상 그룹 로드 밸런서와 연결

  • 생성한 대상 그룹을 로드 밸런서에 연결한다...
  • 새 로드 밸런스 연결을 누른다.

8. 로드 밸런스 생성

  • 로드 밸런스 이름 : MyWebServerELB-015
  • 체계 : 인터넷 경계 선택
  • 네트워크 매핑 : 해당 회차에서 생성한 기본 VPC 선택, 매핑은 아래 [AZ별 지원 EC2 인스턴스 확인 방법] 참고한다.

AZ별 지원 EC2 인스턴스 확인 방법

  • EC2 좌측 메뉴에서 인스턴스 - 인스턴스 유형에서 사용하고자 하는 EC2 인스턴스 유형을 확인한다.
  • 아래 사진에서는 서울 리전에서 t2.micro 인스턴스 유형이 지원하는 가용영역이다. ap-northeast-2a, ap-northeast-2c인것을 알 수 있다.
  • 내 계정에 할당된 리전은 싱가포르이다. 우측 상단에서 리전을 싱가포르로 바꾸어 확인해 보자

    싱가포르 리전
    t2.micro 인스턴스 유형이 지원하는 가용영역은 아래와 같다.
    ap-southeast-1b, ap-southeast-1a, ap-southeast-1c

  • 따라서 매핑은 아래 그림과 같이 ap-southeast-1b, ap-southeast-1a 를 선택한다.

  • 보안 그룹 : 디폴트 보안 그룹
  • 그러나 80번 포트만 허용하는 보안 그룹을 새로 만드는 것이 원칙이다.
  • 리스너 및 라우팅 : 이전 단계에서 생성한 대상 그룹 선택
  • 나머지 설정은 디폴트로 로드 밸런서 생성한다.

9. Auto Scaling 그룹 생성

  • EC2 좌측 메뉴에서 Auto Scaling 그룹 - Auto Scaling 그룹 생성을 누른다.
  1. 시작 템플릿 또는 구성 선택
  • Auto Scaling 그룹 이름 : MyWebServerASG-015
  • 시작 템플릿 : 이전 단계에서 생성한 시작 템플릿 사용 및 버전은 Default
  1. 인스턴스 시작 옵션 선택
  • 네트워크 - 가용 영역 및 서브넷에 첫 번째 가용 영역에 속하는 서브넷을 사용한다.
    4824-9993-b450d9785a30/image.png)

  • 다음을 누른다.
  1. 그룹 크기
  • 원하는 용량은 2개(인스턴스 2개 사용)
  1. 크기 조정
  • 원하는 최소 용량/ 원하는 최대 용량 : 2/2개

  • AutoScaling : 크기 조정 정책 없음 (Auto Scaling 그룹에서는 2개의 인스턴스만 사용하겠다.)

  • 이후 디폴트 설정을 사용해 Auto Scaling 그룹을 생성한다.

  • 생성한 Auto Scaling 그룹의 인스턴스 관리로 이동해 인스턴스를 확인하자.

  • 위 그림에서는 2개의 인스턴스가 InService 상태이다.

    "InService" 상태의 인스턴스는 사용 가능한 상태이며, 요청된 서비스에 대한 트래픽을 수용할 수 있습니다.

10. 로드 밸런스 동작 확인

  • 로드 밸런스 동작 확인을 위해 Auto Scaling 그룹으로부터 생성된 인스턴스 2개에 IP 주소를 출력하는 index.html 파일을 추가한다.
[ec2-user@ip-172-31-9-83 ~]$ echo "<h1>18.143.91.236</h1>" > /var/www/html/index.html
[ec2-user@ip-172-31-9-83 ~]$ echo "<h1>13.250.60.196</h1>" > /var/www/html/index.html

  • 인스턴스로 접근한다면, 각 인스턴스는 자신의 퍼블릭 IP를 index.html로 보여줄 것이다.
  • 이제 로드밸런스 DNS를 URL에 입력해보자.

  • 이제 로드밸런스가 2개의 인스턴스를 웹 브라우저를 새로고침 할때마다 보여준다.

    처음 로드밸런스 생성시 , 로드밸런스 DNS 주소를 너무 오래 불러는 오류가 발생했다. 로드밸런스 생성 시, 디폴트 보안 규칙이 아닌 ( HTTP 80/ SSH 22 를 사용하는 SG를 사용해야 한다)

인프라가 완성되었다.
이제 여기서 ?? 를 하면 ?? 한다.

이제 코드 배포 자동 수행되도록 만들어 보자.

11. Code Depoly사용 앱 생성 및 배포

11-1. GitHub 레퍼지토리 생성 및 소스코드 커밋

GitHub 레퍼지토리 생성

  • 깃허브 로그인 및 레포지토리 생성한다
  • 레퍼지토리 이름 : RepositoryForCodeDeply
  • 퍼블릭 설정 후 생성
  • 새 파일을 생성해 아래 코드 입력
  • 파일 이름 : index.html
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<script>
var text = "I told you so!";
</script>
</head>

<body>

<math xmlns="http://www.w3.org/1998/Math/MathML">
      <mrow>
        <msup><mi>a</mi><mn>2</mn></msup>
        <mo>+</mo>
        <msup><mi>b</mi><mn>2</mn></msup>
        <mo>=</mo>
        <msup><mi>c</mi><mn>2</mn></msup>
      </mrow>
</math>

<!-- embed svg elements directly in HTML5 -->
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
  <polygon points="100,10 40,180 190,60 10,60 160,180"
  style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;">
</svg>

<script>
document.write("<p>"+text+"</p>");
document.write("<p>"+text+"</p>");
document.write("<p>"+text+"</p>");
</script>
</body>

</html>

같은 위치에 appspec.yml 파일을 생성해준다.

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html
hooks:
  AfterInstall:
    - location: scripts/set_owner
      timeout: 5
      runas: root

/Scripts/set_owner 를 파일 제목에 입력하고 아래와 같은 코드를 입력해 set_owner을 생성한다

echo 'Running set_owner'

chown -R ec2-user /var/www/html

12. CodeDeploy 앱, 배포그룹, 배포 생성

12-1. CodeDeploy 앱 생성

  • AWS 웹 콘솔에서 CodeDeploy - 배포 - 애플리케이션 - 애플리케이션으로 들어가자
  • 애플리케이션 이름 : MyWebServerCodeDeployApp-015
  • 컴퓨팅 플랫폼 : EC2/온프레미스

12-2. 배포그룹 생성

  • 배포 그룹 생성해보자. 배포 그룹은 배포 대상, 배포 방법을 정의한다.

  • 배포 대상 : 개발계, 테스트계, 운영계, 등

  • 배포 방법 : 한번에 배포, 반반씩 배포, 단계적으로 등

  • 생성한 애플리케이션에 들어가 - 배포 그룹 - 배포그룹 생성을 누른다

  • 배포 그룹 이름 : MyWebServerCodeDeployAppDG-015

  • 서비스 역할 : CodeDeployRole-015

12-3. 배포 설정

  • 이제 배포 설정을 해 보자.

  • 이전 단계에서 생성한 배포 그룹으로 설정하고, 개정 유형에서 애플리케이션을 GitHub에 저장한다고 체크한다.

  • GitHub 토큰 이름에 내 깃허브 계정을 누른 후, 연결 버튼을 누른다.

  • 아래 그림처럼 GitHub 계정 연결 페이지가 나온다. Authorize aws-codesuite 버튼을 눌러 계정을 연결해주자.

  • 계정이 연결되었다고 나왔다.

  • 리포지토리 이름에는 리포지토리 URL 입력

  • 커밋 ID는 가장 최근의 커밋 ID를 입력

  • 배포 생성 버튼을 눌러 배포를 생성하자.

  • 생성한 배포를 확인해보자.

  • 시간이 지난 후

-배포 수명 주기 이벤트에 실패 라고 나온다. 해당 이벤트로 들어가 보자.

  • 배포 라이프 사이클에서 오류코드 - 이벤트 세부 정보를 확인해보자.
  • 인스턴스에 부여된 역할이 없다.
  • 인스턴스는 CodeDeployEC2Role-015 가 없다.
  • 인스턴스에 역할을 부여해주자. (인스턴스 2개 모두 역할을 부여해준다)

  • EC2 인스턴스에서 부여한 역할을 CodeDeploy Agent 가 사용 하도록 Agent 재실행 하자.
 sudo systemctl restart codedeploy-agent # 2개 인스턴스에서 실행.

  • 배포과정이 끝났다.

  • 두 인스턴스에 배포 완료되었다.

  • 로드밸런서 DNS 주소로 접근해보자

  • 계속 새로고침을 해도 배포된 화면이 보인다. 이는, 인스턴스 두개 모두 배포된 내용을 포함하고 있다.

13. CodeDeploy으로 앱 배포 실습 보완

1. EC2 역할 부여 추가 및 로드 밸런싱 기능 없이 배포

  • 앱을 배포 후, 인스턴스 마다 역할이 없어 수동으로 다시 지정해줘야 한다.
    -> 새로운 ASG 를 생성하는 것이 아닌 ASG 수정(시작 템플릿 변경한 버전 사용)으로 보완하는 방법이다.
  • 이를 보완하기 위해 시작 템플릿을 수정해보자.
  1. ASG의 용량을 0으로 설정해 현재 인스턴스를 종료

  1. 시작 템플릿을 수정해 보자.
  • EC2 - 시작 템플릿 - 작업 - 템플릿 수정(새 버전 생성)

  • 고급 세부 정보 - IAM 인스턴스 프로파일 - EC2 인스턴스 정책을 추가

  • 템플릿 버전 생성

  • 시작 템플릿 - 버전 - 방금 수정한 시작 템플릿 버전 2 선택 - 기본 버전 설정

  • 템플릿 버전 2 선택 후 기본 버전으로 설정

  • 이제 수정한 시작 템플릿을 ASG 에 적용해보자.

  • 동일한 시작 템플릿이 선택 되어있다.

  • 버전을 클릭해 2버전으로 변경 해 준다. - 업데이트

  • 이제 다시 코드 배포를 한다면 EC2 인스턴스에 정책을 추가하지 않아도 된다.

  • 애플리케이션을 삭제 후, AGS 그룹 크기 변경, 애플리케이션 재생성

  • 배포 그룹 생성 시, 로드 밸런서 기능 활성화를 체크하지 않고 생성

  • 배포 실시한다.

  • 배포 시, EC2 인스턴스 정책이 부여되어 있기 때문에 오류가 발생하지 않는다.

  • 로드밸런서 DNS 접속

2. 배포 후 AGS 크기 변경 결과

  • 배포가 완료된 상태에서 AGS 크기를 변경해 기존 (2/2/2)에서 (3/3/3)으로 변경 하면 어떻게 될까?
    => 새로 추가된 인스턴스는 DeployCode에서 자동으로 배포 결과와 동일하게 내용이 변경된다.
  • 인스턴스 목록에 변경된 AGS 크기로 인해 인스턴스 하나가 실행된다.
  • 해당 인스턴스 퍼블릭 IP 주소로 들어가 보자.

=> 배포 재시도를 하지 않아도, AGS 크기 변경된다.

리소스 정리

  • 앱 삭제
  • AGS 크기 0/0/0 설정
  • ELB 삭제
  • TG 삭제
  • ASG 삭제
  • 시작 버전 템플릿 버전 및 시작 템플릿 삭제
  • AMI 등록 취소
  • EC2 스냅샷 삭제
  • SG 삭제
  • VPC 삭제
  • IAM 정책, 역할 삭제
  • 로그그룹 삭제 (Cloud Watch)

https://www.skshieldus.com/download/files/download.do?o_fname=2023%20%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%20%EB%B3%B4%EC%95%88%20%EA%B0%80%EC%9D%B4%EB%93%9C_%20AWS.pdf&r_fname=20221220170637944.pdf.

profile
磨斧爲針

0개의 댓글