diff --git "a/_posts/2024-06-04-aws11_S3 \353\262\204\355\202\267 \354\240\225\354\261\205 \354\204\244\354\240\225 & \354\225\224\355\230\270\355\231\224\355\225\230\352\270\260.md" "b/_posts/2024-06-04-aws11_S3 \353\262\204\355\202\267 \354\240\225\354\261\205 \354\204\244\354\240\225 & \354\225\224\355\230\270\355\231\224\355\225\230\352\270\260.md" new file mode 100644 index 000000000000..57f20558e661 --- /dev/null +++ "b/_posts/2024-06-04-aws11_S3 \353\262\204\355\202\267 \354\240\225\354\261\205 \354\204\244\354\240\225 & \354\225\224\355\230\270\355\231\224\355\225\230\352\270\260.md" @@ -0,0 +1,212 @@ +--- +layout: single +title: "S3 버킷 정책 설정 & 암호화하기" +categories: [AWS] +tag: [AWS, S3] +toc: true +toc_sticky: true +post-header: false + +--- + +## S3 버킷 정책 설정하기 + +버킷 정책을 JSON 형식으로 설정해볼건데, 정책 생성기를 사용하여 특정 AWS 사용자 + +생성할 버킷 정책 : 내가 만든 버킷(myk-s3-bucket)에 Object를 put/get 할 수 있고, 버킷의 위치와 버킷 리스트를 가져 올수 있는 정책을 설정할 것이다. 단, 내 IP에서만 이 행위들을 할 수 있게 설정해보자. + +버킷 > 권한 > 버킷 정책으로 이동 + +![스크린샷 2024-08-28 오후 3.13.41.png](/assets/images/aws11/3.13.41.png) + +편집으로 들어가서 정책생성기를 이용하면 편리하게 정책을 JOSN형태로 생성할 수 있다. (아쉽게도 한글 지원은 하지 않는다.) + +![스크린샷 2024-08-28 오후 3.14.47.png](/assets/images/aws11/3.14.47.png) + +- Select Type of Policy : S3 Bucket Policy (S3 버킷 정책) +- Effect : Allow (허용할 권한을 생성할 것이기 때문에) +- Principal : AWS 유저의 ARN (정책을 적용할 AWS 유저를 지정한다. → IAM에서 해당 유저의 ARN을 복사하면 된다, 여러 유저라면 ‘,’로 지정하면 되고 전체 IAM 유저를 지정하려면 ‘*’를 입력) + + ![스크린샷 2024-08-28 오후 3.18.42.png](/assets/images/aws11/3.18.42.png) + +- Actions : get Obejct, put Object (정책에 해당하는 action을 지정) +- Amazon Resource Name : arn:aws:s3:::myk-s3-bucket/* (정책을 적용할 리소스 지정) + - 버킷 정책 편집에 내 버킷 ARN을 복사한 후 버킷 아래의 모든 Object들에 적용할 거기 때문에 /* 붙여줌 + + ![스크린샷 2024-08-28 오후 3.20.48.png](/assets/images/aws11/3.20.48.png) + + - 특정 폴더별 혹은 객체로 지정하려면 /folder_name/* 혹은 /folder_name/object_name으로 지정 + +![스크린샷 2024-08-28 오후 3.16.46.png](/assets/images/aws11/3.16.46.png) + +접근 허용할 IP를 지정하려면 Add Conditions를 선택하여 해당 옵션을 주면 된다. + +- Condition : IpAddress +- Key : aws:SourceIp +- Value : 허용할 IP 입력 (나의 IP로 입력했다.) + +![스크린샷 2024-08-28 오후 3.23.24.png](/assets/images/aws11/3.23.24.png) + +입력한 후 Add Condition 클릭 후 Add Statement를 클릭하면 방금 생성한 정책이 정책 생성기 리스트에 추가된다. + +![스크린샷 2024-08-28 오후 3.27.02.png](/assets/images/aws11/3.27.02.png) + +이제 GetBucketLocation, ListBucket을 추가한다. + +따로 하는 이유는 GetObejct, PutObject는 적용할 리소스가 객체 단위이므로 “Resouerce”값에 arn:aws:s3:::버킷명/* 으로 지정해주었다. + +하지만, GetBucketLocation, ListBucket는 적용할 리소스가 버킷 단위이므로 “Resouerce”값에 /*가 들어간다면 생성시 에러가 난다. + +그래서 나는 먼저 GetObject, PutObject를 추가 후에 생성하였다. + +- Actions : GetBucketLocation, ListBucket +- Amazon Resource Name : arn:aws:s3:::myk-s3-bucket + + ![스크린샷 2024-08-28 오후 3.31.08.png](/assets/images/aws11/3.31.08.png) + + +Generate Policy를 누르면 우리가 생성한 버킷 정책을 JSON형태로 한번에 보여준다. + +이걸 복사해서 버킷 정책 편집 화면에 붙여넣자. + +생성된 버킷 정책 JSON + +```json +{ + "Version": "2012-10-17", + "Id": "Policy1724825386935", // 정책 ID + "Statement": [ + { + "Sid": "Stmt1724825131984", + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::746669191631:user/aws-learner" + }, + "Action": [ // 버킷에 수행할 액션(행동) + "s3:PutObject", // 객체 업로오기 + "s3:GetObject" // 객체 가져오기 + ], + "Resource": "arn:aws:s3:::myk-s3-bucket/*", // 대상이 되는 리소스 + "Condition": { // 조건 + "IpAddress": { // 아래 IP들을 허용 + "aws:SourceIp": "218.157.44.117" + } + } + }, + { + "Sid": "Stmt1724825386050", + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::746669191631:user/aws-learner" + }, + "Action": [ + "s3:GetBucketLocation", // 버켓 위치 가져오기 + "s3:ListBucket" // 버켓 리스트 확인 + ], + "Resource": "arn:aws:s3:::myk-s3-bucket", // 대상이 되는 리소스 + "Condition": { + "IpAddress": { + "aws:SourceIp": "218.157.44.117" + } + } + } + ] +} +``` + +AWS CLI로 S3의 버킷 목록 조회해보기 + +![스크린샷 2024-08-28 오후 4.17.05.png](/assets/images/aws11/4.17.05.png) + +S3에 파일 업로드 + +![스크린샷 2024-08-28 오후 4.25.08.png](/assets/images/aws11/4.25.08.png) + +AWS CLI로 업로드되었는지 AWS 콘솔에서 확인하기 + +![스크린샷 2024-08-28 오후 4.25.24.png](/assets/images/aws11/4.25.24.png) + +## 암호화 정책 설정 + +버킷에 객체를 업로드(Put Object)할 때 자동으로 암호화를 할 수 있는 버킷과 암호화가 안된 객체를 업로드 할 시에 호출을 거부하는 버킷을 생성해보자. + +나는 암호화용 버킷을 새로 만들었다. + +- 기본 암호화 : 내장 암호화 방식, 버킷 안에서만 암호화가 유효하다 +- 버킷 정책 : 버킷에 대한 액세스 및 권한을 제어하는데 사용한다. + - 정책을 설정하면 지정된 암호화 헤더가 없는 객체를 버킷에 넣는 API 호출을 거부한다. + - 버킷 정책은 기본 암호화 전에 평가된다. + +따라서, 버킷의 기본 암호화를 KMS로 지정하고, 버킷 정책으로 암호화 안된 객체는 거부하는 정책을 생성할 것이다. + +### 버킷 생성 + +버킷을 생성할 때, 암호화는 KMS 유형으로 지정했고, KMS 키는 AWS에서 기본으로 제공하는 키를 사용했다. + +- KMS 키의 내용을 확인하고 싶을때는 AWS > KMS > AWS 관리형 키 > aws/s3에서 확인해보면 된다고 한다. + +![스크린샷 2024-08-28 오후 3.45.10.png](/assets/images/aws11/3.45.10.png) + +### 버킷 정책 설정 + +정책 생성기에서 버킷 정책을 생성했다. + +- Select Type of Policy : S3 Bucket Policy +- Effect : Deny (암호화 헤더가 호출은 거부할것이므로) +- Principal : * (모든 사용자에게 적용) +- Actions : Put Obejct +- ARN : 버킷_ARN/* + +![스크린샷 2024-08-28 오후 4.35.23.png](/assets/images/aws11/4.35.23.png) + +2가지 Condition을 추가해준다. + +- kms 암호화 방식이 아니면 deny하는 조건 + +![스크린샷 2024-08-28 오후 4.39.09.png](/assets/images/aws11/4.39.09.png) + +- header에 위와 같은 키값이 없다면 (Null 이라면) true로 발생시켜 요청을 deny하는 조건 + +![스크린샷 2024-08-28 오후 4.49.32.png](/assets/images/aws11/4.49.32.png) + +위 두가지 설정을 끝내고 정책을 생성해준다. + +```json +{ + "Id": "Policy1724831428004", + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "Stmt1724831425204", + "Action": [ + "s3:PutObject" + ], + "Effect": "Deny", + "Resource": "arn:aws:s3:::myk-encryption-bucket/*", + "Condition": { + "StringNotEquals": { + "s3:x-amz-server-side-encryption": "aws:kms" + }, + "Null": { + "s3:x-amz-server-side-encryption": "true" + } + }, + "Principal": "*" + } + ] +} +``` + +이제 버킷의 기본 암호화와 버킷 정책 설정이 끝났으니 테스트를 해본다. + +이미지 객체를 AWS 콘솔에서 암호화 없이 직접 업로드 한 결과 업로드 실패가 뜬것을 확인할 수 있다. + +![스크린샷 2024-08-28 오후 4.52.09.png](/assets/images/aws11/4.52.09.png) + +AWS CLI로 별도 암호화 설정 없이 업로드를 해보면 역시 deny된 것을 확인 할 수 있다. + +![스크린샷 2024-08-28 오후 4.57.29.png](/assets/images/aws11/4.57.29.png) + +반대로 kms 암호화하여 업로드를 하면 성공할 수 있다. + +![스크린샷 2024-08-28 오후 4.58.18.png](/assets/images/aws11/4.58.18.png) diff --git "a/_posts/2024-06-05-aws12_S3 CORS \354\240\225\354\261\205 \354\213\244\354\212\265\355\225\264\353\263\264\352\270\260.md" "b/_posts/2024-06-05-aws12_S3 CORS \354\240\225\354\261\205 \354\213\244\354\212\265\355\225\264\353\263\264\352\270\260.md" new file mode 100644 index 000000000000..87dc86ff4253 --- /dev/null +++ "b/_posts/2024-06-05-aws12_S3 CORS \354\240\225\354\261\205 \354\213\244\354\212\265\355\225\264\353\263\264\352\270\260.md" @@ -0,0 +1,185 @@ +--- +layout: single +title: "S3 CORS 테스트해보기" +categories: [AWS] +tag: [AWS, S3] +toc: true +toc_sticky: true +post-header: false + +--- + +S3에서 CORS를 적용하여 다른 Origin에서 접근을 하고자 한다면 Headers에 Cors정책을 추가해 주어야 한다. + +외부에서 객체를 액세스할 버킷을 하나 생성해준다. + +이 버킷을 생성할 땐 퍼블릭 엑세스 차단을 비활성화 해주고 생성하고, 3개의 파일을 업로드해준다. + +그리고 정적 호스팅을 활성화해준다. + +![스크린샷 2024-08-28 오후 5.34.33.png](/assets/images/aws12/5.34.33.png) + +해당 내용으로 버킷 정책을 설정해준다 + +위 버킷을 생성할때 처럼 단순히 퍼블릭 액세스를 모두 해제해주면 누구나 해당 데이터에 접근이 가능하기 때문에 퍼블릭 액세스를 허용한 다음에는 버킷 정책을 반드시 설정해주어야 한다. + +버킷 정책을 설정 안하면 정적 호스팅한 url로 접속시 403 Forbidden 에러 뜸. + +```json +{ + "Version": "2012-10-17", + "Id": "Policy1724833189112", + "Statement": [ + { + "Sid": "Stmt1724833188297", + "Effect": "Allow", + "Principal": "*", + "Action": "s3:GetObject", + "Resource": "arn:aws:s3:::myk-cors-bucket/*" + } + ] +} +``` + +index.html 내용 + +```html + +
+Hello
+ + +Hello
+ + +Hello
+ + +