SK shieldus Rookies 9기/클라우드 보안 컨설팅 실무

클라우드 보안 컨설팅 실무 2일차 (22/11/08)

ksh_5 2022. 11. 9. 00:02

정리)

 

 

  • VPC

 

- 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작

- 기존 네트워크와 아주 유사한 가상 네트워크

- 인터넷 게이트웨이 사용해 VPC를 인터넷에 연결

 

 

  • 서브넷

 

- 서브넷은 단일 가용 영역에 상주

- 서브넷 생성 시 해당 서브넷에 대한 IPv4 CIDR 블록 지정. 이는 VPC CIDR 블록의 서브넷

- Private 서브넷 : Public 인터넷에 액세스하려면 NAT 장치가 필요 (업데이트할 때 NAT 장치 필요)

 

 

  • 라우팅

 

- 서브넷 또는 게이트웨이의 네트워크 트래픽이 전달되는 위치 결정

 

 

  • VPC 엔드포인트 사용해 인터넷 게이트웨이 또는 NAT 장치를 사용하지 않고 AWS 서비스에 비공개로 연결

 

   ex) DynamoDB,

 - 인터페이스 엔드포인트

 - 게이트웨이 엔드포인트 : S3, DynamoDB

 

 

  • Peering : 두 VPC의 리소스 간 트래픽 라우팅

 

    ex) Peer : 동료, 친구    ---->  P2P (Peer to Peer)

 

 

  • 기본 VPC

 

- 기본 서브넷, 연결된 인터넷 게이트웨이, 모든 트래픽을 인터넷 게이트웨이로 보내는 기본 라우팅 테이블의 경로, EC2 인스턴스에 퍼블릭 IP 주소 및 DNS 호스트 이름을 제공하는 DNS 설정

- 기본 서브넷에서 시작된 EC2 인스턴스는 자동으로 인터넷에 액세스

 

 

  • 듀얼 스택 (Dual Stack)

 

IPv4와 IPv6도 사용

 

 

  • RFC (Request for Comments)

 

미국의 국제 인터넷 표준화기구인 IETF(Internet Engineering Task Force)에서 제공, 관리하는 문서

 

 

  • Public IP주소

 

- 퍼블릭 IPv4 주소를 받을 것인지 여부를 결정하는 속성 가짐

- 따라서 이 속성이 활성화된 서브넷(퍼블릭 서브넷)에서 인스턴스 시작할 경우, 퍼블릭 IP 주소는 인스턴스에 대해 생성된 주 네트워크 인터페이스(eth0)에 할당

- 퍼블릭 IP 주소는 NAT(Network Address Translation) 통해 주 프라이빗 IP 주소로 매핑

 

 

  • Private IP주소

 

- VPC에서 인스턴스 시작할 경우, 서브넷의 IPv4 주소 범위에 속한 주 프라이빗 IP 주소는 인스턴스의 주 네트워크 인터페이스(eth0)에 할당

- 각 인스턴스에는 인스턴스의 프라이빗 IP 주소를 확인하는 프라이빗(내부) DNS 호스트 이름 할당

 

cf. NAT : 외부에서는 Public IP, 내부에서는 Private IP

 

 

  • 탄력적 IP주소

 

영구 퍼블릭 IP 주소가 필요한 경우, 그 대신에 탄력적 IP 주소를 사용

 

 

  • 인터넷으로부터의 원치 않는 인바운드 연결은 차단하려면 네트워크 주소 변환(NAT) 디바이스 사용

 

 

  • Site-to-Site VPN 연결을 사용하여 VPC를 회사의 데이터 센터에 연결 → 회사의 데이터센터(온프레미스)를 AWS 클라우드에 확장

   (VPN: 암호화 연결, 안전함)

 

 

  • NACL 기본 사항

 

- 서브넷은 한 번에 하나의 네트워크 ACL에만 연결

- 네트워크 ACL에는 인바운드 규칙, 아웃바운드 규칙 존재

- 각 규칙에서는 트래픽 허용 or 거부

- 규칙에는 번호 1~32766까지 사용 (2¹⁵=32768)

- 가장 낮은 번호의 규칙부터 순서대로 적용

- 트래픽이 규칙과 일치하면 규칙 적용 (없으면 아래 규칙 검토)

- 필요한 경우 나중에 새 규칙 삽입할 수 있도록 증분 방식으로 규칙 생성 {ex) 10 or 100단위씩 증분}

