Cloud Solution Architect/AWS

AWS - Amazon Inspector, CloudWatchLog, NAT Instance

YunHyeong 2023. 5. 2. 18:34

1. Amazon Inspector

* Amazon Inspector는 Amazon Elastic Compute Cloud(EC2), AWS Lambda 함수 및 컨테이너 워크로드에서 소프트웨어 취약성과 의도하지 않은 네트워크 노출을 지속적으로 스캔하는 자동화된 취약성 관리 서비스이다.

1.1. 아마존 Inspector를 이용한 애플리케이션 보안 분석

Amazon Inspector 인스턴스의 네트워크 엑세스 가능성 및 해당 인스턴스에서 실행되는 애플리케이션의 보안 상태를 테스트한다. Amazon Inspector는 노출, 취약성 및 모법 사례와의 차이를 평가한다. Amazon Inspector는 평가를 수행한 후, 상세한 보안 평가 결과 목록을 제공하며, 이 목록은 심각도 수준에 따라 구성되어 있다. Amazon Inspector는 사전 정의된 소프트웨어도 제공한다. 에이전트는 평가하려는 EC2 인스턴스의 운영 체제에 선택적으로 설치할 수 있다. 에이전트는 네트워크, 파일 시스템 및 프로세스 활동으 포함한 EC2 인스턴스의 동작을 모니터링한다. 또한 광범위한 동작 및 구성 데이터를 수집한다.

 

1.2 Bastion host에 Docker 설치

sudo systemctl stop httpd # httpd를 멈춰준다. doker 포트와 충돌이 날 수 있기 때문에
sudo yum install docker -y
sudo systemctl enable --now docker
sudo docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa # 도커 실행

wget https://inspector-agent.amazonaws.com/linux/latest/install # agent install 파일 내려받기
sudo bash install # install 파일 실행

- 위의 작업은 bastion host의 주소를 MobaXterm으로 접근하여 진행하였다.

 

- bastion host 서버로 접속하여 dvwa 도커 화면에 접속

- id : admin

- password : admin

 

- Create / Reset Database 버튼을 누른다.

- 버튼을 누른 후에는 id는 "admin", password는 "password"로 바뀐다.

 

- AWS에서 Amazon Inspector를 검색하고 Inspector classic으로 전환한다.

- 신형 Amazon Inspector는 요금 발생을 우려해서 Classic으로 전환하였다.

 

- 검사하는 기간을 15분으로 설정

 

- 새롭게 만든 평가 Template을 실행한다.

 

- 평가 실행 항목에서 평가를 실행한다.

 

- 소프트웨어의 취약성 심각도와 설명 등의 항목이 나와있다

- 설명부분은 번역을 해서 확인이 가능하다.

 

- all log를 검색했을 때 심각도가 높은걸 확인할 수 있다.

- 설명과 권장 사항을 확인하여 문제점에 대한 솔루션을 마련한다.

 

- ls -al /var/log 목록을 봤는데 몇몇 파일의 권한이 소유자 뿐만 아니라 그룹이나 기타 사용자에게 쓰기나 실행 권한이 들어 있는걸 볼 수 있었다

- agent는 이 상황을 지적했다

- 하지만, 이는 쓰임에 따라서 권한을 부여하는 것이기 때문에 적절한 권한이 부여되어 있다면 넘어가도 될거 같다.

 

- Network 항목을 검색했더니 SSH 포트가 열려있는 것을 지적하고 있었다.

- 심각도는 Medium이지만 SSH 포트를 적절한 상황에서는 닫아주면서 보안에 신경써야할 거 같다.

 

1.2. CloudWatch

sudo docker container ls -a # 도커 상태 확인
sudo docker container stop dvwa # dvwa 도커 중지
sudo systemctl start httpd # appache 서버를 다시 실행 시킨다.

- 아파치 서버를 다시 실행하고 bastion host 서버에 다시 접근하면 이전에 설정했던 웹페이지가 뜬다.

 

