콘텐츠로 이동

English · 한국어

PqCOTA

시스템을 관측하고, 변화를 기록하며, 다음 전환을 준비합니다.

pqcota

ci license

시스템이 어떤 암호 알고리즘을 쓰는지 확인하고, 검토하고 적용하고 되돌릴 수 있는 변경으로 양자내성암호 이관을 준비합니다.

pqcota는 조직 안에서 양자내성암호(PQC) 이관을 진행하는 사람과 그 보고를 받는 사람을 위한 오픈소스 소프트웨어입니다(Apache-2.0). 개발자나 암호 전문가가 아니어도 이 도구가 무엇을 하고 어떤 결과를 제공하는지 이해할 수 있습니다. 이 문서는 영문 README의 한국어판입니다. 입문서, FAQ, 보고 안내, 데모, 개발자 문서, 기여·보안·행동 강령 안내와 각 단계 리포의 상세 문서는 한국어판이 있습니다. 릴리스 노트와 제3자 고지는 영문입니다.

한마디로: pqcota는 접근할 수 있는 시스템의 암호 자산과 연결 결과를 관측하고, 그것이 어떻게 바뀌는지 이력으로 남깁니다. 사용자가 무엇을 바꿀지 정하고 나면 그 변경을 수행하고 다시 되돌리는, 검토할 수 있는 파일을 생성합니다.

시연영상 보기(3분 37초, 영문판) · 직접 해 보기


이 문서의 독자

독자 여기서 시작하세요
이관 보고를 받는 관리자나 사업 책임자 제공하는 결과, 결과 읽는 법, pqcota가 하지 않는 일, 그리고 보고 안내
이관을 진행하는 사람 세 단계, 지원 범위, 데이터와 운영, 직접 해 보기, 그리고 보고 안내
PQC가 처음인 사람 배경, 단계별 첫 이관, 그다음 용어
엔지니어나 보안 설계자 개발자 문서, 빌드 안내, CONTRIBUTING

제공하는 결과

받는 질문 pqcota가 주는 것
「우리는 어떤 암호 알고리즘을 어디서 쓰나?」 관측한 시스템마다 로드된 암호 라이브러리, 등록된 Java 보안 provider, 그리고 지켜본 네트워크 연결에서 양쪽이 합의한 알고리즘
「우리 연결 중 양자내성은 몇 개인가?」 관측한 연결을 양자내성·하이브리드(🟢), 고전(🔴), 등급 미정(⚪)으로 나눈 개수
「지난번과 무엇이 달라졌나?」 두 관측의 비교: 무엇이 추가되고 삭제되고 교체됐는지
「무엇을 보지 못했나?」 수집기가 닿지 못한 것에 대한 명시적인 「관측하지 못함」 기록. 갭을 「없음」으로 보고하지 않습니다
「무엇을 바꾸고, 어떻게 되돌리나?」 설정으로 구현할 수 있는 변경마다 그것을 만드는 파일, 되돌리는 파일, 그리고 생성기에 인벤토리 데이터베이스를 --dsn으로 지정했으면 변경 전 시스템 상태 기록. 그렇게 구현할 수 없는 변경은 수동 단계로 나열합니다
「누가 승인했나?」 생성하려면 승인 서명이 붙은 계획이 필요합니다. 기본적으로 그 서명을 승인자의 등록된 공개 키로 확인합니다

이 수치는 pqcota가 지원하는 환경에서 관측할 수 있었던 시스템을, 관측한 그 시점에 기술한 것입니다. 이관 보고서에 넣을 증거이며, 규정 준수나 양자내성을 인증하지 않습니다.

세 단계

