가상화
: 하드웨어를 소프트웨어적으로 표현
클라우드 컴퓨팅
: it리소스를 인터넷을 통해 온디맨드로 제공하고 사용한 만큼만 비용을 지불하는 것
클라우드 컴퓨팅 유형
- laaS : 네트워킹,컴퓨터 및 스토리지 공간에 대한 액세스 제공
- PaaS : 기본 인프라 관리x > 앱 개발과 관리에 집중 가능
- SaaS : "완전한 제품", 인프라 관리x
클라우드 컴퓨팅의 장점
- 민첩성 : 광범위한 기술에 쉽게 엑세스 가능, 필요에따라 빠르게 구동가능
- 탄력성 : 필요한 만큼 리소스를 프로비저닝, 리소스 확장과 축소 가능
- 비용 절감
aws에서 요금을 지불하는 방법
- 사용량에 따른 요금
- 커밋을 통한 비용절감
- 더많이 사용하여 더 적은 비용을 지불
리전
: aws가 전 세계에서 데이터 센터를 클러스터링하는 물리적 위치
가용 영역(AZ)
: aws 리전의 중복 전력, 네트워킹 및 연결이 제공되는 하나 이상의 개별 데이터 센터로 구성
IAM
- AWS 서비스 및 리소스에 대한 액세스와 ID를 안전하게 관리
- 사용자(users), 그룹(group), 역할(role), 정책(policy)으로 구성
- 리전에 속하는 서비스가 아닌 글로벌 서비스
- 식별 → 인증 → 인가
- 사용자 : AWS의 기능과 자원을 이용하는 객체
- 사용자 식별 방법 : 사용자의 고유 식별자 = AWS 계정 ID
- 사용자 자격증명 방법
- AWS Managemetn Console 암호
- Access Key = Accerss Key ID + Secret Access Key
- SSH Key ⇒ AWS에 생성한 EC2 인스턴스로 SSH 접속할 때 사용
- 서버 인증서
- 그룹 : 여러 사용자에게 공통으로 권한을 부여하기 위해서 만든 개념
- 권한 : 어떤 작업을 할 수 있는지 여부를 명시한 규칙
- 정책 : 권한을 정의하는 aws의 객체
- 자격 증명 기반 정책 : 자격증명이 무슨 작업을 어느 리소스에서 어떤 조건에서 수행할 수 있는지를 제어하는 json 권한 정책문서
- 관리형 정책 : 다수의 사용자, 그룹 및 역활에 독립적으로 연결할수 있는 자격 증명 기반 정책
- 인라인 정책 : 단일 사용자, 그룹 또는 역활에 직접 추가하는 정책
- 리소스 기반 정책 : (인라인 정책) S3 버킷과 같은 리소스에 연결하는 정책으로 지정된 보안 주체에 해당 리소스에 대한 특정 작업을 수행할 수 있는 권한을 부여하여 이러한 권한이 적용되는 조건을 정의
- 권한 경계 : 관리형 정책을 사용해 자격 증명 정책이 IAM 엔티티(사용자 또는 역할)에 부여할 수 있는 최대 권한을 설정하기 위한 고급 기능
json 정책 문서

