Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 761 – CPython 아티팩트에 대한 PGP 서명 폐지

Author:
Seth Michael Larson <seth at python.org>
Sponsor:
Hugo van Kemenade
Discussions-To:
Discourse thread
Status:
Active
Type:
Process
Created:
08-Oct-2024
Python-Version:
3.14
Post-History:
25-Sep-2024, 09-Oct-2024
Resolution:
06-Nov-2024

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

Python 3.11.0부터 CPython은 모든 CPython 아티팩트에 대해 검증 가능한 두 가지 디지털 서명인 PGP와 Sigstore를 제공해 왔습니다.

PGP의 설계에서는 신뢰할 수 있는 당사자가 오래 유지되는 개인 키를 유지하고 보호해야 합니다. PGP의 보안성과 사용 편의성은 보안 실무자들에 의해 수년간 비판받아 왔으며, 가장 큰 문제는 “아티팩트 서명”을 위한 대안이 거의 제안되거나 채택되지 않았다는 점이었습니다.

Sigstore의 설계 철학은 서명 및 검증의 사용 편의성에 중점을 두며, OpenID Connect를 통해 강하게 결합된 사람이 읽을 수 있는 ID와 함께 단기 키를 사용합니다. Sigstore는 개발과 채택 모두에서 동력을 얻고 있으며, 다른 여러 생태계와 더불어 PyPI, NPM, Homebrew 및 GitHub에서 채택되고 있습니다.

이 PEP는 새로운 릴리스 관리자부터 PGP 서명 제공을 폐지하고 최종적으로 중단함으로써, 아티팩트 서명에 CPython이 Sigstore만 사용하도록 전환할 것을 제안합니다.

동기

CPython의 릴리스는 릴리스 관리자 중심으로 이루어지며, 한 사람이 수년에 걸쳐 프리릴리스부터 수명 종료까지 여러 CPython 릴리스를 관리합니다.

릴리스 관리자에게 7년 이상 PGP 개인 키를 유지하고 보호하도록 요구하는 것은, 사용하기 편리하고 수명이 짧은 서명 키가 등장한 새로운 시대에 불필요한 부담입니다. 이에 비해 Sigstore에서는 릴리스 과정에서 릴리스 관리자가 버튼을 클릭하여 ID 공급자에 OAuth 로그인을 하는 것만 요구합니다. GitHub와 같은 ID 공급자의 계정 무결성을 유지하는 것은 다중 요소 인증과 강력하고 고유한 비밀번호 사용 등을 통해 Python 릴리스 관리자나 핵심 팀 구성원이 되는 데 이미 기대되는 사항입니다.

근거

Python 릴리스 전반에서 기대 사항 유지

다운스트림 검증자가 영향을 받지 않도록 하려면, 기능 릴리스의 수명 주기 동안 검증 자료의 가용성에 대한 기대를 변경해서는 안 됩니다(SHOULD NOT).

릴리스가 아니라 릴리스 관리자

PGP 서명의 중단은 반드시 “릴리스 관리자 경계”에서 이루어질 필요는 없으며, 새로운 Python 릴리스가 잠재적인 경계가 될 수 있습니다.

PGP 폐지의 주된 동기가 사용 편의성이므로, 릴리스 관리자가 여러 해 동안 다른 릴리스에 PGP 서명을 제공할 의무를 여전히 지닌 상태에서 한 릴리스에 대해 PGP를 중단하기로 결정해도 노력 절감 효과는 크지 않습니다.

새로운 릴리스 관리자는 다운스트림 검증자가 채택해야 하는 새로운 PGP 공개 키를 의미하기도 합니다. 이 기간에 변경하기로 선택하면, 이미 변경이 필요할 다운스트림 유지 관리 지점에서 변경함으로써 호환성 손상을 최소화할 수 있습니다.

서명 방식과 검증자의 고르디우스 매듭

CPython이 PGP와 Sigstore 서명을 동시에 제공하면 “고르디우스 매듭”이 만들어집니다. 기존 서명 방식의 지속적이고 예상되는 가용성 때문에 검증자가 새로운 서명 방식으로 이전할 유인이 줄어들고, 그 결과 기존 서명 방식을 유지해야 한다는 표면적인 수요가 계속 확산됩니다.

이러한 상황에서는 서명 생성 프로젝트와 서명 검증 생태계 모두에서 Sigstore와 같은 새로운 서명 방식의 채택이 늦어집니다. 검증 도구에 서명 방식을 자동화하고 통합해야 할 “필요성”이 생기지 않기 때문입니다.

