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합니다.
- EC2 인스턴스에 대한 IAM 역할 생성
- S3 버킷에 대한 전체 액세스 권한을 부여하는 역할에 IAM 정책을 연결
- 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 계정으로 변환 - 다시 전환
'DevOps > AWS' 카테고리의 다른 글
[AWS] IAM 정책 (자격증명 기반 정책, 리소스 기반 정책) (0) | 2023.09.09 |
---|---|
[AHSS 2주차] AWS IAM 보안 (2) (0) | 2023.09.06 |
[AHSS 1주차] AWS S3 보안 (3) (0) | 2023.08.31 |
[AHSS 1주차] AWS S3 보안 (2) (0) | 2023.08.29 |
[AHSS 1주차] AWS S3 보안 (1) (0) | 2023.08.28 |