단계 쉽게 말하면 산출물
① 관측(Discovery) 작은 프로그램이 시스템에 가서 관측하며, 실행이 정상적으로 끝나면 제거됩니다(실패한 실행이 남길 수 있는 것은 데이터와 운영에 있습니다). 로드된 암호 라이브러리, 등록된 Java 보안 provider, 지켜본 연결에서 협상된 알고리즘을 읽습니다. 시스템당 관측 하나
② 인벤토리(Inventory) 관측을 한곳에 모으고, 각각을 시스템과 애플리케이션에 연결하며, 기존 기록은 수정하지 않고 변경 사항을 새 기록으로 남깁니다. 조회하고 비교할 수 있는 중앙 이력
③ 전환물 생성(Provisioning) 사람이 쓰고 승인한 계획을 받아 그것을 수행할 파일을 생성합니다: 설정 변경, 배치할 모듈, 그에 맞는 되돌림. 표준 Ansible 파일, 그리고 --dsn을 지정하면 「변경 전」 기록

세 단계는 따로 쓸 수 있습니다. 시스템 하나를 보려면 작은 프로그램 하나면 되고, 데이터베이스도 중앙 서버도 필요 없습니다.

결과 읽는 법

줄여 놓은 데모 결과입니다(자산은 줄였고, 데모의 연결은 모두 보여 줍니다).

──────── ① discovered assets (per node) ────────
  pay-app
    • JCA provider chain: SUN,SunRsaSign,…,BC   [confirmed]
        ↑ this BC is not in java.security. The application registered
          it while running, so reading that file would miss it.
    • OpenSSL libcrypto 3.5.5                    [confirmed]
  pay-db
    • OpenSSL libcrypto 1.1.1f                   [confirmed]

──────── ② observed connections + quantum-resistance grade ────────
  🟢 web-gw → pay-app   TLS  X25519MLKEM768
  🟢 web-gw → pay-app   SSH  sntrup761x25519-sha512@openssh.com
  🔴 web-gw → pay-db    TLS  x25519
  🔴 web-gw → pay-db    SSH  curve25519-sha256

  grade totals: 🟢 2 · 🔴 2 · ⚪ 0
  • 🟢는 양자내성 또는 하이브리드 알고리즘이 협상됐다는 뜻이고, 🔴는 고전 알고리즘이 협상됐다는 뜻입니다. ⚪는 등급을 정하지 못했다는 뜻입니다.
  • 🔴는 「취약하다」나 「규정을 어겼다」는 뜻이 아닙니다. pqcota가 지켜보는 동안 이 연결이 고전 알고리즘을 썼다는 뜻입니다. 바꿀지, 언제 바꿀지는 사용자가 정합니다. pqcota는 위험을 점수로 매기지 않습니다.
  • 「confirmed」는 증거의 강도이며, 그 사실을 어떻게 수집했는지로 정해집니다. 실행 중인 시스템에서, 소스에서, 또는 추적으로 본 사실은 「confirmed」입니다. 제공받은 암호 자산 명세서(CBOM)에서 가져온 사실은 아무도 실행 중인 시스템을 보지 않았으므로 더 낮게(「inferred, high」) 매깁니다.
  • 다시 관측해서 변경을 확인하는 방법에는 한계가 있습니다. OpenSSL은 라이브러리와 그 버전을 관측하고 어떤 provider가 로드됐는지는 관측하지 않으므로, provider를 추가해도 인벤토리에는 그 자체로 나타나지 않습니다. Java provider 체인은 직접 관측할 수 있습니다. 연결의 등급은 양쪽이 새 알고리즘을 모두 지원할 때만 바뀝니다.
  • 등급은 관측한 것에서 나옵니다. 라이브러리가 로드돼 있다는 것이 모든 연결에 쓰인다는 증거는 아니고, 연결은 관측하는 동안 일어난 것만 보입니다.
  • 같은 데이터를 시스템과 연결의 지도로 그려 등급별 색으로 표시할 수도 있습니다.

