정보보안 전문가를 꿈꾸며 작성하는 블로그입니다.

SK 쉴더스 루키즈

[SK 쉴더스] 클라우드 보안 2일차 -- 추가 예정

minjoo 2022. 9. 27. 17:07

(스토리지 범용 SSD 설명 다시)

복습

* S3(Simple Storage Service)

- 데이터를 저장하는 공간

- 비교적 저렴함

- Public 저장 : 객체(Object : 파일, 디렉토리 등)를 공개해서 많은 사용자에게 공유 가능

- Private 저장 : 외부에 공개하지 않고 비공개로 저장 가능

 

* Public 저장방법 : 정적 웹사이트

- index.html, 이미지 업로드해서 간단한 웹사이트 구현 가능

ex) 메인페이지가 다운되었을때 에러 페이지 (현재 접속이 되지 않습니다. 등 안내페이지) - DNS 장애기반 라우팅

 

* Zone : 가상의 데이터센터

- 실제 데이터센터를 임차해서 가상화도구(VMware, Xen 등)을 활용해서 가상의 데이터센터를 만듦

- 우리나라에는 Amazon Datacenter 없고, KT/SKT등을 일부 빌려서 가상화도구 설치, 가상의 데이터센서 만듦

- 가용성을 높이기 위해 1~6개까지의 실제 데이터센터를 하나로 묶어서 Zone을 만듦

- 실제로 어느 데이터센터를 사용하는지는 알려주지 않음(Cloud : 알려줄 필요 없음)

- 이름 : ap-northeast-2a, ap-northeast-2b, ap-northeast-2c, ap-northeast-2d

 

* Region

- 특정 지역(국가)에서 클라우드 서비스를 하기 위한 단위

- 리전 내에서 온전한 클라우드 서비스 가능

- 다른 리전에 의존하지 않고도 독자적으로 모든 클라우드 서비스 제공 가능


1.1 S3 Class

- 기본적으로 S3에 저장하면 3개 이상의 Zone(가상의 데이터센터)에 분산해 저장 → Availability(재난,재해에 대비)

- Standard : 저장비용이 비싸지만, 언제든지 인출 가능하고 인출 비용이 없음

- Standard-IA(Infrequent Access, 덜 자주 접속) : 저장비용이 약간 저렴하지만, 약간의 인출 비용이 있음

- One Zone-IA : 하나의 Zone에만 저장, 비용이 좀 더 저렴

- Glacier : 오랫동안 보관할 데이터를 저장하는 곳(저장비용은 저렴), 인출 시간이 오래걸리고 인출 비용도 높음

 

* 수명주기 관리(Life Cycle) → 스케줄링

- 일반적인 데이터의 특징 : 처음에는 자주 사용하다가 시간이 지나면 잘 사용하지 않음

→ 초기에는 Standard에 저장했다가 이후에는 Glacier에 저장하는 방법 등 효율적인 방법으로 저장

→ 위 방법을 자동으로 하는 방법 : S3 Intelligent Tiering

    - 거의 사용을 하지 않으면 Archive Access Tier로 이동

 

문제) 1T를 Standard에 저장하면 한달에 얼마?(GB당 0.025USD) : 약 36,000원

 

1.2 S3 intelligent Tiering (자동으로 변경)

- Frequent Access Tier : 처음 Tier

- Infrequent Access Tier : 30일 동안 사용을 안할 경우

- Archive Access Tier : 90일 동안 사용을 안할 경우

- 어떤 Tier에 있더라도 사용자의 요청이 발생하면 Frequent Access Tier로 다시 이동

 

* S3에 버킷을 생성하고 버킷에 데이터를 저장(upload)해서 사용, Bucket 단위로 관리

- Bucket의 이름은? 전역에서 고유하게 설정(전체에서 유일한 이름 사용)

 

이해를 위해 강의화면을 캡쳐했습니다(문제시 삭제) - 출처 sk 쉴더스 루키즈 9기 강의

 

2.1 VPC(Virtual Private Cloud) 만들기

- VPC : 가상으로 만든 나만의 클라우드

1) VPC 생성(VPC만) - VPC 이름 : 이니셜(ex. mj_vpc)

2) IPv4 CIDR 수동입력

3) IPv4 CIDR : 10.9.0.0/16
4) IPv6 CIDR 블록 없음

5) 테넌시 : 기본값

→ VPC 생성

vpc 생성 페이지
vpc 생성 완료(VPC ID는 고유번호-자동생성)

2.2 서브넷 생성

1) 서브넷 생성

2) VPC 선택(mj_vpc)
3) 서브넷 이름 (ex. msub01)

4) 가용영역(Zone=Availability Zone=AZ) : us-east-2a  // aws 계정의 region에 맞게 설정

5) IPv4 CIDR : 10.9.1.0/24

→ 서브넷 생성

6) 서브넷 선택 > 작업 > 서브넷 설정 편집

7) 퍼블릭 IPv4 주소 자동할당 활성화 체크(퍼블릭 서브넷으로 변환)

→ 저장

- 퍼블릭 IPv4 주소 자동 할당 : 아니요 → Private Subnet : 인터넷과 연결 x

