AWS 보안은 처음부터 끝까지가 IAM(인증, 인가)이며, AWS 사용 할 경우에는 피할 수 없다
AWS 을 이용하는 방법
AWS Web Console
CLI(Command Line Interface) : 코드형태의 명령형 인프라, SDK이용
AWS CloudShell을 통해 체험해 볼 수 있음
반복작업에 적합하다
원하는 항목에 대한 수정이 용이하다
리소스의 준비 상태 확인이 어렵다
문제 발생 시 복원이 어렵다
코드로서의 선언저 인프라
AWS CDK ( DOM 모델 기반)
AWS 계정의 활동 모니터링 및 감사
Identify and Access Management
AWS 유저의 종류
root user
IAM User
User(사용자) vs IAM Group(그룹)
요청의 성공 조건
모든 AWS 서비스는 접근제어 정책(AM - Access Manager) 을 기반으로 인가됨
매 API 호출시, 적용된 정책을 통해 인가 수행
정책은 IAM 역할/ 사용자/ 그룹, AWS 리소스, 임시 자격증명 세션, OU 등에 적용할 수 있음
AWS Root 어카운트는 기본적으로 AWS 리소스에 대한 모든 권한을 가짐
AWS 정책은 기본 디폴트가 Deny 이고,
명시적 Allow < 명시적 Deny 가 우선순위를 가짐
User based Access Control
사용자에게 권한을 직접 부여하는 방법
한계
사용자가 적을 떄는 관리가 용이할 수 있지만,
사용자가 많아질 수록 권한 관리에 많은 시간을 요하게 되고, 실수가 일어날 확률이 높아져서
구조적으로 관리할 수단이 필요해짐
Group based Access Control
권한 a
가 가능한 그룹에 그룹A, 그룹C, 그룹D
가 있는데 ‘어느 그룹 소속이냐’ 이런식으로 권한을 검사하기는 어려워 짐Role based Access Control - RBAC
그룹에다가 구너한을 바로 주는 대신에 권한의 논리적 집합으로써 역할을 만들고, 역할을 그룹이나 사용자에게 연결
특징
한계
같은 그룹에 속한 사용자에 따라서 서로 다른 역할을 조건적으로 부여하는 것은 불가능함
이럴경우, RBAC 상에서는 User에게 직접 역할을 부여하는 방식으로밖에 할 수 없음
예시
원래 7내무반 그룹에는 병기관리 역할만 있었는데, 새로 탄약관리 역할을 추가하려고 합니다.
여기서 김진호 중사는 간부라서 탄약고 개방이 허용되고, 김한국 일병은 병사라서 탄약고 개방이 불허됩니다.
그러면 접근 제어 리스트를 어떻게 구성할 수 있을까요?
기존 그룹을 건드리면 안 된다.
소속을 나타내는 7내무반 외에 다른 그룹을 만들어서 할당하면 안 된다.
이 제약 조건에 따르면, 현재 가능한 유일한 방법은 그룹을 우회해서, 김진호 중사에게 직접 탄약 관리 역할을 할당하는 것
Attribute Based Access Control ( ABAC)
IAM Policy 는 AWS 서비스와 리소스에 대한 인가 기능을 제공
IAM 은 정의한 Policy를 기반으로 AWS 요청을 검사/평가 하게 되며 최종적으로 허용 혹은 차단을 결정
속성
Effect
Allow
| Deny
Action
String
| Array<String>
dynamodb
)가 있습니다.(서비스접두사):(작업)
형식으로 작성dynamodb:Deleteitem
, s3:GetObject
Resource
Statement의 주제가 되는 리소스를 한정(qualify)함
서비스에 따라서 이렇게 해당 서비스에 속한 하부 리소스 단위까지 한정할 수 있음
(DynamoDB의 테이블 수준까지 한정)
리소스를 특정할 수 없는 일부 서비스에서는, Resource를 비워두는 대신 *
를 입력함
Principal
Sid
Identity-based 정책과 Resource-based 정책
Identity-based 정책 (자격증명-기반 정책)
Resource-based (리소스-기반 정책)
정책은 요청을 받는 리소스에게 연결(예. S3 버킷 Policy) → 접근을 받기 위한 정책
Principal 필수 구문 추가 : 해당 리소스에 요청을 전달할 수 있는 보안주체를 기술
Identity-based 과 Resource-based 정책 적용 범위는
In-Account vs Cross-Account 에 따라 다름
정책 | 설명 | 포맷 | 정의 및 관리 |
---|---|---|---|
Identitiy-based 정책 | IAM보안 주체(IAM 사용자, IAM 그룹의 사용자 집합, IAM 역할)에 할당되어 해당 주체의 권한을 규정 | JSON | IAM - 보안주체가 될 수 있는 대상 |
Resource-based 정책 | 정책이 할당될 리소스 기준으로 어떤 보안 주체가 할 수 있는(혹은 없는) 작업을 규정 | JSON | 개별 서비스들 (리소스) |
IAM Permission Boundary 정책 | IAM 보안 주체별로 획득할 수 있는 권한의 최대치를 규정 | JSON | IAM |
Organization SCP | Organization의 OU 또는 개별 어카운트 별로 권한의 최대치를 규정 주로 Root 어카운트의 권한을 제한 시킬 때 사용 | JSON | Organization |
Session 정책 | 임시 자격증명의 기존 퍼미션을 해당 세션에 대해서만 제한할 때 사용 AssumeRole, GetFederationTokenAPI의 파라메터로 전달됨 | JSON | STS |
ACL정책 | 리소스 기준으로 정의하며, 주로 Cross-Account 간의 리소스 공유시, 보안 주체에 대한 접근을 규정 | XML | 개별 서비스들 |
Endpoint 정책 | VPC G/W Endpoint에 적용되는 접근제어 정책, 일종의 Resource-based 정책임 | JSON | VPC |
자격증명-기반 정책(Id-Based Policy) | 리소스-기반 정책(Resource-Based Policy) | |
---|---|---|
연결 대상 | 사용자, 그룹, 역할 등 보안주체(Principal)가 될 수 있는 대상 | 리소스 |
의미 | ( 이 정책이 연결된 보안주체는 ) ( 특정 조건(Condition) 하에 ) 이 리소스(Resource)에 대한 특정 행동(Action)을 허용/불허(Effect) | ( 특정 조건(Condtion)하에 ) 이 리소스(Resource)에 대한 특정 행동(Action)을 특정 보안주체(들)(Principal)에게 허용/불허(Effect) |
특징1 | Principal 속성이 안 들어감 | Principal 속성이 들어감 |
특징2 | IAM Policy 메뉴에서 관리 (혹은 IAM Role에 인라인으로) | 일부 AWS 서비스의 리소스에서 자체 관리 (대표적으로 S3, SQS 등) |
특징3 | 모든 AWS 서비스에 연관 | 일부 공유 자원 성격을 가진 서비스에서 사용 (대표적으로 S3, SQS 등) |
arn:aws:(서비스 Prefix):(AWS 리전 이름):(AWS 계정):(리소스 한정자)
(AWS 리전 이름)
, (AWS 계정)
은 암묵적으로 생략해서 쓰기도 함얘시를 해석해보기
arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E36E6CTWWW86E5
cloudFront
가 들어가 있음 - 특별히 예약된 규칙E36E6CTWWW86E5
라는 CloudFront 전용 보안주체를 가리킴 (S3와 CloudFront는 밀접한 관계)arn:aws:s3:::mcas.musma.net/*
s3
S3
의 경우 리소스 한정자는 곧 버킷으로 나타남mcas.musma.net
버킷에 있는 모든 오브젝트를 말함{
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E36E6CTWWW86E5"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mcas.musma.net/*"
}
=> S3 버킷 mcas.musma.net에 업로드된 모든 오브젝트를 읽을 권한(s3:GetObject)를 CloudFront Origin Access Identity E36E6CTWWW86E5에 부여한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::mcas.musma.net"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::mcas.musma.net/*"
}
]
}
자격증명-기반 정책입니다.
각 Statement 마다 Principal 속성이 존재하지 않으므로 리소스-기반 정책이 아닙니다.
각 서비스마다 고유의 리소스가 있습니다. 예를 들면 S3에서 특정할 수 있는 리소스는 버킷과 객체가 있습니다. 그리고 서비스의 액션 마다 대응하는 리소스 수준 권한이 다릅니다.
예를 들면 s3:GetObject, s3:PutObject, s3:DeleteObject는 객체에 대한 Action입니다. 따라서 대응하는 리소스의 수준도 객체 수준이어야 합니다. Resource 한정자로 arn:aws:s3:::mcas.musma.net/* (mcas.musma.net 버킷의 모든 객체)를 특정하고 있습니다.
s3:ListBucket, s3:GetBucketLocation은 버킷에 대한 Action입니다. 그래서 Resource 한정자로 mcas.mumsa.net 버킷을 가리키고 있습니다.
마지막으로, s3:ListAllMyBuckets는 S3에 딸린 특정 리소스를 한정하지 않는 서비스 수준의 Action입니다. 따라서 Resource를 "*"로 하였습니다.