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

Feat/issue64 #65

Closed
wants to merge 22 commits into from
Closed
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
55 changes: 55 additions & 0 deletions .github/workflows/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Process Markdown Files with Obs3dian

on:
push:
paths:
- '**/*.md'

jobs:
install:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'

- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
pip install obs3dian

- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Run Python script
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
python3 config.py

- name: Process Markdown files
run: |
obs3dian apply --usekey
obs3dian run . --overwrite --usekey

- name: Commit changes
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add .
git commit -m "Processed Markdown files using obs3dian" || echo "No changes to commit"

- name: Push changes
uses: ad-m/[email protected]
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
Binary file added AWS/.DS_Store
Binary file not shown.
17 changes: 17 additions & 0 deletions AWS/IAM/S3 버킷에 대한 퍼블릭 엑세스 차단하기.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@

###  AWS Access Analyzer

엑세스 에널라이져를 활용하면 공유되는 엔티티나 리소스의 접근 상태를 확인할 수 있어 의도치 않은 접근이나 정보 침해 등의 문제를 해결할 수 있다.
또한 이를 활용하면 현재 상황을 파악하는 것 뿐 아니라 배포 이전에 상태를 검증함으로써 더욱 안전하게 리소스를 관리 가능하게 해준다.
___
### 접근 분석기 만들기

책에서는 CLI를 통해 작업하지만, 콘솔을 통해 작업하는게 훨씬 간단 하므로 콘솔을 활용해 작업을 진행해보자.

![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)

iam 메뉴로 이동해 분석기를 만들어보자. 분석기를 생성하고 나면 얼마 지나지 않아 내 AWS 리소스 중 외부 엑세스 공개 현황이 어떻게 진행되고 있는지를 확인할 수 있다.

![](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)

만약 버킷의 퍼블릭 공개 옵션을 수정하고 싶다면 옵션을 수정하면 된다. 되도록 버킷 자체를 공개하기 보단 클라우드 프론트 등을 활용하는 것을 추천한다.
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
### 출처

___
### 개요

___

### 시크릿 매니저란?

![](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)

~~사실 이전부터 시크릿 매니저가 되고 싶었다..

**AWS의 시크릿 매니저란 AWS에서 재공하는 암호 관리 서비스로 DB 접근 자격 증명, 어플리케이션 자격 증명, OAuth 토큰, API 키 등을 관리하는 역할을 수행한다.**

==**시크릿 매니저를 활용하면 더 이상 소스코드 내부에 하드 코딩된 보안 인증 정보가 필요하지 않으므로 보안 태세를 개선할 수 있다.**==