- cloudwatch 서비스에 접근하여 bastion host id로 검색하면 다양한 항목이 나오는 걸 볼 수 있다.

- bastion host의 CPUUtilazation 항목을 확인해본다.

 

1.3 Simple Notification Service

- Amazon SNS 서비스에 접근하여 주제 생성 버튼 클릭

 

- 유형을 표준으로 선택하고

- 이름과 표시 이름을 설정

- 표시이름은 메일이 올때 보내는 측의 이름이다.

- 구독 생성 버튼을 클릭한다.

 

- 엔드포인트를 이메일로 하는 구독을 생성한다.

 

- 메일로 온 AWS 구독 버튼을 클릭한다.

 

- SNS 왼쪽 탭에서 규칙을 누르면 Amazon EventBridge 화면으로 넘어간다.

 

- 다시 CloudWatch 서비스로 이동하여 규칙 생성 버튼 클릭

 

- EC2라는 서비스 이름을 선택하고 모든 인스턴스를 선택한다.

- 현재 존재하는 ec2 인스턴스가 basiton host 밖에 없기 때문에 모든 인스턴스를 선택했다

- 하지만, 인스턴스가 여러개이고 특정 인스턴스에대한 상태를 알림 받고 싶으면 특정 인스턴스의 ID를 입력한다.

 

- 규칙 이름을 입력하고 규칙 생성 버튼을 누른다.

 

- bastion host의 인스턴스를 중지 시키고 메일에서 상태가 변했을 때 오는 알림을 확인할 수 있다.

 

1.4 CloudWatchLog 실습

sudo su - root # root 사용자로 변환
cd /var/log/httpd/ # httpd 경로로 변환하기
yum install -y awslogs # awslogs 설치
systemctl enable --now awslogsd

 

vi /etc/awslogs/awscli.conf # awscli.conf 파일에 들어가서 다음과 같이 편집
aws configure
systemctl restart awslogsd
systemctl restart httpd

 

1.5 IAM 정책, 역할 생성

* ec2가 로그를 활용할 수 있게 특별한 권한을 부여해야한다.

- IAM 서비스에서 정책 생성 버튼 클릭

- 리소스를 모든 리소스로 선택한다.

 

- 정책 이름을 설정한다.

- EC2에게 부여할 역할을 생성한다.

 

- 부여할 정책을 선택하고 역할 이름을 부여하여 설정을 마친다.

- bastion host ec2의 역할을 로그를 볼 수 있는 역할로 수정한다.

- 다시 CloudWatch에 접근하면 로그 그룹에서 접근, 에러, 메세지의 로그를 볼 수 있다.

- accces_log는 ec2에 접근한 로그를 볼 수 있으며 해당 경로로 들어가면 대상으로 선택한 ec2 목록을 볼 수 있다.

 

2. AWS 클라우드 네트워크 보안

- AWS WAF 구축 및 DVWA 도커 컨테이너 취약점 진단

웹 엑세스 제어 목록(웹 ACL)및 보호 할 AWS에 대한 높은 수준의 정보를 제공한다. 웹 ACL은 AWS 리소스로 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있는 웹 어플리케이션 방화벽이다. Amazon CloudFront 배포, Application Load Balancer, Amazon APiI, Gateway API 및 AWS AppSync GraphQL API와 같은 AWS 리소스를 보호 할 수 있다.

2.1 ALB 생성

- ALB의 이름을 셋팅하고

- vpc의 가용영역을 my-pub-2a, my-pub-2c로 선택한다

 

- 대상그룹을 만들 떄에는 리스너를 HTTP(80)포트로 설정한다. 

 

- ALB의 리스너는 HTTPS(443)으로 설정하고 

- ACM 인증서를 HTTPS 사용을 위해 설정에서 넣어준다.

 

- alb의 Route53 레코드 설정

 

- elb는 대상그룹에서 인스턴스가 unhealthy 상태여도 대상그룹의 인스턴스가 하나면 80포트로 접속을 해버린다.

 

- "' OR '1' = '1'--  "를 검색하면 admin을 확인할 수 있다.