pqcota가 하지 않는 일

  • 무엇을 언제 이관할지 정하지 않습니다. 계획은 사람이 쓰고 승인합니다.
  • 위험이나 규정 준수 여부를 판정하지 않고 점수도 매기지 않습니다. 위험 등급도 합격·불합격도 없습니다.
  • 변경을 적용하지 않습니다. 사용자가 자신의 도구로 실행할 표준 Ansible 파일을 생성합니다. 원격 실행 엔진은 없습니다.
  • 소스 코드를 스캔하지 않습니다. 빌드가 이미 암호 자산 명세서(CBOM, CycloneDX)를 만든다면 pqcota가 그것을 같은 인벤토리로 받을 수 있습니다.
  • 규정 준수 제품이 아닙니다. 증거를 제공할 뿐 규정 준수나 양자내성을 인증하지 않습니다.
  • 검토 절차를 관리하지 않습니다. 계획에 붙은 암호 승인 서명을 확인할 뿐입니다. 누가 어떤 순서로 검토하고 승인자 키를 누가 보관하는지는 조직의 절차입니다. 선언된 시스템 목록(CMDB)을 관측 결과와 대조하는 일도 이 소프트웨어의 몫이 아닙니다.

지원 범위

관측 변경 생성
Linux의 OpenSSL ✅ ✅ OpenSSL 3.5 이상: 설정 조각만. 3.0–3.4: 사용자가 제공하는 provider 모듈을 놓고 설정 조각을 더함. 1.1.1 이하: 아무것도 생성하지 않음. 라이브러리 교체는 수동 단계이고 출력에도 그렇게 표시함
Java(JCA) ✅ Linux, 그리고 JDK가 있는 Windows 머신 ✅ Linux 대상. JDK 24 이상: java.security 조각만, 고전 그룹도 함께 유지함. JDK 8 이상: provider 라이브러리를 놓고 등록 조각을 더함. 지원이 끝난 옛 JDK: 아무것도 생성하지 않음. JDK 업그레이드가 필요함
Windows(CNG) ✅ ❌ 아직 아님
네트워크 연결 ✅ Linux 해당 없음

pqcota는 1.0 이전입니다(현재 릴리스: v0.10.6). 관측과 생성은 Linux에서 처음부터 끝까지 동작하며 시험 시스템에서 시연했습니다. Windows 변경 생성은 계획 단계이고 제공되지 않았습니다. 릴리스 노트를 보세요.

데이터와 운영

보안팀이나 운영팀은 이 문서가 답하는 것보다 더 많은 질문을 하게 됩니다. FAQ를 보세요.

무엇을 수집하나. 시스템마다 로드된 암호 라이브러리와 그 버전, 등록된 Java 보안 provider, 지켜본 연결의 상대 주소와 포트, 프로토콜, 협상된 키 교환 그룹과 암호화 방식(cipher)을 수집합니다. 이것은 사용자 인프라에 관한 정보이므로 그에 맞게 다뤄야 합니다. 트래픽을 복호화하지 않고, 원시 패킷 캡처를 파일로 남기지 않습니다.

결과는 어디로 가나. 파일과 사용자가 지정한 데이터베이스에 저장합니다. pqcota 프로그램에는 내장된 업로드나 원격 측정 경로가 없습니다. 내려받기는 설치하거나 데모를 돌릴 때(소스 코드, 컨테이너 이미지) 일어나고, Ansible은 SSH로 사용자의 시스템에 접속합니다.

관측 대상에서 실행되는 프로그램. 상주 에이전트도 서비스도 없습니다. 제공되는 플레이북이 관측 프로그램을 임시 디렉터리에 복사해 실행하고, 결과를 모은 뒤 실행이 끝나면 그 디렉터리를 지웁니다. 실행이 실패하거나 중단되면 그 디렉터리가 남을 수 있으니 확인해야 합니다. Java 관측은 대상의 /tmp 아래, 그 디렉터리 밖에도 작은 파일 하나를 쓰며 이것은 지워지지 않습니다. 일부 관측에는 전제가 있습니다. 연결을 캡처하려면 네트워크 캡처 권한이 필요하고, 경로에 따라 Java 런타임에 닿으려면 JDK가 필요합니다.

