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를 통해 사람이 읽을 수 있는 신원에 강하게 결합된 단기 키를 사용합니다. Sigstore는 개발과 채택 모두에서 추진력을 얻고 있으며, 여러 생태계 가운데 PyPI, NPM, Homebrew, GitHub 등에서 채택되었습니다.

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

동기

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

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

근거

Python 릴리스 기간 동안 기대 사항 유지

다운스트림 검증자가 깨지지 않도록, 기능 릴리스의 수명 주기 동안에는 검증 자료의 제공 여부에 대한 기대 사항을 변경해서는 안 됩니다(SHOULD NOT).

릴리스가 아닌 릴리스 관리자 기준

PGP 서명 중단이 반드시 “릴리스 관리자 경계”에서 이루어져야 하는 것은 아니며, 새 Python 릴리스도 경계가 될 수 있습니다.

PGP 폐지의 주된 동기가 사용성이므로, 릴리스 관리자가 다른 릴리스에 대해 여러 해 동안 PGP 서명을 제공할 의무가 여전히 남아 있는 상황에서 한 릴리스에 대해서만 PGP를 중단하기로 결정해도 노력은 크게 줄어들지 않습니다.

또한 새 릴리스 관리자가 등장하면 다운스트림 검증자가 받아들여야 하는 새 PGP 공개 키도 생깁니다. 이 시기에 변경하기로 하면, 어차피 변경이 필요한 다운스트림 유지 보수 시점으로 호환성 손상을 한정하여 최소화할 수 있습니다.

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

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

이러한 상황은 서명 방식을 자동화하여 검증 도구에 통합해야 할 “필요”를 만들지 않으므로, 서명을 생성하는 프로젝트와 서명을 검증하는 생태계 모두에서 Sigstore와 같은 새로운 서명 방식의 채택을 늦춥니다.

앞으로 어떤 서명 방식이 제공될지에 대한 기대를 바꾸면 다운스트림 도구에서 새 서명 방식의 채택을 촉진하여 이 유인의 매듭을 끊을 수 있습니다. 이렇게 검증 도구가 바뀌면 다른 업스트림 프로젝트도 Sigstore 서명만 게시하는 방식으로 이전할 수 있게 되어, 채택의 선순환이 만들어집니다.

명세

PGP 키는 릴리스 관리자의 신원에 묶여 있으므로, PGP 서명 제공 여부의 변경은 개별 릴리스(3.13, 3.14 등)가 아닌 릴리스 관리자를 기준으로 적용됩니다. 이 PEP는 PGP 서명을 폐지하는 동시에 PGP 서명의 중단 일정을 제안합니다.

PGP 서명의 폐지 및 중단

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

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

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

PGP 서명 중단의 연기

이 PEP는 특별한 상황이 발생할 경우에 대비하여 현재 활성 상태이거나 향후 출시될 CPython 릴리스에서 PGP 서명의 중단을 연기하는 메커니즘을 제공합니다. PGP 서명의 폐지 예정은 이를 대체하는 PEP 없이는 변경할 수 없습니다.

운영 위원회(Steering Council)는 이 PEP가 수락된 이후 향후 어느 시점에 PGP 서명의 중단을 향후 CPython 릴리스로 연기하기로 결정할 수 있습니다(MAY). 운영 위원회가 PGP 서명의 중단을 연기하기로 결정하는 경우, 모든 활성 릴리스 관리자는 릴리스 관리자로서의 남은 임기 동안 자신이 담당하는 CPython 아티팩트에 대해 PGP 서명을 제공해야 합니다(MUST). 여기에는 새 PGP 키를 생성하고 자신의 신원을 python.org에 게시하는 것과 같이 이를 위해 필요한 모든 단계가 포함됩니다.

그러면 PGP 서명의 중단은 안정 릴리스가 없는 다음 릴리스 관리자부터 적용되도록 자동으로 예정되며, 이는 운영 위원회의 결정에 명시됩니다.

하위 호환성

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

보안 영향

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

일반적으로 아티팩트 서명에 요구되는 보안 모델은 호스팅 서비스(CPython의 경우: python.org/downloads)의 보안이나 무결성과 관계없이, 주어진 아티팩트가 예상된 출처에서 왔으며 변경되지 않았는지를 탐지할 수 있는 것입니다.

Sigstore의 보안 모델은 PGP에 비해 중앙 집중식 인프라에 더 많이 의존합니다. 예를 들어 “공공재” 서명 투명성 로그(Rekor), 인증서 발급 기관 및 투명성 로그(Fulcio), 그리고 Google이나 GitHub 같은 OpenID Connect 신원 제공자의 보안 등이 이에 해당합니다.

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

교육 방법

CPython은 릴리스 관리자가 사전에 공개한 신원을 기반으로 Sigstore를 사용하여 아티팩트를 검증하는 방법을 이미 문서화하고 있습니다. PGP 서명의 폐지 예정과 향후 기대 사항을 알리도록 문서가 갱신될 것입니다.

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

기각된 아이디어

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

릴리스 관리자가 되는 것은 이미 어렵고 시간이 많이 들며 장기적인 헌신이 필요한 일이고, 일반적으로 자원봉사로 이루어집니다. 따라서 저희는 PGP 키 관리 의무를 없애는 것을 향후 릴리스 관리자의 번아웃과 스트레스를 줄이고 CPython의 지속 가능성을 높이기 위한 한 걸음으로 봅니다.

이전 PGP 서명 제거하기

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

부록

오프라인 검증 지원

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

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

신뢰 루트를 고정한다는 것은 새로운 신뢰 루트가 수립된 뒤에 만들어진 서명은 “고정된” 이전 신뢰 루트로는 더 이상 검증할 수 없다는 뜻입니다. 새로운 신뢰 루트는 신뢰 루트가 침해된 경우처럼 드물게 발생하는 일일 것으로 예상되며, 이런 경우 검증자는 서명 검증이 실패하기를 원할 것입니다.

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

신뢰 루트 침해와 같은 드문 일을 제외하면, Sigstore로 오프라인 검증을 하더라도 검증자에게 추가적인 운영 요구 사항이 생기지 않습니다.

검증용 사전 컴파일 실행 파일 지원

논의 중에 sigstore-go를 소스에서 빌드하기 위해 Go 빌드 툴체인을 설치하거나 sigstore-python을 위해 동작하는 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