SSL을 통한 WinRM 탭으로 PSRemoting 설정하기 [단계별]

만약 이미 PowerShell Remoting (PSRemoting)을 사용하여 원격 명령을 실행 중이라면 해당 기능이 얼마나 편리한지 이미 알고 계실 것입니다. 여러 원격 컴퓨터에 연결하고 그들을 로컬처럼 관리할 수 있습니다. PSRemoting은 이를 가능하게 하기 위해 Windows Remote Management (WinRM)에 의존하며, WinRM을 SSL로 사용하지 않고 있다면 일부 보안 문제에 노출될 수 있습니다.

본 실습에서는 클라이언트 및 서버에서 WinRM을 HTTPS(SSL)로 설정하고 WinRM을 사용할 때 인증에 인증서를 사용하는 방법을 배우게 됩니다.

전제 조건

본 자습서를 따라하려면 다음 사항을 확인하세요:

  • A Windows 7+ or Server 2008 R2 machine to serve as the client machine. This tutorial will use Windows 10.
  • A Windows 7+ or Server 2008 R2+ machine to serve as the server machine. This tutorial will use Windows Server 2019.
  • 로컬 관리 권한을 가진 로컬 관리 계정 또는 클라이언트 및 서버 기계에서 로컬 관리 권한이 있는 계정에 액세스하세요.
  • Active Directory Certificate Services (ADCS) Public Key Infrastructure (PKI)가 설정되어 있어야 합니다. 실제 운영에는 ADCS를 구현하는 것이 좋지만 이 자습서 및 테스트를 위해서는 선택 사항입니다. 자습서에서는 PKI가 기업 또는 독립형 CA로 설정된 것으로 가정합니다.

SSL로 WinRM을 사용하는 이유는 무엇인가요?

PSRemoting는 기본적으로 WinRM을 사용하여 클라이언트 컴퓨터를 원격으로 관리할 수 있게 해줍니다. 한 번 PSRemoting이 WinRM을 통해 세션을 설정하면 클라이언트에서 서버로의 모든 통신을 암호화합니다. 또한 HTTPS를 사용하지 않고 PSRemoting을 구현하는 설정 절차는 꽤 간단합니다.

PSRemoting이 이미 세션 통신을 암호화한다면 ADCS를 설정하고 인증서를 관리하는 수고를 하지 않아도 되는 이유는 무엇인가요?

인증 프로세스 중에 자격 증명이 사용되는 인증 유형에 따라 보안되지 않은 형식으로 전송될 수 있기 때문입니다.사용된 인증 유형에 따라합니다.

PSRemoting을 더 안전하게 만드는 가장 쉬운 방법 중 하나는 HTTP 대신 HTTPS를 통해 WinRM을 사용하는 것입니다. HTTPS는 인증을 포함하여 WinRM이 이미 사용하는 암호화 계층 내에 연결 스트림 전체를 포장합니다. HTTPS는 또한 연결한 서버가 사용자가 생각하는 것과 동일한지를 검증하는 방법을 동시에 제공합니다.

자체 서명 인증서로 WinRM 구성하기

이제 데모를 살펴보겠습니다. 첫 번째 요령은 자체 서명 인증서를 사용하여 WinRM을 통해 SSL로 PSRemoting 통신을 암호화하는 방법을 배우게 될 것입니다.

자체 서명된 인증서를 사용하는 것은 ADCS와 같은 PKI에 대해 걱정하지 않고 테스트 환경을 설정하는 좋은 방법입니다. 자체 서명된 인증서를 사용할 때 서버 자체가 서명하는 인증서를 생성하는데, 이는 기본적으로 자신을 보증합니다.

