Docs · 참조

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에 보이는 게스트 주소는 항상 연결 가능한 것은 아닙니다.

EngineNetworkMac → guest
Virtualization.frameworkNAT or host-onlyDirect, to the guest's 192.168.64.x lease
Virtualization.frameworkBridgedDirect, to its LAN address
1VM engineNAT or host-onlyThrough a loopback port forward only
1VM engineBridgedDirect, 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은 더 낫습니다. 대역 외 채널이 있기 때문: 게스트 에이전트 채널로 게스트 공개 호스트 키를 읽고 — 인증 대상 네트워크를 거치지 않음 — 고정합니다.

StateWhat you seeWhat ssh does
Not learned yet"the first connection will trust whatever answers"StrictHostKeyChecking accept-new
Learnedthe SHA256:… fingerprint and the dateStrictHostKeyChecking yes
Mismatcha warning naming the date the old key was pinned, and a Relearn buttonyes — 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 게스트는 영향 없음.