
Android 휴대폰의 지문으로 Linux 워크스테이션의 sudo를 승인하세요. LAN 전용이며, ECDSA 키는 휴대폰의 TEE를 벗어나지 않고 pam_rssh와 ssh-agent 프로토콜로 통신합니다.
Android 휴대폰의 지문 센서를 터치하여 Linux 머신에서 sudo를 승인하세요.
sudo를 입력하면 휴대폰이 진동하고, 센서를 터치하면 명령이 실행됩니다. 비밀번호를 입력할 필요도
없고, 클라우드에 아무것도 저장되지 않습니다. 휴대폰이 LAN을 통해 응답하며, 지문은 앱 코드가 아닌
휴대폰의 보안 하드웨어(TEE / StrongBox)에 의해 검증됩니다. 문제가 생기면(휴대폰 꺼짐, 범위 밖,
거부 탭, 60초 경과) sudo는 그냥 일반 비밀번호 프롬프트로 폴백합니다. sudo를 더 편리하게
만들 수는 있어도, 잠금 상태로 만들 수는 없습니다.
![]() 1. 호스트에서 sudo 실행 누가 요청하는지 휴대폰에 팝업이 뜹니다. 여기서 바로 거부할 수 있습니다. |
![]() 2. 탭하기 카운트다운, 호스트와 시간, 처음 보는 호스트에 대한 경고가 표시됩니다. 그다음 시스템 지문 프롬프트가 뜹니다. |
![]() 3. 센서 터치 TEE가 서명하고, sudo가 진행되며, 앱이 스스로 종료됩니다. |
![]() 첫 실행 세 단계와 버튼 하나. 휴대폰에 지문이 없으면 지문 등록을 제안합니다. |
![]() 설정 실시간 체크리스트: 리스너, 알림, 배터리, 방해 금지. 모두 통과해야 "준비 완료"가 됩니다. |
![]() 거부 또는 시간 초과 휴대폰에서 서명이 전송되지 않으며, 호스트가 비밀번호를 요청합니다. |
Pixel 7 에뮬레이터에서 촬영한 스크린샷입니다(따라서 10.0.2.2는 에뮬레이터의 호스트입니다). 2단계 위에 나타나는
시스템 지문 시트는 보안 창이므로 스크린샷에 표시되지 않습니다.
sudo on the host
-> PAM: pam_rssh (third-party) dials the phone over the LAN, as an ssh-agent
-> phone: "Approve sudo? From 192.168.1.10" (notification)
-> tap -> BiometricPrompt -> fingerprint
-> the phone's TEE signs pam_rssh's fresh 32-byte challenge
-> pam_rssh verifies against the pinned public key -> sudo proceeds
pam_rssh의
것입니다. 여기서 작성된 어떤 것도 인증 시점에 호스트에서 root로 실행되지 않습니다.setUserAuthenticationParameters(0, AUTH_BIOMETRIC_STRONG)으로 생성됩니다. 즉 모든 서명마다
새로운 강력 생체 인증이 필요하며, 이는 TEE(또는 StrongBox) 내부에서 강제됩니다. 휴대폰의
악성코드도 당신의 손가락 없이는 서명할 수 없으며, 키는 내보낼 수 없습니다.SECURITY.md에는 보호하지 않는 대상까지 포함한 전체 위협 모델이 있습니다. docs/DESIGN.md에는 설계와 그 근거가 있습니다.
휴대폰: Android 11+ (API 30, 사용 시점별 생체 인증 키를 표현할 수 있게 된 버전) 및 Class 3("강력") 지문 센서.
호스트: 아래 플랫폼 중 하나. 설치 프로그램이
pam_rssh를 함께 가져옵니다. 패키지가 있으면 패키지를,
없으면 고정되고 검증된 커밋에서 빌드합니다.
| 플랫폼 | 상태 |
|---|---|
| Arch, Manjaro, EndeavourOS | ✅ CI에서 엔드 투 엔드 테스트 완료 |
| Debian 12 / 13, Ubuntu 24.04, Mint, Pop!_OS | ✅ CI에서 엔드 투 엔드 테스트 완료 |
| Fedora, RHEL / Rocky / Alma 9 | ✅ CI에서 엔드 투 엔드 테스트 완료 |
| openSUSE Tumbleweed | ✅ CI에서 엔드 투 엔드 테스트 완료 |
| Windows, WSL 경유 (위의 모든 배포판) | 🧪 작동해야 하지만 미검증; 검색이 WSL2의 NAT 너머로 휴대폰을 보지 못할 수 있으므로 --phone을 전달하세요 |
macOS 14+ (/etc/pam.d/sudo_local 경유) | 🧪 실험적, 미검증 |
FreeBSD (security/pam_rssh 포트) | 🧪 실험적, 미검증 |
"엔드 투 엔드 테스트 완료"는 모든 푸시마다 해당 배포판의 새 컨테이너에서
tools/test/e2e.sh를 실행한다는 뜻입니다. 즉 설치 프로그램, pam_rssh,
그리고 **실제 sudo**를 모의 휴대폰에 대해 실행합니다. sudo는 휴대폰이 승인하면 비밀번호 없이
통과해야 하고, 거부하면 비밀번호로 폴백해야 하며, 롤백에 의해 바이트 단위로 복원되어야 합니다.
휴대폰과 호스트가 같은 LAN에 있고, 휴대폰이 고정 주소(DHCP 예약)를 가져야 합니다.
1. 휴대폰. Releases
페이지에서 앱을 설치하거나, Obtainium이 앱을 설치하고
최신 상태로 유지하도록 하세요. https://gitlab.com/ritwick7/sudostamp를 앱으로 추가하면 됩니다. 앱을 열고 Get started를 탭하세요.
키가 휴대폰의 보안 하드웨어 내부에서 생성되고, 휴대폰이 컴퓨터를 기다립니다.
모든 릴리스 APK는 동일한 키로 서명됩니다. 설치 전에 다운로드를 확인하려면:
sha256sum -c --ignore-missing SHA256SUMS # from the same release page
apksigner verify --print-certs sudostamp-v*.apk | grep SHA-256
# must be 7bcb0b51246197b9bb99779e09a3adcbbaeb2d59a0edecf8d2e8be67844d0657
2. 컴퓨터. 두 줄이면 되고, 클론은 필요 없습니다:
curl -fsSLO https://gitlab.com/ritwick7/sudostamp/-/releases/permalink/latest/downloads/sudostamp-setup.sh
sudo bash sudostamp-setup.sh
Arch에서는 yay -S sudostamp를 실행한 다음 sudo sudostamp setup을 실행합니다(업데이트는 시스템과 함께 제공됩니다).
sudostamp-setup.sh는 하나의 자체 포함 파일입니다. 설치 프로그램과 그 헬퍼들이 전부이며, 숨겨진 것은 없습니다.
root로 실행하기 전에 먼저 읽어 보고, 릴리스 페이지에 있는 것과 SHA-256을 비교하세요. 이 파일은
태그된 소스(scripts/bundle-host.sh)로부터 결정적으로 빌드되므로, 직접 다시 빌드해서 바이트 단위로
비교할 수도 있습니다.
이것이 설정의 전부입니다. 네트워크에서 휴대폰을 찾고, 휴대폰에 6자리 코드가 표시됩니다: