diff --git a/.github/workflows/action.yaml b/.github/workflows/action.yaml new file mode 100644 index 0000000..1deae08 --- /dev/null +++ b/.github/workflows/action.yaml @@ -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/github-push-action@v0.6.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/AWS/.DS_Store b/AWS/.DS_Store new file mode 100644 index 0000000..a13bdef Binary files /dev/null and b/AWS/.DS_Store differ diff --git "a/AWS/IAM/S3 \353\262\204\355\202\267\354\227\220 \353\214\200\355\225\234 \355\215\274\353\270\224\353\246\255 \354\227\221\354\204\270\354\212\244 \354\260\250\353\213\250\355\225\230\352\270\260.md" "b/AWS/IAM/S3 \353\262\204\355\202\267\354\227\220 \353\214\200\355\225\234 \355\215\274\353\270\224\353\246\255 \354\227\221\354\204\270\354\212\244 \354\260\250\353\213\250\355\225\230\352\270\260.md" new file mode 100644 index 0000000..65ad90e --- /dev/null +++ "b/AWS/IAM/S3 \353\262\204\355\202\267\354\227\220 \353\214\200\355\225\234 \355\215\274\353\270\224\353\246\255 \354\227\221\354\204\270\354\212\244 \354\260\250\353\213\250\355\225\230\352\270\260.md" @@ -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) + +만약 버킷의 퍼블릭 공개 옵션을 수정하고 싶다면 옵션을 수정하면 된다. 되도록 버킷 자체를 공개하기 보단 클라우드 프론트 등을 활용하는 것을 추천한다. diff --git "a/AWS/IAM/\354\213\234\355\201\254\353\246\277 \353\247\244\353\213\210\354\240\200\353\245\274 \354\202\254\354\232\251\355\225\264 \354\225\224\355\230\270\354\240\200\354\236\245, \354\225\224\355\230\270\355\231\224, \354\227\221\354\204\270\354\212\244.md" "b/AWS/IAM/\354\213\234\355\201\254\353\246\277 \353\247\244\353\213\210\354\240\200\353\245\274 \354\202\254\354\232\251\355\225\264 \354\225\224\355\230\270\354\240\200\354\236\245, \354\225\224\355\230\270\355\231\224, \354\227\221\354\204\270\354\212\244.md" new file mode 100644 index 0000000..b3166c5 --- /dev/null +++ "b/AWS/IAM/\354\213\234\355\201\254\353\246\277 \353\247\244\353\213\210\354\240\200\353\245\274 \354\202\254\354\232\251\355\225\264 \354\225\224\355\230\270\354\240\200\354\236\245, \354\225\224\355\230\270\355\231\224, \354\227\221\354\204\270\354\212\244.md" @@ -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$가 청구된다. 프리티어 적용도 안되니 실험삼아 만들었으면, 곧장 지우도록 하자. \ No newline at end of file diff --git a/Data Structure/queue/queue.md b/Data Structure/queue/queue.md index 080edd3..cd169e2 100644 --- a/Data Structure/queue/queue.md +++ b/Data Structure/queue/queue.md @@ -1,8 +1,8 @@ #자료구조 #queue #선입선출 #선형큐 #원형큐 #우선순위큐 --- -#### 큐(queue) 란? - +#### 큐(queue) 란? + **==선형 구조==의 형태이며 데이터를 일시적으로 쌓아두기 위한 자료구조 중 하나로 ==선입선출(FIFO, First-In-First-Out)==의 특성을 의미** 메모리 안 데이터들을 더욱 효율적으로 다루기 위해 만들어진 데이터 참조 방식 diff --git a/config.py b/config.py new file mode 100644 index 0000000..7148050 --- /dev/null +++ b/config.py @@ -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() diff --git "a/review/weel15/\354\240\225\353\252\205\354\247\204.md" "b/review/weel15/\354\240\225\353\252\205\354\247\204.md" new file mode 100644 index 0000000..1fca13c --- /dev/null +++ "b/review/weel15/\354\240\225\353\252\205\354\247\204.md" @@ -0,0 +1,17 @@ +### 시크릿 매니저 + +시크릿 매니저는 암호 관리 툴로 AWS 내부에서 사용하는 암호들을 관리해주는 도구이다. 암호는 일반적으로 환경변수나 .env 파일로 관리하는 경우들이 많으나 이 경우 직접 파일을 넘기거나 전달 받아야하는 고통이 존재한다. + +AWS의 시크릿 매니저는 돈만 내면 이러한 어려움을 전부 해결해준다. +시크릿 매니저는 AWS 인프라 내부에 존재하는 원격 암호 저장소로 어디서나 권한만 존재한다면 암호를 획득하는 것이 가능해진다. + +이외에도 암호의 재생성이나 주기적인 교체도 지원한다 + +### 세션 매니저 + +세션 매니저를 활용하면 불편하게 퍼블릭 -> 프라이빗을 통해 ssh를 두번 접속하는 문제들을 막을 수 있다. (세션 매니저를 활용하면 프라이빗 인스턴스로의 연결을 곧장 생성할 수 있기 때문) + +### RDS + +RDS는 관계형 데이터베이스 시스템이다. AWS에서 RDS를 생성하기 위해선 가용 영역을 설정해야 하는데 이를 다양하게 설정 함으로써 백업이나 캐싱등의 기능을 사용할 수 있다. +