인증서는 일반적으로 두 가지 작업을 수행하기 위해 존재합니다; 연결을 인증하고 암호화합니다. 자체 서명된 인증서를 사용하는 것은 후자만 구현합니다. 서버의 신원을 검증하기 위해서는 항상 PKI가 제공하는 인증서를 사용해야 합니다. PKI가 제공하는 인증서는 수동으로 개별적으로 모든 자체 서명된 인증서를 신뢰해야 하는 것과 대비하여 단일 신뢰 소스를 제공합니다.

자체 서명된 인증서를 사용하여 SSL을 통한 WinRM을 구성하는 것은 네 가지 고수준 단계를 필요로 합니다:

  1. 목적지 기계에서 자체 서명된 인증서를 생성합니다.
  2. 서버의 WinRM 웹서버(리스너)가 자체 서명된 인증서를 사용하여 인증하도록 구성합니다.
  3. 목적지 기계의 Windows 방화벽에서 적절한 포트를 엽니다.
  4. Enter-PSSession과 같은 PowerShell cmdlet을 사용하여 클라이언트에서 원격 연결을 시작하기 위한 명령을 실행합니다.

이제 각 단계를 살펴보겠습니다.

자체 서명된 인증서 생성

첫 번째 단계는 서버에서 자체 서명된 인증서를 생성하는 것입니다. 연결 시, PSRemoting은 이 인증서를 사용하여 모든 통신을 암호화할 것입니다.

ServerB에서 관리자 권한으로 열린 Windows PowerShell 콘솔에서 아래와 같이 New-SelfSignedCertificate cmdlet을 실행합니다. 아래 명령을 실행하면 ServerB.domain.com에 대한 인증서가 로컬 컴퓨터의 개인 인증서 저장소에 생성됩니다.

New-SelfSignedCertificate -Subject 'CN=ServerB.domain.com' -TextExtension '2.5.29.37={text}1.3.6.1.5.5.7.3.1'
Creating self-signed certificate.

Subject 매개변수는 서버의 완전한 도메인 이름이어야 합니다. WinRM은 서버의 식별을 위해 이 주제를 사용합니다.

서버가 워크그룹에 있더라도 항상 도메인 이름을 제공하세요. 예를 들어 domain.com 또는 lab.local입니다. 대상 컴퓨터에 연결할 때 연결하는 DNS 이름은이 주제 이름과 정확히 일치해야 합니다. 그렇지 않으면 연결이 실패합니다.

TextExtension을 사용하여 인증서의 키 사용 (2.5.29.37)을 정의할 수 있습니다. 이것은 인증서가 사용되는 용도를 정의합니다. 서버 인증을 위한 키 사용을 정의하십시오 ({text}1.3.6.1.5.5.7.3.1) 인증서는 서버의 식별을 인증하는 데만 사용할 수 있습니다.

New-SelfSignedCertificates를 실행하면 생성된 인증서의 썸프린트가 반환됩니다. 이것을 저장하셔야 다음 명령에 필요합니다.

WinRM 리스너 구성

서버에 자체 서명된 인증서를 생성한 후, 그 인증서를 인증에 사용하도록 WinRM 리스너를 구성하십시오. 이를 위해 아래에 표시된 대로 winrm create 명령을 사용하십시오.

아래 명령의 Address=*는 리스너가 서버에 구성된 모든 IP 주소에서 수신 대기하도록 지시합니다. 서버에 여러 개의 IP 주소가 구성되어 있는 경우 여기에 특정 IP 주소를 정의할 수 있습니다.

<cert thumbprint here> 플레이스홀더를 마지막 단계에서 반환된 썸프린트로 대체하는지 확인하십시오.

winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ServerB.domain.com"; CertificateThumbprint="<cert thumbprint here>"}'
Creating WinRM listener with self-signed certificate.

WinRM SSL 방화벽 포트 열기

다음으로, Windows 방화벽을 사용하는 경우 서버로 들어오는 HTTPS 트래픽을 기본 HTTPS 포트 5986을 통해 허용해야 합니다.

PowerShell을 사용하여 HTTPS를 통해 WinRM을 위한 방화벽 포트를 열려면 아래 명령을 실행하십시오.

