본문 바로가기

DevOps/AWS

[AHSS 2주차] AWS IAM 보안 (1)

cloudNet@ 팀의 가시다 님이 진행하는 AWS 보안 스터디 2주차 정리입니다.

[ AWS 보안  ] - IAM 는 어떻게  관리해야 할까요?

이번 시간에는 2가지 실습을 진행해 보겠습니다. 

첫번째는, EC2의 IAM 사용 방법인데 이부분은 간단하게 EC2에서 Role을 Assume 하는 과정을 보여주며

두번째는, User와 IAM 사용 방법인데 user 1, 2 를 생성하여 user 2 가 makebucket을 하지 못하는 상황을 해결하는 방법에 대해 보여줍니다.

 

 

 

✅ 실습 목표 : 아래 그림과 같이 Role을 생성 합니다. 해당 Role에는 S3ReadOnly라는 미리 만들어진 Policy를 할당 하고 

EC2에서는 해당 Role을 Assume합니다.

www.freecodecamp.org/news/aws-iam-explained

 

  1. EC2 인스턴스에 대한 IAM 역할 생성

  1. S3 버킷에 대한 전체 액세스 권한을 부여하는 역할에 IAM 정책을 연결
  2. EC2 인스턴스가 역할을 맡도록 허용

  • 전에 생성한 EC2에 S3 읽기 권한을 가진 Role을 생성하고, 그 Role을 EC2에 부여합니다.
  • EC2는 해당 Role을 위임받아 S3에 접근할 수 있습니다.

 

 

EC2에 접속하여 aws 자격증명 설정을 하지 않은 채로 aws s3 ls 명령어를 입력

ubuntu@server:~$ aws s3 ls
2023-09-27 10:41:42 aria-eks
2023-12-02 19:19:13 cf-templates-3vlsm80lvj2x-ap-northeast-1
2023-09-18 15:37:35 cf-templates-3vlsm80lvj2x-ap-northeast-2
2023-09-19 15:55:38 cf-templates-3vlsm80lvj2x-us-east-1
2023-03-14 14:11:43 elasticbeanstalk-ap-northeast-2-466593096201
2023-09-19 15:36:00 koo-walab
2024-01-11 16:17:25 openshift-black-cfd5c-image-registry-ap-southeast-1-yljahodelh
2024-01-11 15:27:27 openshift-black-v5mbw-bootstrap
2024-01-17 17:37:56 watsonx-chloe

✅ 실습 목표 :  IAM 기본 사용법에 대한 실습을 해보자.

  • IAM Role을 Assume 하기 위해서는 먼저 Assume Role policy가 필요
  • Role을 Assume 한다 = 임시 Credential을 발급한다. 
  • Role과 Policy는 바늘과 실 같은 관계 
  • Assume을 해주는 대상 ( EC2, user , Service Account )

 사전 준비

mzc01-kook@MZC01-KOOK ~ % aws sts get-caller-identity
{
    "UserId": "AIDAWZIY5UIE7BE35JKUZ",
    "Account": "466593096201",
    "Arn": "arn:aws:iam::466593096201:user/koo"
}



# caller id 확인
aws sts get-caller-identity

# 자신의 AWS 계정 ID 변수 지정
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
echo $ACCOUNT_ID

# 페이저 사용 비활성화
export AWS_PAGER=""

 

IAM User 생성 및 정책 연동

# user1 사용자 생성
# user2 사용자 생성
aws iam create-user --user-name user1
aws iam create-user --user-name user2

# user1 사용자의 AWS Web Console 로그인 profile 생성 - 링크
cat <<EOF > create-login-profile-user1.json
{
    "UserName": "user1",
    "Password": "Ahss\$1234",
    "PasswordResetRequired": false
}
EOF
cat create-login-profile-user1.json | jq
aws iam create-login-profile --cli-input-json file://create-login-profile-user1.json

