들어가며
AWS IAM (Identity and Access Management)은 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있는 서비스입니다. 이를 통해 사용자, 그룹 및 역할을 생성 및 제어할 수 있으며, AWS 환경 내에서 특정 리소스에 액세스하고 특정 작업을 수행할 수 있는 사용자를 제어하기 위한 세분화된 권한을 정의할 수 있습니다.
AWS IAM 서비스를 살펴보니 협업 시에 굉장히 좋은 기능인 것 같습니다. 여러 사용자를 정책을 통해서 세세하면서 일관되게 권한을 조정할 수 있게 도와주는 게 인상적 이였습니다.
AWS IAM 과 관련하여 공부한 내용을 정리해보았습니다.
AWS IAM (Identity and Access Management)
계정을 생성하고 나면 IAM 서비스를 이용하게 되는 겁니다. 생성된 계정은 루트 계정이 되는데요. 루트 계정은 몇 가지 설정을 할 때는 제외하고 사용 및 공유해서는 안됩니다.
다른 서비스 이용들은 users를 생성하여 진행합니다.
user들은 그룹으로 관리할 수 있습니다.
그룹은 user만 포함할 수 있습니다. 그룹이 그룹을 포함할 수는 없습니다.
user가 반드시 그룹에 속할 필요는 없습니다. 대신 user는 다양한 그룹에 속할 수 있습니다.

user들 사이에 그룹을 만드는 이유는 권한 관리를 위해서 입니다.
User와 그룹은 Policies라 불리는 JSON 파일에서 할당 할 수 있습니다.

유저 및 그룹 생성하기
IAM 서비스로 이동 합니다.

사용자 메뉴에 접속합니다.

사용자 세부 정보를 작성합니다. 사용자 이름이 곧 ID로 사용되니 주의해서 입력합니다. )(대소문자를 구별합니다.)
사용자가 내가 아닐 경우, 우선 계정을 생성하고 비밀번호는 후에 바꿀 수 있도록 “자동 생성된 암호”를 선택합니다.
사용자 본인이 사용할 User를 생성하는 경우에는 사용자 지정 암호를 선택합니다.

사용자에 권한을 직접 바로 연결하거나 그룹에 추가할 수 있습니다.
기존에 만든 그룹이 없기 때문에 <그룹 생성>을 통해서 새 그룹을 만들어줍니다.
우선 가장 우선 필요한 admin 그룹을 만들어주겠습니다.

생성한 그룹으로 사용자를 할당하고 다음으로 넘어갑니다. 태그는 옵션이지만 추가적인 관리를 쉽게 해줄 수 있습니다.

계정 별칭을 지정함으로써 루트 사용자가 아닌 IAM 사용자가 로그인하기 쉽게 만들 수 있습니다.

IAM 사용자를 위한 로그인 URL로 접속하면 사용자로 로그인 할 수 있게 됩니다.
해당 주소가 아니더라도 루트 사용자 IAM 사용자로 계정 별칭을 입력하고 ID, PW를 입력하면 사용자로 로그인을 할 수 있습니다.

로그인에 성공하면 IAM 사용자로 로그인 했다는 것을 우상단의 버튼을 눌러 확인 할 수 있습니다.

AWS IAM 정책 (policies)
각 그룹의 정책은 그룹에 해당하는 모든 인원에게 적용이 됩니다. 그룹에 속하지 않은 개인에게 적용되는 정책은 inline 정책이라고 합니다.

Charles와 David와 같이 2개의 그룹에 속한 사용자는 2개의 정책 모두에 영향을 받게 됩니다.

AWS IAM 정책 구조
항목 | 요구 | 내용 |
---|---|---|
Version | – 사용 중인 IAM 정책 언어의 버전을 지정 – 일반적으로 2012년 10월 현재 버전을 나타내는 “2012-10-17″로 설정 | |
ID | Optional | – 정책의 ID |
Statement | Required | – 정책에 의해 부여되거나 거부된 권한을 정의하는 명령문 배열 |
Sid | Optional | – Statement ID |
Effect | Allow or Deny | – Statement이 액세스를 허용하거나 거부하는지 여부를 지정 |
Principal | 현재 정책이 적용될 계정, user 혹은 역할 | |
Action | – 어떤 작업을 Allow 혹은 Deny할지 리스트로 지정 | |
Resource | – 작업이 적용되는 AWS 리소스(예: S3 버킷, EC2 인스턴스)를 지정 | |
Condition | Optional | – Statement이 적용되기 위해 충족해야 하는 추가 조건을 지정 – 조건은 IP 주소, 시간, 사용자 신원 등 다양한 요소를 기반으로 할 수 있음 |

정책 권한 확인
정책 메뉴에 들어가서 정책을 검색하면 해당 정책의 권한들을 확인 할 수 있습니다.
JSON 형식으로 보면 자세한 권한 내역을 확인 할 수 있습니다.
사용자 권한 삭제
사용자 메뉴에서 해당 사용자에게 부여된 권한을 선택적으로 삭제할 수 있습니다.

사용자 권한 추가
권한 추가 버튼을 클릭합니다. 적절한 정책을 찾아서 추가하면 정책에 맞는 권한을 추가할 수 있습니다.

정책 생성하기
AWS에서 제공하는 정책 외에 자신만의 정책을 새로 생성할 수 있습니다.
어떤 서비스의 어떤 리소스에 대한 권한을 부여할 것인지 세세하게 설정할 수 있습니다.
서비스 내에서도 특정 리소스에 대한 권한만을 정할 수도 있습니다.
예를 들어서 S3서비스의 특정 버킷에 대한 권한을 지정해 줄 수 있습니다.

IAM Best Practice
- AWS 계정 설정을 제외하고는 root 계정을 사용하지 않습니다.
- 한 명의 사용자 = 하나의 AWS 사용자 입니다. 사용자 id를 공유하지 않습니다.
- 사용자를 그룹에 할당하고 그룹에 권한을 부여합니다.
- 사용자가 MFA를 사용하도록 강조합니다.
- Roles(역할)을 사용하여 AWS 서비스에 권한을 부여해줍니다.
- 프로그래밍적으로 접근하기 위해서는 Access Key를 사용합니다.
- IAM user와 Access key는 절대 공유하지 않습니다.
- IAM Access Advisor와 Credential Report를 통해서 사용자 권한을 감사합니다.
참고하면 좋은 글



위의 설명만으로는 조금 헷갈릴 수 있는데요. 예를 들어, EC2 인스턴스가 AWS로 어떤 작업을 수행하려고 할 때 EC2 인스턴스에 권한을 줘야 한다고 합니다.
