Search
Duplicate
📒

[GitOps CICD] 03. 보안

상태
완료
수업
GitOps CICD
주제
GithubAction
연관 노트
3 more properties
참고

Github 보안

Github 비밀키

NOTE
Github Action 수행 시, 외부 시스템과 연계를 위한 접속용 키, 또는 토큰과 같이 보안에 민감한 정보의 경우 반드시 비밀키를 사용해야 한다!
비밀 키를 적용해서 통신하는 모습
Workflow 실행시 자동으로 마스킹 처리
env: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
YAML
복사
secrets를 사용하면 작성한 시크릿키에 접근가능

비밀키 사용 주의사항

1.
워크플로우에 사용되는 값 중 노출되지 않아야 하는 데이터는 모두 비밀키를 사용해야 한다.
2.
비밀키에는 구조화된 데이터를 저장하지 말자. (복호화 이슈, 하더라도 인코딩변환 과정 추가)
3.
권한을 최소한의 범위로만 설정해야 한다. (저장소의 쓰기권한을 가지면 모든 비밀키 읽기가능)
4.
등록된 비밀키를 주기적으로 검토해라.
5.
비밀키를 주기적으로 한번씩 변경해라.
6.
외부 클라우드(AWS)와 연계시 영구적인 Access Key보다는 OIDC를 사용하자.

비밀키 활용

NOTE
Github 저장소 / Settins / Secrets and Variable에서 생성이 가능하다.

비밀키 네이밍 규칙

영문, 숫자, 밑줄만 사용 가능하다.
공백은 사용이 불가능하며, GITHUB_ 접두사는 사용해서는 안된다.
대소문자를 구분하며 숫자로 시작해서는 안된다.

비밀키 제한

조직 레벨의 비밀키는 최대 1000개 저장가능
레포지토리 레벨의 비밀키는 최대 100개 저장 가능
워크플로우에서는 최대 100개 비밀키까지 접근 가능
비밀키에 저장 가능한 크기는 최대 48KB로 제한 (만약 초과시, 데이터 자체를 암호화하고, 복호화키를 비밀키에 저장하자.)

토큰 인증

NOTE
Github Action에서 Github 서비스에 인증하는 방법을 단순화 하기 위해 GITHUB_TOKEN 값을 자동으로 생성해서 제공한다!
워크플로우가 시작될때 Github가 자동으로 생성한다.
Github 토큰은 Github API를 안전하게 사용하기 위해서 주로 사용되며, 다음과 같은 경우에 사용한다.
1.
토큰을 사용한 저장소의 코드를 체크아웃, 수정, 커밋, 푸시의 작업을 수행
2.
이슈 및 풀 리퀘스트 관리
3.
보안 및 액세스 제어
4.
자동화된 빌드 및 테스트
5.
외부 서비스와의 통합
6.
Github API 사용

Pull Request 예시

name: Github Token 1 on: - pull_request_target jobs: triage: runs-on: ubuntu-latest permissions: contents: read pull-requests: write steps: - uses: actions/labeler@v4 with: repo-token: ${{ secrets.GITHUB_TOKEN }}
YAML
복사
Pull Request 이벤트가 발생하면, labeler 액션에 정의된 규칙에따라 자동 라벨링 등록
frontend: - src/frontend/** # 해당 경로가 수정된다면 frontend 라벨붙임 documentation: - docs/** - README.md backend: - src/backend/**
YAML
복사
github/labeler.yaml

Push 예시

--- name: Github Token 2 on: - push jobs: create_issue: runs-on: ubuntu-latest permissions: issues: write steps: - name: Create issue using REST API run: | curl --request POST \ --url https://api.github.com/repos/${{ github.repository }}/issues \ --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \ --header 'content-type: application/json' \ --data '{ "title": "Automated issue for commit: ${{ github.sha }}", "body": "This issue was automatically created by the GitHub Action workflow **${{ github.workflow }}**. \n\n The commit hash was: _${{ github.sha }}_." }' \ --fail
YAML
복사
Push 이벤트가 발생하면, 관련 이슈를 생성한다.
자동 생성된 이슈

AWS 인증 활용 (Access Key)

NOTE
name: PART3 - CH4 - AWS AccessKey Credentials on: workflow_dispatch jobs: s3: name: S3 Upload using Access Key Credentials runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - name: Checkout uses: actions/checkout@v2 - name: Generate File run: | echo "Build ID: ${{ github.run_id }}" auth through AWS Access Key > ./build.txt # aws key값은 Access Key를 직접 생성해주어야 한다. - name: Setup AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ap-northeast-2 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: Upload File to AWS S3 run: | aws s3 cp build.txt s3://bohyeon-githubaction-test-01/build.txt
YAML
복사
AWS 자격 증명을 사용해, S3서버에 파일을 업로드한다.
등록된 비밀키
작업결과

AWS 인증 활용 (OpenID Connect)

NOTE
AssessKey 방식보다는 보안적으로 우수하다. (임시 키를 발급하기 때문)
OpenID Connect는 IAM > 자격 증명 공급자에서 생성가능
Assume Role 방식을 위해 역할을 만들고, 권한을 할당한다. (S3권한)
name: AWS OIDC Credentials on: workflow_dispatch jobs: s3: name: S3 Upload using OIDC Credentials runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - name: checkout uses: actions/checkout@v2 - name: 업로드 파일 생성 run: | echo "Build ID: ${{ github.run_id }} | auth through AWS OIDC" > ./build.txt - name: AWS 인증설정 uses: aws-actions/configure-aws-credentials@v1 with: aws-region: ap-northeast-2 role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN }} role-duration-seconds: 900 # 만료시간 900초 - name: AWS S3에 파일 업로드 run: | aws s3 cp build.txt s3://bohyeon-githubaction-test-01/build.txt
YAML
복사
AWS 자격 증명을 사용해, S3서버에 파일을 업로드한다.