WinRM 연결 설정
WinRM 연결 설정 (Establish a WinRM Connection)
이 문서는 winrm 커뮤니케이터를 사용해 Packer가 만든 머신에 WinRM 연결을 설정하는 방법을 설명해요. 파일 업로드와 스크립트 실행 같은 작업을 Packer가 수행할 수 있게 해 주죠.
출처: Packer 공식 문서
본문
Introduction (소개)
커뮤니케이터(communicator)는 Packer가 파일을 업로드하고, 스크립트를 실행하는 등 생성 중인 머신과 상호작용하는 메커니즘이에요. winrm 커뮤니케이터는 이를 위해 Windows Remote Management 프로토콜을 사용해요.
Getting Ready to Use the winrm Communicator (winrm 커뮤니케이터 사용 준비)
winrm 커뮤니케이터는 기본 커뮤니케이터가 아니므로 항상 "communicator": "winrm", 템플릿 옵션을 명시적으로 설정해야 해요. 또한 거의 항상 게스트 머신에서 WinRM을 활성화하고 구성하는 사전 실행 스크립트를 제공해야 해요. 이는 일반적으로 PowerShell 스크립트나 배치 파일 형태예요.
완전히 새롭고 구성되지 않은 운영체제 이미지에서 빌드한다면, Windows의 자동 운영체제 설치에 필요한 Autounattend.xml 파일의 일부로 이 사전 실행 스크립트를 제공해야 해요. 클라우드에서 빌드하거나 사전 설치된 이미지에서 빌드한다면, 사전 실행 스크립트를 제공하는 방법은 빌더에 따라 달라져요. winrm 구성 스크립트를 제공하는 방법에 대한 자세한 내용은 각 빌더의 문서를 참고하세요.
autounattend 파일 사용법에 익숙하지 않다면 빠른 가이드를 살펴보세요. 운영체제를 자동으로 초기화하는 방법을 아는 것은 Packer로 iso에서 빌드하는 데 성공하기 위한 핵심이에요.
winrm Communicator Options (winrm 커뮤니케이터 옵션)
winrm_username(string) — WinRM에 연결할 때 사용할 사용자 이름.winrm_password(string) — WinRM에 연결할 때 사용할 비밀번호.winrm_host(string) — WinRM이 연결할 주소.
참고: Amazon EBS 빌더를 사용한다면 ssh_interface 를 통해 WinRM이 연결할 인터페이스를 지정할 수 있어요.
winrm_no_proxy(bool) — 이 값을true로 설정하면 원격host:port가NO_PROXY환경 변수에 추가돼요. 이는 원격 호스트에 연결할 때 구성된 프록시를 우회하는 효과가 있어요. 기본값은false예요.winrm_port(int) — 연결할 WinRM 포트. 일반 암호화되지 않은 연결에서는 기본값이5985이고,winrm_use_ssl이 true로 설정되면 SSL의 경우5986이에요.winrm_timeout(duration string | ex: "1h5m2s") — WinRM을 사용할 수 있을 때까지 기다리는 시간. Windows 머신을 설정하는 데는 일반적으로 오래 걸리므로 기본값은30m이에요.winrm_use_ssl(bool) —true면 WinRM에 HTTPS를 사용해요.winrm_insecure(bool) —true면 서버 인증서 체인과 호스트 이름을 확인하지 않아요.winrm_use_ntlm(bool) —true면 기본(기본 인증) 대신 (세션 보안을 포함한) NTLMv2 인증이 WinRM에 사용돼요. 대상 게스트 내에서 기본 인증이 활성화될 필요가 없다는 요구 사항이 제거돼요. 원격 연결 인증에 대한 더 자세한 내용은 여기에서 찾을 수 있어요.
Examples (예시)
Basics of WinRM Connection (WinRM 연결 기초)
WinRM은 Packer 전용 프로토콜이 아니라는 점에 유의하세요. Microsoft에는 WinRM에 대한 문서가 많이 있어요. 이 가이드를 읽은 후에도 여전히 WinRM으로 연결할 수 없다면 Microsoft 문서를 확인해서 빠뜨린 것이 없는지 확인해 보세요.
Packer가 WinRM으로 연결할 수 있으려면 일반적으로 취해야 할 몇 가지 단계가 있어요.
- Packer가 연결할 사용자 이름과 비밀번호를 설정해요.
- 원격 실행(그리고 필요하면 높은 권한으로의 원격 실행)을 활성화하는 필요한 레지스트리 편집을 해요.
- WinRM을 시작하고, 기본 인증을 허용하는 데 필요한 구성을 설정해요.
- 연결 방식에 따라 포트 5985 및/또는 5986을 열어요.
- WinRM을 실행하고 컴퓨터가 재시작될 때 자동으로 실행되도록 설정해요.
- 필요한 경우 자체 서명 인증서를 생성하거나 WinRM 리스너에 실제 인증서를 제공해요.
Configuring WinRM in VMware (VMware에서 WinRM 구성)
Autounattend.xml을 사용해 WinRM을 구성한다면, 여기 표시된 것처럼 구성 커맨드를 Autounattend 파일에 직접 넣는 것이 WinRM을 설정하는 가장 간단한 방법이에요.
각 줄을 개별적으로 입력하는 대신, winrm 구성 커맨드를 담은 배치 파일을 autounattend에 추가할 수도 있어요. winrm 설정에 따라 이 배치 파일은 복잡하거나 매우 간단할 수 있어요.
다음은 Autounattend 파일 안에서 배치 파일을 호출하는 방법의 예시예요.
<FirstLogonCommands>
...
<SynchronousCommand wcm:action="add">
<CommandLine>cmd.exe /c a:\winrmConfig.bat</CommandLine>
<Description>Configure WinRM</Description>
<Order>3</Order>
<RequiresUserInput>true</RequiresUserInput>
</SynchronousCommand>
...
</FirstLogonCommands>
비슷한 방식으로 PowerShell 스크립트를 호출하는 것도 가능해요.
위에서 참조한 winrmConfig.bat는 다음과 같이 간단할 수 있어요.
rem basic config for winrm
cmd.exe /c winrm quickconfig -q
rem allow unencrypted traffic, and configure auth to use basic username/password auth
cmd.exe /c winrm set winrm/config/service @{AllowUnencrypted="true"}
cmd.exe /c winrm set winrm/config/service/auth @{Basic="true"}
rem update firewall rules to open the right port and to allow remote administration
cmd.exe /c netsh advfirewall firewall set rule group="remote administration" new enable=yes
rem restart winrm
cmd.exe /c net stop winrm
cmd.exe /c net start winrm
위 배치 파일은 매우 단순하고 안전하지 않다는 점에 유의하세요. 최소한의 구성 예시로 의도된 거예요. 아래에서 더 복잡하고 더 안전한 WinRM 구성 과정의 예시를 찾을 수 있어요.
이 배치 파일은 HTTPS가 아닌 HTTP 연결에만 동작하지만, Autounattend 파일에서 이전에 만든 사용자 이름과 비밀번호만으로 연결할 수 있게 해 줘요. 위 배치 파일은 매우 간단한 Packer 구성으로 연결할 수 있게 해 줘요.
"communicator": "winrm",
"winrm_username": "packeruser",
"winrm_password": "SecretPassword"
구성에 사용되는 더 복잡한 PowerShell 스크립트 예시는 아래에서 볼 수 있어요.
# A Packer config that works with this example would be:
#
#
# "winrm_username": "Administrator",
# "winrm_password": "SuperS3cr3t!!!",
# "winrm_insecure": true,
# "winrm_use_ssl": true
#
#
# Create username and password
net user Administrator SuperS3cr3t!!!
wmic useraccount where "name='Administrator'" set PasswordExpires=FALSE
Set-ExecutionPolicy Unrestricted -Scope LocalMachine -Force -ErrorAction Ignore
# Don't set this before Set-ExecutionPolicy as it throws an error
$ErrorActionPreference = "stop"
# Remove HTTP listener
Remove-Item -Path WSMan:\Localhost\listener\listener* -Recurse
# Create a self-signed certificate to let ssl work
$Cert = New-SelfSignedCertificate -CertstoreLocation Cert:\LocalMachine\My -DnsName "packer"
New-Item -Path WSMan:\LocalHost\Listener -Transport HTTPS -Address * -CertificateThumbPrint $Cert.Thumbprint -Force
# WinRM
write-output "Setting up WinRM"
write-host "(host) setting up WinRM"
# Configure WinRM to allow unencrypted communication, and provide the
# self-signed cert to the WinRM listener.
cmd.exe /c winrm quickconfig -q
cmd.exe /c winrm set "winrm/config/service" '@{AllowUnencrypted="true"}'
cmd.exe /c winrm set "winrm/config/client" '@{AllowUnencrypted="true"}'
cmd.exe /c winrm set "winrm/config/service/auth" '@{Basic="true"}'
cmd.exe /c winrm set "winrm/config/client/auth" '@{Basic="true"}'
cmd.exe /c winrm set "winrm/config/service/auth" '@{CredSSP="true"}'
cmd.exe /c winrm set "winrm/config/listener?Address=*+Transport=HTTPS" "@{Port=`"5986`";Hostname=`"packer`";CertificateThumbprint=`"$($Cert.Thumbprint)`"}"
# Make sure appropriate firewall port openings exist
cmd.exe /c netsh advfirewall firewall set rule group="remote administration" new enable=yes
cmd.exe /c netsh advfirewall firewall add rule name="Port 5986" dir=in action=allow protocol=TCP localport=5986 profile=any
# Restart WinRM, and set it so that it auto-launches on startup.
cmd.exe /c net stop winrm
cmd.exe /c sc config winrm start= auto
cmd.exe /c net start winrm
WinRM을 모든 시작에서 자동 실행되도록 설정하는 것이, 향후 WinRM 연결을 받을 필요가 없다면 올바른 선택이 아닐 수 있음에 유의하세요. 마지막 프로비저닝 단계에서 정리하고 불필요한 방화벽 포트를 닫아 이미지가 안전한지 확인하세요.
Configuring WinRM in the Cloud (클라우드에서 WinRM 구성)
대부분의 클라우드는 인스턴스가 실행될 때 실행되는 구성 스크립트를 제공할 수 있게 해 줘요. AWS에서는 이것이 user_data_file 이에요. Google Cloud에서는 windows-startup-script-cmd 메타데이터 태그를 사용해 제공돼요.
예시
기본적으로 이 파일들은 winrm을 구성하는 powershell 또는 cmd 스크립트로, Autounattend에 감쌀 필요가 없어요. 각 클라우드가 요청하는 형식으로 스크립트를 제공하고, 클라우드가 내부적으로 관리하도록 허용하지 않는 방화벽 규칙은 수동으로 구성해야 해요. 각 클라우드의 더 구체적인 세부 사항은 빌더 섹션에서 찾을 수 있어요.
위 예시들은 클라우드 준비에도 동작하지만, 클라우드가 얼마나 사전 구성했는지에 따라 과할 수 있어요.
더 알아보기 (Learn more)
- 이 페이지는 Packer 공식 문서에서 가져왔어요.