Lobste.rs 의견들
  • 훌륭한 글이고, 이런 게 가능하다는 사실을 드러내는 것만으로도 매우 유익함
    개인적으로는 이걸 동작시키는 데 맞는 라이브러리 버전을 찾지 못했지만, 1Password 8은 SSH 키를 안전하게 저장하고 에이전트가 생체 인증으로 키 잠금 해제를 지원한다는 걸 알게 됨
    그래서 이제 손가락을 대는 것만으로 git 작업도 하고 SSH 호스트에도 로그인할 수 있음
    안내: https://developer.1password.com/docs/ssh/get-started/

  • 이건 Mac 전용처럼 보임

    • 회사에서 최신 Windows 노트북을 쓸 수 있어서, 다음처럼 OpenSSH가 Windows Hello와 연동되게 했음
      winget install Microsoft.OpenSSH.preview  
      ssh-keygen -t ecdsa-sk  
      
      이후에는 예전처럼 동작했고, 키로 어디든 SSH 접속할 때마다 표준 Windows Hello 흐름을 거쳐 지문 인식기, 얼굴 인식, PIN 중 하나를 사용할 수 있었음
      그런 보안 요소가 있는 Linux 시스템은 써볼 수 없었고, 내 Linux 워크스테이션에는 V1 TPM이 있지만 서명 작업을 실제 사용자 존재 확인 뒤에만 실행되게 보장하는 방법은 딱히 모르겠음
      Framework 같은 Linux 노트북을 가진 사람이 시도해볼 수 있을지도 모름. 어쩌면 Asahi에서도 실제로 동작할 수 있음
    • 거의 그렇다고 봄. Linux나 Windows에서 TPM2 FIDO 에뮬레이션 계층이 있는지는 잘 모르겠음
  • 그래서 제공된 private key 파일 안에는 정확히 뭐가 들어 있는 거임?

    • @wrs가 먼저 답했지만, ssh: 부분, 즉 애플리케이션은 passkey의 origin에 해당하며 호스트나 도메인별 resident key를 만들 때 유용함
      예를 들어 같은 물리 Yubikey 안에서도 용도별로 키를 분리하는 데 쓰고 있음
      flags는 하드웨어가 키를 어떻게 다뤄야 하는지 지정함 [1]. 에이전트가 자체 제약을 덧붙일 수도 있음
      기술적으로는 FIDO 키에 다른 블롭이나 확장도 저장할 수 있고, 이전 직장에서는 인증과 함께 X.509 공개 키 같은 보조 자격 증명을 넘기는 데 써본 적이 있음. 꽤 멋진 방식임
      [1]
      #define SSH_SK_USER_PRESENCE_REQD  0x01  
      #define SSH_SK_USER_VERIFICATION_REQD  0x04  
      #define SSH_SK_FORCE_OPERATION    0x10  
      #define SSH_SK_RESIDENT_KEY    0x20  
      
    • Claude에 따르면, 그리고 openssh_key_parser로 검증해보면 구조는 다음과 같음
      바깥 래퍼에는 매직값 openssh-key-v1\0, cipher=none, kdf=none이 있어서 암호문이 아님
      공개 키 블롭 74바이트에는 키 타입 sk-ssh-ed25519@openssh.com, 32바이트 Ed25519 점 fdcce889…03e7852b, 애플리케이션 ssh:가 들어 있으며, 이 값이 SSH와 WebAuthn의 FIDO 자격 증명을 네임스페이스로 분리함
      개인 섹션은 248바이트이고 cipher=none이라 평문임. checkint1 == checkint2 == 0x46744267 랜덤값, 반복된 키 타입과 공개 키, 애플리케이션 ssh:, flags: 0x01이 들어 있음
      이 플래그는 USER_PRESENCE_REQUIRED라 터치가 필요하지만 PIN/사용자 검증은 없고, 비상주 키임
      key_handle은 128바이트짜리 불투명 자격 증명 ID로 authenticatorGetAssertion에 전달되고, 장치가 내부적으로 풀어서 Ed25519 시드를 복구함
      그 밖에 빈 reserved, 주석 ahelwer@ah-mbair.local, 패딩 01 02 03이 있음
    • base64 디코더에 넣으면 다음이 나옴

      openssh-key-v1����none���none����������J���sk-ssh-ed25519@openssh.com��� 盘˪<F$KW+���ssh:���FtBgFtBg���sk-ssh-ed25519@openssh.com��� 盘˪<F$KW+���ssh:���fІpF$D8"&0[X 'L=Ev ')BjM]$}rTv6Z+p9O8ݹ%V* f.|қ.%I{9 .W !D"8N ai*W�y53 �������ahelwer@ah-mbair.local
      여기에는 키 표준 버전 v1, 키 타입 sk-ssh-ed25519@openssh.com이 들어 있고 어떤 이유로 반복되며, 사람이 알아보기 쉬운 키 이름 ahelwer@ah-mbair.local도 있음
      나머지는 OpenSSH 플래그, 예를 들면 PIN이나 사용자 존재 확인 필요 여부, 그리고 OpenSSH가 챌린지와 함께 FIDO/U2F API로 보낼 수 있는 핸들 GUID일 것 같음
      OpenSSH는 키 타입, 특히 sk를 보고 이게 실제 개인 키가 아니라 보안 요소를 호출해야 한다고 추론할 수 있음
      그다음에는 보안 요소와 통신하게 해주는 동적 라이브러리를 어디서 로드할지 SecurityKeyProvider 설정이나 SSH_SK_PROVIDER 환경 변수를 확인함

  • 이 글은 SSH만 다루는 것 같은데, 내 컴퓨터의 Secure Enclave나 TPM을 FIDO2 또는 U2F 키로 쓸 방법이 있을까?

    • 당연히 가능하고, 거의 기본 설정만으로 동작해야 함
      Passkey도 웹사이트마다 별도의 개인 키를 쓰는 이런 방식의 한 형태임
  • 이 사실을 보면, 하드웨어에 묶을 수 있는 비대칭 또는 HMAC API 키 지원이 더 흔하지 않다는 게 이상하게 느껴짐
    WebAuthn, DBSC(Device-Bound Session Credentials), OAuth2 DPOP처럼 이런 방향을 더 밀어주는 명세가 늘어나는 건 반가움