PowerShell Remoting HTTPS 구성이 필요한 이유
PowerShell Remoting 세션에서는 HTTP(TCP/5985) 또는 HTTPS(TCP/5986) 전송 프로토콜 사용 여부와 관계없이 기본적으로 모든 트래픽이 AES-256 키로 암호화됩니다. 하지만 AD 포리스트 외부의 컴퓨터나 워크그룹 환경(Kerberos가 신뢰 관계를 수립할 수 없는 환경)의 원격 컴퓨터에 연결할 때는 중간자(Man-in-the-Middle) 공격에 노출될 위험이 있습니다. 따라서 Microsoft는 타사 컴퓨터에 연결할 때 PSRemoting에 항상 HTTPS 전송 방식을 사용할 것을 권장합니다.
이 글에서는 SSL 인증서를 사용하여 HTTPS 기반 PowerShell Remoting을 구성하는 방법을 소개합니다. HTTPS를 통한 PSRemoting 세션은 AD 도메인/포리스트 외부의 컴퓨터에 연결할 때 더 높은 세션 보안 수준을 제공합니다.
1. 원격 컴퓨터 사전 준비
다음 단계는 HTTPS 기반 PowerShell Remoting으로 연결하려는 Windows 원격 장치를 구성하는 방법입니다.
먼저 Windows의 네트워크 위치가 개인(Private) 또는 도메인(Domain)으로 설정되어 있는지 확인합니다.
Get-NetConnectionProfile
다음 명령으로 WinRM과 PSRemoting을 활성화합니다.
Enable-PSRemoting -Force
도메인 환경에서는 GPO(그룹 정책)를 통해 WinRM을 구성할 수 있습니다.
2. SSL 인증서 생성
WinRM에 HTTPS를 구성하려면 먼저 연결 대상 컴퓨터에서 SSL 인증서를 생성해야 합니다. 이 인증서는 WinRM 트래픽 암호화에 사용됩니다. PowerShell을 사용하면 자체 서명(Self-signed) 인증서를 손쉽게 만들 수 있으며, 도메인 환경에서는 자동 등록(Auto-Enrollment)을 통해 WinRM 인증서를 자동으로 발급받을 수도 있습니다.
인증서의 DNS 이름으로 컴퓨터 이름과 IP 주소를 함께 지정하면, DNS 서버가 없는 네트워크 환경에서도 편리하게 사용할 수 있습니다. 인증서의 SAN(Subject Alternative Name)에 두 값을 모두 포함하여 자체 서명 인증서를 생성하는 방법은 다음과 같습니다.
$hostName = $env:COMPUTERNAME
$hostIP=(Get-NetAdapter| Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert
생성된 SSL 인증서는 해당 컴퓨터의 개인 인증서 저장소에서 확인할 수 있습니다.
3. HTTPS 리스너 구성
Windows에서 PowerShell Remoting은 기본적으로 서로 다른 포트를 사용하는 두 개의 리스너가 생성됩니다.
- HTTP: 포트 5985
- HTTPS: 포트 5986
활성화된 WSMan 리스너 목록은 아래 명령으로 확인할 수 있습니다.
Get-ChildItem wsman:\localhost\Listener
기본 HTTP 및 HTTPS 리스너를 제거합니다.
Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse
새 HTTPS 리스너를 생성하고 앞서 만든 인증서를 바인딩합니다.
New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force
4. 방화벽 규칙 및 서비스 재시작
WinRM HTTPS 트래픽을 허용하는 Windows 방화벽 규칙을 생성하거나, 기존 규칙이 활성화되어 있는지 확인합니다.
New-NetFirewallRule -Displayname 'WinRM - Powershell remoting HTTPS-In' -Name 'WinRM - Powershell remoting HTTPS-In' -Profile Any -LocalPort 5986 -Protocol TCP
WinRM 서비스를 재시작합니다.
Restart-Service WinRM
WinRM HTTPS 리스너에 바인딩된 인증서 지문(Thumbprint)은 아래 명령으로 확인할 수 있습니다.
WinRM e winrm/config/listener
5. 인증서 내보내기 및 가져오기
원격 호스트 구성이 완료되면 SSL 인증서를 CER 파일로 내보냅니다.
Export-Certificate -Cert $srvCert -FilePath c:\PS\SSL_PS_Remoting.cer
WinRM 서버 및 클라이언트 구성은 기본적으로 암호화되지 않은 연결을 허용하지 않습니다. 아래 명령으로 확인할 수 있습니다.
dir WSMan:\localhost\Service | ? Name -eq AllowUnencrypted
dir WSMan:\localhost\Client | ? Name -eq AllowUnencrypted
필요한 경우 다음과 같이 암호화되지 않은 연결을 명시적으로 비활성화할 수 있습니다.
winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{AllowUnencrypted="false"}'
CER 파일을 관리자 컴퓨터로 복사한 후 아래 명령으로 가져옵니다(GPO를 사용해 다른 컴퓨터에 인증서를 배포할 수도 있습니다).
Import-Certificate -FilePath c:\PS\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\root\
6. 원격 호스트 연결
이제 WinRM HTTPS를 사용하여 원격 Windows 호스트에 연결하려면 Enter-PSSession 및 Invoke-Command cmdlet에서 -UseSSL 매개변수를 사용해야 합니다. 다음 예제에서는 PowerShell 콘솔에서 IP 주소로 원격 호스트에 연결합니다(이 IP 주소는 TrustedHosts에 추가하지 않은 상태입니다).
$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption
IP 주소로 연결할 때 SkipCNCheck 옵션을 사용하지 않으면 다음과 같은 오류가 발생합니다. The SSL certificate contains a common name (CN) that does not match the hostname(SSL 인증서의 CN이 호스트 이름과 일치하지 않습니다).