[1주차] S3 취약점 및 보안

홍성현·2023년 9월 1일
0

AHSS

목록 보기
1/2

본 내용은 gasida님의 AHSS 1기 스터디에서 진행된 내용입니다.


0. S3란?

Amazon S3

S3는 Simple Storage Service의 약자로 Amazon에서 제공하는 객체 스토리지 서비스이다. 다양한 사용 사례에서 원하는 양의 데이터를 저장하고 보호할 수 있다. 또한 특정 비즈니스, 조직 및 규정 준수 요구 사항에 맞게 데이터에 대한 엑세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공한다.

Amazon S3란 무엇인가요?

0.1 Object Storage

S3가 사용하는 여러가지 Storage 종류 중에서 Object Storage를 사용한다. Obeject Storage가 무엇인지 알아본다.

0.1.0 스토리지의 종류

스토리지 종류

0.1.1 오브젝트 스토리지의 정의

오브젝트 스토리지는 데이터 스토리지를 오브젝트라는 고유한 단위로 관리하고 조작하는 전략이다. 단일 저장소에 보관되어 다른 폴더 내의 파일과 섞이지 않는다. 오브젝트 스토리지는 파일을 구성하는 데이터 조각을 결합하고, 관련 메타데이터 모두를 해당 파일에 추가하며, 사용자 지정 식별자를 연결한다.

0.1.2 오브젝트 스토리지의 특징

0.2 S3 기능

S3는 어떤 기능 및 특징을 가졌는지 알아본다.

  • Storage Class
    - 엑세스 빈도 및 비용에따라 다양한 Storage Class를 제공한다.
    - 종류: S3 Standard, S3 Standard-IA, S3 One Zone-IA, S3 Glacier Flexible Retrieval, S3 Glacier Deep Archive

  • Storage 관리 기능
    - S3 수명주기:수명주기를 설정하여 효율적인 사용 가능.
    - S3 객체잠금:지정한 시간(무기한 가능)동안 객체의 삭제, 덮어쓰기 방지.
    - S3 복제: 객체, 메타데이터, 태그를 버킷에 복제 가능.
    - S3 배치 작업: S3 API 요청이나 GUI 클릭으로 대규모 객체 관리 가능.

  • 엑세스 관리 및 보안
    - IAM: AWS Resource에대한 Access 안전하게 제어해주는 웹서비스. 중앙에서 관리 가능(인증,권한 부여 대상 제어). IAM을 통하여 S3 리소스에 대한 엑세스 관리 가능.
    - 버킷 정책: IAM 기반 정책 언어를 사용하여 S3 버킷과 그 안에 있는 객체에 대한 리소스 기반 권한을 구성되어 버킷 및 객체에 대한 중앙 집중식 엑세스 제어를 제공. ACL은 개별 객체에 대한 권한을 추가하는데 반면, 버킷 내 모든 객체 및 객체 하위 세트까지 권한 추가와 거부가 가능.
    - ACL: ACL은 엑세스를 허용할 AWS 계정이나 그룹과 엑세스 유형을 정의함. 인증된 사용자에게 개별 버킷 및 객체에대한 읽기 및 쓰기 권한 부여 (Resource 기반 정책 추천). ACL 비활성시 다른 정책을 이용하여 다양하고 쉽게 제어가 가능함. S3 최신 사용 사례에서 더이상 ACL을 사용하지 않음.
    - S3 퍼블릭 액세스 차단: S3 버킷과 객체에 대한 퍼블릭 엑세스 차단(기본적으로 버킷 수준에서 켜져있음. 활성화 상태 유지 추천)
    - S3 access point: 액세스 정책을 사용하여 Network endpoint를 구성하여 Amazon S3의 공유 데이터셋에 대한 데이터 액세스를 관리
    - S3 객체 소유권: 버킷의 모든 객체에 대한 소유권을 가져와서 Amazon S3에 저장된 데이터에 대한 액세스 관리를 간소화.
    - IAM Access Analyzer for S3: S3 버킷 액세스 정책을 평가 및 모니터링.

  • 데이터 처리
    - S3 Lamda: 애플리케이션에 데이터가 반환될 때 데이터 수정 및 처리
    - 이벤트 알림: Amazon SNS, SQS로 Lamda 사용하는 workflow trigger

  • 모니터링 및 분석
    - 다양한 S3 리소스 모니터링 및 스토리지 사용량 분석 도구
    - CloudWatch, CloudTrail, Trusted Advisor, Storage Lens, S3 Inventory

  • Strongly Consistency
    -S3 버킷에 있는 객체의 PUT 및 DELETE 요청에 대해 강력한 read-after-write 일관성을 제공
    - 강력한 쓰기 후 읽기 일관성관련 AWS 블로그

    Amazon S3란 무엇인가요?
    객체 소유권 제어 및 버킷에 대해 ACL 사용 중지