$FirewallParam = @{
    DisplayName = 'Windows Remote Management (HTTPS-In)'
    Direction = 'Inbound'
    LocalPort = 5986
    Protocol = 'TCP'
    Action = 'Allow'
    Program = 'System'
}
New-NetFirewallRule @FirewallParam

SSL을 통해 서버에 연결

이제 원격 Windows 서버를 SSL을 통해 WinRM 연결을 수락하도록 구성했습니다. 이제 클라이언트로 돌아가서 테스트하고 싶은 PSRemoting 명령을 시작하십시오. 예를 들어, Enter-PSSession 또는 Invoke-Command cmdlet을 시도할 수 있습니다. 이제는 기본 HTTP 연결과 약간 다르게 연결합니다.

HTTPS를 통한 연결은 일반적으로 단일 매개변수 UseSSL을 필요로 합니다. 이 매개변수는 명령이 기본적으로 수행하는 HTTP 리스너 대신 HTTPS WinRM 리스너를 찾도록 지시합니다. UseSSL 매개변수는 더 많은 PSRemoting 명령에서 사용할 수 있습니다.

테스트를 위해, 자체 서명된 인증서 주체로 정의된 서버의 완전한 도메인 이름(FQDN), 사용자 이름과 암호를 정의하는 PSCredential 개체, 그리고 마지막으로 UseSSL 스위치 매개변수를 제공하여 Enter-PSSession 명령을 실행합니다.

Enter-PSSession -ComputerName ServerB.domain.com -Credential (Get-Credential) -UseSSL

위의 명령을 실행하면, 서버에서 자체 서명된 인증서를 사용하도록 WinRM 리스너를 구성했기 때문에 오류 메시지가 표시됩니다. PSRemoting 클라이언트가 서버에 인증하려고 할 때 인증서를 확인하려고 시도하지만 인증서를 확인할 수 없습니다. 자체 서명된 인증서는 명령이 따를 수 있는 신뢰 체인이 없어 실패합니다.

Failing certificate authority trust check with self-signed certificate.

서버에 자체 서명된 인증서로 연결하려면 인증서 신뢰 확인을 무시해야 합니다. 아래에 표시된 대로 New-PSSessionOption cmdlet을 사용하여 SkipCACheck라는 PSSessionOption을 생성하고 해당 명령에 전달하여 이를 수행할 수 있습니다.

$PSSessionOption = New-PSSessionOption -SkipCACheck
Enter-PSSession -ComputerName ServerB -Credential (Get-Credential) -SessionOption $PSSessionOption -UseSSL

Enter-PSSession cmdlet에 직접 포함되지 않은 원격 연결을 위한 다양한 PSSessionOption 객체를 정의할 수 있습니다.

다시 연결을 시도하고 PowerShell에서 자격 증명을 요청해야 합니다. 제공한 후에는 이제 SSL을 통해 WinRM을 사용하여 서버에 연결해야 합니다!

CA 서명된 인증서로 WinRM 구성

생산 환경에서 WinRM을 사용하여 PSRemoting을 할 경우 가능한 한 안전하게 유지하려면 인증 기관 (CA)에서 SSL을 통한 WinRM에 중점을 두어야 합니다.

CA 서명된 인증서는 신뢰 체인을 유지하며 인증서 발급자의 신원을 검증하므로 간단한 자체 서명된 인증서보다 안전합니다.

Active Directory 환경에서 CA를 설정하는 가장 일반적인 방법 중 하나는 ADCS를 사용하는 것입니다. ADCS를 사용하면 디바이스에 인증서를 배포하고 WinRM을 해당 인증서를 사용하도록 구성할 수 있습니다.

이 튜토리얼은 이미 환경에서 ADCS를 설정하고 작동 중이라고 가정합니다.