# user2 사용자의 AWS Web Console 로그인 profile 생성 - 링크
cat <<EOF > create-login-profile-user2.json
{
    "UserName": "user2",
    "Password": "Ahss\$1234",
    "PasswordResetRequired": false
}
EOF
cat create-login-profile-user2.json | jq
aws iam create-login-profile --cli-input-json file://create-login-profile-user2.json


# iam 사용자 리스트 확인
aws iam list-users | jq

# 사용자에게 프로그래밍 방식 액세스 권한 부여
aws iam create-access-key --user-name user1
aws iam create-access-key --user-name user2 
{
    "AccessKey": {
        "UserName": "user1",
        "AccessKeyId": "xxx",
        "Status": "Active",
        "SecretAccessKey": "xxx",
        "CreateDate": "2023-09-03T06:21:17+00:00"
    }
}

aws iam create-access-key --user-name user2
{
    "AccessKey": {
        "UserName": "user2",
        "AccessKeyId": "xxx",
        "Status": "Active",
        "SecretAccessKey": "xxx",
        "CreateDate": "2023-09-03T06:21:27+00:00"
    }
}

# 사용자에 정책을 추가
aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/AdministratorAccess --user-name user1
aws iam attach-user-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --user-name user2

 

✔️ policy/AdministratorAccess ( user1)

✔️ policy/ReadOnlyAccess ( user2)

 

✔️ 로그인 프로필 생성.json

✔️ user2 에서 ec2 재부팅 안됨

 IAM User 생성 및 정책 연동

# 시도
aws s3 ls

# user1 자격증명 profile 생성 : 위 메모 복붙
aws configure --profile user1
AWS Access Key ID [None]: xxx
AWS Secret Access Key [None]: xxx
Default region name [None]: ap-northeast-2
Default output format [None]:

# user2 자격증명 profile 생성 : 위 메모 복붙
aws configure --profile user2
AWS Access Key ID [None]: xxx
AWS Secret Access Key [None]: xxx
Default region name [None]: ap-northeast-2
Default output format [None]:

# 자격 증명 정보 저장되는 파일 확인
cat ~/.aws/credentials

[default]
aws_access_key_id = xxx
aws_secret_access_key = xxx
[testuser]
aws_access_key_id = xxx
aws_secret_access_key = xxx
[awssecadmin]
aws_access_key_id = xxx
aws_secret_access_key = xxxx
[user1]
aws_access_key_id = xxx
aws_secret_access_key = xxx
[user2]
aws_access_key_id = xx
aws_secret_access_key = xxx

 

 IAM get-caller-identity (프로필 적용 )

 

# caller id 확인
aws sts get-caller-identity --profile user1 | jq
aws sts get-caller-identity --profile user2 | jq

# 자격증명 사용 확인
aws s3 ls --profile user1
aws s3 ls --profile user2
aws ec2 describe-vpcs --profile user1 | jq
aws ec2 describe-vpcs --profile user2 | jq

# S3 버킷 생성
NICKNAME=<각자 자신의 닉네임>
NICKNAME=koo
#aws s3 mb s3://버킷(유일한 이름) --region ap-northeast-2
aws s3 mb s3://ahss-2w-$NICKNAME-1 --region ap-northeast-2 --profile user1

# ❌ Only Read (Make bucket 권한없음)
aws s3 mb s3://ahss-2w-$NICKNAME-2 --region ap-northeast-2 --profile user2

# S3 버킷 조회
aws s3 ls --profile user2

 

 AssumeRole 을 통해 위에 user2가 Make bucket 권한이 없어서 버킷을 생성하지 못하는 문제를 해결해 보도록 하겠습니다.

 

✔️ 가장먼저, assumeRole을 허용하는 policy를 만듭니다.

✔️ 이는, AssumeRole 액션을 허용하는 리소스 정책입니다.

✔️ 그리고 해당 정책을 user2에 붙입니다.

 

