jueves, 8 de agosto de 2019

Como guardar registros detallados de las sesiones de PowerShell

Auditar la el historial de actividad de PowerShell es algo que puede venir útil en caso de incidentes de seguridad o con fines de documentación. En este post, se muestra como habilitar una transcripción detallada de la actividad de PowerShell mediante directivas de grupo.

En una nueva directiva de grupo, ir a "Configuración del equipo > Directivas > Plantillas Administrativas > Componentes de Windows > Windows Powershell" y seleccionar "Activar la transcripción de Powershell". Aquí debe habilitarse la política y seleccionar un directorio donde se guardaran las transcripciones.



Despues de un gpupdate /force para forzar la aplicación de la nueva política, podemos probar si la nueva configuración está en efecto corriendo un comando de PowerShell:


Y finalmente revisar que los comandos ingresados esten siendo registrados en el directorio especificado:


Eso es todo, en otro post se mostrará como utilizar Start-Transcript para registrar los comandos de una sesión individual.

martes, 16 de julio de 2019

Hyper-V: Conectar una maquina virtual a otro VMSwitch con PowerShell

Para conectar una máquina virtual a un VMSwitch distinto al que tiene asignada o asignarle uno por primera vez en caso de que no este conectada, se puede seguir el siguiente ejemplo. En primer lugar, verificar a que switch virtual está conectada la VM (si es que tiene alguno asignado):

PS C:\Users\Administrador> get-vm -Name vm1 | Get-VMNetworkAdapter

Name             IsManagementOs VMName SwitchName MacAddress   Status IPAddresses
----             -------------- ------ ---------- ----------   ------ -----------
Adaptador de red False          vm1               00155D581500 {Ok}   {}

En este caso se ve que el adaptador de esta VM no está conectado a ningún switch virtual. Como este servidor aún no tiene ningún VMSwitch, empiezo verificando las interfaces físicas disponibles en el equipo:

PS C:\Users\Administrador> Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Ethernet0                 Intel(R) 82574L Gigabit Network Conn...       4 Up           00-0C-29-F7-C4-22         1 Gbps
vEthernet (int_switch)    Hyper-V Virtual Ethernet Adapter             12 Up           00-15-5D-58-15-01        10 Gbps


En este servidor la interfaz física Ethernet0 está libre, con el siguiente comando creo un VMSwitch asociado a la misma:

PS C:\Users\Administrador> New-VMSwitch -Name vmswitch_prod -NetAdapterName "Ethernet0" -AllowManagementOS $true

Name          SwitchType NetAdapterInterfaceDescription
----          ---------- ------------------------------
vmswitch_prod External   Intel(R) 82574L Gigabit Network Connection


Finalmente, conectamos el adaptador de la máquina virtual al VMSwitch nuevo con el cmdlet Connect-VMNetworkAdapter y verificamos:


PS C:\Users\Administrador> get-vm -Name vm1 | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName vmswitch_prod
PS C:\Users\Administrador> get-vm -Name vm1 | Get-VMNetworkAdapter

Name             IsManagementOs VMName SwitchName    MacAddress   Status IPAddresses
----             -------------- ------ ----------    ----------   ------ -----------
Adaptador de red False          vm1    vmswitch_prod 00155D581500 {Ok}   {}

miércoles, 10 de julio de 2019

PowerShell: Cambiar el tipo de perfil de red en Windows

En ocasiones, al tratar de configurar WinRM para conexiones remotas con PowerShell, recibimos un error debido a que PowerShell considera inseguro realizar conexiones sobre una red pública. Para resolver esto es necesario modificar el perfil de red que Windows asigna a los adaptadores de red, a continuación se muestra como hacer este cambio.

1-) Identificar el adaptador de red cuyo perfil necesitamos modificar:

PS C:\Windows\system32> Get-NetConnectionProfile

Name             : Unidentified network
InterfaceAlias   : vEthernet (Default Switch)
InterfaceIndex   : 10
NetworkCategory  : Public
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic

Name             : Network 18
InterfaceAlias   : vEthernet (Ether-wifi)
InterfaceIndex   : 15
NetworkCategory  : Private
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic
2-) Utilizando el InterfaceIndex que obtuvimos en el paso anterior, modificamos al tipo de perfil deseado (Las opciones son Private, Public y Domain):

PS C:\Windows\system32> Set-NetConnectionProfile -InterfaceIndex 10 -NetworkCategory Private
PS C:\Windows\system32> Get-NetConnectionProfile



Name             : Unidentified network
InterfaceAlias   : vEthernet (Default Switch)
InterfaceIndex   : 10
NetworkCategory  : Private
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic


Name             : Network 18
InterfaceAlias   : vEthernet (Ether-wifi)
InterfaceIndex   : 15
NetworkCategory  : Private
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

Como alternativa, podría usarse el parametro SkipNetworkCheck al habilitar el PSRemoting para que se ignore el tipo de perfil establecido en el adaptador de red:

PS C:\Windows\system32> Enable-PSRemoting -Force -SkipNetworkCheck

sábado, 6 de julio de 2019

PowerShell: Determinar el historial de membresias de grupo en Active Directory

Hay ocasiones en donde es necesario conocer en que momento un usuario fué agregado a un grupo, en estos casos, esta información puede extraerse de Active Directory gracias a ciertos atributos existentes en los metadatos de replicación.

PS C:\Users\Administrador>
PS C:\Users\Administrador> $username = "juan"
PS C:\Users\Administrador> $userobj  = Get-ADUser $username
PS C:\Users\Administrador>
PS C:\Users\Administrador> Get-ADUser $userobj.DistinguishedName -Properties memberOf |
>>  Select-Object -ExpandProperty memberOf |
>>  ForEach-Object {
>>     Get-ADReplicationAttributeMetadata $_ -Server localhost -ShowAllLinkedValues |
>>       Where-Object {$_.AttributeName -eq 'member' -and
>>       $_.AttributeValue -eq $userobj.DistinguishedName} |
>>       Select-Object FirstOriginatingCreateTime, Object, AttributeValue
>>     } | Sort-Object FirstOriginatingCreateTime -Descending

FirstOriginatingCreateTime Object                                               AttributeValue
-------------------------- ------                                               --------------
6/7/2019 17:48:59          CN=Administradores clave,CN=Users,DC=seclab,DC=local CN=juan,CN=Users,DC=seclab,DC=local


PS C:\Users\Administrador> 

Como se ve en la salida del script anterior, con esto puede determinarse en que fecha un usuario fué agregado a uno o mas grupos. Podría ser que necesitamos esa información con fines forenses, o bien para determinar que membresias de grupo podrían ser reducidas en caso de que algún usuario experimente problemas de "token bloat". El script es una colaboración de Ashley McGlone, ex Premier Field Engineer de Microsoft, aquí puede verse el articulo original.

Por último vale mencionar que ademas de funcionar con cuentas de usuario, puede utilizarse con cuentas de equipos, sustituyendo Get-ADUser por Get-ADComputer

lunes, 8 de abril de 2019

Explorando la red con PowerShell: Escaneo de puertos TCP y barridos ping

A continuación comparto una recopilación de algunos comandos útiles a la hora de explorar la red utilizando PowerShell.

Barridos ping

Para descubrir todos los hosts activos de una red de forma rápida podemos realizar un barrido ping o ICMP. En este ejemplo se usa un operador de rango para hacer ping a todas las IP's de una red /24 y del resultado filtramos los que contienen la linea TTL, que son los que nos interesan (esto excluye las IP's que respondieron con tiempo de espera agotado)


PS C:\> 1..254 | % {echo "192.168.88.$_"; ping -n 1 -w 100 192.168.88.$_} | Select-String ttl

Respuesta desde 192.168.88.1: bytes=32 tiempo=2ms TTL=64
Respuesta desde 192.168.88.214: bytes=32 tiempo=2ms TTL=64
Respuesta desde 192.168.88.229: bytes=32 tiempo<1m TTL=128

PS C:\>

Escaneo de puertos TCP

