요약

  • RFC 9987은 클라이언트 주도의 SSH 에이전트 프로토콜을 표준화합니다. 서명 요청은 공개 키를 지정하고 데이터와 플래그를 전달하며 서명 또는 실패를 받습니다. 응답에는 사람의 의도, 프로세스 신원, 목적지 또는 업무 목적에 대한 표준적 기록이 담기지 않습니다.
  • 에이전트 프로토콜 자체에는 인증이나 전송 보호가 없습니다. 엔드포인트에 접근하면 보통 개인 키 작업을 요청하기에 충분하며, 이 접근을 전달하면 개인 키 바이트가 로컬에 남아 있더라도 전이적 신뢰가 만들어집니다.
  • 확인 제약, 수명, 에이전트 잠금, 다운스트림 SSH 서버의 판단은 서로 별개의 통제입니다. Daniel Kade는 이 판정들을 개인 키, 암호구 또는 민감한 서명 입력을 저장하지 않고 연결하는 프라이버시 보호형 서명 의도 영수증을 제안합니다.

서명이 유효하더라도 권한 스토리는 불완전할 수 있다

운영팀은 안심시키는 결과를 제시받을 수 있습니다. 서명 에이전트가 성공을 반환했고, 서명이 검증되며, 개인 키는 결코 내보내지지 않았다는 것입니다. 각 진술은 참일 수 있지만 팀은 여전히 거버넌스 질문에 답할 수 없습니다. 어떤 프로세스가 이 작업을 요청했는가? 로컬이었는가, 아니면 원격 호스트가 전달된 채널을 통해 에이전트에 도달했는가? 그 순간 어떤 제약이 활성화되어 있었는가? 사람이 확인했다면, 프롬프트는 어떤 안전한 맥락을 보여주었는가? 신뢰하는 SSH 서버는 요청된 계정에 대해 그 키를 수락했는가, 다른 요소를 요구했는가, 요청을 거부했는가, 아니면 이후 명령이 거부된 세션을 허용했는가?

RFC 9987은 2026년 5월 IETF 제안 표준으로 공개되었으며, 개인 키를 보유하거나 그 접근을 위임하는 구성 요소와 클라이언트 간 프로토콜을 정의합니다. 이 프로토콜은 패킷화되고, 요청-응답 방식이며, 전적으로 클라이언트가 주도합니다. 에이전트는 키를 적재하고, 제거하고, 클라이언트에 보이는 키를 나열하고, 서명 작업을 수행하고, 자신을 잠그고, 확장을 노출할 수 있습니다. 이 사양은 오래된 인터페이스를 공통 프로토콜로 만듭니다. 그러나 에이전트를 서명이 사용될 모든 목적을 이해하는 기관으로 바꾸지는 않습니다.

구분은 서명 요청 자체에서 시작됩니다.SSH_AGENTC_SIGN_REQUEST는 공개 키 블롭, 데이터 문자열, 플래그를 담습니다. 성공 응답은SSH_AGENT_SIGN_RESPONSE와 결과 서명을 담습니다. 데이터는 SSH 인증 요청일 수 있지만, 일반 에이전트 메시지는 그것을 유일한 의미로 선언하지 않습니다. 요청을 시작한 실행 파일, 사람 주체, 대상 호스트, 원격 계정, 명령, 티켓, 승인 규칙, 인가 결과를 위한 필수 필드가 없습니다. 암호학적 정확성은 선택된 키가 주어진 바이트에 서명했다는 것만 말합니다. 빠진 맥락을 만들어낼 수는 없습니다.

이것은 표준의 결함이 아닙니다. 좁은 인터페이스는 더 상호운용적이고 보호하기 쉬울 수 있습니다. 실수는 이후, 대시보드가 “에이전트가 서명을 반환했다”를 “사용자가 동의했다” 또는 “작업이 인가되었다”로 승격시킬 때 발생합니다.BTW Media가 존재하는 이유는 주장과 실제 관찰 가능한 것 사이의 구분을 지킬 것을 논합니다. 여기서 관찰 가능한 사건은 키 작업입니다. 동의와 인가는 각자의 증거가 존재할 때까지 별개의 주장으로 남습니다.

