IT/Infra&Cloud

[aws] IAM & Organizations

Hayley Shim 2023. 10. 29. 00:44

안녕하세요. 최근 CloudNet@ AWS Security Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. 해당 내용은 ‘쉽게 적용하는 AWS 보안 레시피’ 책과 AWS Docs 내용을 기반으로 했습니다.

IAM 이란?

  • IAM은 AWS의 사용자 ID를 관리하고, ID(인증) 및 AWS 서비스에 대한 접근 권한(인증)을 확인하는 데 도움이 됩니다.

IAM 구성 요소

IAM 액세스 관리 Console

  1. 사용자 그룹 Group : 그룹에 사용자를 추가할 수 있습니다. 개별 사용자가 아닌 그룹에 권한을 부여하도록 권장합니다.
  2. 사용자 User : IAM 사용자를 생성하고 AWS 리소스에 접근하는 데 필요한 권한을 부여할 수 있습니다.
  3. 역할 Role : 역할은 AWS 서비스에 접근할 수 있는 임시 권한을 사용자에게 제공하는 데 사용됩니다. 예를 들어 EC2 서비스에 S3 권한을 가진 역할을 제공해 서비스를 이용하게 할 수 있습니다.
  4. 정책 Policy : 정책은 사용자 또는 그룹의 권한을 정의하는 JSON 문서입니다.

IAM 정책 만들기

해당 실습은 AWS CLI로 테스트했습니다.

AWS CLI 설치

# mac - 링크 
brew install awscli  # awscli 버전 확인 
aws --version aws-cli/2.7.20 Python/3.10.5 Darwin/21.5.0 source/x86_64 prompt/off  # windows - 링크 msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi

AWS CLI 자격증명 설정

# AWS CLI 사용을 위한 admin IAM User 자격 증명 설정
aws configure
AWS Access Key ID [None]: AKIA5ILF2YYYYYYYY
AWS Secret Access Key [None]: 3g34ixztuNcYYYYYYYYYYYY
Default region name [None]: ap-northeast-2
Default output format [None]: json# 자격 증명 List 확인
aws configure list# 자격 증명 정보 저장되는 파일 확인
cat ~/.aws/credentials
[default]
aws_access_key_id = AKIA5ILF2YYYYYYYY
aws_secret_access_key = 3g34ixztuNcYYYYYYYYYYYY

IAM 그룹 생성 및 확인

# awstestusergroup 그룹 생성
aws iam create-group --group-name awstestusergroup# awssecadmingroup 그룹 생성
aws iam create-group --group-name awssecadmingroup

IAM 사용자 그룹 생성 확인

IAM 사용자 생성 및 확인

# testuser 사용자 생성
aws iam create-user --user-name testuser# testuser 사용자의 AWS Web Console 로그인 profile 생성
cat <<EOF > create-login-profile-testuser.json
{
    "UserName": "testuser",
    "Password": "testUser123!",
    "PasswordResetRequired": false
}
EOF
cat create-login-profile-testuser.json
aws iam create-login-profile --cli-input-json file://create-login-profile-testuser.json
# awssecadmin 사용자 생성
aws iam create-user --user-name awssecadmin# awssecadmin 사용자의 AWS Web Console 로그인 profile 생성
cat <<EOF > create-login-profile-awssecadmin.json
{
    "UserName": "awssecadmin",
    "Password": "awsSecadmin123!",
    "PasswordResetRequired": false
}
EOF
cat create-login-profile-awssecadmin.json
aws iam create-login-profile --cli-input-json file://create-login-profile-awssecadmin.json

IAM 사용자 생성 확인

S3 버킷 생성 및 파일 업로드

# S3 버킷 Suffix (접미사) 변수 지정
# S3suffix=<자신의 닉네임>
export S3suffix=hayley
echo $S3suffix# S3 버킷 생성
#aws s3 mb s3://버킷(유일한 이름) --region ap-northeast-2
aws s3 mb s3://cass-s3bucket-$S3suffix --region ap-northeast-2# 텍스트 파일 생성 후 을 S3로 업로드 
echo "111" > 111.txt 
aws s3 cp 111.txt s3://cass-s3bucket-$S3suffix 
aws s3 ls s3://cass-s3bucket-$S3suffix 
aws s3 ls s3://cass-s3bucket-$S3suffix --recursive --human-readable --summarize

S3 버킷 생성

파일 업로드

사용자에게 프로그래밍 방식 액세스 권한 부여