- 네트워크 ACL 규칙은 트래픽이 서브넷에 들어오고 나갈 때 적용

- 네트워크 ACL은 상태 비저장 (Stateless : 상태 고려X) → 리턴 트래픽 불허

 

* Return Traffic : 내부망에서 요청을 보낸 것을 기록했다가 이에 대한 응답 오는 것

 

cf) 방화벽은 Statefun Inspection (SPI) : State Table에 내부망에서 요청한 것을 기록했다가 응답 오면 허용, 나머진 불가능

→ Return Traffic 허용하는 방식, Stateful 상태 고려하는 방식

→ 내부망 보호하는 효과

 

 

  • 퍼블릭 및 프라이빗 서브넷이 있는 VPC (NAT)

 

- 백앤드 서버(DB)에 대한 공개적인 액세스를 차단하면서 퍼블릭 웹 애플리케이션 실행하려는 경우

- 웹 서버가 데이터베이스 서버와 통신할 수 있도록 보안 및 라우팅 설정

- 소프트웨어 업데이트 시 NAT 게이트웨이 사용해 데이터베이스 서버 인터넷 연결 가능하지만, 인터넷에서 데이터베이스 서버 연결 불가

 

 

① VPC 설정

IPv4 CIDR 블록 크기 /16 (ex) 10.0.0.0/16)인 VPC. 65536개의 프리이빗 IPv4 주소 제공

 

  Network Host
10.0.0.0 이진수로 표현 시 0000 1010 0000 0000 0000 0000 0000 0000
Subnet Mask에서 1이 16개 1111 1111 1111 1111 0000 0000 0000 0000

 

 

② 퍼블릭 서브넷

IPv4 CIDR 블록 크기 /24 (ex) 10.0.0.0/24)인 퍼블릭 서브넷. 256개의 프라이빗 IPv4 주소 제공

퍼블릭 서브넷은 인터넷 게이트웨이로 이어지는 라우팅이 있는 라우팅 테이블과 연결된 서브넷

 

  Network Host
10.0.0.0 이진수로 표현 시 0000 1010 0000 0000 0000 0000 0000 0000
Subnet Mask에서 1이 24개 1111 1111 1111 1111 1111 1111 0000 0000

 

 

③ 프라이빗 서브넷

IPv4 CIDR 블록 크기 /24 (ex) 10.0.1.0/24)인 프라이빗 서브넷. 256개의 프라이빗 IPv4 주소 제공

 

  Network Host
10.0.0.0 이진수로 표현 시 0000 1010 0000 0000 0000 0000 0000 0000
Subnet Mask에서 1이 24개 1111 1111 1111 1111 1111 1111 0000 0000

 

 

  • 프라이빗 서브넷에 있는 EC2에 접근

 

- 퍼블릭 서브넷에 있는 리눅스 통해 접근 (Bastion Host) : Key 필요 (S3 Bucket 사용 → 위험)

- 퍼블릭 서브넷에 있는 윈도우 통해 접근 (Bastion Host) : Key 복사 쉬움, RDP 오른쪽 마우스로 복/붙, 권한 설정 (상속 제거, 읽기만 허용), 보안 그룹에서 허용

- EIP 통해 접근해 설정, 설정이 끝나면 EIP를 Release : 가장 간단, 보안 그룹에서 허용

 

 

실습)

 

 

 

- EC2 생성

 

더보기

① EC2 목록 클릭 후 인스턴스 시작 클릭

② 이름 (webserver) 작성 후 OS 선택 (ubuntu)

③ 키페어 클릭 (ksh)

④ 네트워크 설정에서 생성한 VPC, 서브넷(pri) 클릭

⑤ 방화벽 보안 그룹 생성(ec2_db_server) 클릭

 

⑥ 네트워크 설정 : 서브넷 ksh_pri로 선택 (퍼블릭 IP 자동 할당은 저절로 비활성화)

 

 

⑦ 유형 ssh 클릭 > Source type : My IP

    유형 MySQL 클릭 > public subnet IP 주소를 Source에 적기

 

 

⑧ 인스턴스 시작

 

 

⑨ 탄력적 IP 주소 할당

 

 

⑩ 인스턴스 선택 후 탄력적 IP 주소 연결 

 

 

- DB 서버 설정

 

