Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
tutorial:adm:configuration_-_winrm [2019/06/12 10:43]
kucerar
tutorial:adm:configuration_-_winrm [2019/06/12 13:46]
kucerar https
Line 1: Line 1:
 ====== Configuration of WinRM ====== ====== Configuration of WinRM ======
 In this tutorial we will go through configuration of WinRM which is necessary for using [[devel:documentation:systems:dev:winrm_connector|WinRM connector]] In this tutorial we will go through configuration of WinRM which is necessary for using [[devel:documentation:systems:dev:winrm_connector|WinRM connector]]
 +It will cover configuration which we tested on multiple servers together with our connector. It cover just the basic stuff and if you want to study more about this topic you can use official documentation or 3rd party tutorials which will go deeper.
  
 WinRM or Windows remote management, is a remote management protocol that uses Simple Object Access Protocol to interface with remote computers and servers, as well as Operating Systems and applications. WinRM or Windows remote management, is a remote management protocol that uses Simple Object Access Protocol to interface with remote computers and servers, as well as Operating Systems and applications.
Line 38: Line 39:
  
 You can configure trusted host which will be able to connect. If you don't want to specify this use You can configure trusted host which will be able to connect. If you don't want to specify this use
-<code>winrm set winrm/config/client @{TrustedHosts="*"}</code>+<code>winrm set winrm/config/client '@{TrustedHosts="*"}'</code>
  
 We can use several methods for authentication. We can use several methods for authentication.
   * Basic - the second command will allow unencrypted data transfer, so it's not recommended to use it with HTTP. For some testing purpose it's ok.   * Basic - the second command will allow unencrypted data transfer, so it's not recommended to use it with HTTP. For some testing purpose it's ok.
-<code>winrm set winrm/config/service/auth @{Basic="true"+<code>winrm set winrm/config/service/auth '@{Basic="true"}' 
-winrm set winrm/config/service @{AllowUnencrypted="true"}+winrm set winrm/config/service '@{AllowUnencrypted="true"}'
 </code> </code>
   * NTLM   * NTLM
-<code>winrm set winrm/config/service/auth @{Negotiate="true"}</code>+<code>winrm set winrm/config/service/auth '@{Negotiate="true"}'</code>
   * Kerberos   * Kerberos
-<code>winrm set winrm/config/service/auth @{Kerberos="true"}</code>+<code>winrm set winrm/config/service/auth '@{Kerberos="true"}'</code>
   * CredSSP   * CredSSP
-<code>winrm set winrm/config/service/auth @{CredSSP="true"}</code>+<code>winrm set winrm/config/service/auth '@{CredSSP="true"}'</code>
  
 ==== Permission configuration ==== ==== Permission configuration ====
 +If you want to use user which is not admin then we need a more configuration. If you want to use admin user you should ready to go even without it.
 +
 Now we need to set the right permissions. It's tested against NTLM, Kerberos and CredSSP auth Now we need to set the right permissions. It's tested against NTLM, Kerberos and CredSSP auth
 It's tested with local user + group and with domain user + group. It's tested with local user + group and with domain user + group.
Line 77: Line 80:
 Restart WinRM Restart WinRM
 <code>Restart-Service winrm</code> <code>Restart-Service winrm</code>
 +
 +==== Debug ====
 +When you need to check if WinRM is ready for connection but you don't have access to the Windows server to check the configuration yourself use this tips.
 +
 +Check if port is open and ready to connection, default ports are 5985 (HTTP) and 5986 (HTTPS):  
 +Linux <code>nc -vz HOST PORT</code>
 +Windows <code>Test-WSMan -ComputerName HOST
 +or
 +Test-netConnection HOST -Port PORT
 +</code>
 +Now we know if we are able to connect to the WinRM port. In case the port is not accessible it can be probably blocked in firewall.
 +
 +Next we want to try to connect to WinRM. Install [[devel:documentation:systems:dev:winrm_connector#installation|pywinrm]] follow only the first part of installation, we don't need to install connector server.
 +Open terminal (Linux) or powershell (Windows)
 +<code>
 +> python
 +>>> import winrm
 +>>> s = winrm.Session('http://HOST:5985/wsman', auth=('USER', 'PASS'), transport='ntlm')
 +>>> r = s.run_ps('Write-Host connection test OK')
 +>>> r
 +</code>
 +For connecting via HTTPS use this lane. The difference is in URL where we need to use https and port 5986. Then we are using one more argument where we specify path to trust store
 +<code>
 +>>> s = winrm.Session('https://HOST:5986/wsman', auth=(HOST, PASS), transport='ntlm', ca_trust_path='/etc/ssl/certs')
 +</code>
 +After executing "r" you should see this:
 +{{:tutorial:adm:winrm_response.png?nolink&400|}}
 +
 +Now what we did here? We connect to WinRM via ntlm and executed command Write-Host which is just basic output to console. If there is some misconfiguration in Windows server you will probably get error after executing line 
 +<code>r = s.run_ps('Write-Host connection test OK')</code>
 +
 +=== Commons errors ===
 +the specified credentials were rejected by the server - this error can be caused by:
 +  * wrong username or password
 +  * user is not in group
 +{{:tutorial:adm:winrm_rejected.png?nolink&600|}}
 +
 +Access denied 500  - this error can be caused by:
 +  * wrong username or password
 +  * WinRM SDDL is not configured
 +{{:tutorial:adm:winrm_500.png?nolink|}}
 +
 +==== HTTPS support ====
 +The best case is to use HTTPS connection to connect to WinRM. To achieve this we need to do some more configuration on the server and on the client.
 +We need to create HTTPS listener and for this we will need some certificate. In this tutorial we will cover setting up WinRM with self signed certificate.
 +The configuration will be same if we want to use some other certificate, so if you already have certificate you can skip the part where we are generating one.
 +
 +The tested way to generate self signed certificate on linux via tutorial which can be found [[https://medium.com/@tbusser/creating-a-browser-trusted-self-signed-ssl-certificate-2709ce43fd15|here]] you should follow whole process except the part with finals steps because for our purpose we don't need to import it to browsers.
 +
 +Now we have certificate which is imported in our windows server and now we can configure the HTTP listener
 +<code>winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="HOSTNAME"; CertificateThumbprint="THUMBPRINT"}'
 +for deleting
 +winrm delete winrm/config/Listener?Address=*+Transport=HTTPS
 +</code>
 +
 +Restart WinRM
 +<code>Restart-Service winrm</code>
 +
 +Next step is to validate if we can connect to HTTPS listener so follow instruction in section debug and validate if HTTPS port is accessible.
 +Before we try to execute some powershell command via WinRM we need to import this certificate into client trust store and pass the path to this store as parameter - see debug section
  • by erbenr