0.3 S3 버킷

모든 객체는 위에 그림과 같은 Bucket에 들어가야한다. Object들이 들어가는 Bucket에대하여 알아본다.

Amazon S3란 무엇인가요?
Bucket Acces
[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법

1. 실습환경

#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에서는 키를 받지 않고 진행한다.

2. S3 권한 설정 실습 & IAM Acess Analyzer

2.1 [local] AWS S3 Bucket 생성

S3 Bucket을 생성한 후, 퍼블릭 엑세스 차단이 모두 기본으로 true로 되어있음을 확인할 수 있다. cli와 gui 모두에서 확인할 수 있다.

2.2 Public Access 차단 편집

기본으로 설정된 public access차단을 전부 해제한다.

2.3 [local] Bucket에 textfile 3개 객체 파일 업로드

memo1,2,3 파일을 생성하여 2.1에서 생성한 Bucket에 업로드하여 확인한다.

s3api와 jq 커맨드를 활용하여 object list의 json정보를 간결하게 확인한다.

2.4 [EC2] Bucket 탐색

IAM 자격증명이 없는 EC2에서 Bucket를 탐색하여본다. 퍼블릭 엑세스 차단을 해제했지만, 그 이후 상세한 권한에 대하여서 설정한 적이 없기에 잘 탐색이 안될 것 같다. 아래와 같이 탐색이 되지않는다.

2.5 객체 소유권 편집

S3 > 버킷 > 권한 > 객체 소유권 편집을 통하여 ACL을 활성화 시킨다.

2.6 ACL 편집

S3 > 버킷 > 권한 > ACL 편집을 통하여 퍼블릭 엑세스를 활성화 시킨다.

2.7 [EC2] Bucket 탐색

버킷의 권한을 퍼블릭 엑세스로 바꾼 이후 버킷을 탐색하여본다. 버킷과 객체에 접근을 하는데 버킷을 열어주었으니 객체도 권한을 갖을 것이라고 생각하였지만 객체 접근은 실패하였다. 객체 별 권한 설정 또한 필요하다.

2.8 객체 별 권한 설정

객체 별 권한을 다르게하여 실험하여본다. memo1에는 퍼블릭엑세스 권한을 주고 memo2에는 인증된 사용자 그룹 권한을 준다. memo3은 변화를 주지 않았다.

memo1.txt

memo2.txt

권한 설정 이후 버킷에 엑세스가 퍼블릭으로 바뀌어 있다.

2.9 [EC2] Bucket 탐색

퍼블릭엑세스로 변경한 객체를 제외하고는 여전히 접근이 안되었다.

2.10 [local] Bucket에 객체 복사

IAM 자격증명이 설정된 환경에서는 객체의 복사가 가능한 것을 확인할 수 있다.

2.11 리소스 정책 : 버킷 정책 설정 - 편집

버킷에 있는 모든 Resource에 대하여 가져올 수 있는 버킷정책을 설정한다.

aws cli를 통하여 버킷정책이 지정되었는지 확인한다.

2.12 [EC2] Bucket 탐색

모든 리소스에 대하여 접근이 가능한 것을 확인할 수있다.

2.13 IAM Access Analyzer 액세스 분석기

분석기 생성 버킷 스캔 수행 결과 확인의 과정을 살펴본다. 스캔결과 실습을 통하여 설정했었던 엑세스 관련 정보들을 확인할 수 있다.

IAM - 액세스 보고서 - 액세스 분석기에서 분석기가 찾아낸 버킷 정책 및 ACL이 있다.

버킷에 대한 퍼블릭 엑세스 차단 설정

콘솔에서 차단된 것을 확인할 수 있다.

분석기 삭제

2.14 실습 완료 후 삭제

profile
System Engineer 기록일지

0개의 댓글