개발일기
AWS CloudFront 를 통한 안전한 S3 버킷 정책 설정 본문
🔥 S3란?
AWS에서 제공하는 S3 (Simple Storage Service)를 사용하여 운영서버에서 이미지 파일로 인한 리소스 낭비와 관리 포인트를 분리한다.
S3는 인터넷 스토리지 서비스로, 정적 파일들과 스크립트, 이미지, 음원, 바이너리 패키지등을 저장하는 관리하는 용도로 사용된다.
용량은 가용적으로 늘어나 무제한으로 사용 할 수 있다. 직접적인 스케일링 작업이 필요하지 않다.
이러한 파일들의 업로드 혹은 삭제와 같은 작업을 http/https 프로토콜을 통해 관리할 수 있다. 또한, ec2의 스토리지(ebs)를 사용하여 데이터를 저장하는 것보다 비용이 훨씬 저렴하다.
ACLs(Access Control Lists)은 비활성화 해두자..!
모든 퍼블릭 액세스 차단을 해제하여 시작하였습니다.
퍼블릭 액세스 차단을 풀면 보안적으로 매우 취약한 설정입니다. 추후에 다시 설정합시다..!
생성된 버켓에 이미지를 하나 업로드 하였습니다.
객체 URL을 선택하여 해당 객체에 접근하였습니다.
위에와 같이 Access Denied가 발생하였다.
버킷 정책을 설정해주지 않아서 발생하는 현상이므로 버킷 정책을 설정해주러 출발..!
편집을 클릭하여 버킷 정책을 설정해주자.
😎정책 설정
[1] Select Type Of Policy: S3 Bucket Policy 선택
[2] princial: *
[3] Actions: GetObject 선택
[4] Amazon Resource Name(ARN): arn:aws:s3:::{버킷이름}/* (arn은 bucket properties에서 확인 할 수 있다.
이후 정책을 복사하여 적용한다.
현재 url을 통해 객체에 접근 할 수 있게 되었다.
하지만, 현재 S3는 보안적으로 굉장히 취약한 상황이다.
우선, 데이터들이 저장되어있는 S3 버킷의 주소가 노출되어 있어 악성 공격에 매우 취약합니다..
또, 모든 액세스 요청에 대해 허용되어 있기 때문에 신뢰할 수 없는 클라이언트의 접근 역시 가능합니다.
AWS에서는 CloudFront라는 CDN 서비스를 통해 버킷을 숨기고(OAI) 액세스를 강하게 제한하여 S3 버킷을 사용하도록 권장한다.
✨ CloudFront ✨
가장 먼저 CDN이 어떤 것인지 살펴보자.
📖 CDN(Content Delivery Network)
CDN은 사용자에게 빠르고 안전하게, 지리적 제약 없이 정적 콘텐츠를 제공하는 하도록 할 수 있는 콘텐츠 전송 기술
CDN은 아래 사진과 같이 네트워크(캐시서버)를 구성하여 사용자의 요청에 대한 응답의 물리적인 거리를 줄여 콘텐츠 로딩에 소요되는 시간을 최소화한다. 근접한 사용자의 요청에 원본 서버가 아닌 캐시 서버가 콘텐츠를 전달한다.
위에와 같은 CDN기술은 아래와 같은 장점이 존재합니다.
1. 웹사이트 로딩 속도 개선
2. 대역폭 사용 비용 절감
3. 컨텐츠 제공의 안정성
4. 웹사이트 보안
특히, 응답 속도가 느린 이미지를 제공하는 셀럽잇에서는 CDN을 통해 로딩 속도를 크게 개선할 수 있다.
CloudFront를 사용하면 지리적 제한, 서명된 URL, 서명된 쿠키 등 액세스 제한을 추가로 설정하여 기준이 서로 다른 콘텐츠에 대한 액세스 제한을 강화할 수 있습니다.
- AWS CloudFront
CloudFront는 이런 CDN을 제공하는 서비스이다.
CloudFront를 사용하여 S3 버킷의 직접적인 접근을 막고 CloudFront를 통해서만 액세스가 가능하도록 구성한다면, 보안적인 취약점을 해결 할 수 있다.
AWS에서 제공하는 웹 방화벽인 WAF와 DDos 보호 서비스인 AWS Shield 역시 CloudFront에 적용 가능하여 보안을 강화 할 수 있다.
🛠️ 이제 부터 CloudFront 적용!! 🛠️
취약점인 S3의 정책을 강화하자.
Public Access 접근을 모두 막도록 수정합시다. Bucket Policy도 다시 제거합니다.
버킷 정책도 삭제 했습니다.
S3 버킷을 설정합시다.
CloudFront 배포 생성을 클릭하여 생성하는 화면으로 들어가줍니다.
origin domain을 아까 선택하였던 버킷을 선택합니다.
Original access control settings을 선택하여 CloudFront를 통해서만 bucket에 접근하도록 합니다. 제어 설정도 추가합니다.
다음 cache 동작에서 http 요청 모두 -> https 를 사용하도록 수정합니다.
http 요청 모두 -> https를 사용하도록 수정
WAF을 설정하지 않습니다.
위 구성으로 CloudFont를 생성한다.
생성 완료하면 연결된 버킷과 관련하여 정책을 생성해주는데, 이를 복사한 뒤 버킷 정책에 추가해주자.
이제 S3 객체 url로 직접 access는 불가능하고, {arn}.cloudfront.net/{객체이름} 으로만 접근이 가능한 것을 확인할 수 있다.
아직 도메인을 구매하지 않아 클라우드 프론트에서 해당 설정을 해주지 못하였습니다. 이후에 도메인 구매후 조금 더 글을 추가하겠습니다.
'취준생 프로젝트' 카테고리의 다른 글
WebClient를 사용한 커리어넷 학교 정보 API가져오기 (0) | 2024.08.08 |
---|---|
Sping boot AWS bucket 업로드, 수정 , 삭제하기 (4) | 2024.07.23 |
SpringBoot AWS 설정하는 방법 (0) | 2024.07.16 |
취준생 프로젝트 ERD 구조 및 회고 (0) | 2024.06.27 |
취준생 프로젝트 use-flow 및 요구사작성하기 (0) | 2024.06.22 |