- 퍼블릭 IPv4 주소 자동 할당 : 예 → Public Subnet : 인터넷과 직접 연결 o, 인터넷에서 접근 가능

 

* 충돌이 발생하는 경우

- VPC와 Subnet을 모두 지우고 새로 생성 → IP 대역을 다르게 설정하면 해결

ex) VPC : 10.29.0.0/16, Subnet : 10.29.1.0./24

 

* IP대역의 /16,/24?

/16 : Subnet Mask의 1의 개수 : 11111111 11111111 00000000 00000000 → 255.255.0.0

/24 : Subnet Mask의 1의 개수 : 11111111 11111111 111111111 00000000 → 255.255.255.0

 

2.3 인터넷 게이트웨이 생성

1) 인터넷 게이트웨이 생성 - 이름 : igw-mj

2) igw-mg 선택 > 작업 > VPC에 연결

3) 사용가능한 VPC : 생성한 VPC 선택 > 인터넷 게이트웨이 연결

2.4 라우팅 테이블 연결

1) 라우팅 테이블 목록 > 생성한 VPC의 라우팅테이블 확인 (생성x)

2) 해당 라우팅 테이블 ID 선택

3) 라우팅 탭 > 라우팅 편집 > 라우팅 추가

4) 첫번째 대상 : 0.0.0.0/0, 두번째 대상 : 인터넷 게이트웨이 선택 →  생성한 인터넷 게이트웨이 선택

→ 변경사항 저장

5) 서브넷 연결 탭 > 명시적 서브넷 연결 > 서브넷 연결 편집

6) 생성한 서브넷 체크 > 연결 저장

* 삭제

- Subnet 삭제, Internet Gateway 삭제, VPC 삭제 순서로 삭제

 

* 인터넷이 안되는 이유

- 서브넷이 Public이 아닐 경우

- IGW와 연결이 안되어 있을 경우

- 라우팅 테이블에 인터넷(0.0.0.0/0 : 불특정 네트워크)연결이 안되어있거나, 명시적인 서브넷 등록이 안되어 있는 경우

- IP 설정을 잘못한 경우

 

2.5 EC2

1) 인스턴스 시작

- 이름 : gnuboard

- 어플리케이션 및 OS 이미지 : Ubuntu(22.04 LTS)

- 인스턴스 유형 : t2.micro

2)  키페어 생성

→ 키페어가 설치되면 pen 파일이 다운됨 → PC의 접근하기 쉬운 위치에 저장 

3) 네트워크 설정

- 네트워크, 서브넷 확인

- 방화벽 보안그룹 생성

- SSH 트래픽 허용 체크 → 내 IP 선택

- 인터넷에서 HTTPs 트래픽 허용 체크

- 인터넷에서 HTTP 트래픽 허용 체크

- 편집 > 보안그룹이름/설명 : web-server

* 선택이 잘못되어있을 경우 편집을 선택해서 변경 가능

- 보안 그룹 규칙 확인

* Security Groups(보안규칙 = 방화벽)

- 보안규칙 설정을 안하면 모든 포트에 접근 가능

- 접근할 수 있는 포트를 제한해야 함

   SSH : 나만 접근

   HTTP/HTTPs : 누구나 접근 가능

4) 스토리지 구성

- 프로비저닝 : DB 등 민감한 문제가 있는 경우

- 마그네틱 : Glacier

→ 인스턴스 시작

 

2.6 키페어 보안 설정

- 키 속성 > 보안 > 고급

- 상속 사용 안함 > 이 개체에서 상속된 사용 권한을 모두 제거합니다

→ 컴퓨터 사용자(user)만 접속 가능해야 함

- 추가 > 보안 주체 선택 > 개체 이름에 user 입력 > 이름 확인

- 읽기에만 체크

→ SSH로 접속하려면 반드시 권한을 400으로 설정해야 함

 

2.7 인스턴스 연결

- 생성한 인스턴스 선택 > 연결

- SSH 클라이언트 탭에 명령 복사

- 윈도우 cmd 관리자 권한으로 실행

- 키페어 파일 저장 위치로 이동 > 복사한 명령어 실행

→ ubuntu 서버 접속 성공

 

3. AWS의 EC2 Ubuntu 서버 접속

cmd) $sudo apt update

 

3.1 gnuboard 설치

$ sudo apt install vim

1) 웹 서버 설치

$ sudo apt install apache2

2) database 설치

$ sudo apt install mysql-server

$ sudo mysql -u root -p   // MySQL 접속(패스워드 x)

mysql> create database gnuboard;    // gnuboard DB 생성

mysql> show databases;

mysql> create user board@localhost identified by 'cyber12#$';    //사용자 및 비밀번호 생성

mysql> grant all privileges on gnuboard.* to board@localhost;    // board에게 gnuboard의 모든 테이블에 대한 권한 부여

mysql> exit

3) 웹서버에서 사용할 언어 설치

$ sudo apt install php php-mysql php-common php-gd php-fpm php-xml php-json php-curl git

4) 게시판 소스 다운로드

