본문 바로가기

Security

[이론] AWS IAM(Identity and Access Management) 기본 개념

반응형

안녕하세요 서후아빠입니다. ^_^

이번 세션은 AWS IAM에 대해서 업무적으로 필요한 최소한의 개념에 대해서 간단히 정리해 보았습니다.


개요

AWS에서 Service와 User가 다른 Service에 대한 권한 관리

1개의 IAM에 여러 개 Rule 부여 가능, EC2는 1개의 Rule만 부여 가능

정책 (Policy) 종류 및 사용 목적

식별 기반 정책을 이용하여 리소스 기반 정책 접근

정책 (Policy) JSON 구조

예시 : Amazon S3가 123456789012 계정에서 my-bucket 버킷의 my-function이라는 함수를 호출할 수 있도록 허용
필수 설정 항목은 붉은색 표현

Principal 

구분 JSON
AWS account "Principal": { "AWS": "account-id" }
"Principal": { "AWS": ["account-id", "arn:aws:iam::account-id:root"] }
IAM rule "Principal": { "AWS": "arn:aws:iam::account-id:role/role-name" }
Role session "Principal": { "AWS": "arn:aws:sts::account-id:assumed-role/role-name/role-session-name" }
"Principal": { "Federated": "www.amazon.com" }
"Principal": { "Federated": "arn:aws:iam::account-id:saml-provider/provider-name" }
"Principal": { "AWS": "arn:aws:iam::account-id:user/user-name" }
"Principal": { "AWS": "arn:aws:sts::account-id:federated-user/user-name" }
AWS service  "Principal": { "Service": "s3.amazonaws.com" }
All "Principal": "*"
"Principal" : { "AWS" : "*" }
NotPricipal은 Pricipal의 반대개념으로써 "Effect": "Allow"와 함께 설정하면 해당 출발지 외 모두 허용한다는 의미이므로 함께 설정하는 것은 권장하지 않습니다. 일반적으로 "Effect": "Deny"와 함께 설정합니다.

Action

구분 JSON
lambda의 InvokeFunction(함수호출) Access에 대해서만 적용 "Action": "lambda:InvokeFunction" 
lambda의 InvokeFunction(함수호출) 제외한 모든 Access에 대해서 적용 "NotAction": "lambda:InvokeFunction
특정 Access type(ex : InvokeFunction)뿐만 아니라 모든 Access type에 대해서 적용을 받기 위해서는 *를 입력한다.

Resource

구분 JSON
All(*로 표현) 적용 "Resource": "arn:aws:s3:::my-bucket/*“
"Resource": "arn:aws:s3:::my-bucket/*/test/*"
현재 사용자의 이름과 일치하는 테이블만 적용 "Resource": "arn:aws:dynamodb:ap-northeast-2:account-id:table/${aws:username}"

Condition

구분 JSON
기본 구조 "Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}
The request context
(True, False, Null, Not present 반환)
"Condition": { "NumericLessThanEquals": {"aws:MultiFactorAuthAge": "3600"} }
The condition block "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
condition-operator 
type
condition-operator
String StringEquals, StringNotEquals, StringEqualsIgnoreCase, StringNotEqualsIgnoreCase, StringLike, StringNotLike
Numeric NumericEquals, NumericNotEquals, NumericLessThan (미만), NumericLessThanEquals (이하), NumericGreaterThan (초과), NumericGreaterThanEquals (이상)
Boolean Bool
String condition-operator의 Ignore 의미 : 대소문자 무시 
그 외 Type : Date, Binary, IP address, ARN, ...IfExists

권한 

최종 획득 권한 범위(조건)은 모든 범위가 중첩되는 가운데 부분입니다.

여러 개의 권한이 설정된 경우 적용 우선순위는 아래와 같습니다.

API 요청은 아래 순서에 따라 최종 목적지에 도달합니다.
  ① 4개 정책(SCP, Permission Boundary, ID기반, Resource기반) 중에서 명시적으로 Deny되지 않은 것만 통과
  ② SCP 정책(AWS Organizations에서 부여)에서 Allow된 것만 통과 
  ③ IAM User에 부여된 Permission Boundary 정책에서 Allow된 것만 통과
  ④ 정책 종류 중 식별 기반 정책에서 Allow된 것만 통과 
  ⑤ 정책 종류 중 Resource 기반 정책에서 Allow된 것만 통과

Policy와 Rule

Policy : 요청자(Users or AWS services) or 요청자 그룹의 권한을 정의하는 JSON 문서
Rule : AWS 서비스에 접근 가능한 임시 권한을 요청자에게 제공 (ex : EC2에게 S3 권한을 가진 역할 제공하여 서비스 이용)

IAM에서 필수적으로 설정해야 하는 항목 (중요)

root 사용자의 Access key 비활성화하고, 반면에 IAM User는 Access key 활성화

  - root 사용자는 IAM 설정과 비용 관리만 

  - IAM User는 IAM 이외의 AWS service 관리
MFA 설정
사용자 역할에 맞는 정책 할당 (사용자 그룹에 할당하는 것을 권고)
암호 복잡도 정책 설정
요금 경보 설정 (CloudWatch + SNS 연계)

사용자 인증 종류

프로그래밍(API, CLI, SDK 등) 인증 방식 : Access ID + Secret access Key
AWS 웹 관리 콘솔 인증 방식 : User ID + Pasword (추가 옵션 : MFA)

MFA (Multi-Factor Authentication)

사용 목적 : AWS 웹 관리 콘솔 접근, AWS service에 접근 시 "User ID + Password" 외 2차 인증 통한 보안 강화 

구분 가상 MFA 디바이스  U2F 보안 키  하드웨어 MFA 디바이스 SMS 문자 메시지
기반 MFA (신규 고객 지원 종료)
내용 Mobile에 간편히 설치하여 사용 (무료) USB에 저장된 U2F 보안 키를 사용 (유료, 별도 구매) 은행 OTP와 비슷, 시리얼 번호와 OTP 번호 2개를 입력하여 등록 (유료, 별도 구매) 계정에 등록된 연락처를 이용하여 SMS 인증

U2F 보안 키 vs 하드웨어 MFA 디바이스

  - U2F 보안 키 : U2F 보안 키가 생성한 응답을 사용자가 확인하는 것이 아닌 서비스에서 확인하는 방식

    ※ U2F(Universal 2nd Factor) : FIDO Alliance에서 호스팅하는 공개 인증 표준

  - 하드웨어 MFA 디바이스 : 인증 코드 방식, 사용자가 로그인 시 입력
MFA 이용한 로그인 흐름도

AWS 참고 URL

IAM JSON : https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html 

반응형