SSH(Secure Shell) 프로토콜과 OpenSSH 프로젝트는 Linux에서 수십 년 동안 사용되어 왔습니다. 그러나 최근까지 Windows 환경에서는 OpenSSH가 적용되지 않았습니다. 따라서 Windows Server는 일반적으로 미리 설정되어 있지 않으며 일부 설정이 필요합니다.
이 튜토리얼에서는 Linux와 동일하게 Windows Server에 SSH로 접속하는 방법을 배우게 됩니다. Windows에 OpenSSH를 설치(또는 업데이트)하고 적절한 방화벽 규칙을 추가하며, 공개 키, 비밀번호 및 인증서 기반 인증을 구성하는 방법을 배우게 될 것입니다.
전제 조건
이 문서의 예제와 데모를 효과적으로 따라가기 위해 다음 요구 사항을 충족해야 합니다.
- A Windows Server machine – This article will use Windows Server 2019 Datacenter. The server this tutorial will use will have a user account called june and will connect to the server at the IP address of 40.117.77.227 with a hostname of ataWindows.
- A local computer with PowerShell 7.1 installed. PowerShell 7.1 is available in Windows, Linux, and macOS. The examples in this article use PowerShell 7.1 in Windows 10.
OpenSSH 다운로드
Linux 서버와 달리 Windows 서버에는 기본적으로 SSH 서버가 실행되지 않습니다. 그러나 Microsoft에서는 Windows용 OpenSSH의 오픈 소스 포트를 출시했습니다. 이 릴리스로 인해 Windows 기기에 SSH 서버를 설정할 수 있습니다.
시작하려면 먼저 OpenSSH를 다운로드해야 합니다. 아래 단계를 따라 진행하세요:
- Windows Server에서 원격 데스크톱(RDP) 또는 기호에 맞는 데스크톱 관리자 클라이언트를 사용하여 데스크톱에 연결하세요.
2. Windows Server 데스크톱에서 슈퍼 권한으로 실행되는 Windows PowerShell 콘솔을 엽니다.
3. 다음으로, 아래 코드를 복사하여 PowerShell 창에 붙여넣고 Enter 키를 누릅니다. 이 스크립트는 최신 OpenSSH 릴리스인 v8.1.0.0p1-Beta를 현재 작업 디렉터리로 다운로드합니다.
OpenSSH를 다운로드하기 위해 PowerShell 코드를 저장하려면 Windows PowerShell ISE 또는 Visual Studio Code와 같은 코드 편집기를 열고 저장하면 됩니다.
4. 이제 OpenSSH-Win64.zip 파일이 현재 작업 디렉터리에 있어야 합니다. 아래 명령을 실행하여 확인해보세요.
아래에서 볼 수 있듯이, 디렉터리에 OpenSSH-Win64.zip 파일이 존재합니다.

OpenSSH 설치
OpenSSH-Win64.zip를 다운로드한 후, 다음 단계는 서버에 OpenSSH를 설치하는 것입니다. 설치 마법사는 없으므로 참고하세요.
- 동일한 PowerShell 세션에서 아래 코드를 복사하여 PowerShell에서 실행합니다. 이 코드는 OpenSSH-Win64.zip 파일 내용을 C:\Program Files\OpenSSH에 추출합니다.
2. ZIP 파일을 추출한 후에 PowerShell에서 아래 명령을 실행하여 스크립트 C:\Program Files\OpenSSH\install-sshd.ps1.을 실행합니다. 이 스크립트는 OpenSSH SSH 서버 서비스 (sshd) 및 OpenSSH 인증 에이전트 서비스 (sshd-agent)를 설치합니다.
예상 결과를 아래에서 확인할 수 있습니다.

SSH 서버가 자동으로 시작되도록 보장하려면 PowerShell에서 아래 명령을 실행합니다.
SSH 트래픽을 허용하기 위해 Windows 방화벽 규칙 추가
이 절차는 Windows 방화벽을 사용하는 경우에만 적용됩니다. 타사 방화벽을 사용하는 서버의 경우 포트 22를 허용하는 방법은 해당 방화벽 설명서를 참조하십시오.
OpenSSH를 설치하면 SSH 트래픽을 허용하는 방화벽 예외 규칙이 자동으로 생성되지 않습니다. 따라서 다음 작업은 방화벽 규칙을 수동으로 만드는 것입니다.
새 Windows 방화벽 규칙을 만드는 가장 쉬운 방법 중 하나는 PowerShell 및 New-NetFirewallRule
cmdlet을 사용하는 것입니다. 아래 명령은 포트 22로 향하는 모든 들어오는 TCP 트래픽을 허용하는 ‘Allow SSH’라는 방화벽 규칙을 만듭니다.
아래 명령을 복사하여 PowerShell에서 실행하십시오.
다음 스크린샷은 방화벽 규칙을 생성한 후 PowerShell에서 예상 출력을 보여줍니다.

