Infra & DevOps

[WinRM] WinRM ์„ค์ • ๋ฐ HTTPS ํ†ต์‹ 

hyeyeonismm 2024. 5. 31. 18:52

WinRM (Windows Remote Management)

Microsoft์—์„œ ์ œ๊ณตํ•˜๋Š” ์›๊ฒฉ ๊ด€๋ฆฌ ํ”„๋กœํ† ์ฝœ๋กœ, Windows ์„œ๋ฒ„ ๋ฐ ์‹œ์Šคํ…œ์„ ์›๊ฒฉ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ‘œ์ค€ SOAP ๊ธฐ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ ์นœํ™”์ ์ธ ํ”„๋กœํ† ์ฝœ์ธ WS-Management ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. Powershell ๋ช…๋ น์„ ์›๊ฒฉ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ, Linux์—์„œ Ansible์„ ์‚ฌ์šฉํ•˜์—ฌ Windows OS๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด WinRM์„ ์„ค์ •ํ•˜์˜€๋‹ค. ๋ฆฌ๋ˆ…์Šค์™€ Windows๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ด€๋ฆฌ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ˆ…์Šค์—์„œ ์œˆ๋„์šฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” WinRM๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด์„œ ํ†ต์‹ ํ•ด์•ผ ํ•œ๋‹ค.

 

WinRM ๊ตฌ๋™ ์—ฌ๋ถ€ ํ™•์ธ

WinRM ํ”„๋กœํ† ์ฝœ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ WinRM ๊ตฌ๋™ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

๋งŒ์•ฝ ํ™œ์„ฑํ™” ์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด WinRM์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

winrm quickconfig

 

์—๋Ÿฌ๋‚˜๋Š” ๊ฒฝ์šฐ

VM ํ™˜๊ฒฝ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ–ˆ๋Š”๋ฐ ๋‚ด PC์—์„œ๋Š” '๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ˜•์‹ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ณต์šฉ์œผ๋กœ ...' ๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
์ฐพ์•„๋ณด๋‹ˆ ๋„คํŠธ์›Œํฌ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ Public์ด๋ฉด WinRM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค. WinRM์€ ์›๊ฒฉ ๊ด€๋ฆฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•…์˜์ ์œผ๋กœ ์›๊ฒฉ ์‹œ์Šคํ…œ์— ์ ‘์†ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด Public ๋„คํŠธ์›Œํฌ์—์„œ๋Š” ์ œํ•œ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Private์ด๋‚˜ Domain์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

Set-NetConnectionProfile -NetworkCategory Privte

 

๋ชจ๋“  Hosts๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •

Set-Item wsman:\localhost\Client\TrustedHosts -value *

TrustedHosts ๋ชฉ๋ก์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์•„๋ž˜์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๋˜์–ด์žˆ์œผ๋ฉฐ, ์›๊ฒฉ ์ ‘์† ํ—ˆ์šฉ์„ ์œ„ํ•ด ๋ชจ๋“  Hosts๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. 
๋งŒ์•ฝ ํ†ต์‹ ํ•˜๋ ค๋Š” OS๊ฐ€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๋‚ด์— ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น ์„ค์ •์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ ํŠน์ • ํ˜ธ์ŠคํŠธ๋งŒ์„ ์‹ ๋ขฐํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ IP๋ฅผ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

WinRM ์„œ๋น„์Šค์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ˜„์žฌ ๋ฆฌ์Šค๋„ˆ ํ™•์ธ

WinRM์€ ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP/HTTPS ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

winrm enumerate winrm/config/Listener

 

๋˜ํ•œ ๋‚˜๋Š” Ansible ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ windows๋ฅผ managed node๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์˜ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋‹ค.

winrm set winrm/config/service/Auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'

๊ธฐ๋ณธ ์ธ์ฆ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๊ณ„์ • ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ์‹œ์Šคํ…œ์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๊ณ , AllowUnencrypted True ์„ค์ •์„ ํ†ตํ•ด ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ HTTP ํ”„๋กœํ† ์ฝœ์˜ ์—ฐ๊ฒฐ๋„ ํ—ˆ์šฉํ–ˆ๋‹ค.

 

HTTPS ํฌํŠธ๋ฅผ ํ†ตํ•œ WinRM ํ†ต์‹  ํ—ˆ์šฉํ•˜๋Š” ๋ฒ•

WinRM์—์„œ HTTPS ํ†ต์‹ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. SSL/TLS ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ.. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด HTTPS ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. https://docs.ansible.com/ansible/devel//os_guide/windows_winrm.html๋ฅผ ์ฐธ๊ณ ํ–ˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์šฉ์œผ๋กœ ์‹ค์ œ ์šด์˜๋ง์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ CA์—์„œ ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

# Create self signed certificate
$certParams = @{
    CertStoreLocation = 'Cert:\LocalMachine\My'
    DnsName           = $env:COMPUTERNAME
    NotAfter          = (Get-Date).AddYears(1)
    Provider          = 'Microsoft Software Key Storage Provider'
    Subject           = "CN=$env:COMPUTERNAME"
}
$cert = New-SelfSignedCertificate @certParams

# Create HTTPS listener
$httpsParams = @{
    ResourceURI = 'winrm/config/listener'
    SelectorSet = @{
        Transport = "HTTPS"
        Address   = "*"
    }
    ValueSet = @{
        CertificateThumbprint = $cert.Thumbprint
        Enabled               = $true
    }
}
New-WSManInstance @httpsParams

# Opens port 5986 for all profiles
$firewallParams = @{
    Action      = 'Allow'
    Description = 'Inbound rule for Windows Remote Management via WS-Management. [TCP 5986]'
    Direction   = 'Inbound'
    DisplayName = 'Windows Remote Management (HTTPS-In)'
    LocalPort   = 5986
    Profile     = 'Any'
    Protocol    = 'TCP'
}
New-NetFirewallRule @firewallParams

 

์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ Powershell์— ์ž…๋ ฅํ•œ ํ›„, ๋‹ค์‹œ Listener์„ ์‚ดํŽด๋ณด๋ฉด HTTPS ํ†ต์‹  ํฌํŠธ๋„ ์—ด๋ฆฐ ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.