json 정책문서의 구조
- 문서 상단에 정책 전반의 선택적 정보
- 하나 이상의 Statement로 구성
- 각 Statement에는 단일 권한에 대한 정보가 포함
- 정책에 여러 Statement가 포함된 경우 AWS는 이를 평가할 때 Statement 전체에 논리 OR를 적용
json 정책 요소
- Version
- 정책 언어의 버전
- 최신 버전 "2012-10-17" 사용을 권장
- Statement (필수)
- 단일 문 또는 개별 문의 배열을 포함
- "Statement": [ { ... }, { ... }, { ... } ]
- Sid
- 문(statement) 배열에서 각 문에 할당
- JSON 정책 내에서 고유해야 하며, 정책 문에 대한 설명으로 사용이 가능
- Effect (필수)
- 문의 허용 또는 명시적 거부를 지정
- Allow 또는 Deny 값을 가질 수 있음 (대소문자를 구분)
- 기본적으로 리소스 액세스는 거부되므로, 리소스 액세스를 허용하려면 Effect 요소를 Allow로 설정해야 함
- Principal
- 리소스 기반 정책을 생성하는 경우 액세스를 허용하거나 거부할 계정, 사용자, 역할 또는 페더레이션 사용자를 표시
- Action (필수)
- Resources (필수)
- Condition
- 정책이 효력이 발생하는 시점에 대한 조건을 지정
"Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" } }
JSON 정책 구문 예시
자격 증명 기반 정책으로 example_bucket이라는 하나의 Amazon S3 버킷 목록을 암시된 보안 주체를 허용 한다.
{
"Version": "2012-10-17",
"Statement": {
"Resource": "arn:aws:s3:::exampel_bucket",
"Action": "s3:ListBucket",
"Effect": "Allow"
}
}
모든 리소스에 모든 동작을 허용
{
"Version": "2012-10-17",
"Statement": {
"Resource": "*",
"Action": "*",
"Effect": "Allow"
}
}
!! 안전한 권한 부여 방법 ⇒ 최소 권한 부여

방법 1. 모든 리소스에 모든 동작을 허용 → 필요 이상의 권한을 부여 ⇒ 안전하지 않음
방법 2. DynamoDB에 대한 액션을 구체화 ⇒ DynamoDB의 모든 테이블에 대해 read/write가 가능 ⇒ (접근하면 안 되는) 다른 테이블에 대해서도 접근이 가능하므로 안전하지 않음
방법 3. 사용할 테이블을 제한(한정) ⇒ myDynamoDBTable에 대해서만 read/write 하도록 제한
방법 4. 특정 조건을 명시 ⇒ IP 주소가 1.2.3.4인 곳에서 접근하는 경우에만 myDynamoDBTable에 read/write할 수 있도록 제한
CSRF = 크로스 사이트 요청 위조
: 요청의 절차와 주체를 확인하지 않고 요청을 처리했을 때 발생하는 문제
-> 희생자의 권한으로 요청이 처리
AWS CLI 명령어
- List* ⇒ 자원의 목록을 나열(목록 조회)하는 데 사용
예) ListBuckets, ListInstances, ListUsers
- Describe* ⇒ 특정 리소스에 대한 세부 정보를 확인
예) DescribeInstances, DescribeDBInstances, DescribeVolumes
- Get* ⇒ 자원 자체 또는 특정 데이터를 가져오는 작업
예) GetObject (S3 객체(파일) 다운로드)
- Put* ⇒ 기존 자원에 데이터를 쓰거나 업데이트
예) PutObject (S3에 파일을 업로드)
- Create* ⇒ 새로운 자원(리소스)를 생성
예) CreateBucket, CreateInstance, CreateDBInstance
AWS 클라우드 보안 가이드
1.1 사용자 계정_관리
모든 AWS 리소스는 AWS 계정의 소유이고, 리소스 생성 또는 액세스 권한은 권한 정책에
따라 결정됩니다. 계정 관리자는 IAM 자격 증명(즉, 사용자, 그룹, 역할)에 권한 정책을
연결할 수 있으며 적절한 권한을 통한 서비스 관리가 이루어져야 합니다.
(*) AWS 관리형 정책
서비스 내 FULL ACCESS 등과 같이 중요도가 높은 AWS 관리형 정책은 EC2 서비스
관리/운영자 및 관련 담당자 외에 다른 IAM 계정에 아래와 같은 권한 할당이 되지 않도록
해야합니다. 그중에서도 AWS Admin Console 관리자(AdministratorAccess) 권한은 다수의
IAM 계정에 설정되지 않도록 관리 조치가 필요합니다

