Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

S3 업로드 #6

Merged
merged 1 commit into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
212 changes: 212 additions & 0 deletions _posts/2024-06-04-aws11_S3 버킷 정책 설정 & 암호화하기.md
Original file line number Diff line number Diff line change
@@ -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)
185 changes: 185 additions & 0 deletions _posts/2024-06-05-aws12_S3 CORS 정책 실습해보기.md
Original file line number Diff line number Diff line change
@@ -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
<html>
<head>
<title>AWS TEST</title>
</head>
<body>
<h1>AWS S3 Testing..</h1>
<p>Hello</p>
</body>

<img src="cloud.png" width="500" />
</html>
```

error.html 내용

```html
<h1>Error</h1>
```

이제 이 버킷에 액세스를 제공해줄 버킷을 생성해준다. 이때 만드는 버킷은 퍼블릭 액세스를 비활성화 한 상태로 만들어야 하며, 기존에 만든 버킷과는 다른 리전을 가지고 있어야 한다.

다른 리전을 가지게 됨으로써 이 버킷은 이전에 만든 버킷과 다른 Origin으로 형성하는 것임.

이 버킷은 리전 도쿄(ap-northeast-1)에 만들었고, 4개의 파일을 업로드해준다.

![스크린샷 2024-08-28 오후 5.43.05.png](/assets/images/aws12/5.43.05.png)

index.html 내용

```html
<html>
<head>
<title>AWS TEST</title>
</head>
<body>
<h1>AWS S3 Testing..</h1>
<p>Hello</p>
</body>

<img src="cloud.png" width="500" />

<!-- CORS demo -->

<div id="tofetch"/>
<script>
let tofetch = document.getElementById("tofetch")

fetch('extra.html').then((response) =>{
console.log("response",response)
return response.text();
}).then((html) =>{
console.log("html",html)
tofetch.innerHTML = html
})

</script>
</html>
```

extra.html 내용

```html
<h1>extra Page</h1>
```

이제 새롭게 만든 버킷의 웹 호스팅을 활성화해주고, 버킷 정책을 동일하게 설정해준다.

여기서, 버킷 정책을 등록할 때 먼저 버킷의 퍼블릭 액세스 차단을 비활성화 해준다.

퍼블릭 액세스 차단 상태에서는 버킷 정책을 등록,수정을 할 수 없기 때문에 일단 비활성화 한 후, 버킷 정책을 수정,등록한다.

처음 만들었던 버킷(myk-cors-bucket)의 index.html 파일을 수정해서 확인해보자.

도쿄 리전에 만들었던 버킷의 extra.html 리소스를 이 버킷의 index.html에서 불러오도록 수정해본다.

```html
<html>
<head>
<title>AWS TEST</title>
</head>
<body>
<h1>AWS S3 Testing..</h1>
<p>Hello</p>
</body>

<img src="cloud.png" width="500" />

<!-- CORS demo -->

<div id="tofetch"/>
<script>
let tofetch = document.getElementById("tofetch")
fetch('http://myk-cors-test-bucket.s3-website-ap-northeast-1.amazonaws.com/extra.html').then((response) =>{
console.log("response",response)
return response.text();
}).then((html) =>{
console.log("html",html)
tofetch.innerHTML = html
})

</script>
</html>
```



index.html의 내용을 위와 같이 수정한 후 웹 url에 접속하면 extra.html 파일이 불러와지지 않고 콘솔에 해당 에러가 찍히게 된다. (Access-Control-Allow-Origin)

![스크린샷 2024-08-28 오후 6.47.27.png](/assets/images/aws12/6.47.27.png)

이런 경우에 S3 CORS 설정을 통해 해결해보자.

액세스를 시도할 버킷의 권한으로 이동 → 가장 하단에 있는 CORS 편집

→ 맨 아래 CORS 편집에 해당 json을 넣는다.

- AllowedOrigins 에는 요청을 보내는 버킷의 URL

```json
[
{
"AllowedHeaders": [
"Authorization"
],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"http://myk-cors-bucket.s3-website.ap-northeast-2.amazonaws.com"
],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]
```

해당 설정 후 다시 url로 접속하면 이번엔 해당 리소스가 가져와지는 것을 확인할 수 있다.

![스크린샷 2024-08-28 오후 7.56.23.png](/assets/images/aws12/7.56.23.png)
Binary file added assets/images/aws11/3.13.41.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.14.47.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.16.46.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.18.42.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.20.48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.23.24.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.27.02.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.31.08.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/3.45.10.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.17.05.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.25.08.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.25.24.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.35.23.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.39.09.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.49.32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.52.09.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.57.29.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws11/4.58.18.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws12/5.34.33.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws12/5.43.05.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws12/6.47.27.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/images/aws12/7.56.23.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading