안녕하세요 커널 3기 박예슬입니다.

많은 동기들이 S3를 활용하는 것을 자주 보았는데요, 저 또한 S3를 사용해보며 이런저런 문제를 겪었습니다.

Amazon S3(Amazon Simple Storage Service)는 데이터를 안전하게 저장하고, 인터넷을 통해 접근하는 데에 편리하고 유용한 서비스지만, 보안 위험 요소를 동반할 수 있기 때문에 주의가 필요합니다.

이번 프로젝트에서 고민하고 공부하고 적용했던 보안 방식들에 대해 간략하게 소개해보고자 합니다.

Amazon S3 보안이 중요한 이유

만약 누구나 인터넷을 통해 S3 버킷에 접근할 수 있다면 다음과 같은 문제가 발생할 수도 있습니다.

1. 외부 시스템에서 우리 데이터를 직접 가져가서 사용할 수 있다

만약 S3 버킷이 잘못 설정되어 누구나 접근할 수 있게 된다면, 외부 시스템에서 해당 데이터를 쉽게 가져가 사용할 수 있습니다. 누군가 파일을 대량으로 다운로드 하거나 스트리밍 하는 바람에 대량의 트래픽이 발생한다면, 비용 문제가 발생할 것입니다.

2. 수정 및 삭제의 위험

심지어는 데이터가 수정되거나 삭제될 수 있는 위험성도 안고 있습니다. 잘못된 접근 권한 설정으로 악성 코드나 불법 콘텐츠가 업로드 되고 사용될 수도 있다는 점에 주의해야 합니다.

3. 어떤 데이터는 꼭 제한적으로만 공개되어야 한다

S3에 저장된 데이터 중 일부는 반드시 제한적으로만 공개되어야 합니다. 중요한 정보들은 특히 공개나 유출 이슈가 심각한 법적 문제로 이어질 수 있습니다.

S3 보안을 위한 접근 제어 방법

따라서 S3의 보안을 강화하고 적절한 접근 제어 방법을 사용하는 것이 중요합니다. S3에서는 보안을 위해 몇 가지 주요 접근 제어 방법을 사용하고 있습니다.

1. 버킷 정책(Bucket Policy) 사용

버킷 정책을 사용하면 각 버킷에 대해 누가 어떤 권한을 가지고 있는지 정의할 수 있습니다. 모든 사용자에게 버킷을 공개할 수도 있지만, 특정 IP 주소나 AWS 계정에 대해서만 접근을 허용할 수도 있습니다. 이를 통해 세밀한 권한 관리가 가능하며, 불필요한 접근을 차단할 수 있습니다.

2. IAM(Identity and Access Management) 정책 사용

IAM을 사용하면 사용자나 그룹에 대해 세부적인 권한을 설정할 수 있습니다. 예를 들어, 특정 사용자가 S3 버킷에 읽기 권한만 부여하거나, 특정 액션을 제한하는 등의 세부적인 권한 제어가 가능합니다. 이를 통해 누가 어떤 리소스를 어떻게 사용할 수 있을지 명확하게 규정할 수 있습니다.

3. CORS 설정(Cross-Origin Resource Sharing)

S3 버킷에서 웹 애플리케이션과의 교차 출처 리소스 공유(CORS) 설정을 통해, 외부 사이트나 애플리케이션이 버킷에 접근하는 방식을 제어할 수 있습니다.

4. ACL (Access Control List) 사용 (Deprecated)

과거에는 ACL을 사용하여 객체의 접근 권한을 제어했지만, AWS는 현재 이 방법을 더 이상 권장하지 않으며, 대신 IAM 정책과 버킷 정책을 사용하도록 권장합니다.

S3 보안을 한층 강화하는 방법

S3 보안을 강화하려면 기본적인 접근 제어 외에도 다양한 추가적인 보안 기능을 활용할 필요가 있습니다. 다음은 S3 보안을 한층 더 강화하는 방법들입니다.

1. Block Public Access

S3의 Block Public Access 기능은 실수로 버킷이나 객체가 공개되는 것을 방지합니다. 이 기능을 활성화하면, 버킷 정책이나 ACL을 통해 공개 접근 권한이 실수로 설정되는 것을 예방할 수 있습니다. 이를 통해 S3 버킷이 의도치 않게 외부에 노출되는 위험을 최소화할 수 있습니다.

2. 향상된 IAM 사용 방식

IAM 역할을 사용하면, EC2 인스턴스가 액세스 키나 비밀 키 없이 S3에 안전하게 접근할 수 있습니다. 이 방식은 자격 증명 관리의 복잡성을 줄이고, 액세스 키가 유출된다거나 하는 보안 사고를 예방하는 데 효과적입니다.

3. Presigned URL 사용하기

Presigned URL은 특정 객체에 대해 제한된 시간 동안만 접근할 수 있도록 하는 방법입니다. 서버에서 해당 URL을 생성하여 클라이언트에게 전달하면, URL이 유출되어도 제한된 시간 동안만 유효하기 때문에 보안 위험을 최소화할 수 있습니다. 이 방법을 사용하면 객체의 직접적인 URL이 유출되는 일이 없습니다.

4. CloudFront 사용

CloudFront를 사용하면 S3에 대한 직접적인 접근을 차단할 수 있습니다. CloudFront는 콘텐츠 배포 네트워크(CDN)로, 전 세계 여러 지역에 분산된 캐시 서버를 통해 데이터를 제공하므로 성능을 향상시킬 수 있습니다. 또한, CloudFront에서는 Signed URL 또는 Signed Cookies를 사용하여 더 세밀한 접근 제어가 가능합니다. SSL/TLS를 통해 데이터 전송 시 암호화가 가능하며, Geo Restriction과 WAF(Web Application Firewall) 통합을 통해 추가적인 보안도 제공합니다.