Console Admin = Management Console 관리자 = 루트 사용자 = AWS 가입에 사용한 계정
1.2 IAM 사용자 계정_단일화 관리
모든 AWS 리소스는 AWS 계정의 소유이고, 리소스 생성 또는 액세스 권한은 권한 정책에 따라 결정됩니다. 계정 관리자는 IAM 자격 증명(즉, 사용자, 그룹, 역할)에 권한 정책을 연결할 수 있으며 적절한 권한을 통한 서비스 관리가 이루어져야 합니다.
(*) 적절한 IAM 계정 사용
- AWS IAM 계정 생성 시 1인 1계정 발급을 원칙
- 1명의 담당자가 다수의 IAM 계정을 보유하는 것을 지양
- Cloud 서비스 리소스 사용이 필요할 경우 내부 정책을 기준으로 목적에 맞게 권한이 부여되어야 합니다.
※ Cloud 서비스 별 IAM 계정 생성 및 관리 금지
1.3 IAM 사용자 계정_식별 관리
- IAM 사용자 계정에는 태그를 추가 가능
- 태그 : 사용자를 표현하는 정보 및 직책의 내용을 포함, IAM 사용자에 대한 액세스 구성, 추정 또는 제어가 가능

1.4 IAM 그룹 사용자_계정 관리
- IAM 그룹 사용자(IAM 사용자들의 집합)
- 그룹에 대한 IAM 권한 적용 시 그룹 내 사용자들에게 일괄 적용
- AWS 사용자들에 대한 권한을 쉽게 관리
IAM 사용자 계정 단일화 관리
- 태그 설정 여부 확인
- 태그의 이름과 계정이 1:1 관계를 유지하는지 확인
- list-user-tags 명령어 사용
- 그가 지정되어 있지 않으면 취약
IAM 역할 및 권한에 대한 현황을 확인
- 사용자 그룹에 할당된 권한을 조회
⇒ list-attached-group-policies (그룹에 연결된 관리형 정책을 조회)
⇒ list-group-policies (그룹에 연결된 인라인 정책을 조회)
=> get-group-policy(그룹에 적용된 인라인 정책 문서의 내용을 조회)
1.5 Key Pair_접근 관리
- EC2는 키(Key)를 이용한 암호화 기법을 제공
- Key Pair : 퍼블릭/프라이빗 키를 통해 각각 데이터의 암호화 및 해독을 하는데 사용되는 키
- 보안성을 향상시킬 수 있으므로 EC2 인스턴스 생성 시 Key Pair 등록을 권장
- Amazon EC2에 사용되는 키는 ‘2048비트 SSH-2 RSA 키’ + Key Pair는 리전당 최대 5천 개까지 보유 가능
암호화 / 복호화
1.6 Key Pair_보관 관리
Key Pair 는 타 사용자가 확인이 가능한 공개된 위치에 보관하게 될 경우 > EC2 Instance 에 무단으로 접근이 가능 > 비인가자가 쉽게 유추 및 접근이 불가능한 장소에 보관해야 함
- 키 페어 목록을 조회 > 키페어가 퍼블릭 접근이 불가능한 S3 버킷에 저장되어 있는지 확인
- 키 페어가 없는 경우 → 해당 없음
- 키 페어가 있는 경우
- 퍼블릭 접근이 가능한 S3 버킷에 키 페어가 저장되어 있으면 → 취약
- 퍼블릭 접근이 불가능한 S3 버킷에 키 페어가 저장되어 있으면 → 양호
Flask 기반 웹 애플리케이션 개발
- Flask : python의 마이크로 웹 프레임워크
- static : 정적 리소스(이미지, CSS파일,JS 파일...) 가 위치
- template : 템플릿 파일이 위치
리다이렉션 취약점 = 신뢰되지 않는 URL 주소로 자동접속 연결