접속 자격 증명. 인벤토리에는 로그인이나 키를 담는 필드가 없습니다. 자격 증명이 들어 있는 Ansible 대상 목록은 실행할 때 만들어 소유자만 읽게 하며 인벤토리에 저장하지 않습니다. 사용자가 직접 쓰는 파일도 민감하게 다루세요.

변경 되돌리기. 생성한 변경마다 짝이 되는 제거 파일이 있습니다. 변경은 기존 파일을 덮어쓰지 않고 파일을 더하므로 제거는 pqcota가 더한 것을 지웁니다. 계획에 활성화 단계(예: 재시작)가 있으면 제거가 먼저 그 계획의 비활성화 단계를 실행합니다. 이것은 이전 배포를 복원하는 것이 아닙니다. 같은 경로에 두 번 배포했다면 제거는 파일을 지울 뿐 앞선 버전을 되살리지 않습니다. 설정으로 구현할 수 없는 변경은 수동 단계로 표시되며 되돌리는 것도 수동 단계입니다.

승인. 계획이 확정되지 않았거나 승인되지 않았으면 생성을 중단합니다. 기본적으로 승인 서명을 승인자의 등록된 공개 키로 확인하고, 확인하지 못하면 거부합니다. 승인자 키를 하나도 등록하지 않았을 때에 한해, 확인 없이 계속하는 명령줄 옵션이 있고 그것을 쓰면 사용자가 선택한 것이라는 경고가 출력됩니다. 키를 등록했다면 맞지 않는 서명은 옵션과 상관없이 거부합니다.

이력. 인벤토리는 새 기록을 더하는 방식으로 변경을 남기며, 일반 명령은 옛 기록을 고치지 않습니다. 명령 하나, pqcota-prune은 더 보관하고 싶지 않은 오래된 이력을 삭제하고 삭제 사실을 기록합니다. 이것은 도구의 동작에 대한 설명입니다. 데이터베이스 관리자 권한을 가진 사람의 변조까지 막는 것은 아닙니다.

직접 해 보기

  • 시청(3분 37초): 시연영상(영문판)은 관측부터 생성한 변경을 시험 시스템에 적용하고 되돌리기까지 보여 줍니다. 소리가 없고 자막이 있으며 릴리스 v0.10.3로 촬영했습니다.
  • 실행: Docker가 있으면 demo/가 컨테이너에서 전체 흐름을 돌립니다. 선택 단계(DEMO_REAL_PROVIDER=1)는 실물 양자내성 provider를 빌드하고, 생성한 파일을 OpenSSL 3.0.13이 도는 시험 노드에 적용했다가 되돌립니다. 2026년 9월 30일 실행에서 그 노드의 openssl list -kem-algorithms에 나오는 ML-KEM 항목 수가 적용 후 0에서 14로, 되돌린 뒤 다시 0으로 바뀌었습니다. 이것은 그 노드에서 알고리즘을 쓸 수 있게 됐다는 것을 보일 뿐, 어떤 연결이 그것을 썼다는 것을 보이지는 않습니다. pqcota가 아직 OpenSSL의 provider 계층을 관측하지 않고, 연결에는 양쪽의 지원이 모두 필요하므로, 다시 관측해도 인벤토리가 바뀌지 않았다고 데모의 출력도 알립니다.
  • 사용자의 시스템에서: 엔지니어에게 빌드 안내에서 시작하도록 요청하세요. 관측에는 관측 대상 시스템에 상주하는 소프트웨어가 필요 없지만, 일부 경로에는 권한이나 JDK가 필요합니다. 데이터와 운영을 보세요.

배경

