사용자 인증과 권한 통제는 온프레미스 환경과 더불어 클라우드 환경에서도 가장 중요한 보안 요소이다.
이를 고려해서 AWS는 AWS IAM 기능을 제공한다.
AWS IAM을 살펴보기 전 먼저 AWS IAM 위에서 AWS 리소스가 어떻게 생성되고 관리되는시 살펴봐야 한다.
AWS 리소스를 생성하고 관리하는 데 사용할 수 있는 '웹 기반 사용자 인터페이스'를 제공하는 것
AWS 명령줄 인터페이스
AWS 서비스를 관리하는 통합 도구
AWS 소프트웨어 개발 키트
특정 소프트웨어를 개발할 때 도움을 주는 개발 도구 집합

=> AWS 리소스를 다루는 방법들은 AWS API에서 요청을 받아 온다.
두 애플리케이션이 상호 작용할 수 있게 도와주는 매개체
API를 사용할 때는 두 가지 규칙을 따라야 한다.
사용자나 애플리케이션이 AWS 서비스를 사용하기 위해 도와주는 매개체
예를 들어 AWS 명령줄 인터페이스를 이용하여 Amazon S3 버킷을 생성한다고 가정하면
첫 번째로
AWS 명령줄 인터페이스에서 버킷을 생성하는 명령어를 작성하면 AWS 리소스를 사용할 수 있게 AWS API를 호출한다.
두 번째로
AWS API를 사용할 수 있도록 '인증, 인가'를 확인한 후 요청했던 대로 S3 버킷을 생성한다.

사진처럼 인증과 인가를 확인한 후에는 AWS CloudTrail 서비스를 이용하여 'API 로깅'을 남긴다.
API 로깅이란?
AWS API의 활동 기록을 저장하는 것으로, 보안 사고나 장애가 발생하면 더욱 빠르게 대응할 수 있다.

(Identity & Access Management) AWS 서비스와 리소스에 안전하게 접근할 수 있도록 관리하는 기능
1. AWS 계정 루트 사용자:
맨 처음 생성된 AWS 계정이며, 해당 계정의 모든 권한을 가지고 있다.
2. IAM 사용자(user):
별도의 AWS 계정이 아닌 계정 내 사용자이며, 각 IAM 사용자는 자체 자격 증명을 보유한다.
3. IAM 그룹(group):
IAM 사용자 집합을 의미하며, IAM 그룹에 권한을 지정해서 다수의 IAM 사용자의 권한을 쉽게 관리할 수 있다.
4. IAM 정책(policy):
자격 증명이나 리소스와 연결될 때 요청을 허용하거나 거부할 수 있는 권한을 정의하는 AWS 객체이다.
5. IAM 역할(role):
특정 권한을 가진 계정에 생성할 수 있는 IAM 자격 증명이다. 역할에는 그와 연관된 암호 또는 접근 키 같은 장기 자격 증명이 없어서 그 대신 역할을 주면 역할 세션을 위한 임시 보안 자격 증명을 제공한다.
6. 보안 주체(principals):
AWS 계정 루트 사용자, IAM 사용자, IAM 역할을 이용하여 로그인하고 AWS에 요청하는 사람 또는 애플리케이션이다.
1. 인증 동작
IAM 사용자 계정에 따른 암호나 접근 키가 올바르다면 적합한 사용자로 간주되어 인증 동작이 마무리된다.

2. 인가 동작
인증이 처리되면 IAM 사용자는 적합한 권한이 있는지 확인하는 인가 동작을 진행한다.

사진과 같이 A 사용자는 S3를 사용할 수 있는 S3 FullAccess 권한을 가지고 있으므로 S3 리소스에 대해 파일을 업로드하거나 내려받거나 삭제할 수 있다.
반면 사용자 B는 EC2는 사용할 수 있지만 S3는 사용할 수 없다.
일반적으로 '루트 사용자'와 '일반 IAM 사용자'로 나뉜다.
AWS의 모든 리소스에 접근할 수 있는 전체 권한이 있는 사용자
-> AWS 계정 생성 및 해지와 IAM 사용자 관리 등에 사용하지만, 직접 AWS 리소스를 사용하도록 권장하지는 않는다.
루트 사용자 계정이 해킹되기라도 하면 공격자가 AWS 계정에 대한 모든 권한을 갖게 되는데 IAM 사용자 계정이 해킹된 경우에는 루트 사용자의 계정으로 해킹된 IAM 사용자를 차단하거나 AWS API 로깅으로 침해 행위를 분석할 수 있다.

사용자를 인가하고 나면, 사용자별로 권한에 대한 확인 절차를 진행한다.
사용자별 권한 검사는 AWS IAM 정책을 이용해서 진행한다.
사용자가 특정 AWS 서비스를 사용하려고 인가를 요청하면, IAM은 IAM 정책을 기반으로 AWS 요청을 검사, 평가한 후 최종적으로 허용할지 차단할지를 결정한다.
정의된 권한 범위 내 AWS API를 사용할 수 있는 임시 자격 증명
-> IAM 역할을 사용하면 사용자 권한을 공유하거나 매번 권한을 부여할 필요가 없다.