1.7 Admin Console 관리자_정책 관리
루트 사용자 계정(AWS Cloud 사용을 위해 처음 발급한 계정) : IAM 사용자 계정과 달리 모든 서비스에 접근할 수 있는 최고 관리자 계정
- 인터넷 연결이 가능한 망에서 계정 정보를 인력하여 WEB Console에 접근한다.
- 기본적으로 IAM계정이여야 안전
- 진단기준 : admin console 계정을 서비스 용도로 사용하지 않은 경우에 양호
1.8 Admin Console 계정_Access Key 활성화 및 사용주기 관리
- 진단기준 : AWS Admin Console 계정에 Access Key가 존재하지 않고 IAM 사용자 계정에 대한 Access Key 사용 주기가 60일 이내일 경우에 양호로 판단
1.9 MFA 설정
AWS Multi-Factor Authentication(MFA) : 사용자 이름과 암호 외에 보안을 한층 더 강화할 수 있는 방법
-
사용자가 AWS 웹 사이트에 로그인할 때 사용자 이름과 암호뿐만 아니라 AWS MFA 디바이스의 인증 응답을 입력하라는 메시지가 표시
-
다중 요소를 통해 AWS 계정 설정 및 리소스에 대한 보안을 높일 수 있다.
-
MFA를 구현하는 데 사용할 수 있는 세 가지 인증 요소
- 1) 사용자가 알고 있는 것(예: 비밀번호, PIN, 암호) ⇐ 지식 기반 인증
- 2) 사용자가 소유하고 있는 것(예: 스마트폰, USB 드라이브, 토큰 장치) ⇐ 소유 기반 인증
- 3) 사용자의 신체적 특징(예: 지문, 얼굴 인식, 음성 인증) ⇐ 특징 기반 인증
-
판정 기준 ⇒ AWS 계정 및 IAM 사용자 계정 로그인 시 MFA가 활성화 되어 있을 경우 "양호"로 판정
1.10 AWS 계정 패스워드_정책 관리
AWS Admin Console Account 계정 및 IAM 사용자 계정의 암호 설정할 때 유추하기 쉬운 암호를 설정 > 비 인가된 사용자가 해당 계정을 획득하여 접근 가능성이 존재
안전한 패스워드란 ?
제 3자가 쉽게 추측할수 X, 시스템에 저장되어있는 이용자 정보 또는 인터넷을 통해 전송되는 정보를 해킹하여 이용자의 패스워드를 알아낼 수 없거나 알아낸다 하더라도 많은 시간이 요구되는 패스워드
- 두 종류 이상의 문자구성과 9자리 이상의 길이로 된 문자열
- 10자리 이상의 길이로 구성된 문자열(숫자로만 구성X)
판정기준 : Admin Console 및 IAM 계정의 패스워드 복잡성 기준 준수 및 암호 만료/재사용 제한을 설정하고 있을 경우 "양호"로 판정
2.1 인스턴스 서비스_정책 관리
AWS 인스턴스 서비스(EC2, RDS, S3 등)의 리소스 생성 또는 액세스 권한은 권한 정책에 따라 결정됩니다.
- 판정 기준 : 인스턴스 서비스 IAM 사용 권한이 각각 서비스 역할에 맞게 설정되어 있을 경우 "양호"로 판정
- 사용 권한이 맞게 설정 = 사용자별로 할당된 권한 정보와 비교
- 사용 권한이 맞게 설정되어있는지 확인하는 절차(함수)
- list_users() ⇐ 사용자 정보 조회
- list_attached_user_policies() ⇐ IAM 사용자에게 부여된 관리형 정책을 조회
- list_user_polices() ⇐ 사용자에게 부여된 인라인 정책을 조회
- list_groups_for_user() ⇐ 사용자가 속한 그룹을 조회
- list_attached_group_policies() ⇐ 그룹에 할당된 관리형 정책을 조회
- list_group_policies() ⇐ 그룹에 할당된 인라인 정책을 조회
2.2 네트워크 서비스_정책 관리
AWS 네트워크 서비스(VPC, Route 53, Direct Connect 등)의 리소스 생성 또는 액세스 권한은 권한 정책에 따라 결정됩니다.
2.3 기타 서비스_정책 관리
AWS 기타 서비스(CloudWatch, CloudTrail, KMS 등)의 리소스 생성 또는 액세스 권한은 권한 정책에 따라 결정됩니다.
3. 가상 리소스 관리
3.1 보안 그룹 인/아웃바운드_ANY 설정 관리