Para probar si un puerto TCP está abierto, podemos usar el cmdlet Test-NetConnection

PS C:\> foreach ($ip in 1..254) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.88.$ip}



ComputerName            : 192.168.88.1
RemoteAddress           : 192.168.88.1
RemotePort              : 80
NameResolutionResults   : 192.168.88.1
MatchingIPsecRules      :
NetworkIsolationContext : Private Network
InterfaceAlias          : vEthernet (Ether-wifi)
SourceAddress           : 192.168.88.229
NetRoute (NextHop)      : 0.0.0.0
TcpTestSucceeded        : True


ADVERTENCIA: TCP connect to (192.168.88.2 : 80) failed
ADVERTENCIA: Ping to 192.168.88.2 failed with status: TimedOut

ComputerName            : 192.168.88.2
RemoteAddress           : 192.168.88.2
RemotePort              : 80
NameResolutionResults   : 192.168.88.2
MatchingIPsecRules      :
NetworkIsolationContext : Private Network
InterfaceAlias          : vEthernet (Ether-wifi)
SourceAddress           : 192.168.88.229
NetRoute (NextHop)      : 0.0.0.0
PingSucceeded           : False
PingReplyDetails (RTT)  : 0 ms
TcpTestSucceeded        : False


El comando anterior arroja resultados muy verbose para mi gusto, la siguiente alternativa facilita probar un rango de puertos y da como resultado una salida mas limpia:

PS C:\> 1..1024 | % { echo ((new-object Net.Sockets.TcpClient).Connect("192.168.61.1",$_)) "$_ is open" } 2>$null
22 is open
80 is open
443 is open
PS C:\>

Eso es todo. En una próxima entrada analizaremos opciones para probar puertos UDP con PowerShell.

domingo, 7 de abril de 2019

Preparación para el examen AZ-500: Sesiones de Ignite

Recientemente se lanzó el examen beta AZ-500: Microsoft Azure Security Engineer, siendo el único necesario para obtener la certificación Microsoft Certified: Azure Security Engineer Associate. De momento no hay una guía de preparación oficial, por lo cual lo que voy a apoyarme exclusivamente en la documentación de Microsoft y en Sesiones de Ignite y Microsoft Mechanics.

Si quieres tomar este exámen beta, puedes conseguir un voucher con un 80% de descuento en este post de Microsoft Learning Blog.

A continuación, una lista de las sesiones de Ignite que estoy usando como preparación para este examen.

Azure Essentials: Defense in depth security



Azure Security Center | Azure Friday



Azure security & management - BRK2021



Azure Security fundamentals: Protecting infrastructure apps and data in the cloud - BRK2395



Built-in not bolted on - securing your Azure resources in practice - THR3064



Governing Azure subscriptions with auditing management groups and policies - BRK3268



Protect server workloads across datacenter and cloud with Azure Security Center and - BRK3235



Protect the keys to your kingdom with Privileged Identity Management - BRK3248



Securing your data with Azure SQL DB : Build 2018



Understanding how Microsoft Information Protection capabilities work together to - BRK3002



Accelerate deployment and adoption of Microsoft Information Protection solutions - BRK3009



Securing your hybrid cloud environments with Azure ATP and AAD Identity Protection - BRK3237



Securing web applications using Web Application Firewall



Securing Azure SQL Database Managed Instance: Overview and best practices - BRK3163



Secure customer identity and access management using Azure Active Directory B2C - BRK3240



Monitoring your networks in Azure - BRK3298



Monitor your infrastructure and analyze operational logs at scale with Azure Monitor - BRK3354



MNA 02/08/2019 - Azure DDoS



Common sense in the world of Azure governance - THR2102




Manage keys secrets and certificates for secure apps and data with Azure Key Vault - BRK3059



Lock down access to Azure using identity - BRK3383



Learn how to protect your data in Azure Storage with new features and capabilities - BRK3340



In the security trenches of Azure SQL Database and Azure SQL Data Warehouse - BRK3149



Identity and secure resource access in App Service and Azure Functions - Matthew Henderson



Granting partners and suppliers access to resources using Azure Active Directory B2B - BRK3249