키 보유는 추출을 막을 뿐, 모든 무단 사용을 막지는 않는다

RFC 9987의 보안 섹션은 이례적으로 직접적입니다. 에이전트 프로토콜 자체는 클라이언트 인증도 전송 보안도 제공하지 않습니다. 일반적인 시스템에서 로컬 소켓이나 명명된 파이프가 프로토콜을 운반하며, 주변 운영체제가 소유자와 인가된 위임자로 접근을 제한하도록 기대됩니다. 표준은 에이전트에 도달하는 것만으로도 보통 개인 키 작업을 요청하기에 충분하다고 경고합니다.

이로써 키 보유는 두 가지 다른 의미를 가집니다. 첫째는 개인 키 바이트의 소유입니다. 에이전트는 키를 더 작고 특별히 보호된 프로세스나 하드웨어 토큰 안에 두어 노출을 줄일 수 있습니다. 둘째는 키를 작동시킬 권한입니다. 적대적 프로세스는 키를 추출하지 못하면서도 접근 가능한 무제한 에이전트에게 서명을 요구할 수 있습니다. RFC 9987은 그 상태를 도난된 사용으로 기술하고, 무제한 에이전트가 부채널 관찰을 위한 거의 이상적인 오라클이 될 수 있다고 지적합니다. 따라서 “내보낼 수 없음”은 보유에 대한 유용한 증거이지 적법한 사용에 대한 보편적 판정이 아닙니다.

같은 구분이 하드웨어 기반 키에도 적용됩니다. 토큰 호스팅 신원을 에이전트에 적재하면 이후 개인 키 작업이 보통 토큰에 위임됩니다. 에이전트에서 제거하는 것이 토큰에서 삭제되어서는 안 됩니다. 에이전트 인벤토리와 토큰 인벤토리는 다른 상태입니다. “신원 제거됨”이라는 비상 기록은 그 신원이 사라진 층과 토큰이 다시 호출될 수 있는 남은 경로를 명시하지 않는 한 불완전합니다.

정책의 거울은 올바른 규율을 제시합니다. 정책은 통제의 실제 분포를 반영해야 합니다. 에이전트는 자신의 인터페이스가 작업을 수행할지 통제합니다. 운영체제는 누가 엔드포인트에 도달할 수 있는지 통제합니다. 토큰은 키 재료와 어쩌면 로컬 존재를 통제할 수 있습니다. 원격 서버는 키가 수용 가능한 인증자인지 통제합니다. 서비스나 셸 정책은 인증된 세션이 무엇을 할 수 있는지 통제합니다. 그 어느 행위자도 모든 결정이 결국 하나의 서명에 닿는다고 해서 다른 이의 결정을 얻지 못합니다.

제약은 장식이 아니라 상태다

RFC 9987은 제약된 키 적재를 정의합니다. 수명 제약은 에이전트에게 일정 시간 후 키를 삭제하도록 요구합니다. 확인 제약은 개인 키 작업마다 명시적 사용자 확인을 요구합니다. 명명된 확장이 다른 제한을 도입할 수 있으며, 요청된 제약을 이해하지 못하는 에이전트는 한도를 조용히 무시하는 대신 제약된 키를 거부해야 합니다.

이 규칙들은 중요한 증거 경계를 만듭니다. 키 지문만으로는 현재 권한이 드러나지 않습니다. 같은 키가 다시 추가되면 표준은 새 요청이 이전 제약을 대체해야 한다고 하거나, 에이전트가 적재를 거부할 수 있습니다. 따라서 질문은 단순히 “이 키가 제약되었는가?”가 아닙니다. “이 작업이 발생했을 때, 어떤 적재 또는 대체 시대 아래, 이 클라이언트에 대해 어떤 제약 집합이 활성화되어 있었는가?”입니다. 어제 찍은 스크린샷과 사건 후에 촬영한 인벤토리는 그 시간 특정 질문에 답할 수 없습니다.