- VPC에서의 보안 그룹의 역활 : EC2 인스턴스에 대한 인/아웃바운드 트래픽을 제어하는 가상 방화벽 역할
- VPC에서 EC2 인스턴스를 시작할 때 최대 5개의 보안 그룹에 인스턴스를 할당가능
- 보안 그룹은 서브넷 수준이 아니라 인스턴스 수준에서 작동하므로 VPC에 있는 서브넷의 각 인스턴스를 서로 다른 보안 그룹 세트에 할당 가능
- 보안 그룹은 인/아웃바운드의 규칙 편집을 통해 특정 소스(출발지)에서의 통신이 가능하도록 유형(네트워크 프로토콜) 및 단일/범위 포트를 설정 가능
판정 기준 : 보안 그룹 내 인/아웃바운드의 포트가 Any로 허용되어 있지 않을 경우 "양호"
3.2 보안 그룹 인/아웃바운드_불필요 정책 관리
판정 기준 : 보안 그룹 인/아웃바운드 규칙 내 불필요한 정책(Source, Destination)이 존재하지 않는 경우 "양호"
3.3 네트워크 ACL 인/아웃바운드 트래픽 정책 관리
- 네트워크 ACL(Access Control List) : 1개 이상의 서브넷 내부와 외부의 트래픽을 제어하기 위한 방화벽 역할을 하는 VPC의 선택적 보안 계층
- 보안 그룹과 비슷한 규칙으로 네트워크 ACL을 설정하여 VPC에 보안 계층을 더 추가 가능
- ACL은 VPC 서브넷 계층에서 동작하며 VPC 서브넷과는 1:1로 대응
- 정책의 방식은 허용(Allow) 및 거부(deny) 정책(WhiteList or BlackList) 기능으로 Stateless 방식으로 사용
- VPC에 있는 각 서브넷을 네트워크 ACL과 연결하여 사용할 수 있으며, 서브넷을 네트워크 ACL에 명시적으로 연결하지 않을 경우, 서브넷은 기본 네트워크 ACL에 자동적으로 연결
(단, 하나의 네트워크 ACL은 다수의 서브넷과 연결할 수 있지만 하나의 서브넷은 하나의 ACL에만 연결할 수 있음)
VPC(Vitual Private Cloud)
: AWS 사용자 계정 전용 가상 네트워크
- AWS 클라우드에서 다른 가상 네트워크와 논리적으로 분리
- VPC Peering : 한 AWS 리전 안에서만 존재할 수 있고, 한 리전에 만든 VPC는 다른 리전에서는 보이지 않음
- 생성시 RFC 1918에 지정된 프라이빗 주소 체계 사용을 권장
- 10.0.0.0/8 ⇒ 10.0.0.0 - 10.255.255.255
- 172.16.0.0/12 ⇒ 172.16.0.0 - 172.31.255.255
- 192.168.0.0/16 ⇒ 192.168.0.0 - 192.168.255.255
기본 VPC 구성요소 (default VPC)
3. 인스턴스2 + AMI 생성

4. 로드밸런서 구성

5. 로드밸런서를 통해서만 이용할수 있게 변경
= 개별 인스턴스로 접속 x

