공동 책임 모델
- 보안과 규정 준수는 AWS와 고객의 공동 책임입니다.
- 이 공유 모델은 AWS가 호스트 운영 체제 및 가상화 계층에서 서비스가 운영되는 시설의 물리적 보안에 이르기까지 구성 요소를 운영, 관리 및 제어하므로 고객의 운영 부담을 경감할 수 있습니다.
- 고객은 게스트 운영체제(업데이트 및 보안 패치 포함) 및 다른 관련 애플리케이션 소프트웨어를 관리하고 AWS에서 제공한 보안 그룹 방화벽을 구성할 책임이 있습니다.
AWS 책임 '클라우드의 보안'
- AWS 클라우드에서 제공되는 모든 서비스를 실행하는 인프라를 보호할 책임
- 인프라는 AWS 클라우드 서비스를 실행하는 하드웨어, 소프트웨어, 네트워킹 및 시설로 구성
고객 책임 '클라우드에서의 보안'
- 고객이 선택하는 AWS 클라우드 서비스에 따라 달라짐
- 보안 책임의 일부로 수행해야하는 구성 작업량에 따라 정해진다.
- EC2와 같은 서비스는 Iaas 로 구분 되고 고객이 필요한 모든 보안 구성 및 관리 작업을 수행하도록 요구
AWS 클라우스 서비스 보안
AWS 계정보안의 이해
-
AWS 서비스에 대한 액세스를 제어하는 웹 서비스
-
IAM을 통해 사용자, 액세스 키와 같은 보안 자격 증명, 사용자와 애플리케이션이 어떤 AWS 리소스에 액세스할 수 있는지 제어하는 권한을 한 곳에서 관리가능 ⭕
IAM 사용자, 그룹, 다중인증 설정
- 개별 IAM 사용자에 대해 권한을 정의하는 대신, 업무(관리자, 개발자, 회계 등)에 관련된 사용자 그룹을 만드는 것이 더 편리할 수 있습니다. 그런 다음 각 사용자 그룹별로 관련 권한을 정의가능
- 사용자 그룹에 속한 모든 사용자에게 상속
- 한번에 사용자 그룹 내 모든 사용자에 대해 변경 사항 적용 가능
- 사내에서 직원의 부서가 변경되면 해당 IAM 사용자가 속한 IAM 사용자 그룹만 변경하면 된다.
IAM 키 유출 대책
방법 1: EBS 루트 볼륨 변경
- 뭔가 변화가 발생하는 경우 잠시 인스턴스를 종료하고 수행하는 것 상황에 사용하는 것이 좋음.
- 키 페어 생성후 키를 분실한 인스턴스와 같은 AZ에 새로운 인스턴스 생성(생성한 키를 이용)
- 키를 잃어버린 인스턴스와 방금 생성한 인스턴스 사용 중지
- 각 인스턴스의 볼륨 분리
- 분리된 볼륨을 연결 - ❗ 기존 인스턴스+새로운 볼륨, 주의 디바이스 이름(
/dev/sda1
안되면 /dev/xvda
)
방법 2: 이미지로 만들어서 복제
- 변화가 발생해도 상관 없는 경우 사용하는 것이 좋음.
- 인스턴스를 이미지로 생성 - 인스턴스 우클릭 - 이미지 및 템플릿 - 이미지 생성
- 이미지로 인스턴스를 생성하는 과정에서 키를 셋팅 - AMI 우클릭 - AMI로 인스턴스 시작 클릭
AWS CLI 설치 및 보안 자격 증명 설정
$ sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ sudo unzip awscliv2.zip
$ sudo ./aws/install
$ aws configure
$ aws s3 ls
ACM을 이용한 공인 인증서 발급 및 HTTPS 보안 연결
- AWS Certificate Manager 는 AWS 서비스 및 연결된 내부 리소스에 사용할 공인 및 사설 SSL/TLS(Secure Sockets Layer/전송 계층 보안) 인증서를 손쉽게 프로비저닝, 관리 및 배포할 수 있도록 지원하는 서비스
- SSL/TLS 인증서는 네트워크 통신을 보호하고 인터넷상에서 웹 사이트의 자격 증명과 프라이빗 네트워크상에서 리소스의 자격 증명을 설정하는 데 사용
- AWS Certificate Manager는 SSL/TLS 인증서를 구매, 업로드 및 갱신하는데 드는 시간 소모적인 수동 프로세스를 대신 처리
- 인증서 - 무료, 인증서를 이용하기 위한 서비스 유료
ELB에 인증서 연동
- ALB 생성
- 네트워크 매핑 - public 서브넷 설정
- 보안 그룹 설정
- 리스너 및 라우팅
- 대상 그룹 생성 - 인스턴스 유형, 이름, 포트번호 설정(💦 지금은 80/ 필요에 따라 설정) 후 다음
- 대상 그룹 지정
- 보안 리스너 설정
서울
(로드밸런서에서 인스턴스가 존재하는) 리전에서 인증서 생성
- 검증이 필요하다면 인증서 세부정보 - Route 53에 레코드 추가하기
- 로드 밸랜서 생성
- 레코드 추가/편집 -
https
로 접속확인
아마존 Inspector를 이용한 애플리케이션 보안 분석
- Amazon Inspector
- 규모에 맞는 지속적인 자동 취약성 관리서비스
- Amazon Inspector 인스턴스의 네트워크 액세스 가능성 및 해당 인스턴스에서 실행되는 애플리케이션의 보안 상태를 테스트 합니다.
- Amazon Inspector는 노출, 취약성 및 모범 사례와의 차이를 평가
- 평가를 수행한 후 상세한 보안 평가 결과를 심각도 수준에 따라 구성된 목록으로 제공
- 사전 정의된 소프트웨어도 제공
- 에이전트는 평가하려는 EC2 인스턴스의 운영 체제에 선택적으로 설치 가능
- 에이전트는 네트워크, 파일 시스템 및 프로세스 활동을 포함하는 EC2 인스턴스의 동작을 모니터링
- 또한 광범위한 동작 및 구성 데이터를 수집
- Amazon EC2 인스턴스, 컨테이너 및 Lambda 함수와 같은 워크로드를 자동으로 검색하고 소프트웨어 취약성과 의도하지 않은 네트워크 노출이 있는지 스캔
- Amazon Inspector로 모니터링하려는 각 리전에서 구성이 필요 ❗
대시보드
- 인스펙터
인스펙터 실습
인스턱터로 평가할 EC2 환경 구축
- ec2 생성 후 dvwa 환경 구축 과 inspector agent 설치
$ sudo systemctl stop httpd
$ 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
$ sudo bash install
$ wget https://inspector-agent.amazonaws.com/linux/latest/install
$ sudo bash install
- ip 또는 도메인
/login.php
Path로 접근
- 초기 id, pw : admin, admin
- DB 세팅 - 이후 비밀번호: admin -> password 변경됨.
인스펙터 생성
-
Advanced set up; 고급 설정
-
평가 대상 정의
-
평가 템플릿 정의 - 15분으로 설정
-
검토 후 생성 클릭
생성 결과
평가 실행
- 평가 템플릿이 자동으로 시작안돼서 실행 클릭
- 또는 평가 실행 탭에서 실행
평가 결과
- 결과
- all log 검색 후 상세 보기
환경 종료
$ ls -al /var/log
$ sudo docker container ls -a
$ sudo docker container stop dvwa
$ sudo docker container ls -a
$ sudo systemctl start httpd
CloudWatch 실습
CloudWatch 지표 확인
- 모든 지표 -> EC2 -> 인스턴스별 지표
Amazon SNS
주제 생성
클릭
- 주제 세부 정보 입력
구독 생성
클릭
- 구독 세부 정보 입력
confirm subscription
체크
CloudWatch 규칙 생성
-
규칙 생성
클릭
-
규칙 정보 입력
-
EC2에서 실습
$ sudo yum install -y httpd
$ sudo systemctl enable --now httpd
$ sudo yum install -y awslogs
$ sudo vi /etc/awslogs/awslogs.conf
[/var/log/httpd/access_log]
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/access_log
buffer_duration = 5000
log_stream_name = {instance_id}
log_group_name = /var/log/httpd/access_log
[/var/log/httpd/error_log]
datetime_format = %b %d %H:%M:%S
file = /var/log/httpd/error_log
buffer_duration = 5000
log_stream_name = {instance_id}
log_group_name = /var/log/httpd/error_log
$ sudo systemctl enable --now awslogsd
$ sudo vi /etc/awslogs/awscli.conf
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-2
IAM 정책 생성
정책 생성
클릭
- cloudwatch logs, 모든 리소스
- 생성
IAM 역할 생성
- 역할 생성
- 권한 추가
- 이름 지정후 역할 생성 클릭
- 역할 생성 완료
EC2 인스턴스 IAM 역할 수정
- 적용을 위해 인스턴스에서 awslogsd, httpd 재시작 수행
$ sudo systemctl restart awslogsd
$ sudo systemctl restart httpd
- 로그 그룹 생성됨.
AWS 클라우드 네트워크 보안
AWS WAF 구축 및 DVWA 도커 컨테이너 취약점 진단
- 웹 액세스 제어 목록 (웹 ACL) 및 보호할 AWS 리소스에 대한 높은 수준의 정보를 제공
- 웹 ACL은 AWS 리소스로 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수있는 웹 애플리케이션 방화벽
- Amazon CloudFront 배포, ALB, Amazon API Gateway API 및 AWS AppSync GraphQL API와 같은 AWS 리소스를 보호 가능
WAF 실습 환경 구축
- EC2에서 DVWA 도커 컨테이너 환경 구축
- DVWA 도커 컨테이너 EC2 대상 그룹으로 한 로드 밸런서 생성
EC2에 DVWA 도커 컨테이너 환경 구축
--- 웹서버가 있다면
$ sudo systemctl stop httpd
$ sudo yum install docker -y
$ sudo systemctl enable --now docker
$ sudo docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa
로드 밸런서 생성
- 로드밸랜서 생성 - ALB -
my-alb
- my-vpc
- 퍼블릭 서브넷 a, c - 보안그룹 my-sg-alb
- 리스너 프로토콜(HTTPS, 대상그룹: my-tg-waf
, 프로토콜 HTTP) - 대상 그룹 선택 - 로드밸랜서 생성
- ALB의 DNS 대신 인증서를 이용하기 위해서 HTTPS를 구현하기 위해서 Route 53에서 레코드 생성(인증서 규칙, *.\<domain>.shop) -
waf.goorm.shop
- 레코드 생성
- ALB는 대상 그룹에 대상이 하나만 있는 경우
unhealthy
인 경우에는 포워드 해준다.
- 웹사이트 접속 (admin, password)
WAF 생성
- WAF
- Web ACLs 클릭
- 리전 선택 후 생성 클릭
- 정보 입력
- 리소스 선택
- Add rules and rule groups
- AWS managed rule groups - SQL database check -
Add rules
- Default web ACL action for requests that don't match any rules; 규칙과 매치가 안되는 트래픽은 어떻게 할것인가?
- Set rule priority
- Configure metrics; CloudWatch 에서 보는 부분
- Review and create web ACL
- 생성 결과; 가끔 오류 나는데 대시보드 가면 있다.
- 오류가 났다면 다시 리소스 세팅; 될때 까지 다시 진행
- WAF 적용 확인
- WAF 대시보드 보기
SQL Injection 실습
- SQL Injection 이해
' OR '1' = '1
, ' OR '1' = '1'--
SELECT user FROM user_table WHERE id='admin' AND password=' ' OR '1' = '1';
"SELECT user FROM user_table WHERE id='admin' AND password=' '";
여기서 아이디는 '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에서 정보를 가져온다. 라는 결과가 도출되게 된다.
아키텍처
NACL과 보안 그룹
- 보안 그룹은 인스턴스에 대한 인스턴스에 대한 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할 수행
- VPC 에서 인스턴스를 시작할 때 최대 5개의 보안 그룹에 인스턴스를 할당 가능
- 보안 그룹은 서브넷 수준이 아니라 인스턴스 수준에서 작동하므로 VPC 에 있는 서브넷의 각 인스턴스를 서로 다른 보안 그룹 세트에 할당 가능
- 네트워크 ACL(액세스 제어 목록)은 1개 이상의 서브넷 내부와 외부의 트래픽을 제어하기 귀한 방화벽 역할을 하는 VPC를 위한 선택적 보안 계층
- 보안 그룹과 비슷한 규칙으로 네트워크 ACL을 설정하여 VPC에 보안 계층을 더 추가 가능
리소스 제거
WAF 제거
- Associated AWS resources 제거
- Web ACLs 삭제
Inspector 제거
- Inspector 평가 대상,
삭제
클릭
- cloudwatch 이벤트 삭제, 규칙 삭제
cloudwatch 로그 그룹 삭제
-
로그 그룹 삭제
-
SNS 구독 및 주제 삭제
-
IAM 역할 분리
-
IAM 역할 제거, IAM 정책 제거