# user2 사용자에 인라인 정책을 추가 : STS 서비스의 AssumeRole Action 허용
cat <<EOF > allow-assume-role.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "allowassumerole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
}
EOF
cat allow-assume-role.json | jq
aws iam put-user-policy --user-name user2 --policy-name allow-assume-role --policy-document file://allow-assume-role.json

 

AmazonS3FullAccess 권한을 가진 IAM Role을 연동

✔️ AssumeRole을 허용하는 정책을 생성하였으니, 이제 실제로 동작시킬 Make bucket을 허용하는 IAM Role을 생성합니다.

 

#
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
cat <<EOF > MyAccount-AssumeRole.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {
                "AWS": "$ACCOUNT_ID"
            },
            "Condition": {}
        }
    ]
}
EOF
cat MyAccount-AssumeRole.json | jq
aws iam create-role --role-name assume-role-s3full --assume-role-policy-document file://MyAccount-AssumeRole.json --max-session-duration 7200
{
    "Role": {
        "Path": "/",
        "RoleName": "assume-role-s3full",
        "RoleId": "AROA5ILF2FJITESCKZOAO",
        "Arn": "arn:aws:iam::911283464785:role/assume-role-s3full",
        "CreateDate": "2023-09-03T06:46:47+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "AWS": "911283464785"
                    },
                    "Condition": {}
                }
            ]
        }
    }
}

# assume-role-s3full IAM Role 에 AmazonS3FullAccess 정책 적용
aws iam attach-role-policy --role-name assume-role-s3full --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess

 

  new EC2 

 

✔️ AssumeRole을 통해 단기 key 발급 ( Access Key, Secret Key, Session Token )

sts로 부터 assume role을 받는 순간부터 caller id를 확인하면 assume-role의 ARN을 확인 가능 

✔️ Caller id 확인 

  "UserId": "xxxx:MyS3accessSession"

  "Arn": "arn:aws:sts::xxxx:assumed-role/assume-role-s3full/MyS3accessSession"

 

# AssumeRole 을 통해 임시자격증명 발급
export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text --profile user2)
#aws sts assume-role --role-arn arn:aws:iam::"$ACCOUNT_ID":role/assume-role-s3full --role-session-name <각자 편한이름 지정> --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" --output text
aws sts assume-role --role-arn arn:aws:iam::"$ACCOUNT_ID":role/assume-role-s3full --role-session-name MyS3accessSession --profile user2
{
    "Credentials": {
        "AccessKeyId": "ASIAWZIY5UIETE4YEQ5K",
        "SecretAccessKey": "KPNeGg7ASPF12xXvm8w7Nw1RCeu5WROcV4ynl996",
        "SessionToken": "IQoJb3JpZ2luX2VjEID//////////wEaDmFwLW5vcnRoZWFzdC0yIkYwRAIgLA5uHJAvBUsUVqgdJou/4A74joNS7csagi/+MLspsqMCIClHeqcUkiO3PukHbSI6H2mQTR6a1OcsoizE+54C5wWAKp4CCFoQAhoMNDY2NTkzMDk2MjAxIgyKVP4KsJr4UXAn4zwq+wE9WFKEe13FFZ0YV5Ngbw+9rMWYsPWsLLVaq/AG32W7/vWEsIZ7+gO65LMJgzxH8tYYBdR9NQ3vQI8+60fZEvcor6+EIKWLkf5fKdkjthhMp0FNrvdbEybHhCP00C6CsQR9ivqtcLZwii/KljVuI0MVkMLGszP+gQ/VQJgOw6IVUtGTRALHML66YKKgqlj8kuzv39/Ey+RU3CqvjnCqWT12U+BQGnYBD7US2PWJyvVDHdaTRlHcL3YhpL4WcvgoeDv2jL0M4inCk5SuI5TmymrEUSPduGPGtL/dF+Eh0YXMXFkNkgx6p7M7yAMq+y+/J8rVdQlWkA/WtNYdgzClzNunBjqeASr4AlbfenuJuLxWBZ67L0yEigGgwTeIFzxYETjPQaXmHpzdPrk1tNaiRcrSZ6fpkIPOHQCUXjw3hms8Jr4/+1qdoVph8gPYjfqYLsIEoopIhlfiH441MsBEOZA3DE0N9/NMiKPjnYueWQJUSqgM3OplsThLNBR8Y1dtQ2Bg4bx/b6ejdO9QCVcgS11gYqBaMfP/c9idiRrmoCJcdkhA",
        "Expiration": "2023-09-03T07:50:09+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA5ILF2FJITESCKZOAO:MyS3accessSession",
        "Arn": "arn:aws:sts::911283464785:assumed-role/assume-role-s3full/MyS3accessSession"
    }
}