비밀번호 인증을 사용하여 SSH에 연결하기
이 시점에서 Windows에 OpenSSH를 설치하고 초기 서버 구성을 수행했습니다. 다음 단계는 실제로 SSH를 통해 연결이 작동하는지 테스트하는 것입니다.
새로 구성한 SSH 서버를 테스트하려면 로컬 컴퓨터에서 이제 ssh
명령을 실행하십시오.
이 섹션의 동일한 단계는 Linux SSH 서버에 연결할 때도 적용됩니다.
1. 이번에는 로컬 컴퓨터에서 PowerShell을 엽니다.
2. 다음으로, Windows Server의 사용자 이름과 원격 호스트를 변경해 SSH 로그인 프로세스를 시작하는 아래 명령을 실행하십시오.
3. 처음으로 서버에 연결하면 호스트의 진위성을 확인할 수 없다는 메시지가 표시됩니다. 이 메시지는 컴퓨터가 원격 호스트를 아직 인식하지 못했음을 나타냅니다. yes를 입력하고 Enter를 눌러 계속 진행하세요.
4. 비밀번호를 입력하라는 메시지가 나타나면 계정 비밀번호를 입력하고 Enter를 누르세요.

5. 로그인한 후에는 아래 스크린샷에서 확인할 수 있듯이 원격 호스트의 명령 프롬프트로 이동합니다. 원격 호스트의 세션에 정상적으로 입력되었는지 확인하려면 hostname
을 입력하고 Enter를 누르세요. 해당 명령은 원격 컴퓨터 이름을 반환해야 합니다.

디폴트 셸을 OpenSSH에서 PowerShell로 변경하기
Windows SSH 서버에 처음으로 로그인하면 디폴트 셸 또는 명령 해석기가 CMD인 것을 알 수 있습니다. CMD를 기본 SSH 셸로 사용하는 것도 괜찮지만 PowerShell을 기본 셸로 사용하려면 다음 단계를 따르세요.
디폴트 OpenSSH 셸을 CMD에서 PowerShell로 변경하려면:
먼저 Windows Server에서 고도의 권한을 갖는 PowerShell 창을 엽니다. 이미 열려 있는 경우 이 단계를 건너뛰세요.
다음으로 레지스트리 키 HKLM:\SOFTWARE\OpenSSH에 DefaultShell 문자열 데이터를 Windows PowerShell 경로 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe로 설정하여 DefaultShell이라는 새 레지스트리 문자열 값을 만듭니다.
아래 스크린샷은 해당 명령의 기대 결과를 보여줍니다.

공개 키 인증 구성
이전 섹션에서는 사용자 이름과 암호를 사용하여 연결했습니다. 이것은 작동하지만 SSH 서버와 인증하는 보다 안전한 방법은 키 쌍을 사용하는 것입니다.
간단히 말해, 키 쌍은 공개 키와 개인 키,라고 불리는 두 개의 키로 구성되어 있으며 신원을 증명하는 보안 자격 증명 세트입니다.
공개 키는 서버에 저장되고 개인 키는 로컬 컴퓨터에 남아 있습니다. 개인 키를 비밀번호처럼 취급해야 합니다. 개인 키가 노출되면 누구나 해당 키를 사용하여 SSH 서버에 액세스할 수 있습니다.
관리자_인증_키 파일 준비
공개 키는 서버에 있어야 합니다. 하지만 어디에 있어야 할까요? Windows의 OpenSSH의 경우, SSH 서버는 C:\ProgramData\ssh\administrators_authorized_keys 파일에서 공개 키를 읽습니다. 그러나 이 파일은 기본적으로 존재하지 않습니다. 먼저 하나를 만들어야 합니다.
다음 단계를 따라 administrators_authorized_keys 파일을 생성하고 적절한 액세스 제어 목록 (ACL)을 설정하세요.
Windows Server에서:
1. 관리자 권한의 Windows PowerShell 콘솔을 엽니다.
2. 아래 명령을 복사하여 PowerShell에서 실행합니다. 이 명령은 administrators_authorized_keys 파일을 New-Item
cmdlet을 사용하여 생성합니다.
아래 스크린샷과 유사한 결과가 표시됩니다.