빠른 설정을 위해 Microsoft의 문서를 따르실 수 있지만, 프로덕션 배포의 경우 인증 기관이 조직의 암호화 노력의 중심에 있기 때문에 구성을 심층적으로 연구해야합니다.

인증서 요청 생성

CA에서 발급된 인증서를 사용하는 첫 번째 단계는 인증서를 만드는 것입니다. 인증서를 생성하려면 먼저 인증서 서명 요청(CSR)을 사용하여 인증서 요청을 발행해야합니다. 생성된 CSR은 그런 다음 CA에 전송되어 인증서를 발급할 수 있습니다.

이 섹션의 단계는 엔터프라이즈 CA이거나 독립형 CA일 때 ADCS 배포에서 작동합니다. AD 통합 엔터프라이즈 CA를 사용하는 경우 인증서 자동 등록 또는 인증서 템플릿을 사용하여이 섹션의 단계를 거치지 않고 인증서 등록을 가속화 할 수 있습니다.

서버(ServerB이 이 튜토리얼에서)에 있을 때, CSR을 생성하십시오:

  1. certlm.msc를 실행하여 Windows 인증서 관리자를 엽니다.

2. 개인 저장소를 마우스 오른쪽 단추로 클릭하고 모든 작업을 선택하십시오 —> 고급 작업 —> 사용자 지정 요청 생성.

3. 이 튜토리얼에서는 아래에 표시된 인증서 정보 페이지까지 모든 필드를 기본값으로 남겨 두십시오. 여기에 도착하면 세부 정보 드롭다운을 클릭하고 속성을 선택하십시오.

Creating a custom certificate request.

4. 주체 탭을 클릭하고 유형일반 이름으로 변경하십시오.

5. 이제 도메인에 가입되어 있으면 서버의 완전한 도메인 이름을 입력하고 그렇지 않으면 호스트 이름만 입력하고 추가를 클릭하십시오.

Specifying subject for certificate request.

WinRM SSL 수신기와 함께 사용하려면 일반 이름을 사용해야 합니다. 목록의 다른 옵션은 포함할 수 있지만 이 배포에 필요하지 않습니다.

6. 확장 탭을 클릭하십시오.

7. 만약 나중에 다룰 인증서 기반 인증을 사용하지 않는다면, 확장된 키 사용 헤더를 확장하고 서버 인증을 추가하십시오. 이 키 사용 유형은 Windows에게 인증 서버로 사용해야 하는 인증서임을 알려줍니다. 다른 옵션으로는 클라이언트 인증, 코드 서명 및 문서 암호화가 있습니다.

8. 인증서 기반 인증을 설정하려면 아래와 같이 클라이언트 인증을 선택해야 합니다.

Requesting a client authentication certificate.

9. 다음으로 개인 키 탭을 클릭하고 키 옵션을 확인하십시오. 키 쌍의 보안을 강화하기 위해 기본 키 크기를 1024에서 최소 2048로 변경하십시오.

Windows에는 더 강력한 암호화 공급자도 있지만, 이전 소프트웨어와의 호환성 문제가 발생할 수 있습니다.

10. 인증서 속성 창을 닫고 설정을 저장하려면 확인을 클릭하고 계속하려면 다음을 클릭하십시오.

11. 이제 인증서 요청을 출력할 경로를 제공하고 완료를 클릭하십시오.

완료되면 인증서 요청 파일이 생성됩니다.

인증서 요청

요청이 생성되면 해당 요청을 CA에 제출하여 인증서를 생성해야 합니다. 그 방법은 다음과 같습니다:

  1. ADCS 서버로 이동하여 http://<서버 이름 FQDN>/certsrv/certrqxt.asp.
Certificate request submission web page.

2. 이전에 생성한 인증서 요청 파일을 메모장으로 열고 인증서 요청 파일에서 텍스트를 복사하여 요청 상자에 붙여넣습니다. 이 인증서에는 추가 속성이 필요하지 않습니다.

