SSH
Mac에서 게스트로 SSH — 실제로 동작하는 주소, ssh config에 추가되는 한 줄, 키, 계정, 호스트 키 신뢰.
SSH는 켜기 전까지 모든 머신에서 꺼져 있습니다. 활성화하면 게스트 로그인 경로가 열리며, 아무도 우연히 얻어서는 안 됩니다.
1vm ssh enable dev
1vm ssh config --install # add the Include line to ~/.ssh/config
ssh dev # plain ssh now resolves the machine
앱에도 동일한 제어가 있는 Configure → SSH 창이 있습니다. 어느 프런트엔드도 다른 쪽을 감싸지 않습니다.
실제로 동작하는 주소
사람들이 자주 막히는 부분이며 엔진에 따라 다릅니다. 1vm list에 보이는 게스트 주소는 항상 연결 가능한 것은 아닙니다.
| Engine | Network | Mac → guest |
|---|---|---|
| Virtualization.framework | NAT or host-only | Direct, to the guest's 192.168.64.x lease |
| Virtualization.framework | Bridged | Direct, to its LAN address |
| 1VM engine | NAT or host-only | Through a loopback port forward only |
| 1VM engine | Bridged | Direct, to its LAN address |
1VM 엔진에서 게스트는 상수 10.0.2.15의 사용자 모드 네트워크 스택 뒤에 있고 Mac에는 그 서브넷의 인터페이스가 없습니다. ssh 10.0.2.15는 거기서 절대 작동하지 않습니다. 작동하는 것은 포워드입니다:
ssh -p 2222 onevm@127.0.0.1
SSH를 켜면 이 포워드가 자동 생성되고 라이브 적용 — 재부팅 불필요. 포워드는 127.0.0.1에 바인딩하므로 SSH 활성화로 게스트가 네트워크에 노출되지 않습니다.
ssh config에 추가되는 한 줄
1vm ssh config --install은 ~/.ssh/config 맨 위에 센티넬로 구분된 블록을 정확히 하나 추가합니다:
# >>> 1VM managed >>> do not edit this block
Include ~/Library/Application Support/OneVM/VMs/.ssh/config
# <<< 1VM managed <<<
나머지는 라이브러리 자체 .ssh/ 디렉터리에 생성되므로 파일은 한 줄이고 1VM이 나머지를 소유합니다. ONEVM_HOME은 전체를 옮기므로 프로젝트 로컬 라이브러리는 자체 SSH config를 갖습니다.
소유하지 않은 파일을 편집할 때 따르는 규칙:
- 파일 맨 위 —
ssh_config는 first-obtained-wins이므로 기존Host *블록 뒤에Include를 두면 조용히 패배합니다. - 멱등. 열 번 실행해도 블록 하나.
- 원자적, 백업 포함. 쓰기 전 원본을 타임스탬프
config.1vm-backup-…에 복사. - 가역.
--uninstall은 센티넬 블록만 제거.--print는 쓰지 않고 표시. - 재정렬 대신 거부. 설정에 모든 호스트 옵션이 블록 위치보다 위에 있으면 1VM은 알리고 거부하며 파일을 재정렬하지 않습니다.
- 실제 호스트를 가리지 않음. 머신 이름이 ssh config에서 이미 해석되면
<name>.1vm별칭만 출력.
생성 블록 예 — 포트와 주소는 원시 게스트 IP가 아니라 위 도달 규칙에서:
Host dev dev.1vm
HostName 127.0.0.1
Port 22417
User dev
IdentityFile ".../dev.vm/agent-key"
IdentitiesOnly yes
AddressFamily inet
StrictHostKeyChecking yes
ConnectTimeout 5
키
각 머신은 번들 내 agent-key에 자체 Ed25519 키를 갖고 모드 0600입니다. 폴더에 있으므로 1vm clone이 함께 가져가고 클론은 같은 identity로 도달 가능합니다.
자체 키를 사용할 수 있습니다. 1VM은 경로만 저장하고 일치하는 .pub만 게스트에 복사 — 개인키는 읽거나 복사하거나 저장하지 않습니다.
1vm ssh keys dev # show the machine key
1vm ssh keys dev --print-public # the public line
1vm ssh keys dev --regenerate # new keypair
1vm set dev ssh.identityFile ~/.ssh/id_ed25519
계정
1vm set dev ssh.users …는 게스트에 어떤 계정이 있는지 관리합니다. 이름은 게스트 패밀리별 검증 — Linux와 macOS는 [a-z_][a-z0-9_-]{0,31}, Windows는 20자 상한 및 예약 구두점 거부 — 관리자 멤버십은 각각 wheel/sudo, Administrators, admin에 매핑됩니다.
onevm은 예약입니다. 1vm exec, 1vm task run, MCP 서버가 로그인하는 계정이므로 이름 변경이나 삭제 시 깨집니다. 창에는 에이전트 계정으로 라벨된 잠긴 행으로 표시하며 숨기지 않습니다 — 존재하지만 로그인 목록에 보이지 않는 로그인은 거짓입니다.
root와 Administrator도 예약이며 root 로그인은 꺼진 상태입니다.
호스트 키 신뢰
대부분 도구는 첫 연결 시 응답하는 것을 신뢰합니다. 1VM은 더 낫습니다. 대역 외 채널이 있기 때문: 게스트 에이전트 채널로 게스트 공개 호스트 키를 읽고 — 인증 대상 네트워크를 거치지 않음 — 고정합니다.
| State | What you see | What ssh does |
|---|---|---|
| Not learned yet | "the first connection will trust whatever answers" | StrictHostKeyChecking accept-new |
| Learned | the SHA256:… fingerprint and the date | StrictHostKeyChecking yes |
| Mismatch | a warning naming the date the old key was pinned, and a Relearn button | yes — so the connection correctly fails |
1vm ssh trust dev # pin the current host key
1vm ssh trust dev --relearn # re-pin after a legitimate change
불일치는 1vm reset 후, sshd 이전 스냅샷 복원 후, 재설치 후에 정상입니다. 공격과 똑같이 보이기도 합니다 — 그래서 항상 누르는 버튼이지 조용한 덮어쓰기가 아닙니다.
클론. identity 키는 의도적으로 클론에 복사됩니다. 호스트 키 고정은 아닙니다 — 두 머신이 하나의 호스트 키를 제시하는 것은 실제 문제입니다. 첫 부팅에 게스트 호스트 키를 재생성하려면 1vm clone dev test --rekey-ssh를 사용하세요.
보안 기본값
- 키 전용 인증. 비밀번호와 keyboard-interactive 인증 꺼짐, root 로그인 꺼짐, agent나 X11 포워딩 없음.
- 포워드는 loopback 바인딩. SSH 활성화로 게스트가 LAN에 노출되지 않음. 공개 주소 바인딩은 가능하지만 의미를 평이한 말로 경고합니다.
- 개인키 자료와 계정 생성 인수는 private 채널만 통과하며 로그에 도달하지 않습니다.
롤백 모드는 SSH 계정 삭제
롤백 모드는 전원 끄기 시 부팅 이후 모든 쓰기를 폐기 — 게스트에 프로비저닝된 계정과 키 포함. 버그가 아니며 1VM은 마커 파일을 신뢰하지 않고 매 부팅마다 프로비저닝을 재실행합니다. 게스트 호스트 키도 매번 바뀔 것으로 예상하세요.
게스트에서 Mac으로
역방향 — 게스트 에서 Mac 으로 SSH — 는 1VM 엔진에서 Mac을 10.0.2.2로, 등록된 서비스 포트만. 1VM은 macOS Remote Login을 켜지 않습니다. System Settings에서의 결정 그대로입니다.
현재 상태
SSH는 앱, CLI, 두 엔진 전체에 구현되어 있고 유닛 테스트 스위트로 커버됩니다. 두 가지 솔직한 주의:
- 라이브 게스트 soak 테스트가 미완료 수락 게이트입니다.
- 출하 Omarchy 팩토리 이미지는
openssh가 패키지 목록에 추가되기 전 이므로 팩토리 Omarchy 게스트에는 이미지 재빌드까지sshd가 없습니다. 다른 Linux 게스트는 영향 없음.