더보기
update

① 인스턴스 연결 후 업데이트($ sudo apt update)

 

 

mysql-server 설치

② $ sudo apt install mysql-server

 

 

vim 설치

③ $ sudo apt install vim -y

 

 

④ $ cd /etc/mysql/mysql/conf.d/

    $ sudo vi mysqld.cnf

 

 

⑤ bind-address = 127.0.0.1을 외부에서 접속 가능하도록 주석(#) 처리

 

 

mysql 접속

⑥ $ sudo mysql -u root -p

 

 

DB 설정

⑦ mysql> create database gnuboard;

    mysql> create user astro@'%' identified by 'cyber12#$';

    mysql> grant all privileges on gnuboard.* to astro@'%';

    mysql> flush privileges;

 

 

- Web Server 설정

 

더보기

① EC2 목록 클릭 후 인스턴스 시작 클릭

② 이름 (webserver) 작성 후 OS 선택 (ubuntu)

③ 키페어 클릭 (ksh)

 

 

④ 네트워크 설정에서 생성한 VPC, 서브넷(pub) 클릭

⑤ 방화벽 보안 그룹 기존 보안 그룹 선택 (webserver) 클릭

 

 

⑥ 인바운드, 아웃바운드 규칙 확인

 

 

⑦ 인스턴스에 연결

 

 

update

⑧ $ sudo apt update

 

 

apache 설치

⑨ $ sudo apt install apache2 -y

 

 

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

 

 

⑪ $ cd /var/www/html

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

 

 

⑫ $ cd gnuboard5

    $ sudo mkdir data

    $ sudo chmod 707 data

    $ sudo service apache2 restart

 

 

- gnuboard에서 db서버 연결

 

더보기

- 퍼블릭 IP/gnuboard5로 접속 시 그누보드 화면이 뜬다

 

 

MySQL 정보입력

- Host : ec2 (DB) IP 주소 : 3306

- User : astro

- Password : cyber12#$

- DB : gnuboard

 

최고관리자 정보입력

- 회원 ID : admin

- 비밀번호 : admin1234

 

gnuboard 접속 화면

 

 

사설 IP로 설정해도 연결 잘 되는 이유?

→ 서브넷들을 라우팅 테이블에 명시적 연결로 구성

→ 보안 그룹에서 퍼블릭 서브넷 IP주소에서 3306번 포트로 들어오는 경우 허용

 

 

- DB 서버 확인

 

더보기

$ sudo mysql -u root -p

mysql> show databases;     // 여러 개로 복수로 써야 함

mysql> show tables;     // 테이블 목록 확인

 

 

mysql> desc g5_board_file;     // g5_board_file의 컬럼 목록 확인

 

 

mysql> select * from g5_board_file;     // 테이블에 저장된 내용 확인

mysql> desc g5_member;     // 회원 테이블의 컬럼 목록 확인

 

 

mysql> select mb_id, mb_password, mb_name from g5_member;     // 회원 목록 확인 (id, pw, 이름)

 

 

  • EC2에 DB 직접 설치해서 운영하는 방법 VS RDS 사용하는 방법

 

- RDS 사용하는 경우 AWS에서 관리, 비용 약간 더 비쌈, root 권한 사용할 수 없음, DB에 대한 Tuning, Customizing 할 수 없음, 등

- EC2에 DB 직접 설치 : 관리 잘하기 어려움, 기존 DB가 RDS와 호환이 안 되는 경우에 택할 수 있음, root 권한 사용 가능

 

 

  • Spot Instance

 

- 사용자가 제시한 금액이 시세보다 높으면 내 인스턴스를 실행하고, 시세가 더 높으면 내 인스턴스를 중지 또는 삭제하도록 설정 가능

 

 

  • Amazon Inspector

 

- Amazon EC2 인스턴스에서 소프트웨어 취약성과 의도하지 않은 네트워크 노출을 자동으로 검색하고 스캔

- 취약점 분석 및 스캐닝해주는 AWS 서비스

 

 

  • 인스턴스 스토어

 

- 인스턴스에서 임시 데이터 저장하는 데 사용 가능

- 인스턴스 스토어에 저장된 데이터 삭제 : 인스턴스 중단하거나 최대 절전 모드로 전환하거나 종료

 

 

  • LAMP

 

- Linux용 Apache + MySQL + PHP

 

 

amazon linux2에 lamp 웹 서버 설치 실습)

 