향후 어떤 서명 방식을 사용할 수 있을지에 대한 기대를 변경하면, 다운스트림 도구에서 새로운 서명 방식의 채택을 촉진함으로써 유인 매듭을 끊을 수 있습니다. 검증 도구에 대한 이러한 변경은 다른 업스트림 프로젝트도 Sigstore 서명만 게시하는 방식으로 이전할 수 있게 하며, 그 결과 채택의 선순환이 발생합니다.

사양

PGP 키는 릴리스 관리자 ID에 연결되어 있으므로, PGP 서명의 가용성 변경은 개별 릴리스(3.13, 3.14 등)가 아니라 릴리스 관리자에 연결됩니다. 이 PEP는 PGP 서서를 폐지하고 중단 일정을 제안합니다.

PGP 서명의 폐지 및 중단

이 PEP는 향후 CPython 릴리스에서 PGP 서명을 폐지하고, 검증자가 PGP의 대안으로 CPython 아티팩트를 검증하기 위해 Sigstore를 채택할 것을 권고합니다.

이 PEP는 또한 아직 안정 Python 릴리스를 유지하지 않는 향후 릴리스 관리자가 PGP 서명을 게시해야 한다는 기대를 없앱니다. 이 글을 작성하는 시점에는 3.14가 안정 릴리스가 없는 다음 Python 버전이므로 Hugo van Kemenade가 이에 해당합니다.

이미 안정 릴리스가 있는 릴리스(3.13, 3.12, 3.11 등)는 영향을 받지 않으며, 수명이 종료될 때까지 아티팩트에 대한 PGP 서명을 계속 제공합니다. 기존의 모든 PGP 서명은 계속 예상대로 작동합니다.

PGP 서명 중단 연기

이 PEP는 특별한 상황이 발생할 경우 활성 및 예정된 CPython 릴리스에서 PGP 서명의 중단을 연기할 수 있는 메커니즘을 제공합니다. PGP 서명의 사용 중단은 이를 대체하는 PEP 없이는 변경할 수 없습니다.

Steering Council은 이 PEP가 승인된 후 향후 시점에 PGP 서명 중단을 미래의 CPython 릴리스까지 연기하기로 결정할 수 있습니다. Steering Council이 PGP 서명 중단을 연기하기로 결정하면 모든 현직 릴리스 관리자는 릴리스 관리자로 재임하는 기간의 남은 기간 동안 자신이 담당하는 CPython 아티팩트에 대한 PGP 서명을 제공해야 합니다. 여기에는 새 PGP 키 생성 및 python.org에 신원 게시 등 이를 수행하는 데 필요한 모든 단계가 포함됩니다.

그러면 PGP 서명 중단은 안정 릴리스가 없는 다음 릴리스 관리자에 대해 자동으로 예약되며, Steering Council의 결정에서 이를 명시합니다.

하위 호환성

이 제안은 향후 CPython 아티팩트를 PGP를 사용하여 검증할 수 있는 기능을 제거합니다. CPython 아티팩트에 PGP를 사용하는 모든 다운스트림 검증자는 Sigstore를 사용하기 시작하거나, 다른 방법으로 CPython의 소스 코드를 검증하거나, 향후 CPython 릴리스에 대한 검증을 완전히 중단해야 합니다.

보안 영향

PGP와 Sigstore는 서로 다른 보안 모델을 사용하므로 PGP 서명을 제거하면 모든 사용자는 Sigstore가 제공하는 보안 모델에 의존하는 선택지만 갖게 됩니다.

일반적으로 아티팩트 서명에 필요한 보안 모델은 호스팅 서비스의 보안 또는 무결성과 관계없이 특정 아티팩트가 예상된 출처에서 왔으며 수정되지 않았는지를 감지할 수 있어야 합니다(CPython의 경우 호스팅 서비스는 python.org/downloads입니다).

Sigstore의 보안 모델은 PGP에 비해 중앙 집중식 인프라에 더 많이 의존하며, 여기에는 “공익” 서명 투명성 로그(Rekor), 인증 기관 및 투명성 로그(Fulcio), 그리고 Google 및 GitHub와 같은 OpenID Connect ID 공급자의 보안이 포함됩니다.

CPython 개발은 이미 이러한 서비스 중 일부의 보안에 의존하고 있으며, 나머지 서비스는 장기적인 공개 키 관리를 제공하는 데 있어 어떤 개별 릴리스 관리자보다 더 많은 자원을 갖추고 있습니다.