# 사용자에게 프로그래밍 방식 액세스 권한 부여
aws iam create-access-key --user-name testuser
{
    "AccessKey": {
        "UserName": "testuser",
        "AccessKeyId": "AKIA5ILF2FJIY4OLAN3R",
        "Status": "Active",
        "SecretAccessKey": "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",
        "CreateDate": "2022-08-07T11:24:58+00:00"
    }
}aws iam create-access-key --user-name awssecadmin
{
    "AccessKey": {
        "UserName": "awssecadmin",
        "AccessKeyId": "AKIA5ILF2FJI4BIO3FWE",
        "Status": "Active",
        "SecretAccessKey": "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",
        "CreateDate": "2022-08-07T11:25:12+00:00"
    }
}# testuser 사용자를 awstestusergroup 그룹에 추가 
aws iam add-user-to-group --group-name awstestusergroup --user-name testuser  # awssecadmin 사용자를 awssecadmingroup 그룹에 추가 
aws iam add-user-to-group --group-name awssecadmingroup --user-name awssecadmin

사용자 그룹 내 사용자 추가

AWS Configure Profile 생성

# testuser 자격증명 profile 생성
aws configure --profile testuser
AWS Access Key ID [None]: AKIA5ILF2FJIY5HVCNBL
AWS Secret Access Key [None]: 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
Default region name [None]: ap-northeast-2
Default output format [None]:# awssecadmin 자격증명 profile 생성
aws configure --profile awssecadmin
AWS Access Key ID [None]: AKIA5ILF2FJI5VJEQFUC
AWS Secret Access Key [None]: 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
Default region name [None]: ap-northeast-2
Default output format [None]:# 자격 증명 정보 저장되는 파일 확인
cat ~/.aws/credentials

IAM 정책 만들기

  • 정책 내용 JSON 파일 생성
cat <<EOF > my-s3-list-bucket-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::cass-s3bucket-$S3suffix",
            "Condition": {
                "DateLessThan": {
                    "aws:EpochTime": "1660057200"
                }
            }
        }
    ]
}
EOF
  • 정책 생성
# 정책 생성
aws iam create-policy --policy-name MyS3ListPolicyCLI --policy-document file://my-s3-list-bucket-policy.json
  • 사용자 그룹에 권한 정책 추가
