옵션

사용자, 역할, 정책 및 권한에 대한 AWS Identity and Access Management(IAM)를 관리합니다. IAM 정책을 생성하고, 계정 간 액세스를 구성하며, 서비스 역할을 설정하고, 권한 오류를 해결하고, 최소 권한 보안 원칙을 적용합니다.

...모든 것을 확장하십시오
34
업데이트 된 시간 2026년 9월 21일

AWS IAM

AWS Identity and Access Management(IAM)는 AWS 서비스 및 리소스에 대한 안전한 액세스 제어를 지원합니다. IAM 는 AWS 보안의 기반이 되며, 모든 AWS API 호출은 IAM 를 통해 인증 및 권한 부여를 거칩니다.

목차

  • 핵심 개념
  • 일반적인 패턴
  • CLI 참조
  • 모범 사례
  • 문제 해결
  • 참고 자료

핵심 개념

주체

AWS에 요청을 보낼 수 있는 엔터티: IAM 사용자, 역할, 페더레이션 사용자 및 애플리케이션.

정책

권한을 정의하는 JSON 문서. 유형:

  • 신원 기반: 사용자, 그룹 또는 역할에 연결됨
  • 리소스 기반: 리소스(S3 버킷, SQS 큐)에 연결됨
  • 권한 경계: 한 신원이 가질 수 있는 최대 권한
  • 서비스 제어 정책(SCP): 조직 전체에 적용되는 제한

역할

신뢰할 수 있는 엔티티가 인수할 수 있는 권한을 가진 신원. 영구적인 자격 증명이 없으며, 임시 보안 토큰을 사용합니다.

신뢰 관계

어떤 주체(principal)가 역할을 인수할 수 있는지 정의합니다. 역할의 신뢰 정책을 통해 구성됩니다.

일반적인 패턴

Lambda용 서비스 역할 생성

AWS CLI:

# 신뢰 정책 생성
cat > trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "lambda.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

# 역할 생성
aws iam create-role \
  --role-name MyLambdaRole \
  --assume-role-policy-document file://trust-policy.json

# 관리형 정책 연결
aws iam attach-role-policy \
  --role-name MyLambdaRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

boto3:

import boto3
import json

iam = boto3.client('iam')

trust_policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"Service": "lambda.amazonaws.com"},
            "Action": "sts:AssumeRole"
        }
    ]
}

# 역할 생성iam.create_role(
    RoleName='MyLambdaRole',
    AssumeRolePolicyDocument=json.dumps(trust_policy)
)

# 관리형 정책 연결
iam.attach_role_policy(
    RoleName='MyLambdaRole',
    PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
)

최소 권한 원칙에 따른 사용자 정의 정책 생성

cat > policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query"
      ],
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable"
    }
  ]
}
EOF

aws iam create-policy \
  --policy-name MyDynamoDBPolicy \
  --policy-document file://policy.json

계정 간 역할 인수

# 계정 B(신뢰 계정)에서 계정 A를 신뢰하는 역할을 생성합니다.
cat > cross-account-trust.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111111111111:root" },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": { "sts:ExternalId": "unique-external-id" }
      }
    }
  ]
}
EOF

# 계정 A에서 역할을 인수합니다.
aws sts assume-role \
  --role-arn arn:aws:iam::222222222222:role/CrossAccountRole \
  --role-session-name MySession \
  --external-id unique-external-id

CLI 참조

필수 명령어

명령어 설명
aws iam create-role 새로운 IAM 역할을 생성합니다.
aws iam create-policy 고객 관리형 정책 생성
aws iam attach-role-policy 역할에 관리형 정책 연결
aws iam put-role-policy 역할에 인라인 정책 추가
aws iam get-role 역할 세부 정보 가져오기
aws iam list-roles 모든 역할 나열
aws iam simulate-principal-policy 정책 권한 테스트
aws sts assume-role 역할을 인수하고 임시 자격 증명을 가져옵니다
aws sts get-caller-identity 현재 신원 정보 가져오기

유용한 플래그

  • --query: JMESPath를 사용하여 출력 필터링
  • --output table: 사람이 읽기 쉬운 형식으로 출력
  • --no-cli-pager: 스크립트 실행 시 페이지 표시 비활성화

모범 사례

보안

  • 일상적인 작업에는절대 root 계정을 사용하지 마십시오
  • 모든 사용자 계정에 대해MFA를 활성화하십시오
  • 장기 액세스 키 대신역할을 사용하십시오
  • 최소 권한 원칙 적용 — 필요한 권한만 부여하십시오
  • 조건 설정을 통해 IP, 시간 또는 MFA에 따라 접근을 제한하십시오
  • 인증 정보를 정기적으로교체하십시오
  • 위임된 관리에권한 경계를 적용하십시오

