S3 Security
- 사용자 기반 보안
- IAM 정책
IAM 사용자는 IAM 정책을 가지고 어떤 API 호출이 허용될지를 결정하며
사용자가 IAM 정책을 통해 S3 버킷으로의 액세스 방법을 승인받게 되면 실행이 가능해짐
- IAM 정책
- 리소스 기반 보안
- 버킷 정책
S3 콘솔에서 설정 가능한 버킷 전반의 규칙으로 버킷에서 보안 주체가 무엇을 할 수 있는지 혹은 없는지를 결정하며
이를 통해 S3 버킷으로의 교차 계정 액세스가 활성화됨 - ACL 방식 (Object Access Control List - ACL)
세분화된 방식으로 객체 레벨에서의 액세스 규칙을 설정 - 버킷 ACL 방식 (Bucket Access Control List - ACL)
- 버킷 정책
+) 사용자가 IAM을 통해 S3 버킷에 액세스할 수 있다고 하더라도 버킷 정책이 사용자 액세스를 명시적으로 거부할 경우 액세스 불가능
S3 Bucket Policies
- JSON 기반 정책
- S3 버킷에 퍼블릭 액세스가 가능한 정책의 경우
Resources : 버킷 정책은 사용자의 버킷이나 객체 둘 다에 적용할 수 있음
Actions : API의 허가 및 거부를 설정
Effect :허용이나 거부
Principal : S3 버킷 정책을 적용할 계정 혹은 사용자
- 이외에도 버킷에 퍼블릭 액세스 권한을 승인하거나, 업로드 시점에 객체를 암호화시킬 경우,
혹은 교차 계정 S3 버킷 정책을 사용해서 다른 계정에 액세스 권한을 줄 때 S3 버킷을 사용
Bucket settings for Block Public Access
- 객체가 퍼블릭화 되는 것을 차단하는 설정으로 계정에 제한이 있을 경우에 사용
- 네 가지 종류의 퍼블릭 액세스 차단 설정이 존재
1) 새 액세스 제어 목록 (new access control lists - ACLs) : 새 퍼블릭 혹은 액세스 포인트 정책으로
2) 모든 액세스 제어 목록 (any access control lists - ACLs)
3) 새 퍼블릭 버킷 (new public bucket)
4) 액세스 포인트 정책 (access point policies)
이를 통해 객체와 버킷이 외부로 공개되지 않도록 차단할 수 있으며 버킷과 객체를 향한 퍼블릭 및 교차 계정 액세스를 막음 - 기업 데이터 유출을 (퍼블릭 액세스를) 막기 위해서 사용
S3 Security - Other
- 네트워킹에서는 VPC 엔드 포인트로 S3에 비공개 액세스가 가능
즉, VPC에 EC2 인스턴스가 있고 인터넷 액세스가 없는 경우 VPC 엔드 포인트를 통해 비공개로 S3에 액세스 - 로깅 및 감사에서는 S3 액세스 로그를 사용해 다른 S3 버킷에 해당 로그를 저장할 수 있음
- API 호출은 AWS CloudTrail에 기록할 수 있으며 로깅할 수 있는 서비스에도 로깅 가능
- 사용자 보안에는 MFA (Multi Factor Authentication) 삭제가 존재하며 특정 버전 객체를 버킷에서 삭제하고 싶을 경우
객체를 비활성한 후 MFA로 인증을 하여 객체를 삭제 - 서명된 URL은 AWS의 자격증명으로 서명된 URL이며 한정된 시간 동안 유효하므로 제한된 시간 동안 특정 파일에 액세스 가능
예) 사용자가 로그인한 서비스로부터 프리미엄 영상을 구매하여 다운로드
<S3 버킷 정책 실습>
- JSON으로 작성할 버킷 정책을 정의
버킷 정책은 암호화되지 않은 객체에 대한 업로드를 막는 역할을 함
버킷에서 수정을 눌러 버킷 정책을 수정하면 두 개의 링크가 나오게 되는데
Policy examples를 누르면 AWS 문서로 이동하여 생성할 수 있는 버킷 정책의 모든 가능 사례를 읽어볼 수 있고
Policy Generator를 누르면 버킷 정책을 생성할 수 있음
버킷 정책을 생성할 때 정책 유형을 S3 Bucket Policy로 선택한 후 업로드되는 모든 객체를 거부하도록 문장을 추가하기 위해
Effect에서 Deny를 선택하고 Principal에서는 *를 입력하여 전체를 선택
Actions는 업로더에서 수행되어 AWS 상에 파일을 업로드할 때를 선택하고 API 이름은 PubObject로 선택
그리고 ARN은 버킷 이름/키 이름이 되어야 하므로 S3 버킷에서 표시된 버킷 ARN을 복사해 리소스 이름 뒤에 */를 입력해 설정
*/를 입력해 설정 하면 앞서 선택한 PutObject 액션이 버킷 안에 있는 모든 객체에 적용되게 됨
문장을 추가하여 객체를 업로드할 수 없도록 거부하기 위해 조건을 추가
Condition은 Null로 두고
Key로 찾는 키를 S3로 설정하기 위해 s3:x-amz-server-side-encryption을 찾아서 골라주고 Value에는 true를 입력
이 키는 S3에 파일을 보낼 때 이 헤더가 있는지를 확인하게 되므로 이 헤더가 Null이 나오면 거부하게 됨
그리고 첫 문장 반복을 위한 두 번째 문장을 정함
Effect에서 Deny를 선택하고 Principal에서는 *를 입력하여 전체를 선택
Actions는 업로더에서 수행되어 AWS 상에 파일을 업로드할 때를 선택하고 API 이름은 PubObject로 선택
그리고 ARN은 버킷 이름/키 이름이 되어야 하므로 S3 버킷에서 표시된 버킷 ARN을 복사해 리소스 이름 뒤에 */를 입력해 설정
*/를 입력해 설정 하면 앞서 선택한 PutObject 액션이 버킷 안에 있는 모든 객체에 적용되게 됨
문장을 추가하여 문장을 반복하도록 하는 조건을 추가
Condition은 StringNotEqual을 선택하고
Key는 s3:x-amz-server-side-encryption을 찾아서 골라주고 Value는 AES256을 입력
즉 이 조건은 파일이 업로드되었고 헤더가 있는 경우 그 헤더가 AES255(SSE-S3) 유형의 암호화를 나타내고 있지 않으면 거부
그리고 이렇게 생성된 정책을 그대로 복사해서 S3 콘솔에 붙여 넣으면 완료
- 버킷 정책 확인 및 작동 확인
SSE-S3로 암호화되지 않은 모든 객체를 거부하는 버킷 정책이 존재하게 됨
작동을 확인하기 위해 Coffee.jpg를 암호화 설정을 지정하지 않고 업로드하면 버킷 정책으로 인해 액세스가 거부되어 실패함
그 후 암호화 설정을 올바른 헤더로 정해서 SSE-S3 암호화를 하여 Coffee.jpg를 업로드하면 성공적으로 업로드
만약 버킷 정책에 부합하지 않은 KMS 키를 사용하는 암호화를 할 경우 업로드에 실패하게 됨
- 버킷 정책과 관련된 보안 설정
Permissions에 Block all public access 설정이 있으며 이 기능은 기본적으로 설정되어 있으며
S3에서 외부로 데이터가 유출되는 것을 막는 역할을 하므로
객체가 공개되는 공개 웹사이트를 운영하는 것이 아니라면 이 기능을 상시 켜두어야 함
또한 이 설정은 내 계정 수준에서도 정의할 수 있으므로 Account Setting for block public access를 체크하면
버킷에 대한 모든 공개 접근을 차단할 수 있어 보안 수준을 한 단계 높일 수 있음
- 액세스 제어 목록 (ACL)
모든 객체에 대해서도 적용되는 액세스 제어 목록은 객체 수준에서 읽고 쓰는 객체를 정의하는 방법으로
ACL이 정의한대로 내 계정에서 객체를 읽고 쓰는 것이 가능해지므로 AWS에서 객체를 보호하는 방법 중 하나
<IAM 역할 및 정책 실습>
- IAM 역할과 정책
IAM 역할에는 서로 다른 구성 요소가 존재하며 연결된 관리형 정책이 있고 따로 정책을 생성할 수 있음
Policies 탭으로 가면 AWS 관리형 정책이 있고 시간에 따라서 업데이트 되는 정책임
임의로 정책을 생성하는 것도 가능하므로 직접 정책을 생성할 때는 서비스, 액션, 리소스, 요청 조건을 지정할 수 있음
관리형 정책을 가져올 수도 있으며 인프라나 조직이 자체적인 정책을 구성할 수도 있음
또한 EC2 역할에서 이미 선택한 정책에 대해 추가되는 적합한 정책인 인라인 정책을 직접 추가할 수 있음
하지만 항상 정책은 전체적으로 관리하는 것이 관리상 더 나은 관점이므로 인라인 정책을 권고하지 않음 - 정책 분석
AmazonS3ReadOnlyAccess는 Policy Summaray에서 표를 통해 정책에 대한 요약을 보거나 JSON 문서로 볼 수 있음
정책에 대한 표 요약을 보면 S3에서는 전체 읽기와 제한된 목록이 있으며
정책에 대한 JSON 문서를 보면 액션을 수행하는 것에 대해서는 Allow *이므로 리소스에 대해 Get이나 List가 가능함
즉, Amazon S3 리소스에서 Get이나 List라는 이름으로 시작하는 모든 API 호출이 가능하다는 뜻이므로
ListBucket API와 같은 API을 볼 수 있으며, Get을 통해 객체나 버킷에 대해서 액션을 수행할 수 있음
AmazonS3FullAccess는 S3:*가 허용으로 나오므로 모든 API를 S3가 허용된다는 뜻이므로 모든 리소스에서 가능
- 정책 생성
JSON 문서를 통해 정책을 생성하여 뭐든 원하는대로 지정할 수 있음
이러한 JSON 문서를 생성하기 위해서는 Create policy를 사용하여 직접 정책을 생성해야 함
직접 정책을 생성하기 위해서는 Visual editor나 JSON editor와 서비스를 선택해야 함
JSON editor는 JSON을 직접 입력하거나 붙여넣을 수 있고, Visual editor는 클릭으로 원하는 사항을 지정할 수 있음
서비스로는 S3를 선택한 후 Actions에는 List, Read, Write가 있고 각각을 펼쳐 보면 동작 내에서 할 수 있는 세부 동작이 나타남
Actions Read의 GetObject만 가능하도록 체크한 후
리소스의 경우 특정한 버킷이나 모든 리소스에 대해 무엇에 대한 읽기를 허용할지를 고르기 위하는데 *로 표시
특정 리소스를 지정해서 ARN을 추가할 수도 있음
Conditions에서는 조건을 지정할 수 있으나 지금은 사용하지 않고 넘어가도록 함
원하는 경우 추가로 권한을 부여할 수도 있으나 지금은 필요 없으므로 삭제하도록 함
생성한 MyTestS3CustomPolicy를 통해 지정한 조건일 때 해당 리소스에 대해서 읽기 권한을 얻을 수 있음
생성 후 해당 정책을 누르면 JSON 문서도 볼 수 있고 Visual Editor로 생성되었고 S3:GetObejct가 리소스에 대해 허용을 확인
- AWS Policy Generator 도구
AWS Policy Generator를 구글에 검색하면 정책 유형에 따라 생성할 수 있는 도구를 제공하여 JSON 문서를 제공
- 정책 연결
방금 생성한 사용자 관리형 유형인 MyTestS3CustomPolicy를 연결하여
EC2 인스턴스에 좀 더 구체적으로 적용할 수 있고 더 나은 보안을 확보할 수 있음
<AWS 정책 시뮬레이터>
- 정책 연결 해제 및 AWS Policy Simulator를 통한 확인
AmazonS3FullAccess의 연결을 해지하면 AmazonS3ReadOnlyAccess만 있기 때문에 읽기만 가능해짐
이를 확인해보기 위해 AWS Policy Simulator를 사용하여 온라인 도구로 정책을 시뮬레이션 테스트
사용자나 그룹 역할별로 찾을 수 있음
첫 번째로 지정한 EC2 역할에 대해 수행하기 위해 이를 선택한 후
서비스를 클릭해 S3를 선택 그리고 Actions에서는 GetObject를 선택한 후 Run Simulation을 클릭하면
해당 문장에 대해 GetObject가 허용된다고 나오게 됨
이후 PutObject를 Actions으로 선택한 뒤 시뮬레이션을 실행하면 일치하는 문장이 어뵤으므로 암시적 거부가 되게 됨
즉, ReadOnlyAccess는 PutObject 권한이 부여되지 않으므로 거부되는 것
항목을 하나씩 누르면 해당 문장이 정책과 일치해서 허용됐는지를 직접 살펴볼 수 있음
또한 CLI를 통해서도 이를 확인할 수 있음
'Cloud > AWS' 카테고리의 다른 글
[SAA] S3 CORS (0) | 2022.03.23 |
---|---|
[SAA] S3 웹사이트 (0) | 2022.03.23 |
[SAA] S3 암호화 (0) | 2022.03.23 |
[SAA] S3 버전 관리 (0) | 2022.03.21 |
[SAA] S3 버킷 및 객체 (0) | 2022.03.21 |