이 주제가 생긴 까닭. NIST는 오늘의 공개 키 암호를 깰 수 있는 양자컴퓨터가 언제 나올지 아무도 정확히 모르며 추정은 몇 년에서 수십 년까지 다양하다고 밝힙니다. 또 시스템을 새 표준으로 옮기는 데 10년에서 20년이 걸릴 수 있고, 공격자가 지금 암호화된 데이터를 기록해 두었다가 나중에 풀 수 있다고 밝힙니다. NIST는 조직이 전환을 시작하도록 권합니다(NIST). 오랫동안 기밀로 남아야 하는 데이터가 가장 먼저 걱정되는 대상입니다.

새 표준은 무엇인가. 2024년 8월 13일 NIST는 FIPS 203(키 설정용 ML-KEM)과 FIPS 204(ML-DSA), FIPS 205(SLH-DSA)를 발표했으며 뒤의 둘은 모두 전자서명용입니다(NIST 발표).

하이브리드. 하이브리드 키 교환은 고전 알고리즘과 양자내성 알고리즘을 결합해, 둘 중 하나라도 안전성을 유지하는 한 공유 비밀이 보호되도록 하는 것을 목표로 합니다. 인증이나 구현의 결함을 고치지는 못합니다(IETF RFC 9954).

단일 패치가 아니라 조직 차원의 전환 활동. PQC 이관은 업데이트 한 번으로 끝나지 않습니다. 조직은 보통 네 가지 질문을 차례로 다룹니다. 암호를 어디서 어떤 알고리즘으로 쓰는가, 그중 무엇을 먼저 바꿀 것인가(사람의 결정), 운영을 흔들지 않고 어떻게 바꿀 것인가, 바꾼 뒤에 어떻게 확인하고 계속 확인할 것인가입니다. pqcota는 첫째와 셋째, 넷째를 돕고 둘째는 사용자에게 맡깁니다.

용어

용어 뜻
PQC 양자내성암호: 기존 컴퓨터와 양자컴퓨터의 공격을 모두 견디도록 설계된 알고리즘
키 교환 연결을 시작할 때 두 시스템이 공유 비밀을 합의하는 방법. 「지금 기록해 두었다가 나중에 해독」 공격에 노출되는 부분입니다
하이브리드 고전 알고리즘과 양자내성 알고리즘을 함께 쓰는 것
CBOM 암호 자산 명세서: 소프트웨어의 암호 알고리즘·키·인증서 등과 그 관계를 기록하는 명세서입니다. pqcota는 CycloneDX 형식을 받습니다
provider OpenSSL이나 Java에 알고리즘을 공급하는 플러그인 라이브러리. 제품을 바꾸지 않고도 양자내성 알고리즘을 더할 수 있습니다
노드 관측하는 머신, 가상 머신, 컨테이너 하나
스냅샷 한 노드의 한 시점 상태 기록. 상태가 바뀔 때만 새 스냅샷을 저장하고, 반복 관측은 기존 것에 집계합니다
Ansible 많은 머신에 설정을 적용하는 흔한 도구. pqcota가 생성하는 파일은 표준 Ansible 파일입니다
승인 서명 승인자가 자신의 이름으로 계획에 생성한 전자서명. pqcota가 변경을 생성하기 전에 확인합니다

라이선스와 더 보기

Copyright 2026 Great Honor randyinthedev@gmail.com. 라이선스는 Apache License 2.0(영문)이며, 저자 이름은 AUTHORS에 설명되어 있습니다.

의존성 라이선스는 라이선스 안내와 THIRD-PARTY-NOTICES에 있습니다. 릴리스 노트 · 개발자 문서 · 단계별 첫 이관 · FAQ · 보고 안내 · 빌드 안내 · 기여 · 호환성 정책 · 구조와 흐름(릴리스 노트와 제3자 고지는 영문입니다). pqcota는 다섯 리포 중 하나이며 목록은 CONTRIBUTING에 있습니다. 이름은 PQC와 오케스트라를 합친 것입니다. pqcota는 한 파트를 연주하고, 지휘자는 사용자입니다.

English