Skip to content

Commit 8a9fb32

Browse files
authored
Merge pull request #51 from gdsc-ssu/mj/week15
[wee15] AWS 시크릿 매니저
2 parents ea70168 + df85cad commit 8a9fb32

4 files changed

+198
-0
lines changed

AWS/.DS_Store

6 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
###  AWS Access Analyzer
3+
4+
엑세스 에널라이져를 활용하면 공유되는 엔티티나 리소스의 접근 상태를 확인할 수 있어 의도치 않은 접근이나 정보 침해 등의 문제를 해결할 수 있다.
5+
또한 이를 활용하면 현재 상황을 파악하는 것 뿐 아니라 배포 이전에 상태를 검증함으로써 더욱 안전하게 리소스를 관리 가능하게 해준다.
6+
___
7+
### 접근 분석기 만들기
8+
9+
책에서는 CLI를 통해 작업하지만, 콘솔을 통해 작업하는게 훨씬 간단 하므로 콘솔을 활용해 작업을 진행해보자.
10+
11+
![400](https://csocrates.s3.ap-northeast-2.amazonaws.com/S3%20%EB%B2%84%ED%82%B7%EC%97%90%20%EB%8C%80%ED%95%9C%20%ED%8D%BC%EB%B8%94%EB%A6%AD%20%EC%97%91%EC%84%B8%EC%8A%A4%20%EC%B0%A8%EB%8B%A8%ED%95%98%EA%B8%B0%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202024-05-25%20%EC%98%A4%EC%A0%84%2010.14.30.png)
12+
13+
iam 메뉴로 이동해 분석기를 만들어보자. 분석기를 생성하고 나면 얼마 지나지 않아 내 AWS 리소스 중 외부 엑세스 공개 현황이 어떻게 진행되고 있는지를 확인할 수 있다.
14+
15+
![](https://csocrates.s3.ap-northeast-2.amazonaws.com/S3%20%EB%B2%84%ED%82%B7%EC%97%90%20%EB%8C%80%ED%95%9C%20%ED%8D%BC%EB%B8%94%EB%A6%AD%20%EC%97%91%EC%84%B8%EC%8A%A4%20%EC%B0%A8%EB%8B%A8%ED%95%98%EA%B8%B0%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202024-05-25%20%EC%98%A4%EC%A0%84%2010.15.16.png)
16+
17+
만약 버킷의 퍼블릭 공개 옵션을 수정하고 싶다면 옵션을 수정하면 된다. 되도록 버킷 자체를 공개하기 보단 클라우드 프론트 등을 활용하는 것을 추천한다.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
### 출처
2+
3+
___
4+
### 개요
5+
6+
___
7+
8+
### 시크릿 매니저란?
9+
10+
![](https://csocrates.s3.ap-northeast-2.amazonaws.com/%EC%8B%9C%ED%81%AC%EB%A6%BF%20%EB%A7%A4%EB%8B%88%EC%A0%80%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%B4%20%EC%95%94%ED%98%B8%EC%A0%80%EC%9E%A5%2C%20%EC%95%94%ED%98%B8%ED%99%94%2C%20%EC%97%91%EC%84%B8%EC%8A%A4%20/%20Pasted%20image%2020240516112454.png)
11+
12+
~~사실 이전부터 시크릿 매니저가 되고 싶었다..
13+
14+
**AWS의 시크릿 매니저란 AWS에서 재공하는 암호 관리 서비스로 DB 접근 자격 증명, 어플리케이션 자격 증명, OAuth 토큰, API 키 등을 관리하는 역할을 수행한다.**
15+
16+
==**시크릿 매니저를 활용하면 더 이상 소스코드 내부에 하드 코딩된 보안 인증 정보가 필요하지 않으므로 보안 태세를 개선할 수 있다.**==
17+
18+
하드코딩으로 비밀번호를 관리하는 행위는 간편하지만 절대 금물이다. 잘못하면 [2억 잃은 종말론자](https://velog.io/@kandy1002/AWS%EC%97%90%EC%84%9C-2%EC%96%B5%EC%A7%9C%EB%A6%AC-%EC%9A%94%EA%B8%88%ED%8F%AD%ED%83%84-%EB%A9%B4%EC%A0%9C%EB%B0%9B%EA%B8%B0%EA%B9%8C%EC%A7%80?ref=codenary)와 같은 현상이 언제든지 발생할 수 있기 때문이다. 어느날 결제 청구서에 2억원이 찍혀있다고 생각해보자. 잠깐의 귀찮음이 재앙을 발생시킬 수도 있다.
19+
20+
이에 따라 인증과 관련된 암호 정보는 .env 파일이나 혹은 별도의 암호 DB를 활용하는 경우가 많은데 사실 이 두 방법 모두 장단이 뚜렷하다.
21+
22+
* **.env**
23+
env 파일로 관리했을 때의 장점은 별도의 설정이나 어려움 없이 해당 파일만 확보하면 모든 설정 정보를 파악하는 것이 가능하다는 것이다. 추가적으로 env 파일은 환경변수와 밀접한 관련이 있기 때문에 환경변수를 활용 할 때도 유용하게 사용할 수 있다.
24+
25+
문제점은 간단하다. 해당 파일이 노출되면 모든 정보가 탈취 된다는 것과 일반 파일이기에 별도의 암호화가 진행돼 있지 않다는 점 등이 있다.
26+
27+
* **암호 DB 만들기**
28+
암호 DB는 특정한 암호를 다양한 인스턴스에 접근할 때 주로 사용하는 방법이다. 암호 변경시 각각의 인스턴스에 매번 모든 암호를 전달할 수 없으므로 이러한 방법을 활용하는 경우도 있다.
29+
30+
이 경우 env 파일에서 발생했던 암호화 불가 문제, 파일 전송 문제 등을 모두 해결할 수 있지만, 이러한 시스템을 구축하는 것이 어렵다는 문제가 발생한다. 서브넷 설정부터 DB 백업 등 복잡한 요소들을 전부 고려해줘야 한다. 또한 암호 디비 접속을 위한 설정을 또 관리해야 한다.
31+
32+
33+
이러한 방법들의 문제점을 해결하고 AWS 각 인스턴스에서 쉽게 인증 정보를 확보하기 위해서 만들어진 것이 시크릿 매니저이다. 시크릿 매니저는 클라우드에 존재하는 인증 파일 관리소로 다양한 인스턴스에서 네트워크를 통해 해당 관리소로 접근해 인증 정보등을 활용 할 수 있다.
34+
35+
![](https://csocrates.s3.ap-northeast-2.amazonaws.com/%EC%8B%9C%ED%81%AC%EB%A6%BF%20%EB%A7%A4%EB%8B%88%EC%A0%80%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%B4%20%EC%95%94%ED%98%B8%EC%A0%80%EC%9E%A5%2C%20%EC%95%94%ED%98%B8%ED%99%94%2C%20%EC%97%91%EC%84%B8%EC%8A%A4%20/%20Pasted%20image%2020240516134812.png)
36+
___
37+
### 시크릿 매니저의 기능
38+
39+
* 암호생성
40+
* 암호검색
41+
* 주기적인 암호 교체
42+
* 암호 모니터링
43+
44+
시크릿 매니저를 활용하면 암호의 생성부터 검색, 자동적인 교체, 암호의 사용 현황 등을 관리할 수 있다. 이하에서 하나씩 해당 기능을 사용해보자.
45+
46+
일단 암호를 생성해보자. 우리가 해볼 작업은 특정 유저 들만 시크릿 매니저에 접근 가능하게 만들어 해당 유저 층만 RDB에 접근 가능하게 만드는 것이다.
47+
48+
![](https://csocrates.s3.ap-northeast-2.amazonaws.com/%EC%8B%9C%ED%81%AC%EB%A6%BF%20%EB%A7%A4%EB%8B%88%EC%A0%80%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%B4%20%EC%95%94%ED%98%B8%EC%A0%80%EC%9E%A5%2C%20%EC%95%94%ED%98%B8%ED%99%94%2C%20%EC%97%91%EC%84%B8%EC%8A%A4%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202024-05-16%20%EC%98%A4%ED%9B%84%202.33.34.png)
49+
50+
이제 기존에 사용하던 RDS를 등록해준다. 암호에 대한 힌트나 다른 인스턴스들에서 해당 암호에 어떻게 접근하도록 할지 추가한다.
51+
![](https://csocrates.s3.ap-northeast-2.amazonaws.com/%EC%8B%9C%ED%81%AC%EB%A6%BF%20%EB%A7%A4%EB%8B%88%EC%A0%80%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%B4%20%EC%95%94%ED%98%B8%EC%A0%80%EC%9E%A5%2C%20%EC%95%94%ED%98%B8%ED%99%94%2C%20%EC%97%91%EC%84%B8%EC%8A%A4%20/%20%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202024-05-16%20%EC%98%A4%ED%9B%84%202.34.10.png)
52+
53+
암호를 생성하고 나면 이제 실제 암호 값을 받아올 수 있는지 확인해보자. 기존에 사용하던 IAM 유저에 시크릿 매니저에서 데이터를 읽을 수 있는 권한을 추가해주자.
54+
55+
```json
56+
{
57+
"Version": "2012-10-17",
58+
"Statement": [
59+
{
60+
"Sid": "BasePermissions",
61+
"Effect": "Allow",
62+
"Action": [
63+
"secretsmanager:*",
64+
"cloudformation:CreateChangeSet",
65+
"cloudformation:DescribeChangeSet",
66+
"cloudformation:DescribeStackResource",
67+
"cloudformation:DescribeStacks",
68+
"cloudformation:ExecuteChangeSet",
69+
"docdb-elastic:GetCluster",
70+
"docdb-elastic:ListClusters",
71+
"ec2:DescribeSecurityGroups",
72+
"ec2:DescribeSubnets",
73+
"ec2:DescribeVpcs",
74+
"kms:DescribeKey",
75+
"kms:ListAliases",
76+
"kms:ListKeys",
77+
"lambda:ListFunctions",
78+
"rds:DescribeDBClusters",
79+
"rds:DescribeDBInstances",
80+
"redshift:DescribeClusters",
81+
"redshift-serverless:ListWorkgroups",
82+
"redshift-serverless:GetNamespace",
83+
"tag:GetResources"
84+
],
85+
"Resource": "*"
86+
},
87+
{
88+
"Sid": "LambdaPermissions",
89+
"Effect": "Allow",
90+
"Action": [
91+
"lambda:AddPermission",
92+
"lambda:CreateFunction",
93+
"lambda:GetFunction",
94+
"lambda:InvokeFunction",
95+
"lambda:UpdateFunctionConfiguration"
96+
],
97+
"Resource": "arn:aws:lambda:*:*:function:SecretsManager*"
98+
},
99+
{
100+
"Sid": "SARPermissions",
101+
"Effect": "Allow",
102+
"Action": [
103+
"serverlessrepo:CreateCloudFormationChangeSet",
104+
"serverlessrepo:GetApplication"
105+
],
106+
"Resource": "arn:aws:serverlessrepo:*:*:applications/SecretsManager*"
107+
},
108+
{
109+
"Sid": "S3Permissions",
110+
"Effect": "Allow",
111+
"Action": [
112+
"s3:GetObject"
113+
],
114+
"Resource": [
115+
"arn:aws:s3:::awsserverlessrepo-changesets*",
116+
"arn:aws:s3:::secrets-manager-rotation-apps-*/*"
117+
]
118+
}
119+
]
120+
}
121+
```
122+
123+
이제 아래와 같은 예시 코드를 활용해 적절하게 비밀번호를 전달 받을 수 있는지 확인해보자.
124+
```python
125+
import boto3
126+
from botocore.exceptions import ClientError
127+
128+
129+
def get_secret():
130+
131+
secret_name = "YOUR_SECRET"
132+
region_name = "ap-northeast-2"
133+
134+
# Create a Secrets Manager client
135+
session = boto3.session.Session(profile_name="YOUR_PROFILE")
136+
client = session.client(service_name="secretsmanager", region_name=region_name)
137+
138+
try:
139+
get_secret_value_response = client.get_secret_value(SecretId=secret_name)
140+
print(get_secret_value_response) #암호 확인
141+
142+
except ClientError as e:
143+
# For a list of exceptions thrown, see
144+
# https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
145+
raise e
146+
147+
# Your code goes here.
148+
149+
150+
get_secret()
151+
152+
```
153+
154+
정상적으로 실행 됐을 경우 아래와 같은 결과를 확인할 수 있다.
155+
156+
```bash
157+
{'ARN': 'arn:aws:secretsmanager:ap-northeast-2:393430687602:secret:test-OsL7QR', 'Name': 'test', 'VersionId': '4b9f32fc-d3e6-4e12-8f7b-0c538677c53b', 'SecretString': '{"username":"admin","password":"wjdaudwls123","engine":"mysql","host":"database-1.cjuakk8k6gun.ap-northeast-2.rds.amazonaws.com","port":3306,"dbInstanceIdentifier":"database-1"}', 'VersionStages': ['AWSCURRENT'], 'CreatedDate': datetime.datetime(2024, 5, 16, 14, 36, 0, 518000, tzinfo=tzlocal()), 'ResponseMetadata': {'RequestId': 'b4bab061-1a40-4881-94db-982cc411a028', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'b4bab061-1a40-4881-94db-982cc411a028', 'content-type': 'application/x-amz-json-1.1', 'content-length': '423', 'date': 'Thu, 16 May 2024 05:44:01 GMT'}, 'RetryAttempts': 0}}
158+
```
159+
160+
이제 여기서 받은 키를 활용하면 실제 rds 서버에 접속할 때 사용할 수 있다. 요것도 한번 테스트 해보자!
161+
162+
### 주의
163+
164+
KMS는 일단 만들면 달에 1$가 청구된다. 프리티어 적용도 안되니 실험삼아 만들었으면, 곧장 지우도록 하자.

review/weel15/정명진.md

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
### 시크릿 매니저
2+
3+
시크릿 매니저는 암호 관리 툴로 AWS 내부에서 사용하는 암호들을 관리해주는 도구이다. 암호는 일반적으로 환경변수나 .env 파일로 관리하는 경우들이 많으나 이 경우 직접 파일을 넘기거나 전달 받아야하는 고통이 존재한다.
4+
5+
AWS의 시크릿 매니저는 돈만 내면 이러한 어려움을 전부 해결해준다.
6+
시크릿 매니저는 AWS 인프라 내부에 존재하는 원격 암호 저장소로 어디서나 권한만 존재한다면 암호를 획득하는 것이 가능해진다.
7+
8+
이외에도 암호의 재생성이나 주기적인 교체도 지원한다
9+
10+
### 세션 매니저
11+
12+
세션 매니저를 활용하면 불편하게 퍼블릭 -> 프라이빗을 통해 ssh를 두번 접속하는 문제들을 막을 수 있다. (세션 매니저를 활용하면 프라이빗 인스턴스로의 연결을 곧장 생성할 수 있기 때문)
13+
14+
### RDS
15+
16+
RDS는 관계형 데이터베이스 시스템이다. AWS에서 RDS를 생성하기 위해선 가용 영역을 설정해야 하는데 이를 다양하게 설정 함으로써 백업이나 캐싱등의 기능을 사용할 수 있다.
17+

0 commit comments

Comments
 (0)