정책 설계

  • AWS 관리형 정책으로 시작하고, 필요에 따라 사용자 정의하십시오
  • 동적 정책을 위해 정책 변수(${aws:username})를 사용하십시오
  • 민감한 작업에 대해서는 명시적 거부 설정을 우선적으로 적용하십시오
  • 관련 권한을 논리적으로 그룹화하십시오

모니터링

  • API 감사를 위해 CloudTrail을 활성화하세요
  • IAM Access Analyzer를 사용하여 권한이 지나치게 광범위한 정책을 식별하십시오
  • 자격 증명 보고서를 정기적으로 검토하십시오
  • 루트 계정 사용에 대한 알림 설정

문제 해결

액세스 거부 오류

증상: AccessDeniedException 또는 UnauthorizedAccess

디버깅 단계:

  1. 신원 확인: aws sts get-caller-identity
  2. 부착된 정책 확인: aws iam list-attached-role-policies --role-name MyRole
  3. 작업 시뮬레이션:
    aws iam simulate-principal-policy \
      --policy-source-arn arn:aws:iam::123456789012:role/MyRole \
      --action-names dynamodb:GetItem \
      --resource-arns arn:aws:dynamodb:us-east-1:123456789012:table/MyTable
    
    
  4. SCP 또는 권한 경계에서 명시적 거부 사항 확인
  5. 리소스 기반 정책이 해당 주체를 허용하는지 확인하십시오

역할을 인수할 수 없음

증상: AssumeRole 호출 시 AccessDenied 오류 발생

원인:

  • 신뢰 정책에 호출 주체(principal)가 포함되어 있지 않음
  • 호출자에게 sts:AssumeRole 권한이 없음
  • ExternalId 불일치 (계정 간 역할의 경우)
  • 세션 지속 시간이 최대치를 초과함

해결 방법: 역할의 신뢰 관계를 검토하고 업데이트하십시오.

정책 크기 제한

  • 관리형 정책: 6,144자
  • 인라인 정책: 2,048자(사용자), 10,240자(역할/그룹)
  • 신뢰 정책: 2,048자

해결 방법: 여러 정책을 사용하거나, 접두사/와일드카드를 사용하여 리소스를 참조하거나, 태그 기반 액세스 제어를 사용하십시오.

참고 문헌

  • IAM 사용자 가이드
  • IAM API 참조
  • IAM CLI 참조
  • 정책 참조
  • boto3 IAM
GitHub에서 보기
---
name: iam
description: Manage AWS Identity and Access Management for users, roles, policies, and permissions. Create IAM policies, configure cross-account access, set up service roles, troubleshoot permission errors, and enforce least-privilege security.
---

# AWS IAM

AWS Identity and Access Management (IAM) enables secure access control to AWS services and resources. IAM is foundational to AWS security—every AWS API call is authenticated and authorized through IAM.

## Table of Contents

