Rust로 작성된 현대적이고 메모리 안전한 SSH 서버 OxiSH를 소개합니다.
OxiSH는 제가 20개월 동안 작업해 온 현대적이고 메모리 안전한 SSH 서버이며, 이를 기쁘게 발표합니다. OxiSH는 Rust로 작성되었고, 안전한 sans-I/O 프로토콜 코어와 기반 암호화 기본 요소를 위한 추상화를 갖추고 있습니다.
많은 대형 조직은 C와 C++로 작성된 소프트웨어의 보안 취약점 중 최대 70%가 메모리 안전성 문제로 발생한다는 점을 보여 주었습니다(Microsoft, Google). 미국에서는 정부 기관들이 몇 년 전부터 메모리 안전 프로그래밍 언어의 사용을 권고해 왔습니다. Prossimo 프로젝트는 메모리 안전성이 가장 중요한 영역의 우선순위를 정하는 데 도움이 되는 세 가지 위험 기준을 제시합니다.
SSH 서버는 이 세 기준을 모두 충족합니다.
OpenSSH는 주된 구현체이며, C로 작성되어 수십 년간 존재해 왔습니다. 오늘날까지도 계속해서 메모리 안전성 문제를 겪고 있습니다. 저는 메모리 안전한 대안에 투자할 가치가 있다고 생각했기에 OxiSH를 시작했습니다.
OxiSH를 시작하기 전에, 이 아이디어를 더 빨리 현실로 만들 수 있도록 도와줄 기존 Rust SSH 구현체를 찾아보는 데 시간을 들였습니다. 특히 상당히 인기 있어 보이는 russh를 살펴보았습니다. 하지만 오래된 암호화 기본 요소 일부를 구현하고 있으며 설계도 상당히 단일 구조처럼 보였기에, 대신 처음부터 시작하기로 했습니다.
OxiSH를 반쯤 비공개인 방식으로 계속 개발할 수도 있었지만, 이제는 공개적으로 발표하기에 충분히 좋은 상태라고 생각합니다. 그렇다고 프로덕션 사용 준비가 되었다는 뜻은 아니며, 여러 제한 사항이 있습니다(아래 참고). 이는 출발점이며, 다른 분들의 피드백과 기여를 기다리고 있습니다. 저 역시 곧 제 서버에서 이를 직접 실사용하기 시작할 예정입니다.
Tokio 기반 비동기 네트워킹 서버와 sans-I/O SSH 프로토콜 코어, 공개 키 인증 지원(Ed25519 및 ECDSA P-256 키만 지원), 그리고 자식 프로세스를 생성하고 이를 SSH 세션에 연결할 수 있는 기본 셸 구현을 갖추고 있습니다. CI에서 OpenSSH 클라이언트를 대상으로 Linux와 macOS에서 테스트합니다. Windows 지원도 있으면 좋겠지만, 이를 위해서는 다른 누군가의 참여가 필요합니다. 아직 클라이언트 구현체는 없으며, 현재로서는 이를 작업할 계획도 없습니다. 다만 sans-I/O 코어는 이를 가능하게 하는 데 충분히 활용될 수 있습니다. 저수준 sans-I/O API 외에도 재사용을 가능하게 하는 라이브러리 API가 있으며, 현재는 규모가 작습니다.
암호화 기본 요소는 graviola와 aws-lc-rs라는 두 가지 서로 다른 백엔드로 구현됩니다. Cargo 기능을 사용해 컴파일 시점에 사용할 백엔드를 선택할 수 있습니다. 기본값인 graviola는 빌드하기 쉽지만 x86-64와 ARM64에서만 작동합니다. 반면 aws-lc-rs는 이식성이 더 뛰어나고 약간 더 효율적일 것으로 예상되며 Linux에서 FIPS 모드로 컴파일할 수 있습니다. mlkem768x25519-sha256 알고리즘을 사용한 하이브리드 포스트퀀텀 키 교환을 구현하며, 이전 클라이언트를 위한 대체 키 교환 알고리즘으로 curve25519-sha256도 지원합니다. 지원되는 공개 키 알고리즘은 Ed25519와 ecdsa-sha2-nistp256뿐이고, 지원되는 암호화 알고리즘은 AES-128-GCM뿐이며, 지원되는 해시 알고리즘은 SHA-256뿐입니다. 기반 백엔드가 지원하는 다른 알고리즘을 추가하는 일은 상당히 쉬울 것이지만, 공격 표면을 줄이기 위해 그 집합을 가능한 한 작게 유지하고 싶습니다.
메모리 안전성 영역 밖에서도 OxiSH의 설계와 구현이 유사한 실수를 피하도록, 과거 OpenSSH 취약점을 검토하는 데 노력을 기울였습니다. 향후 코드베이스의 외부 감사를 위해 비용을 지불하고 싶지만, 그 작업을 직접 지원할 자금을 마련할 수 있을 가능성은 낮습니다.
더 명확한 누락 기능 몇 가지는 다음과 같습니다.
OpenSSH와의 완전한 기능 호환성(심지어 버그 단위 호환성까지도)은 명시적으로 이 프로젝트의 목표가 아닙니다. 하지만 각자의 환경에서 OpenSSH를 대체하기 위해 사람들이 무엇을 필요로 하는지 더 듣고 싶습니다. 이슈를 등록해 주세요!
대부분의 코드는 제가 작성했고, 모든 코드를 아주 상세하게 검토했습니다. 저는 Rust 코드를 작성한 경험이 10년 이상이며, 지난 몇 년 동안 다음을 포함한 몇몇 인기 네트워크 프로토콜 프로젝트를 유지 관리해 왔습니다.
올해 초 몇 주 동안 Trifecta Tech Foundation의 훌륭한 분들로부터 도움을 받을 수 있었던 것은 행운이었습니다. 이들은 Sovereign Tech Agency로부터 투자를 받아 서버 내 일부 핵심 플랫폼 상호작용을 파악하는 데 도움을 주었으며, 여기에는 권한 분리와 터미널 처리의 초기 초안이 포함됩니다. 앞으로도 이 프로젝트에서 협력을 이어갈 수 있기를 바랍니다.
앞서 언급했듯이, 이는 단지 출발점입니다. 피드백을 남기거나 직접 PR을 기여해 주세요(참여하기 전에 AI 정책을 포함한 기여 지침을 확인해 주세요). OxiSH 및 다른 프로젝트에 대한 제 작업을 지원하고 싶으시다면, 후원을 고려해 주세요. 비공개로 연락하고 싶으시다면, 제 이메일 주소는 웹사이트에서 쉽게 찾으실 수 있을 것입니다.