From the trenches: Hardening your Azure Active Directory tenant - THR2214



Expose APIs with peace of mind when using Azure API Management - BRK2200



Enable Azure Active Directory Conditional Access to secure user access while - BRK3241



Deep dive into Implementing governance at scale through Azure Policy - BRK3085



CYA (covering your assets) with security and threat detection in Azure - BRK2421



Azure Update Inventory and Automation for Linux and Windows VM management - BRK3063



Azure Information Protection and Exchange Online - better together - THR3076



Azure Firewall and Best Practices in building an enterprise-grade DMZ in Azure - BRK4029



Azure Active Directory security insights with Conditional Access Identity Protection - BRK3401



Azure Active Directory best practices from around the world - BRK3408



Attack discovery and investigation with Azure Advanced Threat Protection - THR3037



AKS (Azure Kubernetes Service) Security & Identity updates | Best of Microsoft Ignite 2018



How to delegate administration in Azure AD - BRK3239



Early look at Microsoft Threat Protection





domingo, 24 de marzo de 2019

Transferir archivos con PowerShell usando WinRM

Mover archivos con PowerShell es sencillo siempre que tengamos acceso vía SMB al servidor remoto. Por ejemplo, para copiar la carpeta "C:\Tools" y todo su contenido (-Recurse) al servidor FILESERVER por SMB, basta con el siguiente comando:

Copy-Item -Path "C:\Tools" -Destination "\\FILESERVER\C$" -Recurse

El comando asume que las credenciales utilizándose son válidas en el equipo remoto. En caso de que el servidor no tenga habilitado el SMB, puede lograrse lo mismo mediante WinRM. Los requisitos son los siguientes:


  • PowerShell 5.0 en el equipo local y en el remoto
  • WinRM debe estar habilitado (Viene configurado por defecto desde Windows Server 2012 en adelante, en caso de que esté deshabilitado puede habilitarse con Enable-PSRemoting -Force)
  • Los puertos 5985 (HTTP) y 5986 (HTTPS) deben estar habilitados.
  • Ambos equipos deben estar en dominio. Si la estación de trabajo desde donde se está administrando el servidor está en un grupo de trabajo, seguir las siguientes instrucciones.

Primero, crear una sesión remota y guardarla dentro de una variable:

$FileSession = New-PSSession –ComputerName FILESERVER

El comando es muy similar al anterior, el único cambio es que en este caso utilizamos el parametro ToSession y le pasamos la variable de la sesión creada previamente:

Copy-Item –Path "C:\Tools" –Destination 'C:\' –ToSession $FileSession -Recurse

A pesar de ser similar al comando anterior, esta vez la transferencia se realizó vía WinRM. Una vez terminada la transferencia, es buena practica remover la sesión que creamos:

$FileSession | Remove-PSSession

sábado, 23 de marzo de 2019

Nuevos requisitos para la certificacion Azure Administrator Associate

La semana pasada pasé el examen AZ-100: Microsoft Azure Infrastructure and Deployment que en ese momento era uno de los dos examenes necesarios para obtener la certificación Microsoft Certified: Azure Administrator Associate. Habiendo ya agendado el siguiente exámen, el AZ-101: Microsoft Azure Integration and Security, se anuncia en el blog Born to Learn un camino simplificado para esta certificación en el cual solo se requiere pasar solo un examen para obtener esta certificación. Por fortuna, el equipo de Microsoft Learning tomó algunas decisiones para hacerse cargo de las inconveniencias que puedan tener las personas que ya estaban siguiendo este track:

  • Los que ya pasaron el examen AZ-100, obtendran automáticamente la certificación Microsoft Certified: Azure Administrator Associate a partir del 1 de mayo del 2019.
  • Los que ya tomaron el examen AZ-101, hayan pasado o no, recibiran un voucher para tomar cualquier examen de Microsoft que se imparta a traves de Pearson VUE.