$ cd /var/www/html

$ sudo git clone https://github.com/gnuboard/gnuboard5    // github의 gnuboard를 통째로 복제

$ cd gnuboard5

$ sudo mkdir data

$ sudo chmod 707 data

5) 마무리

$ sudo apt install net-tools

$ sudo service apache2 restart

6) 게시판 설정

- http://34.236.155.180/gnuboard5/    → aws의 region에 퍼블릭 IPv4 주소 사용

- 그누보드 설치하기

- 사용자 board, 비밀번호 cyber12#$, DB명 gnuboard, 웹사이트 관리자 admin/admin1234

 

* EC2를 계속 켜놓으면 비용 발생 : t2.micro → 시간당 0.0144 USD

 

* Scale Up : 더 고사양 스펙으로 바꾸는 것

* Scale Down :  더 저사양 스펙으로 바꾸는 것

 

4. Amazon Linux

- Red hat의 기본 커널에 최소한의 기능만 넣어서 클라우드 환경에 최적화시킨 운영체제

- 가볍고 빠르게 동작 → Amazon에서 많이 사용'

 

4.1 Amazon Linux 설치

1) 인스턴스 시작 - 이름 : amz_gnuboard

Amazon Linux 선택 (Amazon Linux2, 64비트)

2) VMware - Ubuntu 22.04 LTS 실행

- aws_key.pem 파일을 Ubuntu 로 복사

* 안될경우 Player > Manage > Reinstall VMware Tools (VMware Tool 재설치)

3) linux 터미널에서 키페어 파일 권한 변경

$sudo chmod 400 aws_key.pem

 

4.2 Amazon Linux 연결 - Ubuntu 22.04 LTS

- 생성한 인스턴스 선택

- 연결 > ssh 클라이언트 - 명령 확인

우분투 터미널에 확인한 명령어 입력 (sudo 사용!!)

 

4.3 gnuboard 설치

$ sudo yum update -y    // -y : 미리 yes 설정

$ sudo yum install httpd    // 아파치 웹서버 설치

$ sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2

* lamp : Linux용 Apache2 MySQL PHP(웹서버 세트)

$ sudo yum install -y mariadb-server

$ sudo systemctl start httpd    // 아마존 리눅스에서는 아파치 시작명령을 사용해야 아파치 시작

$ sudo systemctl enable httpd    // 부팅할 때마다 시작하도록 등록

$ sudo usermod -a -G apache ec2-user    // 아파치 그룹(-G apache)에 ec2-user를 추가(-a : add)

$ sudo chown -R ec2-user:apache /var/www    // 웹서버 루트 디렉토리(/var/www)의 소유권을 apache 그룹의 ec2-user로 변경

$ sudo chmod 2775 /var/www    // 웹서버 루트 디렉토리의 권한을 2775로 변경(other는 read와 executable만 가능)

$ sudo find /var/www -type d -exec chmod 2775 {} \;    // 웹서버 루트 디렉토리의 하위 디렉토리가 2775로 되어있는지 확인

$ sudo find /var/www -type f -exec chmod 0664 {} \;    // 웹서버 루트 디렉토리의 하위 파일이 0664로 되어있는지 확인

$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

→ 웹 브라우저를 열고 http://IP주소/phpinfo.php에 접속(잘 실행되는지 확인) - ip주소 : 3.88.90.1

 

4.4 gnuboard 추가 설치

1) DB 설정

$ sudo systemctl start mariadb

$ sudo mysql -u root -p    // 패스워드 x

MariaDB [(none)]> create database gnuboard;

MariaDB [(none)]> create user board@localhost identified by 'cyber12#$';

MariaDB [(none)]> grant all privileges on gnuboard.* to board@localhost;

MariaDB [(none)]> flush privileges;

MariaDB [(none)]> exit;

2) gnuboard source 코드 다운로드 (git 설치 필요)

$ sudo yum install git

$ cd /var/www/html

$ sudo git clone https://github.com/gnuboard/gnuboard5 

$ cd gnuboard5

$ sudo mkdir data

$ sudo chmod 0777 data

$ sudo yum install php php-mariadb php-common php-gd php-fpm php-xml php-json php-curl git -y

- lamp-mariadb10.2-php7.2를 설치했기때문에 php-mysql은 설치할 필요x

$ sudo systemctl restart httpd

3) gnuboard 실행 

- http://3.88.90.1/gnuboard5/ 접속 - 생성한 인스턴스의 퍼블릭 IPv4 주소 입력

- gnuboard 설치 : 사용자 board, 비밀번호 cyber12#$, DB명 gnuboard, 웹사이트 관리자 admin/admin1234

- 게시판에 이미지 업로드해보기

* 사설 IP로 접속하면 x (10.x.x.x 는 사설 ip)

 

참고) AWS 비용 관련

- VPC와 Subnet은 별도 비용 발생 x

- S3는 아주 조금 발생

- EC2는 종료해야함(인스턴스 종료 후 1시간 정도후에 삭제됨)

- S3 - bucket 삭제(내부의 객체(파일)을 모두 삭제한 후 버킷 삭제)