[SEC-007][중급] 암호화 키와 TLS 안전하게 관리하기 > IT 기술 공유

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

IT 기술 공유

[SEC-007][중급] 암호화 키와 TLS 안전하게 관리하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 136회 작성일 26-09-02 20:36

본문

[이번 수업]
암호화·전자서명·TLS가 맡는 역할을 구분하고, 암호키의 생성부터 폐기까지 관리해야 하는 이유를 배웁니다. 로컬에서 인증서 검증이 켜진 TLS 클라이언트 기본 설정도 확인합니다.

[선수지식]
SEC-002의 해시와 비밀번호, SEC-003의 인증·인가, NET-005의 HTTPS·TLS 통신 흐름을 알고 Python과 터미널을 실행할 수 있어야 합니다.

[학습목표]
1. 대칭키·비대칭키·전자서명의 역할을 구분한다.
2. 키 수명주기의 주요 단계를 설명한다.
3. TLS 클라이언트의 인증서 검증 설정을 확인한다.

[핵심개념]
암호화는 평문을 알아보기 어려운 암호문으로 바꾸고 올바른 키로 되돌리는 기밀성 기술입니다. 대칭키 방식은 통신 양쪽이 같은 비밀키를 사용해 많은 데이터를 효율적으로 보호합니다. 비대칭키 방식은 공개키와 개인키 쌍을 사용하며 키 설정과 전자서명 등에 쓰입니다. 전자서명은 서명한 주체와 데이터가 바뀌지 않았음을 검증하는 데 도움을 줍니다. 해시는 원본 복원을 위한 암호화가 아닙니다.

강한 알고리즘도 키가 노출되면 보호 효과를 잃습니다. 키 관리는 안전한 난수로 생성하고, 필요한 대상에게만 전달하며, 전용 저장소에서 보호하고, 용도·사용 기간·권한을 제한하고, 교체·폐기하는 전체 수명주기입니다. 암호문과 키를 같은 접근 권한 아래에 두거나 하나의 키를 여러 용도로 재사용하지 않습니다. 키 식별자, 사용 주체와 교체 이력은 감사하되 키 값 자체는 로그에 남기지 않습니다.

TLS 1.3은 핸드셰이크에서 통신 상대를 인증하고 알고리즘을 협상하며 공유 키 자료를 설정합니다. 이후 레코드 계층은 트래픽 키로 기밀성과 무결성을 보호합니다. 일반적인 서버 인증에서는 인증서 신뢰 경로뿐 아니라 접속한 서비스 이름과 인증서의 식별자가 맞는지도 확인해야 합니다. 인증서가 있다는 사실만으로 신뢰하지 말고 유효기간·신뢰 경로·서비스 이름을 함께 검증합니다.

[따라하기]
아래 코드를 `tls_defaults.py`로 저장합니다. 네트워크 연결이나 실제 키 생성 없이 Python의 안전한 TLS 클라이언트 기본값을 읽습니다.

```python
import ssl

context = ssl.create_default_context()

if not context.check_hostname:
    raise SystemExit("hostname verification is disabled")
if context.verify_mode != ssl.CERT_REQUIRED:
    raise SystemExit("certificate verification is not required")

print(f"check_hostname={context.check_hostname}")
print(f"verify_mode={context.verify_mode.name}")
print(f"minimum_version={context.minimum_version.name}")
```

Windows PowerShell에서는 `py tls_defaults.py`, macOS·Linux 터미널에서는 `python3 tls_defaults.py`를 실행합니다. 현재 실습 환경의 예상 결과는 아래와 같습니다. 운영체제와 Python 빌드의 보안 정책에 따라 최소 버전은 더 높을 수 있습니다.

```text
check_hostname=True
verify_mode=CERT_REQUIRED
minimum_version=TLSv1_2
```

`check_hostname=True`는 서비스 이름을 인증서와 비교한다는 뜻이고, `CERT_REQUIRED`는 신뢰할 수 있는 인증서를 요구한다는 뜻입니다. 이 코드는 서버에 접속하지 않으므로 특정 사이트를 검사하지 않습니다.

[흔한 실수]
- 해시, 인코딩과 암호화를 같은 것으로 생각한다.
- 알고리즘만 강하면 키 저장 위치는 중요하지 않다고 생각한다.
- 인증서 오류를 해결하려고 검증을 꺼 버린다.
- 키를 소스코드·이미지·로그·일반 백업에 평문으로 남긴다.
- 키를 교체한 뒤 이전 키의 폐기·복구·롤백 절차를 시험하지 않는다.

[보안 주의]
검증된 표준과 유지보수되는 암호 라이브러리를 사용하고 암호 알고리즘을 직접 만들지 않습니다. 예제에서는 실제 인증서·개인키·토큰을 입력하지 마세요. 운영 키는 전용 키 관리 시스템이나 하드웨어 보안 모듈 등 승인된 저장소에 두고 최소 권한과 접근 감사를 적용합니다. 인증서 검증을 끄거나 오래된 프로토콜을 임시 허용하는 방식으로 오류를 우회하지 않습니다. 키 유출이 의심되면 해당 키와 인증서를 폐기·교체하고 영향 범위를 점검합니다.

[직접 해볼 과제]
`context.minimum_version`이 `ssl.TLSVersion.TLSv1_2`보다 낮으면 프로그램을 중단하는 검사를 추가하세요. 세 검증값을 표로 정리하고, 각각을 끄면 기밀성·무결성·상대 인증 중 무엇이 약해지는지 한 줄씩 설명합니다.

[확인문제]
1. 대칭키와 비대칭키 방식의 키 사용은 어떻게 다른가요?
2. 인증서 검증에서 신뢰 경로와 함께 확인할 것은 무엇인가요?
3. 키 값 대신 감사 기록에 남겨야 할 정보는 무엇인가요?

[다음 학습]
다음 AI-007에서는 프롬프트, 토큰과 컨텍스트 창을 배웁니다.

[공식 참고 자료]
- NIST 키 관리 지침: https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final
- NIST 전자서명 표준: https://csrc.nist.gov/pubs/fips/186-5/final
- TLS 1.3 최신 표준 RFC 9846: https://www.rfc-editor.org/info/rfc9846/
- TLS 서비스 이름 확인 RFC 9525: https://www.rfc-editor.org/info/rfc9525/
- Python TLS 기본 컨텍스트: https://docs.python.org/3/library/ssl.html#ssl.create_default_context

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

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

접속자집계

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