0. 개요
Windows 10 버전 / Windows Server 2019 이후부터 자체 OpenSSH를 지원함에 따라 서드파티 프로그램을 사용하지 않고서 SSH 서버 구축이 가능하다. 이를 통해, Windows 환경에 OpenSSH를 수동 설치하여 SFTP 서버를 구축하는 방법에 대해 알아보고자 한다.
1. 기본 구조
Windows OpenSSH에 접속하는 방법은 크게 두가지로 나뉜다.
- Windows 로컬 사용자 계정 기반 인증
- RSA 공개키-개인키 기반 인증
본 포스트에서는 Windows OpenSSH 구축부터, 기본적인 Windows 로컬 사용자 계정 기반 인증을 통해 Windows OpenSSH에 접속하는 과정까지 설명하도록 하겠다.
2. OpenSSH 구축 준비
OpenSSH를 본래 Windows 기능 추가 설정 메뉴에서 간편하게 설치가 가능하지만, Windows 빌드 버전이나 기타 사유로 인해 정상적으로 설치가 되지 않는 증상이 발생한다.
따라서, 본 포스트에서는 해당 상황을 방지하기 위해 OpenSSH를 수동 구축하는 방법에 대해 설명한다.
2-1. OpenSSH 설치파일 다운로드
상기 링크는 Windows OpenSSH를 다운로드 받을 수 있는 링크이다. MSI
설치파일이 아닌 ZIP
압축파일을 통해 수동 설치를 진행할 것이므로, 본인 환경에 맞는 ZIP
파일을 다운로드 받는다.
- Windows 32-bit 환경 :
OpenSSH-Win32.zip
- Windows 64-bit 환경 :
OpenSSH-Win64.zip
2-2. 시스템 환경변수 편집
대체적으로 일반적인 Windows 에는 System32
명령어들을 사용하기 위한 환경변수들이 추가되어 있으나, 간혹 Windows Server에서는 해당 환경변수들이 추가되어 있지 않은 경우가 있어 확인이 필요하다.
Windows 검색기능을 이용하여 환경 변수
검색 후, 시스템 환경 변수 편집
항목에 진입한다.
시스템 변수
항목에 있는 Path
변수를 편집해야 한다. 아래의 항목이 없으면 추가해 주도록 하자.
C:\WINDOWS\System32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
2-3. 인증용 Windows 로컬 사용자 계정 생성
Windows PowerShell을 관리자 권한으로 실행한다.
PS C:\Windows\system32> $PW = Read-Host -AsSecureString
[계정 비밀번호 입력]
PS C:\Windows\system32> New-LocalUser [계정명] -Password $PW
Name Enabled Description
---- ------- -----------
[계정명] True
Windows PowerShell에서 사용자 계정 생성 절차는 아래와 같다.
- SecureString 타입으로
PW
변수를 선언하여, 계정에 사용할 비밀번호를 변수에 먼저 저장 New-LocalUser
명령어를 통해 사용할 사용자 계정명을 입력하고, 비밀번호는PW
변수에 저장된 비밀번호로 지정
본 포스트에서는 ftptest
의 사용자 계정명을 사용하는 Windows 로컬 사용자 계정을 생성했다.
2-4. OpenSSH 설치
본 단락은 본격적인 OpenSSH 설치에 관련된 내용을 다룬다.
[2-1. OpenSSH 설치파일 다운로드] 단락에서 내려받았던 OpenSSH 설치 압축파일을 C드라이브 최상단 경로에 압축해제 한다.
경로는 크게 상관없으나 원활한 사용을 위해서는 해당 경로에 위치시키는 것을 권장한다. 본 포스트에서 OpenSSH 설치 구성 파일들을 위치시킨 경로는 C:\OpenSSH-Win64
이다.
PowerShell을 관리자 권한으로 실행한다.
PS C:\Windows\system32> Set-ExecutionPolicy Unrestricted
실행 규칙 변경
실행 정책은 신뢰하지 않는 스크립트로부터 사용자를 보호합니다. 실행 정책을 변경하면 about_Execution_Policies 도움말
항목(http://go.microsoft.com/fwlink/?LinkID=135170)에 설명된 보안 위험에 노출될 수 있습니다. 실행 정책을
변경하시겠습니까?
[Y] 예(Y) [A] 모두 예(A) [N] 아니요(N) [L] 모두 아니요(L) [S] 일시 중단(S) [?] 도움말 (기본값은 "N"): Y
OpenSSH 설치 스크립트를 실행하기 위해서 스크립트 실행 규칙을 Unrestricted
로 변경한다.
PS C:\Windows\system32> ExecutionPolicy
Unrestricted
스크립트 실행규칙이 Unrestricted
로 잘 변경되었는지 확인한다.
PS C:\Windows\system32> ./setx PATH "$env:path;C:\OpenSSH-Win64" -m
성공: 지정한 값을 저장했습니다.
압축 해제 했었 던 OpenSSH 설치 파일들이 위치한 폴더 경로를 시스템 환경 변수에 등록한다. 파일 경로가 다를 경우 아래와 같이 입력하면 된다.
./setx PATH "$env:path;[폴더경로]" -m
PS C:\Windows\system32> cd C:\OpenSSH-Win64
PS C:\OpenSSH-Win64>
OpenSSH 설치 파일들이 위치한 경로로 이동한다.
PS C:\OpenSSH-Win64> ./install-sshd.ps1
보안 경고
신뢰하는 스크립트만 실행하십시오. 인터넷의 스크립트는 유용할 수 있지만 사용자 컴퓨터를 손상시킬 수도 있습니다.
스크립트를 신뢰하는 경우 Unblock-File cmdlet을 사용하면 이 경고 메시지 없이 스크립트를 실행할 수 있습니다.
C:\OpenSSH-Win64\install-sshd.ps1을(를) 실행하시겠습니까?
[D] 실행 안 함(D) [R] 한 번 실행(R) [S] 일시 중단(S) [?] 도움말 (기본값은 "D"): R
보안 경고
신뢰하는 스크립트만 실행하십시오. 인터넷의 스크립트는 유용할 수 있지만 사용자 컴퓨터를 손상시킬 수도 있습니다.
스크립트를 신뢰하는 경우 Unblock-File cmdlet을 사용하면 이 경고 메시지 없이 스크립트를 실행할 수 있습니다.
C:\OpenSSH-Win64\OpenSSHUtils.psm1을(를) 실행하시겠습니까?
[D] 실행 안 함(D) [R] 한 번 실행(R) [S] 일시 중단(S) [?] 도움말 (기본값은 "D"): R
[*] C:\OpenSSH-Win64\moduli
Inheritance is removed from 'C:\OpenSSH-Win64\moduli'.
'NT AUTHORITY\Authenticated Users' now has Read access to 'C:\OpenSSH-Win64\moduli'.
'BUILTIN\Users' now has Read access to 'C:\OpenSSH-Win64\moduli'.
Repaired permissions
[SC] SetServiceObjectSecurity 성공
[SC] ChangeServiceConfig2 성공
[SC] ChangeServiceConfig2 성공
sshd and ssh-agent services successfully installed
Updated Machine PATH to include OpenSSH directory, restart/re-login required to take effect globally
./install-sshd.ps1
명령어를 통해 설치 스크립트를 실행시키자. 스크립트 실행 보안설정에 의해, 스크립트를 정말 실행할 것인지 물어보면 R
을 입력해 진행하면 된다.
PS C:\OpenSSH-Win64> Get-Service sshd | format-list -property *
Name : sshd
RequiredServices : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
DisplayName : OpenSSH SSH Server
DependentServices : {}
MachineName : .
ServiceName : sshd
ServicesDependedOn : {}
ServiceHandle : SafeServiceHandle
Status : Stopped
ServiceType : Win32OwnProcess
StartType : Manual
Site :
Container :
OpenSSH 서버의 Windows 서비스 명칭은 sshd
이다. Get-Service
명령어를 통해 Windows 서비스에 sshd
서비스가 잘 등록되었는지 확인하자.
3. OpenSSH 기본 설정 및 방화벽 설정
본 단락에서는 간단한 OpenSSH 설정에 관련한 내용만을 다루고, 서비스를 실행하여 외부 컴퓨터에서 SSH를 통해 SFTP 서버에 원격 접속하는 과정을 다룬다.
3-1. 포트 설정
%PROGRAMDATA%\ssh
OpenSSH 실행 파일 및 설정 파일은 상기 경로에 구성되어 있다. 설정을 변경하기 위해 sshd_config
파일을 메모장으로 열도록 하자.
Port
항목의 주석처리를 해제하고, 사용할 포트번호를 변경한다. 대체적으로 22번 포트를 많이 사용하기 때문에 본 포스트에서도 그대로 유지하고 진행하도록 하겠다.
과정을 모두 마쳤으면 파일을 저장하도록 한다.
3-2. 포트 인바운드 예외처리
외부에서 해당 포트를 이용해 SFTP 서버를 기동하고 있는 컴퓨터에 접근하려면, 방화벽에서 차단되지 않게 인바운드 22번 포트를 허용해 주어야 할 것이다.
PowerShell을 관리자 권한으로 실행한다.
PS C:\Windows\System32> New-NetFirewallRule -Name sshd -DisplayName '#OpenSSH-Server-In-TCP' -Enabled True -Direction In
bound -Protocol TCP -Action Allow -LocalPort 22
Name : sshd
DisplayName : #OpenSSH-Server-In-TCP
Description :
DisplayGroup :
Group :
Enabled : True
Profile : Any
Platform : {}
Direction : Inbound
Action : Allow
EdgeTraversalPolicy : Block
LooseSourceMapping : False
LocalOnlyMapping : False
Owner :
PrimaryStatus : OK
Status : 저장소에서 규칙을 구문 분석했습니다. (65536)
EnforcementStatus : NotApplicable
PolicyStoreSource : PersistentStore
PolicyStoreSourceType : Local
방화벽에 22번 포트를 통한 인바운드 접근을 허용하기 위한 명령어를 입력한다. 다른 포트를 사용했다면 아래의 내용을 참고해 입력하면 된다.
New-NetFirewallRule -Name sshd -DisplayName '[인바운드 허용 규칙 이름]' -Enabled True -Direction Inbound -Protocol [프로토콜. TCP 또는 UDP] -Action Allow -LocalPort [포트번호]
3-3. 서비스 자동실행 설정
PS C:\Windows\System32> Set-Service -Name sshd -StartupType 'Automatic'
컴퓨터가 재시작 될 때 마다 sshd
서비스가 자동으로 실행되게 하기위한 명령어를 실행한다.
PS C:\Windows\System32> Get-Service sshd | format-list -property *
Name : sshd
RequiredServices : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
DisplayName : OpenSSH SSH Server
DependentServices : {}
MachineName : .
ServiceName : sshd
ServicesDependedOn : {}
ServiceHandle : SafeServiceHandle
Status : Stopped
ServiceType : Win32OwnProcess
StartType : Automatic
Site :
Container :
StartType
이 Automatic
으로 잘 변경되었는지 확인한다.
PS C:\Windows\System32> Start-Service sshd
sshd
서비스를 실행한다.
4. 외부 → 로컬PC (OpenSSH 서비스 실행 중) 접속 가능여부 확인
외부 PC에서 OpenSSH 서비스를 실행 중인 로컬 PC로 SSH, SFTP 접속이 가능한지 확인해보도록 하자.
4-1. SSH 접속 확인
PuTTY를 이용하여 SSH 접속 테스트를 진행해 보면 정상적으로 연결이 된 것을 확인할 수 있다. 윈도우의 CMD를 그대로 PuTTY에서 사용할 수 있는 것이다.
4-2. SFTP 접속 확인
WinSCP를 통해 SFTP 접속 테스트를 진행해 보면 정상적으로 연결이 된 것을 확인할 수 있다.