이 내용을 가르치는 방법

CPython은 릴리스 관리자가 사전에 게시한 신원을 바탕으로 Sigstore를 사용하여 아티팩트를 검증하는 방법을 이미 문서화하고 있습니다. 문서는 PGP 서명의 사용 중단과 향후 예상 사항을 명시하도록 업데이트됩니다.

새로운 Python 사용자에게 CPython 아티팩트의 서명을 검증할 것을 기대해서는 안 됩니다. 대신 Sigstore는 Linux 배포판, Homebrew, pyenv 또는 소스에서 CPython을 프로그래밍 방식으로 가져와 빌드하는 기타 도구와 같은 다운스트림 통합자의 빌드 파이프라인에 포함될 가능성이 더 높습니다.

거부된 아이디어

PGP 서명을 무기한 계속 게시하기

릴리스 관리자가 되는 일은 이미 어렵고 시간이 많이 들며 장기적인 헌신이 필요한 업무이고, 일반적으로 자원봉사로 수행됩니다. 따라서 PGP 키 관리 업무를 제거하는 것은 향후 릴리스 관리자의 번아웃과 스트레스를 줄이고 CPython의 지속 가능성을 향상하기 위한 조치라고 봅니다.

이전 PGP 서명 제거

이 PEP는 기존 Python 버전을 기반으로 구축된 인프라를 중단하려는 것이 아니라, 향후 Python 버전에 대한 기대 사항만 변경하려는 것입니다. 따라서 python.org에서 이미 제공되는 모든 PGP 서명은 PGP 중단 이후에도 계속 제공됩니다.

부록

오프라인 검증 지원

pre-PEP 논의 중에 Sigstore에서 오프라인 검증을 지원하는지에 대한 질문이 있었습니다. Sigstore 번들(.sigstore) 파일을 사용하면, Sigstore 클라이언트는 아티팩트를 완전히 오프라인으로 검증할 수 있습니다.

Sigstore에서 오프라인 검증을 사용하려면 신뢰 루트 업데이트를 비활성화하고, 검증 중에 사용할 신뢰 루트를 파일에 “고정”해야 합니다.

신뢰 루트를 고정한다는 것은 새로운 신뢰 루트가 설정된 후에 만들어진 서명을 이전에 “고정된” 신뢰 루트를 사용해서는 더 이상 검증할 수 없게 된다는 의미입니다. 신뢰 루트가 손상되는 경우와 같이 새로운 신뢰 루트가 필요한 일은 드물게 발생할 것으로 예상되며, 이 경우 검증자는 서명 검증이 실패하기를 원할 것입니다.

오프라인 검증에서는 폐기 확인도 불가능해지지만, 이는 키를 폐기하려면 온라인 조회가 필요한 PGP의 모델과 유사합니다.

신뢰 루트 손상과 같은 드문 사건을 제외하면, Sigstore에서 오프라인 검증을 사용하더라도 검증자에게 추가적인 운영 요구 사항을 부과하지 않습니다.

검증을 위한 사전 컴파일된 실행 파일 지원

논의 중에 소스에서 sigstore-go를 빌드하기 위한 Go 빌드 도구체인을 설치하거나, 이미 작동하는 Python 설치 환경을 갖추지 않고도 sigstore-python을 사용하여 Sigstore 번들을 검증할 수 있는 사전 컴파일된 실행 파일을 요청하는 의견이 있었습니다.

Cosign은 사전 컴파일된 독립 실행형 바이너리를 제공하고 오프라인에서 번들 검증을 지원하는 또 다른 Sigstore 프로젝트입니다:

# Download Cosign
wget https://github.com/sigstore/cosign/releases/download/v2.4.1/cosign-linux-amd64

# For offline verification, also need the Root of Trust. Can be grabbed
# from GitHub at: https://github.com/sigstore/root-signing/blob/main/targets/trusted_root.json
wget https://raw.githubusercontent.com/sigstore/root-signing/refs/heads/main/targets/trusted_root.json

# Download CPython artifacts
wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz
wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz.sigstore

./cosign-linux-amd64 verify-blob \
  --new-bundle-format \
  --certificate-oidc-issuer 'https://accounts.google.com' \
  --certificate-identity 'thomas@python.org' \
  --bundle ./Python-3.13.0.tgz.sigstore \
  # --offline and --trust-root optional for offline verification
  --offline \
  --trust-root ./trusted_root.json \
  ./Python-3.13.0.tgz