확인도 똑같이 세심한 취급이 필요합니다. 표준은 확인 대화상자를 예로 듭니다. 보편적 표시 계약을 규정하지 않습니다. 클릭은 상호작용이 긍정 결과를 반환했다는 것을 증명합니다. 시스템이 사람이 바이트, 목적지, 결과를 정확히 표현하는 맥락을 보았다는 것도 보여줄 때만 정보에 입각한 동의를 증명합니다. 원시 데이터는 너무 민감하거나 불투명할 수 있지만, “키 사용을 허용할까요?” 같은 일반 메시지는 계정 수준이나 명령 수준의 결정을 담기엔 너무 얇습니다. 운영 인터페이스는 안전하고 이해 가능한 요약을 제시하고 그것을 정확한 작업에 결합해야 합니다.

잠금 상태 역시 독립적 판정입니다. 잠기면 에이전트는 올바른 암호구로 잠금 해제될 때까지 최소한 개인 키 서명 작업을 중단해야 합니다. 성공적인 잠금 해제는 에이전트 상태 전이를 확립할 뿐입니다. 이후 요청자를 식별하거나, 목적지를 승인하거나, 적재된 모든 키가 모든 계정에 적합하다고 만들지 않습니다. 잠금 해제를 일괄 동의로 취급하면 일시적 기능 활성화 사건을 원래 감당하도록 설계되지 않은 권한으로 변질시킵니다.

포워딩은 신뢰 경계를 넘어 사용을 위임한다

에이전트 포워딩은 원격 시스템이 개인 키 재료를 받지 않고 로컬 키를 사용할 수 있기 때문에 매력적입니다. 그것은 실제 보안 속성입니다. 동시에 위임이기도 합니다. RFC 9987은 포워딩을 전이적 신뢰 관계로 부르고, 구현이 기본으로 활성화하지 말 것을 권고하며, 완전히 신뢰하지 않는 호스트에는 에이전트를 전달하지 말라고 사용자에게 말합니다. 원격 호스트의 공격자는 키가 클라이언트에 남아 있더라도 전달된 에이전트에게 키 사용을 요구할 수 있습니다.

채널 구조는 사후 귀속을 제한합니다. RFC 9987은agent-connect가 연결 요청을 시작한 세션 채널을 구별하는 식별자를 전달하지 않는다고 말합니다. 하나의 SSH 연결은 여러 세션을 운반할 수 있고, 클라이언트 측 에이전트는 동시 포워딩 연결을 볼 수 있지만, 기본 채널은 그 자체로 정확한 발생 세션을 이름 지을 수 없습니다. “이 SSH 전송으로 왔다”가 반드시 “이 셸, 프로세스 또는 사람이 요청했다”는 것은 아닙니다.

여기서실행 코드 우선이 운영적으로 중요합니다. 불필요한 포워딩에 대한 정책은 가치 있지만, 증거는 실행 중인 경계에서 와야 합니다. 소켓 소유권, 연결 상태, 포워딩 선택, 활성 제약, 요청 타이밍, 이후 검증자 결과입니다. 이런 관찰 없이 구성 선언만으로는 특정 서명이 어떤 경로를 따랐는지 증명할 수 없습니다.

인증 판정은 SSH 서버가 소유한다

다운스트림 SSH 프로토콜은 일반 에이전트에 없는 맥락을 제공합니다.RFC 4252는 공개 키 사용자 인증을 정의합니다. 그 서명은 SSH 세션 식별자와 사용자 이름, 서비스, 방법, 알고리즘, 공개 키를 포함하는 요청 필드를 커버합니다. 서버는 그 키가 그 사용자에 대해 유효한 인증자인지 결정하고 서명을 검증해야 합니다. 그런 다음에도 추가 인증을 요구할 수 있습니다. 최종 인증은 에이전트의 이전 서명 응답이 아니라 서버의SSH_MSG_USERAUTH_SUCCESS로 표시됩니다.