1단계 LAMP 서버 준비)

 

더보기

- amaz_linux 2로 인스턴스 설치

 

 

ssh 연결

key> ssh -i "ksh.pem" ec2-user@15.152.54.255

 

 

update

$ sudo yum update -y

 

 

$ sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2     // 최신 버전으로 전부 가져오기

 

 

$ cat /etc/system-release     // amazon linux 버전 확인 가능

 

 

$ sudo yum install -y httpd mariadb-server

 

 

$ yum info package_name

$ sudo systemctl start httpd     // 웹서버 시작

$ sudo systemctl enable httpd     // 시스템이 부팅할 때마다 시작되도록 설정

$ sudo systemctl is-enabled httpd     // httpd 실행되는지 확인

$ sudo usermod -a -G apache ec2-user     // 사용자를 apache 그룹에 추가

$ exit     // 종료 후 다시 접속

 

 

$ groups     // 그룹 멤버십 확인

$ sudo chown -R ec2-user:apache /var/www     // 그룹 소유권을 apache 그룹으로 변경

$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;     // 그룹 쓰기 권한 추가해 나중에 하위 디렉터리에 대한 그룹 ID 설정하려면 /var/www와 그 하위 디렉터리의 디렉터리 권한 변경

$ find /var/www -type f -exec sudo chmod 0664 {} \;     // 그룹 쓰기 권한 추가하려면 /var/www 및 그 하위 디렉터리 파일 권한을 반복해 변경

 

 

2단계 LAMP 서버 테스트)

 

더보기

$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php     // apache 문서 루트에서 php 파일 생성

 

 

php 정보 페이지 표시된 화면

 

 

3단계 데이터베이스 서버 보안 설정)

 

더보기

$ sudo systemctl start mariadb

$ sudo mysql_secure_installation

 

 

$ sudo systemctl enable mariadb

 

 

4단계 Wordpress 설치)

 

 

더보기

$ wget https://wordpress.org/latest.tar.gz     // wordpress 설치 패키지 다운로드

$ tar -xzf latest.tar.gz     // 압축 해제

$ sudo systemctl start mariadb

 

 

$ mysql -u root -p   // 데이터베이스 생성, 사용자 생성, 권한 부여 등

$ create user 'wordpress-user'@'localhost' identified by 'your_strong_password';     // MySQL 데이터베이스에 대한 사용자 및 암호 생성

$ create database 'wordpress-db';     // 데이터베이스 생성

$ grant all privileges on 'wordpress-db'.* to "wordpress-user"@"localhost";     // 전체 권한을 이전 생성한 사용자에 부여

$ flush privileges;     // 데이터베이스 권한을 새로고침해서 모든 변경사항이 적용

 

 

$ cp wordpress/wp-config-sample.php   wordpress/wp-config.php     // wp-config-sample.php 파일을 wp-config.php 파일에 복사

$ vi wordpress/wp-config.php

 

 

- 생성한 데이터베이스 이름으로 변경

- 생성한 데이터베이스 사용자로 변경

- 생성한 암호로 변경

 

 

 $ cp -r wordpress/*  /var/www/html

$ mkdir /var/www/html/blog
$ cp -r wordpress/* /var/www/html/blog/

 

 

$ sudo vim /etc/httpd/conf/httpd.conf

$ sudo yum install php-gd

 

 

 AllowOverride None → AllowOverride ALL로 변경

 

 

$ sudo chown -R apache /var/www     // 파일 소유권 및 콘텐츠를 apache 사용자에게 허용

$ sudo  chgrp -R apache /var/www     // 그룹 소유권을 apache 그룹에 허용

$ sudo chmod 2775 /var/www     // 디렉터리 권한 변경해 그룹 쓰기 권한 추가

$ find /var/www -type d -exec sudo chmod 2775 {} \;     // 미래 하위 디렉터리에서 그룹 ID 설정

$ find /var/www  -type f -exec sudo chmod 0644 {} \;     // 그 하위 디렉터리 파일 권한을 재귀적으로 변경

 

 

$ sudo systemctl restart httpd

$ sudo systemctl enable httpd && sudo systemctl enable mariadb

$ sudo systemctl status mariadb

$ sudo systemctl start mariadb

 

 

$ sudo systemctl start httpd

 

 

wordpress 설치화면