정리)
- 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 서버 설정

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

② $ sudo apt install mysql-server

③ $ sudo apt install vim -y

④ $ cd /etc/mysql/mysql/conf.d/
$ sudo vi mysqld.cnf

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

⑥ $ sudo mysql -u root -p

⑦ 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) 클릭

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

⑦ 인스턴스에 연결

⑧ $ sudo apt update

⑨ $ 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

사설 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로 인스턴스 설치

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

$ 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 파일 생성

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

'SK shieldus Rookies 9기 > 클라우드 보안 컨설팅 실무' 카테고리의 다른 글
클라우드 보안 컨설팅 실무 6일차 (22/11/14) (0) | 2022.11.15 |
---|---|
클라우드 보안 컨설팅 실무 3일차 (22/11/09) (0) | 2022.11.09 |
클라우드 보안 컨설팅 실무 1일차 (22/11/07) (0) | 2022.11.07 |