RFC 4253은 보호된 전송과 세션 식별자를 확립합니다.RFC 4254는 인증 이후 채널과 서비스를 다룹니다.RFC 4251은 전체 아키텍처를 제공합니다. 이 계층적 배치는 하나의 서명이 전체 스토리가 되는 것을 막습니다. 키 사용, 서버 인증, 채널을 열거나 운영할 권한은 서로 다른 결정으로 남습니다.

알고리즘 기록도 권한보다 좁습니다.RFC 8332는 RSA SHA-2 서명 방법을,RFC 8709는 SSH를 위한 Ed25519와 Ed448을 명세합니다.RFC 8308은 확장 협상을 제공합니다.IANA SSH 매개변수 레지스트리는 RFC 9987이 만든 식별자를 포함한 상호운용 가능한 식별자를 기록합니다. 이 출처들은 구현자에게 피어가 메커니즘을 어떻게 이름 짓고 처리하는지 말해줍니다. 등록된 방법이 배치되었거나, 특정 엔드포인트가 에이전트를 노출했거나, 사람이 특정 사용을 승인했다고는 말하지 않습니다.

6단계 서명 의도 영수증

책임 있는 설계는 감사 시스템을 비밀 저장소로 만들지 않으면서 권한 사슬을 따르는 영수증이 필요합니다. 첫 단계는 요청자 입장을 기록합니다. 경로가 로컬이었는지 전달되었는지, 이용 가능한 연결 또는 엔드포인트 증거, 정책 시대, 요청 식별자입니다. 주변 시스템에서 피어 신원이 이용 가능하면 무한정 프로세스 덤프 대신 안정적이고 최소화된 참조를 기록합니다.

두 번째 단계는 키 상태를 기록합니다. 공개 키 지문, 가시성 범위, 적재 또는 대체 시대, 활성 수명, 확인 및 확장 제약, 해당하는 경우 토큰 위임, 잠금 상태입니다. 개인 키, 토큰 PIN 또는 잠금 해제 암호구를 담아서는 안 됩니다.

세 번째 단계는 작업을 기록합니다. 에이전트에 제출된 정확한 데이터의 길이와 충돌 저항 다이제스트를 요청된 키 알고리즘 및 서명 플래그와 함께 저장합니다. 민감한 평문은 이미 그것을 필요로 하는 시스템에 남아 있어야 합니다. 다이제스트는 계정 이름, 명령 또는 다른 재료를 더 넓은 텔레메트리 평면으로 복사하지 않고 결합 지점을 만듭니다.

네 번째 단계는 확인을 기록합니다. 요구되었는가? 목적지, 계정, 프로토콜, 결과에 대한 어떤 안전한 설명이 표시되었는가? 어떤 신뢰된 상호작용 표면이 결정을 반환했는가, 언제, 결과가 승인인지 거부인지 이용 불가인지? 영수증은 거부의 부재만으로 동의를 추론해서는 안 됩니다.

다섯 번째 단계는 에이전트 판정을 기록합니다. 성공 또는 실패, 시간, 거부 클래스, 적절한 경우 서명에 대한 해시 또는 내부 식별자입니다. 여섯 번째는 신뢰 시스템 결과를 기록합니다. 의도된 프로토콜과 목적지, 세션 신원, 검증자 결정, 요청된 계정과 서비스, 추가 인증이 요구되었는지, 이후 인가 결과, 철회 또는 정정 경로입니다.

이 6단계 영수증은 Daniel Kade의 거버넌스 제안이며, RFC 9987이 요구하는 필드 집합이 아닙니다. 그 목적은 에이전트가 업무 정책을 이해하게 만드는 것이 아니라, 하나의 좁은 성공이 사슬의 나머지를 사칭하는 것을 막는 것입니다.

출처