Windows Server 2022에는 OpenSSH Server가 선택적 기능으로 들어 있습니다. 서드파티 설치 프로그램이 필요 없고 Windows Update로 업데이트됩니다. 켜고 나면 SSH로 PowerShell을 실행하고, scp로 파일을 복사하며, 스크립트나 CI를 다른 Linux 머신처럼 서버에 연결할 수 있습니다.
아래 과정은 모두 저희 Windows Server 2022 이미지에서, RDP로 연 관리자 권한 PowerShell로 진행했습니다(연결 방법).
먼저 네트워크. NAT Windows 플랜에서는 유일한 인바운드 포워딩이 RDP로 가므로 인터넷에서 SSH에 닿을 수 없습니다. 외부에서 SSH를 쓰려면 Windows Small-IP처럼 전용 IPv4가 있는 플랜이 필요합니다. 포트에 닿을 수 있다면 아래 단계는 5분 정도 걸립니다.
1. OpenSSH Server 설치
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
클라이언트는 이미 설치되어 있고, 서버는 추가하기 전까지 NotPresent로 표시됩니다. 저희 서버에서는 설치에 28초가 걸렸습니다.
2. 시작하고 부팅 시 자동 시작 설정
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*
이 기능을 설치하면 방화벽 규칙 OpenSSH-Server-In-TCP(포트 22, 인바운드, 허용)가 만들어지므로 직접 추가할 필요가 없습니다.
3. PowerShell을 기본 셸로 설정
기본적으로 SSH 세션은 cmd.exe로 열립니다. PowerShell로 바꿉니다.
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
새 연결은 바로 PowerShell 5.1을 받습니다. 재시작할 필요가 없습니다.
4. Administrator용 키: 누구나 걸려 넘어지는 파일
이것이 Windows 특유의 첫 번째 함정입니다. Administrators 그룹 계정에 대해 sshd는 C:\Users\<name>\.ssh\authorized_keys를 읽지 않습니다. 공유 파일인 C:\ProgramData\ssh\administrators_authorized_keys를 읽으며, 그것도 Administrators와 SYSTEM 외에는 아무도 쓸 수 없을 때만 읽습니다.
$pub = 'ssh-ed25519 AAAA...your-public-key... you@laptop'
Set-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value $pub -Encoding ascii
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
-Encoding ascii도 중요합니다. 저희 테스트에서 같은 키를 Out-File(UTF-16, PowerShell 5.1 기본값)로 저장했더니 Permission denied (publickey)로 거부되었습니다. 내 컴퓨터에서:
ssh Administrator@YOUR.SERVER.IP
비밀번호 없이 PowerShell 프롬프트가 나오면 성공입니다. 관리자가 아닌 사용자는 일반적인 C:\Users\<name>\.ssh\authorized_keys가 그대로 동작합니다.
5. 비밀번호 로그인 끄기: 두 번째 함정
뻔한 수정인 PasswordAuthentication no만으로는 이 버전에서 부족합니다. OpenSSH 8.1은 여전히 같은 Windows 비밀번호를 묻는 keyboard-interactive를 제공합니다. 저희 테스트에서도 그것까지 끄기 전에는 키 없는 로그인에서 keyboard-interactive가 계속 보였습니다. 또한 이 설정은 파일 끝의 Match Group administrators 블록보다 앞에 있어야 하며, 그렇지 않으면 관리자에게만 적용됩니다. 다음 명령으로 두 줄을 맨 위에 넣습니다.
$cfg = 'C:\ProgramData\ssh\sshd_config'
$lines = Get-Content $cfg | Where-Object { $_ -notmatch '^#?\s*(PasswordAuthentication|KbdInteractiveAuthentication|ChallengeResponseAuthentication)\s' }
Set-Content $cfg -Value (@('PasswordAuthentication no', 'ChallengeResponseAuthentication no') + $lines) -Encoding ascii
Restart-Service sshd
현재 SSH 세션은 열어 둔 채로 두 번째 터미널에서 시험해 보세요. 비밀번호만으로 시도하면 이제 이렇게 나와야 합니다.
Permission denied (publickey).
저희 테스트에서 Administrator와 일반 사용자 모두 이렇게 나왔고, 키 로그인은 계속 동작했습니다.
이걸로 할 수 있는 일
- 어디서든 명령 실행:
ssh Administrator@IP 'Get-Service sshd'. - 파일 복사:
scp .\app.zip Administrator@IP:C:/apps/. - RDP와 같은 방식으로 포트를 내 주소에만 허용:
Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.
어떤 플랜을 고를까
외부에서 SSH를 쓰려면 공인 IPv4가 필요합니다. Windows Small-IP(4 vCPU, 4 GB, 50 GB)는 월 $28, Windows Medium-IP(6 vCPU, 6 GB)는 월 $36입니다. Windows는 직접 보유한 라이선스로 쓰는 Server 2022입니다(BYOL 설명). 네 가지 플랜은 모두 Windows VPS 페이지에 있습니다. 연결을 끊은 뒤에도 프로그램을 계속 돌리려면 Windows Server에서 스크립트 24시간 실행하기를 참고하세요.
댓글
아직 댓글이 없습니다. 첫 번째가 되세요.