- [Core Concepts](#core-concepts)
- [Common Patterns](#common-patterns)
- [CLI Reference](#cli-reference)
- [Best Practices](#best-practices)
- [Troubleshooting](#troubleshooting)
- [References](#references)

## Core Concepts

### Principals

Entities that can make requests to AWS: IAM users, roles, federated users, and applications.

### Policies

JSON documents defining permissions. Types:
- **Identity-based**: Attached to users, groups, or roles
- **Resource-based**: Attached to resources (S3 buckets, SQS queues)
- **Permission boundaries**: Maximum permissions an identity can have
- **Service control policies (SCPs)**: Organization-wide limits

### Roles

Identities with permissions that can be assumed by trusted entities. No permanent credentials—uses temporary security tokens.

### Trust Relationships

Define which principals can assume a role. Configured via the role's trust policy.

## Common Patterns

### Create a Service Role for Lambda

**AWS CLI:**

```bash
# Create the trust policy
cat > trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "lambda.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

# Create the role
aws iam create-role \
  --role-name MyLambdaRole \
  --assume-role-policy-document file://trust-policy.json

# Attach a managed policy
aws iam attach-role-policy \
  --role-name MyLambdaRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```

**boto3:**

```python
import boto3
import json

iam = boto3.client('iam')

trust_policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"Service": "lambda.amazonaws.com"},
            "Action": "sts:AssumeRole"
        }
    ]
}

# Create role
iam.create_role(
    RoleName='MyLambdaRole',
    AssumeRolePolicyDocument=json.dumps(trust_policy)
)

# Attach managed policy
iam.attach_role_policy(
    RoleName='MyLambdaRole',
    PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
)
```

### Create Custom Policy with Least Privilege

```bash
cat > policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query"
      ],
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable"
    }
  ]
}
EOF

aws iam create-policy \
  --policy-name MyDynamoDBPolicy \
  --policy-document file://policy.json
```

### Cross-Account Role Assumption

```bash
# In Account B (trusted account), create role with trust for Account A
cat > cross-account-trust.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111111111111:root" },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": { "sts:ExternalId": "unique-external-id" }
      }
    }
  ]
}
EOF

# From Account A, assume the role
aws sts assume-role \
  --role-arn arn:aws:iam::222222222222:role/CrossAccountRole \
  --role-session-name MySession \
  --external-id unique-external-id
```

## CLI Reference

### Essential Commands

| Command | Description |
|---------|-------------|
| `aws iam create-role` | Create a new IAM role |
| `aws iam create-policy` | Create a customer managed policy |
| `aws iam attach-role-policy` | Attach a managed policy to a role |
| `aws iam put-role-policy` | Add an inline policy to a role |
| `aws iam get-role` | Get role details |
| `aws iam list-roles` | List all roles |
| `aws iam simulate-principal-policy` | Test policy permissions |
| `aws sts assume-role` | Assume a role and get temporary credentials |
| `aws sts get-caller-identity` | Get current identity |

### Useful Flags

- `--query`: Filter output with JMESPath
- `--output table`: Human-readable output
- `--no-cli-pager`: Disable pager for scripting

## Best Practices

### Security

- **Never use root account** for daily tasks
- **Enable MFA** for all human users
- **Use roles** instead of long-term access keys
- **Apply least privilege** — grant only required permissions
- **Use conditions** to restrict access by IP, time, or MFA
- **Rotate credentials** regularly
- **Use permission boundaries** for delegated administration

### Policy Design

- Start with AWS managed policies, customize as needed
- Use policy variables (`${aws:username}`) for dynamic policies
- Prefer explicit denies for sensitive actions
- Group related permissions logically

### Monitoring

- Enable **CloudTrail** for API auditing
- Use **IAM Access Analyzer** to identify overly permissive policies
- Review **credential reports** regularly
- Set up alerts for root account usage

## Troubleshooting

### Access Denied Errors

**Symptom:** `AccessDeniedException` or `UnauthorizedAccess`

**Debug steps:**
1. Verify identity: `aws sts get-caller-identity`
2. Check attached policies: `aws iam list-attached-role-policies --role-name MyRole`
3. Simulate the action:
   ```bash
   aws iam simulate-principal-policy \
     --policy-source-arn arn:aws:iam::123456789012:role/MyRole \
     --action-names dynamodb:GetItem \
     --resource-arns arn:aws:dynamodb:us-east-1:123456789012:table/MyTable
   ```
4. Check for explicit denies in SCPs or permission boundaries
5. Verify resource-based policies allow the principal

### Role Cannot Be Assumed

**Symptom:** `AccessDenied` when calling `AssumeRole`

**Causes:**
- Trust policy doesn't include the calling principal
- Missing `sts:AssumeRole` permission on the caller
- ExternalId mismatch (for cross-account roles)
- Session duration exceeds maximum

**Fix:** Review and update the role's trust relationship.

### Policy Size Limits

- Managed policy: 6,144 characters
- Inline policy: 2,048 characters (user), 10,240 characters (role/group)
- Trust policy: 2,048 characters

**Solution:** Use multiple policies, reference resources by prefix/wildcard, or use tags-based access control.

## References

- [IAM User Guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/)
- [IAM API Reference](https://docs.aws.amazon.com/IAM/latest/APIReference/)
- [IAM CLI Reference](https://docs.aws.amazon.com/cli/latest/reference/iam/)
- [Policy Reference](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)
- [boto3 IAM](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iam.html)

모든 파일

3개 파일

iam 설치

스킬 파일을 다운로드하여 .claude/skills/ 디렉터리에 압축을 풀어주세요.

ZIP 다운로드

저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.

git clone https://github.com/itsmostafa/aws-agent-skills/tree/main/skills/iam # Copy SKILL.md to your .claude/skills/ directory

복사 복사
빠른 설정: 스킬 폴더를 .claude/skills/로 복사하세요. Claude가 해당 스킬을 자동으로 감지하여 사용합니다.

관련 스킬

gmgn-portfolio
업데이트 된 시간 2026년 7월 1일
device-integrity
업데이트 된 시간 2026년 6월 29일
zeroize-audit
업데이트 된 시간 2026년 7월 1일
flutter-use-http-package
업데이트 된 시간 2026년 6월 30일
OR