3. 제출을 클릭합니다. 이렇게하면 요청이 CA에 제출됩니다. 그런 다음 요청 ID가 표시되며 나중에 필요합니다. 이것을 저장하세요! 나중에 필요할 것입니다.

4. 이제 로컬 컴퓨터의 Windows 인증서 관리자를 사용하여 ADCS 환경의 일부인 CA 서버에 연결하거나 certsrv.msc를 실행하여 RDP를 통해 연결합니다.

5. 대기 중인 요청을 클릭합니다.

Winrm over SSL : Issuing certificate from pending request.

6. 보류 중인 요청을 마우스 오른쪽 단추로 클릭하고 모든 작업을 클릭한 다음 발급을 클릭합니다. 이렇게하면 이전 단계의 요청 ID를 기반으로 방금 제출한 요청이 승인됩니다.

인증서 등록

이제 CA에서 인증서를 발급했으므로 WinRM을 구성 중인 서버에 인증서를 등록할 시간입니다. 다음을 수행하세요:

  1. SSL로 WinRM을 설정 중인 서버에서 http://<서버 이름 FQDN>/certckpn.asp로 이동합니다. 단일 대기 중인 인증서 요청이 표시됩니다.
Viewing status of pending certificate request.

필요한 경우 다른 기기에서 공개 인증서를 검색할 수 있지만 HTTPS를 통해 WinRM을 설정하는 서버에서 시작하는 것이 프로세스를 단순화합니다.

2. 목록에서 제출한 요청을 선택하고 인증서 체인을 다운로드하십시오. HTTPS를 통해 WinRM을 구성 중인 서버가 CA를 루트 서버로 사용하는 경우 전체 인증서 체인을 다운로드해야 합니다.

Downloading certificate chain.

3. 인증서 체인 파일을 엽니다. 서버용 인증서와 체인에서 더 높은 인증서 기관의 모든 인증서를 볼 수 있어야 합니다. 아래 win2.lab.int는 요청된 인증서이고, WIN2-CAwin2.lab.int의 인증서를 발급한 CA의 인증서입니다.

Showing certificates inside of the certificate chain.

4. 인증서 중 하나를 두 번 클릭하고 열리는 상자에서 인증서 설치 버튼을 클릭하십시오. 이 인증서는 특정 사용자가 아닌 서버에서 사용되므로 옵션을 로컬 컴퓨터로 변경하십시오.

Importing certificate into the local machine certificate store.

5. 모든 것을 기본값으로 남기고 프롬프트를 계속 진행하십시오. 기본값은 인증서를 신뢰할 수 있는 루트 인증서 저장소에 배치해야 합니다.

6. 이제 목록의 다른 인증서 각각에 대해 단계 3에서 5를 반복하십시오. 여러 개의 인증서가 있는 경우 다른 모든 인증서가 중간 인증서 기관 저장소에 배치되었는지 확인하십시오.

WinRM HTTPS 수신기 생성 및 설정

이제 모든 인증서가 설치되었으므로 서버에서 해당 인증서를 수신기에 사용하도록 WinRM을 구성할 시간입니다.

WinRM 서버에서 PowerShell을 열어주세요:

  1. 아래 명령을 실행하여 WinRM 수신기를 자동으로 설정하십시오. winrm 명령은 WinRM의 요구 사항과 일치하는 인증서를 로컬 머신 인증서 저장소에서 검색하여 이 작업을 수행합니다.
winrm quickconfig -transport:https

2. Windows 방화벽은 기본적으로 5986 포트의 WinRM HTTPS 포트를 차단합니다. 방화벽이 수신 포트 5986을 허용하도록하려면 다음 PowerShell 명령을 실행하십시오.

$FirewallParam = @{
     DisplayName = 'Windows Remote Management (HTTPS-In)'
     Direction = 'Inbound'
     LocalPort = 5986
     Protocol = 'TCP'
     Action = 'Allow'
     Program = 'System'
 }
 New-NetFirewallRule @FirewallParam