3. 다음으로, 현재 ssh_host_dsa_key 파일에 할당된 ACL을 가져와 해당 ACL을 administrators_authorized_keys 파일에 복사합니다. 이를 위해 아래 명령을 실행하세요.
OpenSSH 서비스는 관리자 그룹과 SYSTEM 계정만 관리자_인증키 파일에 액세스할 수 있도록 요구합니다. 그리고 ssh_host_dsa_key의 ACL을 administrators_authorized_keys로 복사하는 것은 ACL이 이미 설정되어 있기 때문에 의미가 있습니다.
4. 이제 Windows 탐색기를 엽니다.
5. C:\ProgramData\ssh\ 폴더로 이동합니다.
6. administrators_authorized_keys 파일을 마우스 오른쪽 단추로 클릭하고 속성을 클릭합니다.
7. 속성 페이지에서 보안 탭을 클릭하고 고급을 클릭합니다.

8. 그런 다음 권한이 아래 이미지와 같이 표시되는지 확인합니다.

새 SSH 키 쌍 생성
새 SSH 키 쌍을 생성하려면 Windows 10(이상) 및 대부분의 Linux 운영 체제에 내장된 OpenSSH 클라이언트 도구 중 하나인 ssh-keygen
명령을 사용하십시오.
이 섹션에 표시된 예제는 Windows 및 Linux 컴퓨터에서 모두 작동합니다.
로컬 컴퓨터에서 PowerShell 콘솔에서:
1. 아래 명령을 실행하여 홈 폴더의 .ssh 디렉터리로 이동합니다.
2. 다음으로, 명령 ssh-keygen
을(를) 입력하고 Enter 키를 누르세요. 키를 생성하는 파일 위치를 저장할 위치를 입력하라는 메시지가 나오면 기본 위치를 유지하고 Enter 키를 누릅니다. 이렇게 하면 SSH 클라이언트가 자동으로 인증할 때 SSH 키를 찾을 수 있습니다.
Windows에서는 기본 키 파일이 C:\Users\<username>\.ssh\id_rsa에 있습니다.
3. 다음 프롬프트에서는 암호를 비워 둡니다. 이 시점에서는 테스트를 위해 암호를 사용할 필요가 없습니다.
개인 키에 암호를 추가하면 보안이 크게 향상됩니다. 암호는 개인 키에 대한 두 번째 요소 인증(2FA)으로 작동합니다.
명령이 두 개의 파일을 생성했음을 알 수 있습니다; id_rsa (개인 키) 및 id_rsa.pub (공개 키).

공개 키를 Windows SSH 서버에 배포하기
이제 개인-공개 키 쌍을 생성했으므로 다음 단계는 공개 키를 SSH 서버의 C:\ProgramData\ssh\administrators_authorized_keys 파일로 복사하는 것입니다.
로컬 컴퓨터에서 PowerShell 콘솔에서:
1. 아래 코드를 복사하여 PowerShell에서 실행하세요. 먼저 사용자 이름과 IP 주소를 변경해야 합니다. 각 명령 위의 주석을 참조하여 각 명령이 무엇을 하는지 알 수 있습니다.
2. 암호를 입력하면 ssh가 공개 키를 복사하도록 진행됩니다. 아래에 표시된 것과 같이 유사한 결과가 표시됩니다.

공개 키 인증을 사용하여 SSH에 연결
이제 공개 키를 SSH 서버에 복사했으므로 더 이상 암호를 사용하여 인증할 필요가 없습니다. 아래에서 볼 수 있듯이 ssh가 암호를 요청하지 않았습니다.

인증서 인증 구성
공개 키 인증과 마찬가지로 인증서 인증은 암호 없이 또는 암호구호로 보호됩니다. 인증서 로그인을 활성화하려면 공개 키를 SSH 서버에 배포하지 않고도 키 쌍을 생성하는 동일한 절차를 따릅니다.
SSH 서버의 authorized_keys 또는 administrators_authorized_keys 파일에 공개 키를 매핑할 필요가 없습니다. 대신, 공개 키는 인증 기관 (CA) 키를 사용하여 서명됩니다.
인증 기관 (CA) 키 생성
서명을 위한 CA 키 생성은 이전에 이 기사에서 수행한 사용자 키 쌍 생성과 유사합니다. 다만 이번에는 새로운 CA 키에 대한 파일 이름을 지정해야 합니다. 이를 위해 Windows Server에서 PowerShell 콘솔에서 다음을 수행하십시오:
실행하세요 ssh-keygen
명령어를 아래와 같이 표시된대로. 이 명령은 CA 키를 C:\ProgramData\ssh\ca_userkeys에 생성하지만 파일 이름을 다르게 사용해도 됩니다. 다른 파일 이름을 사용해도 CA 키 기능에는 영향을 주지 않습니다.
암호를 묻는 경우, 암호를 비워두고 Enter 키를 누르세요.
아래에서 볼 수 있듯이 명령이 두 개의 파일을 만들었습니다. ca_userkeys,는 개인 키이고, ca_userkeys.pub,는 공개 키입니다.