Examinando la alineación de los tópicos de los examenes AZ-100 y AZ-101 con los del nuevo examen AZ-103, se observa que el nuevo examen ya no cubre Logic Apps, Azure Functions, App Service, Azure Site Recovery ni Azure Migrate. Presumo que esos tópicos se moverán a algún otro rol intermedio que se anuncie a futuro, o bien estarían incluidos únicamente en el path de Microsoft Certified Azure Solutions Architect Expert.

lunes, 11 de junio de 2018

Solución al error de autenticación en conexión a Escritorio remoto "Oracle/CredSSP"

Las actualizaciones de Mayo del 2018 trajeron sorpresas para los administradores de entornos donde las conexiones RDP dejaron de funcionar repentinamente. Microsoft publicó un articulo donde detalla el alcance de la vulnerabilidad de CredSSP cuyos parches trajeron consigo este inconveniente que se presenta principalmente en los casos donde el cliente ya tiene las actualizaciones de 05/2018 y el servidor aún no cuenta con las mismas.

El error que se presenta al intentar conectarse desde un cliente actualizado a un servidor sin el parche es el siguiente:

An authentication error occurred. The function requested is not supported.This could be due to CredSSP encryption oracle remediation
Error de autenticacion. No se permite la funcion solicitada.Puede deberse a una actualizacion de Oracle de cifrado CredSSP

Desde luego la solución mas recomendable es aplicar la actualización en clientes y servidores que se manejaran vía RDP, pero en casos donde es imperioso acceder a un servidor que aún no esta parchado es posible cambiar el comportamiento del cliente para que ignore la vulnerabilidad utilizando políticas de grupo o directamente modificando el registro, el cambio requiere un reinicio para tomar efecto.

Via gpedit.msc:





Vía regedit:



PS C:\Users\Administrator> reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters" /f /v AllowEncryptionOracle /t REG_DWORD /d 2
The operation completed successfully.

PS C:\Users\Administrator>



Luego de parchear los servidores, lo recomendable es revertir el cambio para no dejar el sistema expuesto al robo de credenciales.

Paso a paso: Administración remota de Hyper-V en grupos de trabajo


Para administrar remotamente un servidor Hyper-V en casos donde la estación de trabajo o el servidor están en un grupo de trabajo, deben realizarse algunas configuraciones previas que detallo en esta entrada.


Configuración en el servidor Hyper-V


Habilitar la administración remota:

PS C:\Users\Administrator> Configure-SMRemoting.exe -Enable
Server Manager Remoting is now enabled: Enabled remote access.

PS C:\Users\Administrator>

Crear las reglas de firewall necesarias para la administración remota:

Set-NetFirewallRule -DisplayGroup 'Windows Management Instrumentation (WMI)' -Enabled true -PassThru
Set-NetFirewallRule -DisplayGroup 'Remote Event Log Management' -Enabled true -PassThru
Set-NetFirewallRule -DisplayGroup 'Remote Volume Management' -Enabled true -PassThru

Habilitar CredSSP en el servidor:

PS C:\Users\Administrator> Enable-WSManCredSSP -Role Server -Force


Configuración en el cliente


Habilitar el servicio winrm y añadir el host HYPER-V a los equipos de confianza del cliente:


PS C:\Windows\system32> winrm quickconfig
WinRM service is already running on this machine.
PS C:\Windows\system32> winrm set winrm/config/client '@{TrustedHosts="hyperv"}'
Client
    NetworkDelayms = 5000
    URLPrefix = wsman
    AllowUnencrypted = true [Source="GPO"]
    Auth
        Basic = true
        Digest = true
        Kerberos = true
        Negotiate = true
        Certificate = true
        CredSSP = true
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    TrustedHosts = hyperv

PS C:\Windows\system32>


Al igual que en el servidor, en el cliente necesitamos una regla de firewall para permitir la administración remota de volúmenes:

Set-NetFirewallRule -DisplayGroup 'Remote Volume Management' -Enabled true -PassThru


Agregar el hostname y dirección IP del servidor al archivo C:\Windows\System32\Drivers\etc\hosts