코드형 인프라(IaC, Infrastructure as Code)
: 수동 프로세스 및 설정 대신 코드를 사용하여 컴퓨팅 인프라를 프로비저닝하고 지원하는 기능
- 수동 인프라 관리는 시간이 많이 걸리고 오류가 발생하기 쉽다
- 코드형 인프라를 사용하면 원하는 상태에 도달하기 위한 모든 단계를 포함하지 않고도 인프라의 원하는 상태를 정의
사이트 신뢰성 엔지니어링(SRE, Site Reliability Engineering)
: 소프트웨어 도구를 사용하여 시스템 관리 및 애플리케이션 모니터링과 같은 IT 인프라 작업을 자동화하는 관행
- 조직은 SRE를 사용하여 개발 팀의 빈번한 업데이트 중에도 소프트웨어 응용 프로그램의 안정성을 유지
- 대규모 시스템을 관리하는 것이 수백 대의 기계를 수동으로 관리하는 것보다 지속 가능하기 때문에 확장 가능한 소프트웨어 시스템의 신뢰성을 향상시킨다.
: AWS 리소스를 모델링하고 설정하여 리소스 관리 시간을 줄이고 AWS에서 실행되는 애플리케이션에 더 많은 시간을 사용하도록 해 주는 서비스
- 필요한 모든 AWS 리소스를 설명하는 템플릿을 생성하면 CloudFormation이 해당 리소스의 프로비저닝과 구성을 담당
- AWS 리소스를 개별적으로 생성하고 구성할 필요가 없으며 어떤 것이 무엇에 의존하는지 파악할 필요도 없음 > CloudFormation에서 모든 것을 처리하기 때문에
구성 요소
- 템플릿 : JSON 또는 YAML 형식의 텍스트 파일
- 스택
- 하나의 단위로 관련 리소스를 관리
- 스택을 생성, 업데이트, 삭제하여 리소스 모음을 생성, 업데이트 및 삭제
- 스택의 모든 리소스는 템플릿으로 정의
- 변경 세트 : 리소스를 변경하기 전에 제안된 변경 사항 요약
- 변경 세트를 사용하면 변경 사항을 구현하기 이전에 해당 변경이 실행 중인 리소스 특히, 중요 리소스에 미치는 영향을 확인할 수 있다.

1. Infrastructure Composer (인프라 컴포저) 또는 텍스트 편집기를 사용하여 JSON 또는 YAML 형식으로 템플릿을 생성하거나 수정
2. 템플릿을 로컬 또는 Amazon S3 버킷에 저장
3. 템플릿 파일의 위치(예: 로컬 컴퓨터의 경로 또는 Amazon S3 URL)를 지정하여 스택을 생성 (템플릿에 파라미터가 포함되어 있는 경우 스택을 생성할 때 입력 값을 지정할 수 있음)
변경 세트로 스택 업데이트

3. 업데이트하려는 스택과 수정된 템플릿의 위치(예: 로컬 컴퓨터의 경로 또는 Amazon S3 URL)를 지정하여 변경 세트를 생성합니다. 템플릿에 파라미터가 포함되어 있는 경우 변경 세트를 생성할 때 값을 지정할 수 있습니다.
4. 변경 세트를 보고 기대하는 변경을 CloudFormation에서 수행할지 확인합니다. 예를 들어 CloudFormation에서 중요한 스택 리소스를 대체할지 확인합니다. 원하는 변경 사항을 포함할 때까지 변경 세트는 필요한 만큼 생성할 수 있습니다.
스택 삭제
삭제할 스택을 지정하면 CloudFormation에서는 해당 스택과 스택 내 모든 리소스를 삭제한다.
템플릿을 저장하고 있는 S3 버킷은 별도로 (수동으로) 삭제해야 함
스택 업데이트
: SSH 접속이 가능하도록 등록된 키 페어를 선택하고, 보안그룹에 인바운드 22번 포트를 허용하도록 수정
- 키 페어가 AWS에 등록되어 있고, 개인키를 가지고 있다
- SH로 접속 가능한 IP 대역을 사용자가 입력하도록 해서 접속을 제한
- 파라미터로 처리 (CIDR 형식에 맞춰서 문자열로 자유롭게 입력)