# awstestusergroup 그룹에 정책 권한을 추가
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
aws iam attach-group-policy --group-name awstestusergroup --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/MyS3ListPolicyCLI# # awstestusergroup 그룹에 연결된 정책 확인
aws iam list-attached-group-policies --group-name awstestusergroup
{
    "AttachedPolicies": [
        {
            "PolicyName": "MyS3ListPolicyCLI",
            "PolicyArn": "arn:aws:iam::911283464785:policy/MyS3ListPolicyCLI"
        }
    ]
  • testuser 사용자로 S3 버킷 조회
# [testuser 자격증명 profile] cass-s3bucket-<자신의닉네임> S3 버킷 리스트 조회
aws s3 ls cass-s3bucket-$S3suffix --profile testuser
2022-08-05 09:40:09          4 111.txt# [testuser 자격증명 profile] 모든 버킷의 ListBuckets 권한(Action)은 없음 > 정상 실습 상태
aws s3 ls --profile testuser
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

testuser 사용자로 S3 버킷 조회 시 화면

실습 리소스 삭제

# awstestusergroup 그룹에 MyS3ListPolicy 정책 권한을 연결을 제거
aws iam detach-group-policy --group-name awstestusergroup --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/MyS3ListPolicyCLI# awstestusergroup 그룹에 testuser 사용자 제거
aws iam remove-user-from-group --group-name awstestusergroup --user-name testuser# awstestusergroup 그룹 제거
aws iam delete-group --group-name awstestusergroup# testuser 사용자의 AWS Web Console 로그인 profile 제거
aws iam delete-login-profile --user-name testuser# testuser 사용자의 access-key 제거
ACKEYID=$(aws iam list-access-keys --user-name testuser --query "AccessKeyMetadata[0].AccessKeyId" --output text)
aws iam delete-access-key --user-name testuser --access-key-id $ACKEYID# testuser 사용자 제거
aws iam delete-user --user-name testuser# MyS3ListPolicy, MyS3ListPolicyCLI 정책 제거
aws iam delete-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/MyS3ListPolicy
aws iam delete-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/MyS3ListPolicyCLI# 정책 제거 확인
aws iam list-policies --scope Local# awssecadmingroup 그룹에 awssecadmin 사용자 제거
aws iam remove-user-from-group --group-name awssecadmingroup --user-name awssecadmin# awssecadmingroup 그룹 제거
aws iam delete-group --group-name awssecadmingroup# awssecadmin 사용자의 AWS Web Console 로그인 profile 제거
aws iam delete-login-profile --user-name awssecadmin# awssecadmin 사용자의 access-key 제거
ACKEYID=$(aws iam list-access-keys --user-name awssecadmin --query "AccessKeyMetadata[0].AccessKeyId" --output text)
aws iam delete-access-key --user-name awssecadmin --access-key-id $ACKEYID# awssecadmin 사용자에 연결된 AdministratorAccess 정책 제거
aws iam detach-user-policy --user-name awssecadmin --policy-arn arn:aws:iam::aws:policy/AdministratorAccess# awssecadmin 사용자 제거
aws iam delete-user --user-name awssecadmin# S3 버킷 삭제
# S3suffix=<자신의 닉네임>
export S3suffix=hayley
aws s3 rm s3://cass-s3bucket-$S3suffix --recursive  # 버킷 내에 객체를 먼저 삭제 할 것
aws s3 rb s3://cass-s3bucket-$S3suffix

AWS Organizations 사용을 위한 관리 계정 만들기

AWS Organizations Concepts

AWS Organizations는 중앙에서 모든 AWS 계정을 관리할 수 있도록 도와줍니다.(링크)

  • Organization : AWS 계정을 단일 단위로 관리할 수 있도록 통합하기 위해 생성하는 개체입니다.
  • Root : 조직의 모든 계정에 대한 상위 컨테이너입니다. 정책을 루트에 적용하면, 해당 정책은 조직의 모든 조직 단위(OU) 계정에 적용됩니다.
  • 조직 단위(OU) : 루트에 있는 계정을 위한 컨테이너입니다. 각 OU는 상위 OU를 하나만 가질 수 있으며, 현재 각 계정은 한 OU의 멤버만 될 수 있습니다.
  • Account : Organizations의 계정은 AWS 리소스를 포함하는 표준 AWS 계정으로, 이러한 리소스에 액세스할 수 있는 자격 증명입니다.
  • 서비스 제어 정책(SCP) : SCP의 영향을 받는 계정에서 사용자와 역할이 사용할 수 있는 서비스와 작업을 지정하는 정책입니다. SCP는 권한을 부여하지 않는다는 점을 제외하고 IAM 권한 정책과 비슷합니다. 대신, SCP는 조직, 조직 단위(OU) 또는 계정에 대한 최대 권한을 지정합니다. SCP를 조직 루트 또는 OU에 연결하면 SCP가 멤버 계정의 개체에 대한 권한을 제한합니다.

실습

Tutorial: Creating and configuring an organization — AWS Organizations (amazon.com)

위 튜토리얼을 참고하여 3개의 AWS 계정으로 아래와 같이 계층화된 구조를 만듭니다.

조직 구성 예시

SCP 생성

  • AWS Organizations → 정책 → 서비스 제어 정책 ⇒ 서비스 제어 정책 생성 클릭 : 정책이름 Block CloudTrail Configuration Actions
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1234567890123",
            "Effect": "Deny",
            "Action": [
                "cloudtrail:AddTags",
                "cloudtrail:CreateTrail",
                "cloudtrail:DeleteTrail",
                "cloudtrail:RemoveTags",
                "cloudtrail:StartLogging",
                "cloudtrail:StopLogging",
                "cloudtrail:UpdateTrail"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
  • AWS Organizations → 정책 → 서비스 제어 정책 ⇒ 서비스 제어 정책 생성 클릭 : 정책이름 Block S3 Actions
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1111111111111",
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": [ "*" ]
        }
    ]
}

생성된 SCP 확인

SCP 정책 연결

  • Root 에 Block CloudTrail Configuration Actions SCP 정책 연결
  • Production OU 에 Block S3 Actions 연결

Organization Policy 적용 테스트

  • 두번째 AWS 계정에서 S3 서비스 접속 시 차단 확인

S3 서비스 접속 시 차단 확인됨

관련 내용

다중 계정 AWS 환경을 설정 및 관리할 수 있는 AWS Control Tower 내용을 참고해보세요.(링크)

 

클라우드 보안 거버넌스 - AWS Control Tower - AWS

AWS Control Tower는 다수의 AWS 서비스를 오케스트레이션하는 동시에 조직의 보안 및 규정 준수 요구 사항을 유지 관리하여 AWS 경험을 간소화합니다.

aws.amazon.com

 

blog migration project

written in 2022.8.7

https://medium.com/techblog-hayleyshim/aws-iam-organizations-control-tower-f55ddefc252f