Modificar la política de seguridad local (gpedit.msc) para permitir delegación de credenciales (agregar wsman/* en la lista de servidores para poder administrar cualquier servidor remoto):





Configurar las opciones de seguridad COM con la utilidad ubicada en C:\Windows\System32\dcomcnfg.exe, aquí debemos permitir el acceso remoto para anonymous logon:





Comprobamos la conectividad al servidor Hyper-V remoto, en este caso utilizando credenciales alternativas:







domingo, 3 de junio de 2018

Virtualizacion anidada (nested virtualization) en Windows Server 2016

Una nueva característica de Hyper-V en Windows Server 2016 es la de virtualización anidada o nested virtualization, que nos permite ejecutar un hipervisor como ESX o KVM dentro de un guest de Hyper-V. Este feature muy útil para ambientes de laboratorio se habilita por máquina virtual con el  comando Set-VMProcessor sobre la VM apagada.


Para comprobar si la virtualización anidada ya esta habilitada en una VM utilizar Get-VMProcessor:


Como la mayoria de los features disponibles en Hyper-V corriendo sobre Windows Server 2016, la virtualización anidada también puede utilizarse en Windows 10 con Hyper-V. Esto requiere Windows 10 versión 1607 en adelante.

sábado, 5 de agosto de 2017

Cliente NFS dañado: Troubleshooting con Process Monitor de sysinternals

En un servidor corriendo Windows Server 2003 que debía montar unas unidades de red NFS, me topé con el siguiente caso:

  • Al intentar mapear un NFS export desde el explorador de Windows se recibe el error “Network Path not found”. Lo mismo sucede con los comandos net use y mount.  

Si ahí terminara la cosa, sería una buena justificación para culpar al NFS, pero lo mas raro es el otro síntoma:

  •   Al escribir la ruta de red desde el menú ejecutar, se puede acceder al export NFS correctamente, aunque se siente algo de lentitud al recorrer directorios o copiar archivos. 

Las primeras pruebas realizadas -sin éxito- fueron tan básicas como crear un nuevo perfil de usuario y verificar que el servicio "Estación de trabajo" esté iniciado. Luego de algunas búsquedas de problemas similares, intenté verificar la negociación de versión de NFS y descartar alguna que algún recurso NFS accedido anteriormente haya dejado una configuración residual de AnonymousUID o AnonymousGID en el registro. Llegué a intentar soluciones tan desesperadas como tratar de engañar al Windows con un enlace simbólico al NFS.

Era hora de utilizar la famosa premisa que repite Mark Russinovich en cada una de sus sesiones "The case of the unexplained": Ante la duda, ejecuta Process Monitor.

Ejecuto Process Monitor y dejo corriendo las trazas sin filtros, intento montar con net use el NFS share y con la función find de Process Monitor busco la cadena de texto correspondiente a la dirección IP del servidor NFS. Aquí encuentro la primera pista útil, en el path que llama el proceso explorer puede verse una cadena de texto extraña en la ruta del export NFS, con un resultado de BAD_NETWORK_NAME.




Comparando esta traza con otra tomada en un sistema que funciona correctamente se comprueba que desde luego, esa cadena de texto es completamente anormal. Otra busqueda revela que RDPNP, que es el lo que se agrega al path del NFS, es un proveedor de red controlado por la librería mpr.dll (Multiple Provider Router):



Technet - Multiple Provider Router:
The Multiple Provider Router (MPR) handles communication between the Windows operating system and the installed network providers. It enables Windows to present an integrated network to the user.When the MPR starts, it checks the registry to determine which network providers are installed on the system and the order they should be cycled through. It loads all registered network provider DLLs and uses them to process subsequent WNet calls made by the user interface or other applications.
Curioso por conocer la evidente diferencia entre los mecanismos para acceder a un recurso de red mediante net use y acceder mediante el menú ejecutar, y ya con la librería mpr.dll ya en la mira, le dí una revisión al libro de Mark Russinovich "Windows Internals: 6th Edition", un libro "viejo" para los estándares de los libros de IT (Basado en Windows Vista y Server 2008), pero aún así vigente en su mayor parte. El siguiente diagrama muestra que hay dos vías para llegar a un recurso de red NFS, via el Multiple Provider Router o vía User Mode.





Esto explica porque es posible acceder al NFS share vía el menú ejecutar pero no es posible montarlo, pero aún no resuelve el problema. El siguiente paso fué un sfc /scannow seguido de una verificación del hash del archivo mpr.dll y posteriormente compararlo con el mismo archivo en otro servidor funcional. También se compararon permisos entre ambos archivos, lectura y ejecución, todo se ve normal en el archivo en sí.

Paso al registro, toca revisar los Network Providers, estos son unos mini-redirectores proveídos por Microsoft o terceros para acceder a servicios de Red como SMB, NFS, Unidades compartidas mediante Terminal Server y WebDav, estos redirectores están seteados en la clave del registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order\ProviderOrder, usualmente deben verse como en la siguiente imagen:


En el sistema afectado esta clave tiene un solo provider, correspondiente al componente SnacNP del fabricante Symantec:



Mientras que en otro sistema funcional se ve que el SnacNP se antepone a los demas providers:



Al intentar desinstalar el software encuentro que el mismo ya no está presente en el sistema, lo cual es bueno, pero evidentemente su instalación/desinstalación fue errática, ya que cuando fue instalado el SnacNP de Symantec sobrescribió completamente el valor existente en este sistema, en lugar de simplemente agregar la cadena de texto necesaria.

Otra curiosidad es que al intentar agregar los providers manualmente desde Centro de Redes y Recursos Compartidos > Configuración del Adaptador > Configuración avanzada, había una pestaña ausente:



Mientras que en un servidor sano vemos lo siguiente:




Finalmente el problema se corrigió editando el registro y agregando las cadenas faltantes (LanmanWorkstation, RDPNP y Nfsclientnp) al registro. Con esto ya apareció la pestaña de Network Providers que no se veía anteriormente, se logró montar la unidad NFS y la performance del recorrido por los directorios mejoró notablemente.

Por último, dejo algunos enlaces interesantes sobre el uso de las herramientas de sysinternals para troubleshooting en Windows:











martes, 1 de agosto de 2017

Bash en Windows 10: Como habilitar el Subsistema de Windows para Linux

Hace unos días Microsoft anunció que el Subsistema de Windows para Linux ya salió de version beta. Esta característica, que estaba disponible para usuarios de Windows Insider ya desde el año pasado, pasa ahora a ser un feature estable que estará disponible en los releases generales del sistema operativo.

Antes de instalar el feature, debemos verificar que nuestra versión de Windows es la 1607 en adelante, desde Configuración > Sistema > Acerca de, o desde PowerShell:

PS C:\WINDOWS\system32> [environment]::OSVersion.Version

En mi caso tengo el Build 14393, que corresponde al build 1607 de acuerdo a este articulo.





Para habilitar esta característica, ejecutar el siguiente comando desde una sesión de PowerShell corriendo con permisos elevados:

PS C:\WINDOWS\system32> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux



Luego del reinicio, en el Windows Store, hay 3 distribuciones de Linux que podemos elegir:
  • ubuntu
  • sles12
  • opensuse-42
Para instalar ubuntu desde PowerShell, ir a Configuración --> Actualización y Seguridad --> Para programadores y elegir Modo de programador. Luego de esto, con el comando bash se iniciará la descarga de ubuntu. Al finalizar la descarga, deben configurarse las opciones regionales y el nombre de usuario.



Si se presenta algún problema durante la instalación desde el Windows Store, este articulo de MSDN recopila los problemas mas comunes que se presentan y como solucionarlos.


      lunes, 31 de julio de 2017

      Node fairness: Controlando el Balanceo de maquinas virtuales en Hyper-V 2016

      En Windows Server 2016, Microsoft introdujo una nueva característica de Failover Clustering disponible exclusivamente para el rol Hyper-V. Se trata de Node Fairness, una funcionalidad pensada para mantener balanceada la carga de los nodos del cluster redistribuyendo maquinas virtuales cuando detecta que algún nodo esta sobrecargado. Las maquinas virtuales se mueven a nodos con menor carga mediante migraciones en vivo y por lo tanto sin disrupción de servicios.



      El feature viene activo por defecto y ya sea mediante Powershell o la consola de Failover Cluster Manager, puede desactivarse, configurar cuando entrará en acción y ajustar la agresividad de la heuristica que utiliza el cluster para determinar cuando un nodo esta sobrecargado.

      AutoBalancerLevel

      Hay 3 niveles de agresividad para esta heuristica:

      AutoBalancerLevel Agresividad Porcentaje de carga del Host
      1 Baja 80%
      2 Media 70%
      3 Alta 60%


      Para visualizar el valor por defecto:

      PS C:\Users\Administrador.CONTOSO> Get-Cluster -Name cluster01 | fl autobalancerlevel
      AutoBalancerLevel : 1

      Como puede verse, AutoBalancerLevel esta por defecto establecido en 1, un valor bastante relajado, que indica que si la CPU o memoria llegan al 80% de uso deberá empezar a hacer migraciones en vivo de maquinas virtuales a otros nodos del cluster.

      Para ajusta el valor de AutoBalancerLevel con PowerShell:

      PS C:\Users\Administrador.CONTOSO> (Get-Cluster).AutoBalancerLevel = 2


      AutoBalancerMode

      Otro valor configurable es AutoBalancerMode, que determina en que momentos se verificará la carga de trabajo de los nodos, por defecto viene establecido 2, lo cual hace uso de los nuevos nodos agregados al cluster para rebalancear la carga de VMs y también controla cada 30 minutos que ningún nodo este sobrecargado, de forma que si algún nodo del cluster falla y las maquinas virtuales migran a otros nodos, Node Fairness se encargará de corregir la distrubución de carga de VMs en los nodos sobrevivientes.

      AutoBalancerMode Comportamiento
      0 Deshabilitado
      1 Balancear solo al agregar nuevos nodos
      2 Balancear al agregar nodos y cada 30 minutos

      Para cambiar este valor con PowerShell:

      PS C:\Users\Administrador.CONTOSO> (Get-Cluster).AutoBalancerMode = 1  


      Para modificar estos valores desde la consola Failover Cluster Manager, en las propiedades del clúster, modificar las opciones de la pestaña equilibrador:



      Salvo excepciones por necesidades específicas, la configuración por defecto es apropiada para la mayoría de los escenarios. Node Fairness respeta las políticas existentes de anti-affinity y possible owners configuradas en el cluster.

      Balanceo de VMs en Virtual Machine Manager

      En un clúster manejado por VMM, Node Fairness se desactiva automáticamente en favor del feature Dynamic Optimization presente desde Virtual Machine Manager 2012, cuya funcionalidad es equivalente e incluso va un poco mas allá, permitiendo configurar que el balanceo ocurra en schedules establecidos por el administrador.


      sábado, 29 de julio de 2017

      Virtual Machine Manager: Error durante fase "specialize" al crear VM desde plantilla

      Recientemente estuve realizando un deployment del controlador SDNv2 de Microsoft Network Controller en un ambiente de pruebas, para esto utilice la plantilla de servicio para VMM disponible en el Github de Microsoft. La tarea terminaba con un warning e inspeccionando la consola de las 3 máquinas virtuales en todas aparecía el siguiente error:

      Error durante el sysprep de los nodos de Network Controller
       
      Luego de otros intentos fallidos tratando de determinar si se trataba de que el VHD de Windows Server 2016 estuviese dañado, me fijé en un detalle mas básico que omití modificar en el template de VMM, la zona horaria establecida en la plantilla era distinta a la del Domain Controller del lab, y para complicar aún mas el escenario, el servidor VMM también tenía otra zona horaria. Luego de corregido este detalle el deployment del servicio finalizó correctamente. Si bien este no era mi caso, otra causa de este error podría ser que la cuenta especificada en la plantilla para unir el equipo al dominio no cuente con privilegios para hacerlo.

      En otros casos donde el origen del error no sea tan evidente, puede montarse el VHD de la VM problemática y revisarse la ruta %WINDIR%\Panther\ para investigar que datos arroja el log del sysprep.