이제 CA 키를 생성했으니 SSH 서버에게 CA를 신뢰하도록 하고 CA 키를 찾을 위치를 알려야 합니다. 이를 위해 새로운 줄 TrustedUserCAKeys path/to/ca_userkeys.pub
을 서버의 C:\ProgramData\ssh\sshd_config 파일에 추가하세요.
아래 명령을 실행하여 파일 sshd_config에 구성 항목을 추가하세요.
사용자의 공개 키에 서명하기
이 시점에서 CA 키를 생성하고 SSH 서버를 CA 공개 키 파일을 신뢰하도록 구성했습니다. 이제 남은 것은 사용자의 공개 키를 서명하는 것입니다.
로컬 컴퓨터에서 PowerShell 콘솔에서:
1. id_rsa.pub
파일을 SCP 명령을 사용하여 SSH 서버의 홈 드라이브로 복사하세요. 사용자 이름과 IP 주소를 올바른 값으로 변경하세요.
2. ssh를 사용하여 Windows Server에 로그인하십시오. 로그인 한 후에는 사용자의 공개 키를 서명하기 위해 ssh-keygen
을 실행하십시오. 아래 명령어에는 여러 매개변수가 사용되었음을 알 수 있습니다. 이제 하나씩 살펴보겠습니다.
-s C:\ProgramData\ssh\ca_userkeys
– 공개 키를 서명하기 위한 CA 키의 위치를 지정합니다. 이 예제에서 CA 키는 사용자가 생성한 키입니다.-I id_username
– 서명된 사용자 공개 키에 할당할 ID를 지정합니다.id_username
값을 원하는 이름으로 변경하십시오.-V +4w
– 이 매개변수는 서명된 키의 유효 기간을 지정합니다. 이 예제에서+4w
는 서명된 사용자 키의 유효 기간이 4 주임을 의미합니다. 이 값을 원하는 유효 기간으로 변경할 수 있습니다.-n username
– 서명된 공개 키의 소유자인 사용자 이름입니다.<path to id_rsa.pub>
– 서명할 사용자 공개 키의 위치입니다 (Windows).
SSH 세션에서 명령을 실행한 후에는 아래와 같은 유사한 출력을 받아야 합니다. 보시다시피, 해당 명령은 id_rsa-cert.pub라는 새 파일을 생성했으며, 이 파일이 서명된 사용자 인증서입니다.

3. 이제 로컬 컴퓨터 PowerShell 세션으로 돌아가서 서버에서 로컬 컴퓨터로 id_rsa-cert.pub 파일을 복사하십시오. 명령을 실행하기 전에 사용자 이름과 IP 주소를 올바른 값으로 변경하십시오.
복사가 완료되면 아래와 같이 홈 폴더에서 서명된 사용자 인증서를 찾을 수 있습니다.

인증서 인증을 사용하여 SSH로 연결하기
인증서 인증을 구성했으며 이제 사용자 인증서가 있습니다. 이제 SSH 서버에 인증서 인증으로 연결할 수 있는지 테스트해야 합니다.
인증서로 SSH에 연결하는 명령은 비밀번호 또는 공개 키를 사용하는 것과 동일합니다. 그러나 이전에 공개 키 인증을 활성화한 경우에는 먼저 비활성화해야 합니다. 그렇지 않으면 ssh가 인증서 대신 키 쌍을 계속 사용할 것입니다.
키 쌍을 비활성화하려면 administrators_authorized_keys 파일에서 공개 키를 제거하십시오. 이를 위해 다음 단계를 따르십시오.
다음 명령은 administrators_authorized_keys 파일을 비워서 모든 매핑된 공개 키를 효과적으로 제거합니다. 모든 매핑된 공개 키를 지우지 않으려면 텍스트 편집기를 사용하여 각 파일에서 선택된 공개 키를 수동으로 제거하십시오.
Windows Server에 SSH된 상태에서:
1. PowerShell에서 아래 코드를 실행하여 administrators_authorized_keys 파일을 비웁니다.
2. 이 시점에서 authorized_keys와 administrators_authorized_keys 파일이 비어 있음을 아래 스크린샷에서 볼 수 있습니다.

3. exit
을 입력하고 Enter 키를 눌러 SSH 세션을 종료합니다. PowerShell 세션으로 돌아갑니다.
4. 공개 키를 제거한 후 다음 ssh 로그인 시도에서는 인증서 인증이 사용됩니다. 로그인 경험은 공개 키 인증과 동일합니다.

결론
이제 OpenSSH Windows Server를 처음부터 설정하고 다양한 인증 수단을 탐색하고 설정하는 방법을 배웠습니다. 이제 Linux와 마찬가지로 Windows Server에 연결할 수 있습니다!