# 위에서 출력된 AccessKeyId , SecretAccessKey , SessionToken 으로 임시자격증명 적용
export AWS_ACCESS_KEY_ID="ASIAWZIY5UIETE4YEQ5K"
export AWS_SECRET_ACCESS_KEY="KPNeGg7ASPF12xXvm8w7Nw1RCeu5WROcV4ynl996"
export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEID//////////wEaDmFwLW5vcnRoZWFzdC0yIkYwRAIgLA5uHJAvBUsUVqgdJou/4A74joNS7csagi/+MLspsqMCIClHeqcUkiO3PukHbSI6H2mQTR6a1OcsoizE+54C5wWAKp4CCFoQAhoMNDY2NTkzMDk2MjAxIgyKVP4KsJr4UXAn4zwq+wE9WFKEe13FFZ0YV5Ngbw+9rMWYsPWsLLVaq/AG32W7/vWEsIZ7+gO65LMJgzxH8tYYBdR9NQ3vQI8+60fZEvcor6+EIKWLkf5fKdkjthhMp0FNrvdbEybHhCP00C6CsQR9ivqtcLZwii/KljVuI0MVkMLGszP+gQ/VQJgOw6IVUtGTRALHML66YKKgqlj8kuzv39/Ey+RU3CqvjnCqWT12U+BQGnYBD7US2PWJyvVDHdaTRlHcL3YhpL4WcvgoeDv2jL0M4inCk5SuI5TmymrEUSPduGPGtL/dF+Eh0YXMXFkNkgx6p7M7yAMq+y+/J8rVdQlWkA/WtNYdgzClzNunBjqeASr4AlbfenuJuLxWBZ67L0yEigGgwTeIFzxYETjPQaXmHpzdPrk1tNaiRcrSZ6fpkIPOHQCUXjw3hms8Jr4/+1qdoVph8gPYjfqYLsIEoopIhlfiH441MsBEOZA3DE0N9/NMiKPjnYueWQJUSqgM3OplsThLNBR8Y1dtQ2Bg4bx/b6ejdO9QCVcgS11gYqBaMfP/c9idiRrmoCJcdkhA"


# caller id 확인
aws sts get-caller-identity | jq

# S3 버킷 생성
NICKNAME=<각자 자신의 닉네임>
NICKNAME=koo
#aws s3 mb s3://버킷(유일한 이름) --region ap-northeast-2
aws s3 mb s3://ahss-2w-$NICKNAME-2 --region ap-northeast-2

# S3 버킷 조회
aws s3 ls

# S3 버킷 삭제
aws s3 rb s3://ahss-2w-$NICKNAME
aws s3 rb s3://ahss-2w-$NICKNAME-2

# (참고) 임시자격증명 제거
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN

 

  Assume Role 콘솔 역할 전환

✔️ 콘솔에서 역할 전환 링크 복사 

✔️ user2 웹 관리 콘솔에서 해당 링크 붙여넣기

✔️ user2 역할 전환 클릭

✔️ Assume-Role 계정으로 변환 - 다시 전환