Windows 의 IIS 는 FTP 와 FTPS 를 제공하지만 SFTP 는 제공하지 않는다. SFTP 는 SSH 위에서 도는 별개의 프로토콜이라 FTP 서버 기능으로 대신할 수 없다. 이름이 비슷해 IIS 설정을 뒤지게 되는데 거기에는 없다.
| 프로토콜 | 기반 | Windows 기본 제공 |
|---|---|---|
| FTP | 자체 프로토콜, 평문 | IIS FTP 서버 |
| FTPS | FTP + TLS | IIS FTP 서버 |
| SFTP | SSH 서브시스템 | OpenSSH Server 기능 |
Windows Server 2019 이후와 Windows 10 1809 이후에는 OpenSSH Server 가 선택적 기능으로 들어 있다. 별도 제품을 사지 않아도 된다.
# 설치 가능한 기능 확인
Get-WindowsCapability -Online -Name OpenSSH*
# 서버 설치
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 서비스 등록과 기동
Set-Service -Name sshd -StartupType Automatic
Start-Service sshd
방화벽 규칙은 설치 과정에서 자동으로 만들어지는 경우가 많지만, 없으면 직접 넣는다.
Get-NetFirewallRule -Name *ssh*
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
설정은 C:\ProgramData\ssh\sshd_config 에 있다. 리눅스와 항목은 같지만 경로 표기와 기본 동작이 다르다.
Port 22
PasswordAuthentication yes
PubkeyAuthentication yes
# SFTP 만 허용하고 셸 접속은 막는다
Subsystem sftp sftp-server.exe
Match Group sftpusers
ChrootDirectory C:\sftproot
ForceCommand internal-sftp
AllowTcpForwarding no
파일을 고친 뒤에는 서비스를 다시 시작한다.
Restart-Service sshd
Windows 의 OpenSSH 는 관리자 그룹 계정의 공개키를 개인 폴더가 아니라 공용 파일에서 읽는다. 이것을 모르면 ~/.ssh/authorized_keys 에 키를 넣어도 계속 비밀번호를 묻는다.
| 계정 | 키 파일 |
|---|---|
| 일반 사용자 | C:\Users\<사용자>\.ssh\authorized_keys |
| Administrators 그룹 소속 | C:\ProgramData\ssh\administrators_authorized_keys |
권한도 까다롭다. 키 파일은 소유자와 SYSTEM 만 접근할 수 있어야 하고, 그렇지 않으면 무시된다.
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant "SYSTEM:F" "Administrators:F"
이 동작을 끄려면 sshd_config 의 다음 두 줄을 주석 처리한다.
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
기본 셸이 cmd.exe 라서 원격 명령 실행이 어색하다면 PowerShell 로 바꾼다. SFTP 전용으로 쓸 것이라면 건드릴 필요는 없다.
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
sftp -P 22 username@windows-host
연결이 안 되면 순서대로 본다.
Get-Service sshd
Get-NetTCPConnection -LocalPort 22
Get-WinEvent -LogName 'OpenSSH/Operational' -MaxEvents 30
자세한 로그가 필요하면 sshd_config 에 LogLevel DEBUG3 을 넣고 서비스를 재시작한다. 로그는 이벤트 뷰어의 Applications and Services Logs → OpenSSH 에 쌓인다.
ChrootDirectory 의 의미가 같다.