WinRM SSL 연결 테스트

이 시점에서 연결할 준비가되었습니다. Invoke-Command 또는 Enter-PSSession과 같은 즐겨 찾는 PSRemoting cmdlet을 사용하여 서버에 연결하고 UseSSL 매개 변수를 사용하십시오.

Enter-PSSession -ComputerName ServerB.domain.com -UseSSL -Credential (Get-Credential)

ComputerName 매개 변수의 값이 인증서 생성 중에 제공된 공통 이름과 정확히 일치하는지 항상 확인하십시오. 다른 호스트 이름 또는 호스트의 IP 주소에 연결을 시도하면 인증서 불일치 오류가 발생하여 연결 실패가 발생합니다.

인증서 기반 인증 설정

이제 이미 HTTPS를 사용하는 WinRM 수신기를 설정해야합니다. 그렇다면 원격 서버의 로컬 사용자로 인증하는 데 사용자 인증서를 사용할 수도 있습니다. 사용자 인증서를 사용하면 가장 안전하지만 설정하는 데 시간이 걸립니다. 각 인증서가 개별 클라이언트 머신에 고유하기 때문에 반복적인 작업도 많이 수행해야합니다.

인증서 기반 인증은 로컬 사용자 계정과 도메인 사용자 계정에서만 작동합니다.

인증서 요청 생성 섹션에서 클라이언트 인증을 위한 인증서를 요청한 것으로 가정하고 계속 읽어주세요:

인증서-인증 및 서버에서 사용자 매핑 활성화

  1. 서버에서, Set-Item 명령을 실행하여 인증서 기반 인증을 허용합니다.
Set-Item WSMan:\localhost\Service\Auth\Certificate -Value $true

2. 다음으로, 신뢰할 수 있는 루트 인증 기관 저장소를 살펴보기 위해 Get-ChildItem을 실행하여 클라이언트 인증서를 발급한 CA의 썸프린트를 찾습니다. 이를 위해 CA 이름을 포함하는 주체로 인증서를 필터링합니다.

Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -like 'CA-Name'}

3. 아래 명령을 실행하십시오. 여기서 SubjectName은 인증서를 생성할 때 제공한 사용자 인증서의 주체입니다.

CAThumbprint는 이전 명령으로 수집된 CA의 썸프린트이며, 그런 다음 프롬프트된 자격 증명은 인증서 기반 인증에 사용될 로컬 사용자의 사용자 이름과 비밀번호입니다.

New-Item WSMan:\localhost\ClientCertificate -Subject SubjectName -URI * -Issuer CAThumbprint -Credential (Get-Credential)

인증서 기반 인증 테스트

이제 인증서와 사용자 매핑이 설정되었으므로 자격 증명을 제공하지 않고 클라이언트 머신에서 인증서를 사용하여 인증할 수 있습니다.

PowerShell에서 클라이언트에서 개인 인증서 저장소를 확인하여 클라이언트 인증서의 썸프린트를 가져옵니다.

Get-ChildItem Cert:\CurrentUser\My

이제 아래와 같이 CertificateThumbprint 매개변수에 썸프린트를 지정하여 PSRemoting 명령을 실행하십시오.

Enter-PSSession -ComputerName ServerName -CertificateThumbprint <Thumbprint>

인증서 기반 인증은 HTTPS 리스너와만 사용할 수 있으므로 -UseSSL이 함축됩니다. 다른 인증 방법에서는 SSL을 사용하도록 지정해야 합니다.

다음 단계

이제 SSL을 통해 WinRM을 설정하는 방법을 배웠으니, PowerShell Remoting: The Ultimate Guide 포스트에서 PSRemoting에 대해 더 알아보세요!

PSRemoting을 비롯한 PowerShell에 대해 자세히 알고 싶으세요? PowerShell for Sysadmins, the book를 확인해보세요!

Source:
https://adamtheautomator.com/winrm-ssl/