본 내용은 gasida님의 AHSS 1기 스터디에서 진행된 내용입니다.
S3는 Simple Storage Service의 약자로 Amazon에서 제공하는 객체 스토리지 서비스이다. 다양한 사용 사례에서 원하는 양의 데이터를 저장하고 보호할 수 있다. 또한 특정 비즈니스, 조직 및 규정 준수 요구 사항에 맞게 데이터에 대한 엑세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공한다.
S3가 사용하는 여러가지 Storage 종류 중에서 Object Storage를 사용한다. Obeject Storage가 무엇인지 알아본다.
오브젝트 스토리지는 데이터 스토리지를 오브젝트라는 고유한 단위로 관리하고 조작하는 전략이다. 단일 저장소에 보관되어 다른 폴더 내의 파일과 섞이지 않는다. 오브젝트 스토리지는 파일을 구성하는 데이터 조각을 결합하고, 관련 메타데이터 모두를 해당 파일에 추가하며, 사용자 지정 식별자를 연결한다.
오브젝트 스토리지의 정의와 장단점
스토리지 종류 비교 - 블록,파일,오브젝트 스토리지 쉽게 이해하기
스토리지 기초 지식 9편: 오브젝트 스토리지란
S3는 어떤 기능 및 특징을 가졌는지 알아본다.
모든 객체는 위에 그림과 같은 Bucket에 들어가야한다. Object들이 들어가는 Bucket에대하여 알아본다.
Amazon S3란 무엇인가요?
Bucket Acces
[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법
#local pc IAM 자격증명 완료
#AWS > 서비스 > ec2 > 네트워크 및 보안 > keypair 생성 > pem file 생성
#KEYNAME 환경변수 지정
#.pem file ~/.ssh 이동
#Download YAML
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: must be the name of an existing EC2 KeyPair.
LatestAmiId:
Description: (DO NOT CHANGE)
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
AllowedValues:
- /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: My-VPC
MyIGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: My-IGW
MyIGWAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref MyIGW
VpcId: !Ref MyVPC
MyPublicRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: My-Public-RT
DefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: MyIGWAttachment
Properties:
RouteTableId: !Ref MyPublicRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref MyIGW
MyPublicSN:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 0, !GetAZs '' ]
CidrBlock: 10.0.0.0/24
Tags:
- Key: Name
Value: My-Public-SN
MyPublicSN2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC
AvailabilityZone: !Select [ 2, !GetAZs '' ]
CidrBlock: 10.0.1.0/24
Tags:
- Key: Name
Value: My-Public-SN-2
MyPublicSNRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref MyPublicRT
SubnetId: !Ref MyPublicSN
MyPublicSNRouteTableAssociation2:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref MyPublicRT
SubnetId: !Ref MyPublicSN2
MySG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: WEB Security Group
VpcId: !Ref MyVPC
Tags:
- Key: Name
Value: My-SG
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
CidrIp: 0.0.0.0/0
MYEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: !Ref LatestAmiId
KeyName: !Ref KeyName
Tags:
- Key: Name
Value: DVWA-EC2
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref MyPublicSN
GroupSet:
- !Ref MySG
AssociatePublicIpAddress: true
PrivateIpAddress: 10.0.0.10
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
hostnamectl --static set-hostname My-EC2
yum install -y nmap tree lynx git htop jq
Outputs:
DvwaNodeIP:
Value: !GetAtt MYEC2.PublicIp
#CloudFormation 스택 배포
첫번째 시도, 환경변수 KEYNAME 설정 오류로 인한 실패(환경변수 terminal reboot후 없어짐)
두번째 시도, 올바른 KEYNAME 입력 후 stakc 생성 성공
#작업용 EC2 SSH 접속
ec2 접속시 권한으로 인한 bad permission 오류 이후 chmod 644 -> 400 으로 key 권한 변경 후 접속
실습환경이 준비되었다. 이제 실습을 진행하며 S3을 사용하며 취약점 및 기능들을 살펴본다. 실습 시 local에서는 aws cli로 IAM 키를 자격증명이 된 상태에서 진행하고 EC2에서는 키를 받지 않고 진행한다.
S3 Bucket을 생성한 후, 퍼블릭 엑세스 차단이 모두 기본으로 true로 되어있음을 확인할 수 있다. cli와 gui 모두에서 확인할 수 있다.
기본으로 설정된 public access차단을 전부 해제한다.
memo1,2,3 파일을 생성하여 2.1에서 생성한 Bucket에 업로드하여 확인한다.
s3api와 jq 커맨드를 활용하여 object list의 json정보를 간결하게 확인한다.
IAM 자격증명이 없는 EC2에서 Bucket를 탐색하여본다. 퍼블릭 엑세스 차단을 해제했지만, 그 이후 상세한 권한에 대하여서 설정한 적이 없기에 잘 탐색이 안될 것 같다. 아래와 같이 탐색이 되지않는다.
S3 > 버킷 > 권한 > 객체 소유권 편집을 통하여 ACL을 활성화 시킨다.
S3 > 버킷 > 권한 > ACL 편집을 통하여 퍼블릭 엑세스를 활성화 시킨다.
버킷의 권한을 퍼블릭 엑세스로 바꾼 이후 버킷을 탐색하여본다. 버킷과 객체에 접근을 하는데 버킷을 열어주었으니 객체도 권한을 갖을 것이라고 생각하였지만 객체 접근은 실패하였다. 객체 별 권한 설정 또한 필요하다.
객체 별 권한을 다르게하여 실험하여본다. memo1에는 퍼블릭엑세스 권한을 주고 memo2에는 인증된 사용자 그룹 권한을 준다. memo3은 변화를 주지 않았다.
memo1.txt
memo2.txt
권한 설정 이후 버킷에 엑세스가 퍼블릭으로 바뀌어 있다.
퍼블릭엑세스로 변경한 객체를 제외하고는 여전히 접근이 안되었다.
IAM 자격증명이 설정된 환경에서는 객체의 복사가 가능한 것을 확인할 수 있다.
버킷에 있는 모든 Resource에 대하여 가져올 수 있는 버킷정책을 설정한다.
aws cli를 통하여 버킷정책이 지정되었는지 확인한다.
모든 리소스에 대하여 접근이 가능한 것을 확인할 수있다.
분석기 생성 버킷 스캔 수행 결과 확인의 과정을 살펴본다. 스캔결과 실습을 통하여 설정했었던 엑세스 관련 정보들을 확인할 수 있다.
IAM - 액세스 보고서 - 액세스 분석기에서 분석기가 찾아낸 버킷 정책 및 ACL이 있다.
버킷에 대한 퍼블릭 엑세스 차단 설정
콘솔에서 차단된 것을 확인할 수 있다.
분석기 삭제