/*

여기서 아이디는 'admin'으로 쓰였으며
비밀번호는 ' OR '1' = '1로 쓰였다.
비밀번호를 분해해보면 실제로 입력된 비밀번호는 ' '가 입력됐으며 그 뒤의 OR '1' = '1은 연산자로 쓰이게 된다.

첫번 째 비교인 아이디와 비밀번호를 확인해보자.
아이디 admin이 DB에 있으니 True값이 출력되고
비밀번호는 ' '로 DB에 없어 False가 출력되어 결과적으로 A와 B값 모두가 참이여야 True가 나와야하는 AND 논리연산자에 의해 결과값이 False가 나오게 된다.
이 결과값을 A라고 가정하자.

두번 째 비교인 OR '1' = '1을 확인해보자.
OR 연산자는 위에서 말했던 것 처럼 A또는 B값 중 하나라도 True값이면 True값이 나오게 된다.
'1'과 '1'은 서로 같기 때문에 값은 True가 나오게 된다. 이 결과값을 B라고 가정하자.

이후 AND연산을 먼저 하고 나온 A값(False)과 B(True)값을 OR연산으로 진행하게 되면

A값(False)과 B값(True)중 하나라도 참(True)이면 DB에서 정보를 가져온다. 라는 결과가 도출되게 된다.

*/

2.1 WAF & Shield

* 웹 ACL 생성(웹 방화벽 생성)

- waf 서비스에서 alb를 리소스로 넣어준다.

- AWS-AWSManagedRulesSQLiRuleSet 위배 규칙에 어긋나는 것만 허용한다.

- 이 규칙에 맞아 떨어지면 Attack으로 간주

 

- 현재 VPC 구성도 이다.

- waf가 규칙에 맞아 떨어지는 접근을 alb로 들어가기 전에 차단한다.

 

- 다시 한번 dvwa에서 OR '1' = '1'--  을 검색하면 403 Forbidden에러가 발생한다.

 

3. NAT Instance

* Public subnet에 위치시킨다.(실습에서는 pub-2a에 만들었다)

* 가용 영역을 2a로 하는 인스턴스 생성

sudo sysctl -w net.ipv4.ip_forward=1 # ip-forward 기능을 활성화
sudo /sbin/iptables -t nat -A POSTROUTING -o enX0 -j MASQUERADE # snat의 기능을 한다 postrouting(내부에서의 트래픽이 외부로 나간다는 뜻), 외부에서 들어오는 것이 아니라 내부에서 나가는 것에 대한 셋팅이다.
sudo yum install -y iptables-services
sudo service iptables save

 

- wp01과 wp02를 템플릿을 활용해서 생성한 다음

- 로드밸런서를 생성하여 대상그룹에 넣어준다.

 

- private subent 라우팅 테이블의 목적지와 대상을 설정해준다.

 

- 소스/대상 확인 변경을 중지로 클릭한다.

- 라우터 역할 할 수 있도록(end 단이 아니라 중개의 역할을 하도록 만든다.)

- 트래픽을 송수신하는 역할로 만든다.

 

4. Autoscaling 장애 발생시 자동 복구

* Autoscaling은 대상 그룹 안에 있는 인스턴스 중 하나에 이상이 생기면 그 인스턴스를 종료 시키고 새롭게 인스턴스를 생성하는 기능이 있다.

- Autoscaling 그룹에서 상태 확인 목록의 편집을 눌러서 Elastic Load Balancer 상태 확인 켜기를 체크한다.

 

 

- 대상 그룹에 있는 인스턴스 하나의 httpd 데몬 파일을 중지 시킨다

- 이렇게 하면 인스턴스에 이상이 생겨서 autoscaling에서 자동으로 이 인스턴스를 종료한다.

- 또한 인스턴스를 중지 시키면 상태 이상으로 간주하여 그 인스턴스 역시 종료 시키고 새로운 인스턴스를 만든다.

- httpd를 중지한 new01인스턴슬 지우고 새로운 인스턴스를 만들고 있다.