[SEC-008][중급] 비밀정보의 수명 안전하게 관리하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[SEC-008][중급] 비밀정보의 수명 안전하게 관리하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 104회 작성일 26-09-03 14:35

본문

[이번 수업]
비밀정보가 코드 밖에 있다는 사실만으로 안전해지지는 않습니다. 이번에는 비밀정보를 환경변수로 전달할 때의 한계와 보안 저장소의 역할을 배우고, 생성부터 교체·폐기까지 이어지는 수명주기를 연습합니다.

[선수지식]
SEC-003의 최소 권한, SEC-007의 암호화와 키 관리, DEVOPS-007의 설정·비밀 구분을 알고 Python과 터미널을 실행할 수 있어야 합니다.

[학습목표]
1. 일반 설정과 비밀정보를 구분할 수 있습니다.
2. 환경변수와 보안 저장소의 역할 차이를 설명할 수 있습니다.
3. 비밀정보의 생성·전달·교체·폐기·감사를 계획할 수 있습니다.

[핵심개념]
비밀정보는 노출되면 다른 시스템의 권한을 얻는 데 쓰일 수 있는 값입니다. 서비스용 암호, API 토큰, 개인키와 세션 서명키가 예입니다. 소스 코드에 자격증명을 고정하면 코드를 읽는 사람이나 배포된 프로그램이 같은 값을 공유하게 되고, 값을 바꾸려면 프로그램까지 다시 배포해야 합니다.

환경변수는 값을 코드와 분리해 실행할 때 전달하는 통로입니다. 그러나 그 자체가 암호화된 보안 저장소는 아닙니다. 같은 실행 환경의 프로세스, 진단 자료나 잘못 작성한 로그를 통해 노출될 수 있습니다. 로컬 학습에는 가짜 값을 환경변수로 전달해도 되지만, 운영에서는 승인된 보안 저장소에 값을 보관하고 인증된 작업이 실행 시 필요한 값만 읽게 합니다. 권한은 비밀 하나와 필요한 동작에만 제한합니다.

비밀의 수명주기는 다음과 같습니다. ① 목적과 소유자를 정하고 충분히 예측하기 어려운 값을 생성합니다. ② 암호화된 통신으로 필요한 작업에만 전달합니다. ③ 서비스용 비밀은 적절한 주기로 새 버전으로 교체하고 소비자가 새 값을 읽는지 확인합니다. ④ 불필요하거나 노출된 옛 값은 즉시 폐기하고 만료시킵니다. ⑤ 조회·교체·폐기한 주체와 시각은 감사 기록에 남기되 비밀값 자체는 기록하지 않습니다. 저장소에서 지우거나 커밋을 삭제하는 것만으로 이미 노출된 권한이 사라지지는 않으므로 폐기와 교체가 핵심입니다.

[따라하기]
아래를 secret_check.py로 저장하세요. 실제 값은 출력하지 않고, 값과 버전 정보가 모두 주입됐는지만 확인합니다.

```python
import os

secret = os.getenv("APP_SECRET")
version = os.getenv("APP_SECRET_VERSION")

if not secret or not version:
    raise SystemExit("ERROR: secret or version is missing")

print("secret_loaded=True")
print(f"secret_version={version}")
```

macOS·Linux에서는 가짜 값을 한 명령에만 전달합니다.

```sh
APP_SECRET=local-demo-v1 APP_SECRET_VERSION=v1 python3 secret_check.py
APP_SECRET=local-demo-v2 APP_SECRET_VERSION=v2 python3 secret_check.py
```

Windows PowerShell에서는 실행 뒤 변수를 지웁니다.

```powershell
$env:APP_SECRET = "local-demo-v2"
$env:APP_SECRET_VERSION = "v2"
py .\secret_check.py
Remove-Item Env:APP_SECRET, Env:APP_SECRET_VERSION
```

두 번째 실행의 예상 결과입니다. 값은 화면에 나타나지 않습니다.

```text
secret_loaded=True
secret_version=v2
```

[흔한 실수]
환경변수를 영구 보안 저장소로 여기거나, 실제 비밀을 셸 명령 기록·오류 메시지·디버그 로그에 남기기 쉽습니다. 모든 작업에 같은 토큰을 주거나 새 값을 저장소에 넣은 뒤 실행 중인 서비스의 갱신 여부를 확인하지 않는 것도 문제입니다. 파일에 적었다면 확장자만 숨기지 말고 저장소 제외, 파일 권한과 백업 범위를 함께 확인해야 합니다.

[보안 주의]
실습에는 반드시 `local-demo-v2` 같은 가짜 값만 사용하고 본인 소유의 로컬·격리 환경에서 실행하세요. 실제 비밀이 코드나 로그에 노출되면 게시물을 지우는 데 그치지 말고 해당 값을 즉시 폐기·교체하고 접근 기록을 확인합니다. 로그에는 성공 여부, 참조 이름, 버전과 시각만 남기며 값은 마스킹해도 가능하면 기록하지 않습니다.

[직접 해볼 과제]
환경변수 하나를 빼고 실행해 프로그램이 안전하게 중단되는지 확인하세요. 이어서 가상의 서비스 비밀에 대해 소유자, 사용 작업, 교체 조건, 만료 시각, 폐기 확인 방법을 한 줄씩 적은 점검표를 만드세요.

[확인문제]
1. 환경변수가 보안 저장소와 같은 것은 아닌 이유는 무엇인가요?
2. 노출된 비밀을 코드에서 삭제한 뒤에도 교체해야 하는 이유는 무엇인가요?
3. 비밀정보 감사 로그에 값 대신 무엇을 남겨야 하나요?

[다음 학습]
다음 AI-008에서는 문장의 의미를 숫자 배열로 바꾸는 임베딩과 벡터 검색을 배웁니다.

[공식 참고 자료]
비밀정보 관리 공식 보안 지침: https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html
하드코딩 자격증명 취약점 분류: https://cwe.mitre.org/data/definitions/798.html
Python 환경변수 읽기 공식 문서: https://docs.python.org/3/library/os.html#os.getenv
암호 키 관리 공식 권고: https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,630
어제
6,862
최대
16,772
전체
770,581
Copyright © 소유하신 도메인. All rights reserved.