비밀이란?
소프트웨어 개발에서 비밀은 시스템, 서비스, 데이터, API에 대한 액세스를 인증하거나 권한을 부여하는 데 사용되는 중요한 정보입니다. 예를 들면 다음과 같습니다.
- GitHub의 REST API와 같은 외부 서비스와 상호작용을 할 수 있는 API 키 및 액세스 토큰입니다. 또한 액세스 토큰을 사용하면 GitHub Actions와 같은 서비스에서 인증이 필요한 작업을 수행할 수 있으며, 이를 나중에 실험할 예정입니다.
- 로컬 및 외부 데이터베이스와 스토리지에 대한 액세스 권한을 부여하는 데이터베이스 자격 증명 입니다.
- 프라이빗 SSH 및 PGP 키와 같은 프라이빗 키는 다른 서버에 액세스하고 데이터를 암호화하는 데 사용할 수 있습니다.
비밀은 중요한 시스템을 포함하여 많은 액세스 권한을 제공하므로 비밀을 안전하게 유지하는 것이 왜 그렇게 중요한지 이해할 수 있습니다.
비밀이 노출되면 어떻게 될까요?
- 공격자는 비밀이 액세스할 수 있는 모든 항목에 무단으로 액세스할 수 있습니다.
- 해커는 중요한 사용자 데이터를 포함하여 데이터를 도용할 수 있습니다. 개인 정보 보호와 법적 파급 효과가 있을 수 있으며 사용자와 애플리케이션에 대한 신뢰에 해를 끼칠 수 있습니다.
- 해커가 클라우드 공급자 계정에서 권한 없는 워크로드를 실행하는 경우 노출된 비밀로 인해 비용이 발생할 수 있습니다.
- 해커는 노출된 비밀을 사용하여 서버를 삭제, 수정, 중단하여 가동 중지 시간 및 데이터 손실을 일으킬 수 있습니다.
비밀이 사용자에게 부여하는 모든 액세스와 기능, 해커가 수행할 수 있는 작업을 고려해 보세요. 예를 들어 GitHub 계정에 대한 personal access token이 노출된 경우 해커가 GitHub를 게시하고 변경할 수 있습니다.
비밀 관리 모범 사례
이러한 유형의 문제를 방지하려면 모범 사례를 따라 유출을 방지하고 비밀이 노출된 경우 피해를 제한하세요.
PoLP(최소 권한 원칙) 을 따릅니다.
가능하면 비밀이 수행할 수 있는 작업을 제한하고 필요한 작업으로만 액세스할 수 있습니다. 예시:
- 비밀을 사용하여 데이터를 읽고 데이터를 변경하지 않는 경우 읽기 전용으로 지정합니다.
- 사용 중인 API에서 비밀을 특정 범위 또는 권한으로만 제한할 수 있는 경우 필요한 범위나 권한만 선택합니다. 예를 들어 GitHub 비밀에 대해서만 문제를 만들어야 하는 경우 비밀이 리포지토리 콘텐츠나 기타 항목에 액세스할 이유가 없습니다.
- 비밀이 공격자에게 해당 암호를 소유한 사용자 계정에 대한 모든 권한을 부여하는 경우 비밀의 소유권을 가져올 수 있는 서비스 계정을 만드는 것이 좋습니다.
애플리케이션에서 비밀 보호
- 비밀을 하드코딩하지 않습니다. 항상 환경 변수 또는 플랫폼의 비밀 관리 도구(예: GitHub의 리포지토리 비밀)를 사용합니다.
- 다른 사람과 비밀을 공유해야 하는 경우 암호 관리자와 같은 전용 도구를 사용합니다. 메일이나 인스턴트 메시지를 통해 비밀을 보내지 않습니다.
- 가능하면 만료 날짜를 설정하고 비밀을 정기적으로 교체합니다. 이렇게 하면 이전 비밀이 악용될 위험이 줄어듭니다.
- 애플리케이션에서 로그를 생성하는 경우 기록하기 전에 비밀이 수정되었는지 확인합니다. 그러지 않으면 활성 비밀을 일반 텍스트 파일에 저장할 수 있습니다.
비밀이 노출될 경우 피해 제한
- 1초 동안만 노출되더라도 손상된 비밀을 고려하고 즉시 비밀을 해지합니다. 그런 다음, 새 비밀을 생성하고 안전하게 저장합니다.
- 손상된 비밀로 수행된 의심스러운 활동을 표시할 수 있는 활동 로그를 확인합니다.
- 비밀이 어떻게 노출되었는지 고려하고 다시는 이런 일이 발생하지 않도록 프로세스를 변경합니다.
GitHub가 비밀을 안전하게 유지하는 방법
비밀을 안전하게 유지하기 위해 수행할 수 있는 작업은 많지만 GitHub에서 비밀을 유지하는 데 도움이 되는 작업도 많습니다. 모든 사용자가 실수할 수 있으므로 실수로 비밀을 노출했을 때 포착할 수 있는 기능을 지원합니다.
- 푸시 보호는 나중에 실험해 볼 기능으로, GitHub의 리포지토리에 비밀 푸시를 차단합니다.
- 비밀 검색은 리포지토리를 검사하고 비밀을 검색할 때 경고를 만듭니다. 일부 비밀의 경우 비밀을 자동으로 해지하는 등의 조처를 할 수 있도록 공급자에게 알립니다.
비밀을 안전하게 저장하는 연습
이 연습에서는 personal access token을 만들고 안전하게 저장하여 GitHub Actions와 함께 사용할 수 있도록 합니다. 만들 작업은 이슈에 응답하는 간단한 워크플로입니다.
1. 연습 리포지토리 만들기
먼저 작업할 리포지토리를 만듭니다. new2code
계정에는 신속하게 시작하는 데 사용할 수 있는 템플릿 리포지토리가 있습니다.
- 새 리포지토리 페이지로 이동합니다. 이 링크를 클릭하면
new2code
계정의 템플릿이 미리 선택됩니다. - “Owner”에서 사용자 계정이 선택되어 있는지 확인합니다.
- “Repository name” 필드에
secret-action
을 입력하세요. - 설명 필드 아래에서 Public을 선택하여 리포지토리 표시 유형을 설정합니다.
- Create repository(리포지토리 만들기)를 클릭합니다.
2. 더미 토큰 커밋
모두가 실수를 하고 코딩 경험의 어느 시점에서 실수로 비밀을 커밋할 수 있습니다. 이 연습에서는 트리거되는 경고에 익숙해지고 편안해질 수 있도록 의도적으로 가짜 토큰을 커밋합니다.
-
방금 생성한 리포지토리로 이동합니다.
-
파일 목록에서
.github/workflows
를 클릭하여 YAML 워크플로 파일로 이동합니다. -
파일 목록에서
comment.yml
을 클릭하여 워크플로 파일을 엽니다. -
워크플로 파일을 편집하려면 오른쪽 위에서 을 클릭합니다.
-
줄 13에서 따옴표 사이에 이 더미 토큰,
GH_TOKEN: ""
을 삽입합니다.secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde
최종 결과는 다음과 같아야 합니다.
GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde"
-
변경 내용을 커밋하려면 오른쪽 위에서 변경 내용 커밋... 을 클릭한 다음, 대화 상자에서 변경 내용 커밋을 다시 클릭합니다.
-
이제 “비밀 검사를 하면 13줄에서 GitHub 비밀 검색 비밀을 발견했다”는 푸시 보호 경고가 표시됩니다.
더미 토큰을 실험하지 않은 경우 토큰을 노출하지 않았다는 경고가 표시됩니다. 경고에서 선택할 수 있는 옵션을 검토합니다.
-
커밋을 중지하고 비밀을 노출하지 않도록 하려면 Cancel을 클릭합니다. 오른쪽 위에서 Cancel changes를 클릭한 다음, 메시지가 표시되면 저장되지 않은 변경 내용을 삭제합니다.
3. 실제 토큰 만들기
이제 모범 사례를 수행해 보겠습니다. 먼저 사용자 대신 작업을 수행할 수 있는 personal access token을 만듭니다(만든 메모는 사용자 계정에서 나온 것으로 표시됨).
Note
각 구성 단계에 대해 최소 권한 원칙을 따르는 방법을 확인합니다. 토큰은 필요한 만료 기간이 가장 짧고, 필요한 리포지토리에만 액세스할 수 있으며, 작동하는 데 필요한 최소 권한을 갖습니다.
- 새 personal access token 페이지로 이동합니다.
- “Token name”에서 새 토큰에 이름을 지정합니다. “Action token”처럼 사용할 수 있습니다.
- “Expiration”에서 “7 days”를 선택합니다.
- “Repository access”에서 Only select repositories를 선택합니다.
- “Select repositories” 드롭다운에서 이전에 만든 연습 리포지토리만 선택합니다.
- “Permissions” 섹션에서 “Repository permissions”의 오른쪽에서 를 클릭하여 가능한 모든 권한을 봅니다.
- “Issues”로 아래로 스크롤하고 오른쪽 드롭다운에서 “Read and write”를 선택합니다.
- 페이지 아래쪽에서 Generate token을 클릭합니다. 메시지가 표시되면 Generate token을 다시 클릭하여 확인합니다.
이 시점부터 결과 토큰을 안전하게 처리하는 것이 중요합니다. 곧 토큰을 사용할 예정이므로 잠시 클립보드에 복사할 수 있습니다.
4. 토큰을 안전하게 저장
이제 리포지토리에 새 토큰을 안전하게 저장할 수 있습니다.
-
연습의 시작 부분에서 만든 리포지토리로 이동합니다.
-
리포지토리 이름 아래에서 설정을 클릭합니다. "설정" 탭이 표시되지 않으면 드롭다운 메뉴를 선택한 다음 설정을 클릭합니다.
-
사이드바의 "보안" 섹션에서 비밀 및 변수를 선택하고 작업을 클릭합니다.
-
“Repository secrets”에서 새 리포지토리 비밀을 클릭합니다.
-
Name 필드에 비밀의 이름을 입력합니다. 이 연습에서는
MY_TOKEN
를 사용합니다. -
Secret 필드에 이전에 생성한 personal access token을 붙여 넣습니다.
-
비밀 추가를 클릭합니다.
이제 비밀이 안전하게 암호화되어 사용할 준비가 되었습니다!
5. 작업에서 토큰 참조
이제 YAML 워크플로 파일을 업데이트하여 토큰을 사용하고 작동하는지 테스트할 수 있습니다.
-
리포지토리로 다시 이동합니다. 리포지토리의 설정에 있는 경우 리포지토리 이름 아래에서 Code를 클릭할 수 있습니다.
-
파일 목록에서
.github/workflows
를 클릭하여 YAML 워크플로 파일로 이동합니다. -
파일 목록에서
comment.yml
을 클릭하여 워크플로 파일을 엽니다. -
워크플로 파일 편집을 시작하려면 오른쪽 위에서 을 클릭합니다.
-
줄 13에서,
GH_TOKEN: ""
에서, 빈 따옴표를${{ secrets.MY_TOKEN }}
으로 바꿉니다. 앞에서 추가한 리포지토리 비밀을 참조합니다.GH_TOKEN: ${{ secrets.MY_TOKEN }}
-
변경 내용을 커밋하려면 오른쪽 위에서 Commit changes... 을 클릭합니다.
-
“Commit changes” 대화 상자에서 “Commit message”를 편집하여 변경 내용을 반영합니다. 예를 들어 “리포지토리 비밀을 사용하도록 워크플로 업데이트”를 입력할 수 있습니다.
-
“Commit directly to the
main
branch”가 선택되어 있는지 확인합니다. -
변경 내용 커밋을 클릭합니다.
6. 토큰 및 워크플로 테스트
이제 모든 준비가 끝났습니다. 계속하여 워크플로를 테스트해 보겠습니다.
-
리포지토리 이름 아래에서 이슈 아이콘을 클릭합니다.
-
새 문제를 클릭합니다.
-
“Add a title”에서 원하는 제목을 입력할 수 있습니다.
-
“Add a description”의 텍스트 영역에
Hello
를 입력합니다. -
텍스트 영역 아래에서 Create를 클릭합니다.
워크플로를 완료할 시간이 있으면 새 주석이 표시됩니다. 토큰을 사용 중이므로 주석을 직접 작성하고 인사말이 포함됩니다.
다음 단계
비밀 검색 및 푸시 보호에 대한 자세한 내용은 GitHub Skills에서 비밀 검사 소개 과정을 완료할 수 있습니다.