하드코딩으로 비밀번호를 관리하는 행위는 간편하지만 절대 금물이다. 잘못하면 [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억원이 찍혀있다고 생각해보자. 잠깐의 귀찮음이 재앙을 발생시킬 수도 있다.

이에 따라 인증과 관련된 암호 정보는 .env 파일이나 혹은 별도의 암호 DB를 활용하는 경우가 많은데 사실 이 두 방법 모두 장단이 뚜렷하다.

* **.env**
env 파일로 관리했을 때의 장점은 별도의 설정이나 어려움 없이 해당 파일만 확보하면 모든 설정 정보를 파악하는 것이 가능하다는 것이다. 추가적으로 env 파일은 환경변수와 밀접한 관련이 있기 때문에 환경변수를 활용 할 때도 유용하게 사용할 수 있다.

문제점은 간단하다. 해당 파일이 노출되면 모든 정보가 탈취 된다는 것과 일반 파일이기에 별도의 암호화가 진행돼 있지 않다는 점 등이 있다.

* **암호 DB 만들기**
암호 DB는 특정한 암호를 다양한 인스턴스에 접근할 때 주로 사용하는 방법이다. 암호 변경시 각각의 인스턴스에 매번 모든 암호를 전달할 수 없으므로 이러한 방법을 활용하는 경우도 있다.

이 경우 env 파일에서 발생했던 암호화 불가 문제, 파일 전송 문제 등을 모두 해결할 수 있지만, 이러한 시스템을 구축하는 것이 어렵다는 문제가 발생한다. 서브넷 설정부터 DB 백업 등 복잡한 요소들을 전부 고려해줘야 한다. 또한 암호 디비 접속을 위한 설정을 또 관리해야 한다.


이러한 방법들의 문제점을 해결하고 AWS 각 인스턴스에서 쉽게 인증 정보를 확보하기 위해서 만들어진 것이 시크릿 매니저이다. 시크릿 매니저는 클라우드에 존재하는 인증 파일 관리소로 다양한 인스턴스에서 네트워크를 통해 해당 관리소로 접근해 인증 정보등을 활용 할 수 있다.

![](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)
___
### 시크릿 매니저의 기능

* 암호생성
* 암호검색
* 주기적인 암호 교체
* 암호 모니터링

시크릿 매니저를 활용하면 암호의 생성부터 검색, 자동적인 교체, 암호의 사용 현황 등을 관리할 수 있다. 이하에서 하나씩 해당 기능을 사용해보자.

일단 암호를 생성해보자. 우리가 해볼 작업은 특정 유저 들만 시크릿 매니저에 접근 가능하게 만들어 해당 유저 층만 RDB에 접근 가능하게 만드는 것이다.

![](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)

이제 기존에 사용하던 RDS를 등록해준다. 암호에 대한 힌트나 다른 인스턴스들에서 해당 암호에 어떻게 접근하도록 할지 추가한다.
![](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)

암호를 생성하고 나면 이제 실제 암호 값을 받아올 수 있는지 확인해보자. 기존에 사용하던 IAM 유저에 시크릿 매니저에서 데이터를 읽을 수 있는 권한을 추가해주자.

```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BasePermissions",
"Effect": "Allow",
"Action": [
"secretsmanager:*",
"cloudformation:CreateChangeSet",
"cloudformation:DescribeChangeSet",
"cloudformation:DescribeStackResource",
"cloudformation:DescribeStacks",
"cloudformation:ExecuteChangeSet",
"docdb-elastic:GetCluster",
"docdb-elastic:ListClusters",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"kms:DescribeKey",
"kms:ListAliases",
"kms:ListKeys",
"lambda:ListFunctions",
"rds:DescribeDBClusters",
"rds:DescribeDBInstances",
"redshift:DescribeClusters",
"redshift-serverless:ListWorkgroups",
"redshift-serverless:GetNamespace",
"tag:GetResources"
],
"Resource": "*"
},
{
"Sid": "LambdaPermissions",
"Effect": "Allow",
"Action": [
"lambda:AddPermission",
"lambda:CreateFunction",
"lambda:GetFunction",
"lambda:InvokeFunction",
"lambda:UpdateFunctionConfiguration"
],
"Resource": "arn:aws:lambda:*:*:function:SecretsManager*"
},
{
"Sid": "SARPermissions",
"Effect": "Allow",
"Action": [
"serverlessrepo:CreateCloudFormationChangeSet",
"serverlessrepo:GetApplication"
],
"Resource": "arn:aws:serverlessrepo:*:*:applications/SecretsManager*"
},
{
"Sid": "S3Permissions",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::awsserverlessrepo-changesets*",
"arn:aws:s3:::secrets-manager-rotation-apps-*/*"
]
}
]
}
```

이제 아래와 같은 예시 코드를 활용해 적절하게 비밀번호를 전달 받을 수 있는지 확인해보자.
```python
import boto3
from botocore.exceptions import ClientError


def get_secret():

secret_name = "YOUR_SECRET"
region_name = "ap-northeast-2"

# Create a Secrets Manager client
session = boto3.session.Session(profile_name="YOUR_PROFILE")
client = session.client(service_name="secretsmanager", region_name=region_name)

try:
get_secret_value_response = client.get_secret_value(SecretId=secret_name)
print(get_secret_value_response) #암호 확인

except ClientError as e:
# For a list of exceptions thrown, see
# https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
raise e

# Your code goes here.


get_secret()

```

정상적으로 실행 됐을 경우 아래와 같은 결과를 확인할 수 있다.

```bash
{'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}}
```

이제 여기서 받은 키를 활용하면 실제 rds 서버에 접속할 때 사용할 수 있다. 요것도 한번 테스트 해보자!

### 주의

KMS는 일단 만들면 달에 1$가 청구된다. 프리티어 적용도 안되니 실험삼아 만들었으면, 곧장 지우도록 하자.
4 changes: 2 additions & 2 deletions Data Structure/queue/queue.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#자료구조 #queue #선입선출 #선형큐 #원형큐 #우선순위큐

---
#### 큐(queue) 란?

#### 큐(queue) 란?
**==선형 구조==의 형태이며 데이터를 일시적으로 쌓아두기 위한 자료구조 중 하나로 ==선입선출(FIFO, First-In-First-Out)==의 특성을 의미**

메모리 안 데이터들을 더욱 효율적으로 다루기 위해 만들어진 데이터 참조 방식
Expand Down
34 changes: 34 additions & 0 deletions config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import json
import os
from pathlib import Path

APP_NAME = "obs3dian"
SETUP_FILE_NAME = "config.json"
APP_DIR_PATH = "/home/runner/.config/obs3dian"


def save_config():
app_dir_path = Path(APP_DIR_PATH) # create app setting folder
aws_access_key_id = os.getenv("AWS_ACCESS_KEY_ID")
aws_secret_access_key = os.getenv("AWS_SECRET_ACCESS_KEY")
json_data = {
"profile_name": "default",
"aws_access_key": aws_access_key_id,
"aws_secret_key": aws_secret_access_key,
"bucket_name": "csocrates-s3",
"output_folder_path": "./output",
"image_folder_path": "./",
}

if not app_dir_path.exists():
app_dir_path.mkdir()

config_path = app_dir_path / SETUP_FILE_NAME
with config_path.open("w") as f:
json.dump(json_data, f) # write config.json

print(f"save config file in {config_path}")


if __name__ == "__main__":
save_config()
17 changes: 17 additions & 0 deletions review/weel15/정명진.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
### 시크릿 매니저

시크릿 매니저는 암호 관리 툴로 AWS 내부에서 사용하는 암호들을 관리해주는 도구이다. 암호는 일반적으로 환경변수나 .env 파일로 관리하는 경우들이 많으나 이 경우 직접 파일을 넘기거나 전달 받아야하는 고통이 존재한다.

AWS의 시크릿 매니저는 돈만 내면 이러한 어려움을 전부 해결해준다.
시크릿 매니저는 AWS 인프라 내부에 존재하는 원격 암호 저장소로 어디서나 권한만 존재한다면 암호를 획득하는 것이 가능해진다.

이외에도 암호의 재생성이나 주기적인 교체도 지원한다

### 세션 매니저

세션 매니저를 활용하면 불편하게 퍼블릭 -> 프라이빗을 통해 ssh를 두번 접속하는 문제들을 막을 수 있다. (세션 매니저를 활용하면 프라이빗 인스턴스로의 연결을 곧장 생성할 수 있기 때문)

### RDS

RDS는 관계형 데이터베이스 시스템이다. AWS에서 RDS를 생성하기 위해선 가용 영역을 설정해야 하는데 이를 다양하게 설정 함으로써 백업이나 캐싱등의 기능을 사용할 수 있다.

Loading