27 diciembre, 2018

Transferir roles FSMO Windows Server y hacer purgado de los servicios de Active Directory del dominio

Los roles de maestros de operaciones FSMO (Flexible Single Master Operations) es una característica de Active Directory. Se trata de un conjunto de tareas de un controlador de dominio usadas principalmente para la replicación entre controladores de dominio.

Existen 5 roles FSMO en un Active Directory:
  • Schema Master (Maestro de Esquema). Uno por Bosque.
  • Domain Naming Master (Maestro de Nomenclatura de Dominios). Uno por Bosque.
  • RID Master - Relative Identifier Master (Maestro Identificador Relativo). Uno por Dominio.
  • Infrastructure Master (Maestro de Infraestructura). Uno por Dominio.
  • PDC Emulator - Primary Domain Controller Emulator (Maestro Controlador Principal de Dominio). Uno por Dominio.

Figura 1: 5 Roles FSMO en Active Directory.


Comprobar el estado de los controladores de dominio

dcdiag (Domain Controller Diagnostic Tool) es una herramienta con la que podemos analizar el estado de los controladores de dominio de un bosque, ejecutando una serie de verificaciones se podrá diagnosticar su funcionamiento.

En el siguiente caso vemos el resultado del análisis en un bosque en el que existen dos controladores de dominio, uno de ellos está activo (SrvDominio Windows Server 2016) y el otro inactivo (apagado, Windows Server 2008 R2).
C:\>dcdiag
... ...

   Probando servidor: Nombre-predeterminado-primer-sitio\SRVDOMINIO
      Iniciando prueba: Advertising
         Advertencia: SRVDOMINIO no se está anunciando como un servidor horario.
         ......................... SRVDOMINIO no superó la prueba Advertising
      Iniciando prueba: FrsEvent
         Existen eventos de advertencia o de error en las últimas 24 horas después de compartir SYSVOL. Los problemas
         de replicación de SYSVOL incorrecta pueden ocasionar problemas de la directiva de grupo.
         ......................... SRVDOMINIO superó la prueba FrsEvent
      Iniciando prueba: DFSREvent
         ......................... SRVDOMINIO superó la prueba DFSREvent
      Iniciando prueba: SysVolCheck
         ......................... SRVDOMINIO superó la prueba SysVolCheck
      Iniciando prueba: KccEvent
         ......................... SRVDOMINIO superó la prueba KccEvent
      Iniciando prueba: KnowsOfRoleHolders
         [ADCONTROL1] Error en DsBindWithSpnEx(): 1722,
         El servidor RPC no está disponible..
         Advertencia: ADCONTROL1 es Schema Owner, pero no responde al enlace RPC de DS.
         Error en la búsqueda de atributos con capacidad de búsqueda LDAP en el servidor ADCONTROL1. Valor devuelto =
         81
         Advertencia: ADCONTROL1 es Schema Owner, pero no responde al enlace LDAP.
         Advertencia: ADCONTROL1 es Domain Owner, pero no responde al enlace RPC de DS.
         Advertencia: ADCONTROL1 es Domain Owner, pero no responde al enlace LDAP.
         Advertencia: ADCONTROL1 es PDC Owner, pero no responde al enlace RPC de DS.
         Advertencia: ADCONTROL1 es PDC Owner, pero no responde al enlace LDAP.
         Advertencia: ADCONTROL1 es Rid Owner, pero no responde al enlace RPC de DS.
         Advertencia: ADCONTROL1 es Rid Owner, pero no responde al enlace LDAP.
         Advertencia: ADCONTROL1 es Infrastructure Update Owner, pero no responde al enlace RPC de DS.
         Advertencia: ADCONTROL1 es Infrastructure Update Owner, pero no responde al enlace LDAP.
         ......................... SRVDOMINIO no superó la prueba KnowsOfRoleHolders

... ...


Transferir roles FSMO entre Domain Controller

netdom es una utilidad de línea de comandos para la administración de Active Directory y Relaciones de confianza.

Listar los roles FSMO

netdom query fsmo
netdom query fsmo
Figura 2: netdom query fsmo

ntdsutil es una utilidad de línea de comandos para la administración de ADDS (Active Directory Domain Services).

FSMO: ¿Transfer o Seize?

Transferir ROLES de un servidor activo a uno nuevo (de ADCONTROL1 a SRVDOMINIO)
C:\>ntdsutil
ntdsutil: roles
fsmo maintenance: connections
server connections: connect to server SrvDominio
Enlazando a SrvDominio ...
Conectado a SrvDominio usando credenciales de usuario conectado localmente.
server connections: q
fsmo maintenance: transfer naming master
fsmo maintenance: transfer infrastructure master
fsmo maintenance: transfer PDC
fsmo maintenance: transfer RID master
fsmo maintenance: transfer schema master
fsmo maintenance: q
ntdsutil: q

Transferir ROLES de un servidor inactivo (apagado) a uno activo (de ADCONTROL1 a SRVDOMINIO)
C:\>ntdsutil
ntdsutil: roles
fsmo maintenance: connections
server connections: connect to server SrvDominio
Enlazando a SrvDominio ...
Conectado a SrvDominio usando credenciales de usuario conectado localmente.
server connections: q
fsmo maintenance: seize naming master
fsmo maintenance: seize infrastructure master
fsmo maintenance: seize PDC
fsmo maintenance: seize RID master
fsmo maintenance: seize schema master
fsmo maintenance: q
ntdsutil: q

Una vez transferidos los roles FSMO volvemos a comprobar su estado y que se transfirieron correctamente.

netdom query fsmo
Figura 3: netdom query fsmo

Purgado de servicios de Active Directory en el caso de que un DC ya no vaya estar operativo en el dominio

Si se trata de un servidor que ya no estará operativo en el bosque habrá que limpiar o "purgar" el resto de servicios que puedan estar asociados al DC viejo.

1. Limpiar registros DNS

Eliminar todos los registros que apunten al DC viejo en toda la jerarquía del Administrador de DNS.

eliminar registros dns dc viejo fsmo
Figura 4: Eliminar registros DNS del DC viejo.

2. Limpiar Sitios y Servicios de Active Directory

Eliminar el servidor DC viejo de "Sitios y Servicios de Active Directory".

eliminar registros sitios y servicios de active directory dc viejo fsmo
Figura 5: Eliminar registros de "Sistios y servicios de Active Directory".

3. Limpiar Active Directory

Eliminar los objetos de equipos de las OU (Organizational Unit) Computers y Domain Controllers.

eliminar cuentas y objetos de active directory dc viejo fsmo
Figura 6: Eliminar los DC de Active Directory.

4. Cambiar opciones del servicio DHCP

En el caso de tener el rol del servicio DHCP instalado, eliminar de los servidores DNS de las Opciones de ámbito la dirección IP del DC viejo.

eliminar opciones servidores dns del servidor dhcp dc viejo fsmo
Figura 7: Eliminar IP del DC del servicio DHCP.

5. Cambiar direcciones DNS a los equipos de la red interna

Cambiar las direcciones DNS al resto de máquinas de la red interna con ip estática definida Windows o Linux ya sean servidores o equipos clientes.

Saludos!

Autor: Adrián Lois

11 diciembre, 2018

Docker Cheat Sheet: Comandos Docker [Guía de referencia]

Llevo una temporada trabajando con el sistema de contenedores de Docker, poco a poco fuí recopilando los comandos de Docker que iba utilizando a través de su web oficial.

Cree un repositorio para irlo actualizando paulatinamente con la referencia de estos comandos de Docker.

En la medida de lo posible iré actualizando esta entrada con el nuevo contenido que vaya incorporando al repositorio de Github.

Instalación Docker en Ubuntu 18.04

Instalación Docker

Actualizar los repositorios existentes.
sudo apt update
Instalar paquetes previos que permitan a apt usar paquetes a través de HTTPS.
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Agregar la clave GPG del repositorio oficial de Docker.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Agregar el repositorio de Docker en las fuentes de APT.
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
Finalmente, se instala Docker.
sudo apt install docker-ce
Se comprueba que el daemon de Docker está iniciado y el proceso está habilita para iniciarse en el arranque.
sudo systemctl status docker
Si no estuviese iniciado y/o habilitado para el arranque del sistema.
sudo systemctl start docker
sudo systemctl enable docker


Ejecutar el comando Docker sin sudo o desde otro usuario

De forma predeterminada el comando Docker solo puede ser ejecutado por el usuario root o por un usuario del grupo docker. Donde “username” sería el nombre del usuario.
sudo usermod -aG docker username
Para comprobar que el usuario forma parte del grupo docker se pude ejecutar.
id -nG


Referencia de comandos Docker - Docker Cheat Sheet

https://docs.docker.com/engine/reference/commandline/docker

Comandos gestión Docker

Listar contenedores en ejecución. Listar todos los contenedores en ejecución y parados (-a indica todos).
docker ps –a
Listar imágenes descargadas en local (-a muestra todas las imágenes incluidas las intermedias).
docker images
Descargar imagen a caché local desde un repositorio público.
docker pull ubuntu:18.04
Loguearse en Docker Hub, será necesario estar autenticado para subir (push) una imagen.
docker login
docker login -u <usuario> -p <password>
Subir una imagen a un repositorio (Docker Hub).
docker push <imagen_local>
Crear una imagen de un contenedor personalizado en ejecución.
docker commit <ID o nombre_contenedor> <nombre_imagen_nueva>
Para subir una imagen creada a un repositorio como puede ser Docker Hub, es neecsario "tagearla" antes.
docker tag <imagen_local> <nombre_tag_imagen>
docker push <nombre_tag_imagen_creada>
Construir una imagen a partir de un Dockerfile (--file será necesario si el nombre del fichero no es "Dockerfile" y no está situado el mismo directorio).
docker build --tag <nombre_imagen> --file <fichero_dockerfile>
Eliminar una imagen local (-f o --force fuerza la eliminación).
docker rmi <id o nombre_imagen>
Eliminar un contenedor, si el contenedor está en ejecución será necesario detenerlo (docker stop ) antes de eliminarlo se puede indicar el parámetro -f o --force (esto fuerza la detención y eliminación del contenedor).
docker rm <id o nombre_imagen>
Eliminar todos contenedores, redes, imágenes o volúmenes "colgantes" sin referencia o no utilizados
docker system prune

#Parámetros
--all       #Eliminar todas las imágenes no utilizadas, no solo las que cuelgan.
--force     #Forzar el eliminado, no pedir confirmación.
--volumes   #Eliminar volúmenes no utilizados o colgantes.
--filter    #Proporcionar valores de filtro.

Crear e iniciar un contenedor basado en una imagen Ubuntu 18.04, que ejecuta una Shell en modo interactivo (-it) como entrypoint.
docker run –name <nombre_contenedor> -h <nombre_hostname> -it ubuntu:18.04 /bin/bash
Crear y ejecutar un contenedor con un comando/servicio en segundo plano un comando como entrypoint (-d modo detached, no interactivo) (-c comando dentro del modo interactivo bash).
docker run -d --name <nombre_contenedor> -h <hostname> <nombre_imagen> bash -c "<comando>"
docker run -d --name mi_web -h web ubuntu_web bash -c "apache2ctl -D FOREGROUND"
Crear e iniciar un contenedor en modo interactivo con una Shell (-i interactivo -t asociar una tty).
docker run -it --name test debian bash
Crear contenedores. El contenedor se crea pero no se inicia (sería necesario usar después docker start). “docker créate” dispone de multitud parámetros.
docker create -it --storage-opt size=120G fedora /bin/bash
Iniciar, detener y reiniciar contenedores.
docker start <id o nombre_imagen>
docker stop <id o nombre_imagen>
docker restart <id o nombre_imagen>
Publicar puertos en contenedores (aunque se ejecute una imagen que ya predefina exposición de puertos, igualmente habría que establecerlos en la ejecución del contenedor).
#Publicar el puerto 80 del contenedor en un puerto aleatorio del host.
docker run -it --name test -p 80 debian bash

#Publicar el puerto 80 del contenedor al 8080 del host.
docker run -it --name test -p 8080:80 debian test

#Publicar todos los puertos expuestos a puertos aleatorios del host.
docker run -it --name test -P debian bash
Listar los puertos de contenedores.
docker port <id o nombre_imagen>
Finalizar (matar) contenedores.
docker kill <id o nombre_imagen>
Buscar registros de logs de contenedores (-f muestra logs a tiempo real).
docker logs -f <id o nombre_imagen>
Mostrar los procesos en ejecución de contenedores.
docker top <id o nombre_imagen>
Buscar imágenes en repositorios (Docker Hub).
docker search <término>
Importar, exportar y guardar imágenes en un archivo tar.
docker save --outpout <nombre_contenedor> <nombre_empaquetado_contenido.tar>
docker export --output <nombre_contenedor> <nombre_empaquetado_contenido.tar>
docker import <nombre_empaquetado_contenido.tar> <nombre_contenedor>
Cargar una imagen desde un archivo tar o STDIN (Standard Input).
docker load --input <test.tar>
Gestionar Docker.
docker df                              #Mostrar el uso del disco docker.
docker system events o docker events   #Mostrar eventos en tiempo real.
docker system info o docker info       #Mostrar información de todo el sistema.
Desactivar procesos de contenedores.
docker unpause <id o nombre_imagen>
Actualizar la configuración de contenedores.
docker update <id o nombre_imagen>
Mostrar la versión de Docker.
docker version
Inspeccionar cambios de archivos o directorios de contenedores.
docker diff <id o nombre_imagen>
Inspeccionar contenedores (devuelve información de bajo nivel).
docker inspect <id o nombre_imagen>
Mostrar estadísticas de uso de los recursos de contenedores (CPU, Memoria, I/O, PIDs).
docker stats   #Muestra todos los contenedores actuales en ejecución.
docker stats <id o nombre_imagen>
Gestionar volúmenes Docker.
docker volume create    #Crear un volumen.
docker volume inspect   #Mostrar información detallada de volúmenes.
docker volume ls        #Listar volúmenes.
docker volume rm        #Eliminar volúmenes.
docker volume prune     #Eliminar volúmenes locales no utilizados.
Gestión de redes Docker.
docker network create       #Crear una red.
docker network connect      #Conectar un contenedor a una red.
docker network disconnect   #Desconectar un contenedor de una red.
docker network inspect      #Mostrar información detallada de redes.
docker network ls           #Listar redes.
docker network rm           #Eliminar redes.
docker network prune        #Eliminar todas las redes no utilizadas.
Montar un volumen de un directorio local en un contenedor (útil para trabajar con volúmenes de datos que se están editando habitualmente).
docker run -it -v /home/user/codigoWeb:/var/www/html debian bash
Crear un contenedor que usará un volumen asociado a otro contenedor existente.
#Crear el contenedor sin bash, simplemente para tenerlo como referencia para crear posteriormente otros contenedores basados en este usando su volumen de datos como referencia.
docker run -it -v /tmp:/var/www/html --name container_code debian /bin/false

#Asociar el volumen creado en el contenedor anterior con un nuevo contenedor usando el ID del contenedor.
docker run -it --name code -h code --volumenes-from ec3456a3d16cb debian bash
Copiar datos desde el contenedor al host local (opcional -a --archive copia toda la información uid/gid).
docker cp -a <id_contenedor>:<path_contenedor> <path_host_local>
Copiar desde el host local al contenedor.
docker cp -a <path_host_local> <id_contenedor>:<path_contenedor>
Ejecutar un comando en un contenedor en ejecución. Por ejemplo una Shell bash en modo interactivo (útil para acceder a un contenedor en ejecución).

https://docs.docker.com/engine/reference/commandline/exec
docker exec -it nombre_contenedor /bin/bash
docker exec -it nombre_contenedor /bin/sh
○ Salir de un contenedor con bash interactivo
# Con la combinación de teclas: Ctrl+p+q
# exit: si el contenedor se inició en modo --detach o -d
○ Live restore Docker

Permite que los contenedores permanezcan en ejecución aunque el daemon no esté disponible (por ejemplo en un reinicio del daemon dockerd). Ayuda a reducir la inactividad del contenedor debido a fallas del daemon, interrupciones planificadas o actualizaciones.

https://docs.docker.com/config/containers/live-restore

Para habilitar es necesario crear el fichero “/etc/docker/daemon.json”, con el contenido.
{
  "live-restore": true
}
○ Iniciar contenedores automáticamente

Iniciar automáticamente un contenedor con “--restart always” se trata de una política de reinicio que siempre reinicia el contenedor si este se detiene (útil para auto iniciar el contenedor después de reiniciar la máquina host).
docker run -d --restart always --name test -h test debian

#Políticas de reinicio automático de contenedores
no               #No reinicia automáticamente el contenedor. (valor por defecto)
on-failure       #Reinicia el contenedor si sale debido a un error.
unless-stopped   #Reinicia el contenedor a menos que se detenga explícitamente o el propio Docker se detenga o reinicie.
always           #Siempre reinicia el contenedor si se detiene.


Comandos Docker Swarm

Referencia de comandos Docker Swarm.

https://docs.docker.com/engine/reference/commandline/swarm
https://docs.docker.com/engine/reference/commandline/swarm_update

Iniciar, unirse, dejar y actualizar un cluster Swarm.
docker swarm init         #Inicializar un Swarm.
docker swarm join         #Unirse a un Swarm como nodo worker y/o manager (dependiendo si se trata de un –token manager o worker).
docker swarm leave        #Dejar un Swarm.
docker swarm update       #Actualizar un Swarm, dispone de varias opciones.
docker swarm join-token   #Gestionar join tokens


Comandos Docker Machine

Referencia de comandos Docker Machine.

https://docs.docker.com/machine/reference
docker-machine create   #Crear un nodo.
docker-machine kill     #Detener una nodo.
docker-machine ls       #Listar nodos.
docker-machine ssh      #Iniciar sesión en un nodo activo.
docker-machine rm       #Eliminar un nodo.
docker-machine env      #Establecer variables de entorno para definir que docker debe ejecutar un comando en una máquina en particular.
Crear dos nodos usando driver de Amazon Web Services, estableciendo región y zona de disponibilidad, red VPC y tamaño de disco.
docker-machine create --driver amazonec2 --amazonec2-region "us-east-2" --amazonec2-zone "b" --amazonec2-vpc-id vpc-0d1dd38... --amazonec2-root-size 8 test


Comandos Docker Node

Referencia de comandos Docker Node.

https://docs.docker.com/engine/reference/commandline/node
docker node inspect   #Mostrar información detallada en uno o más nodos.
docker node ls        #Listar nodos del Swarm.
docker node ps        #Enumerar las tareas que se ejecutan en uno o más nodos.
docker node rm        #Eliminar uno o más nodos del Swarm.
docker node update    #Actualizar un nodo.
Promover un nodo worker a manager.
docker node promote <nodo>
Degradar un nodo manager a worker.
docker node demote <nodo>
Cambiar nodo a solo Manager y no Manager+Worker (que sería la función por defecto).
docker node update --availability drain <nodo>
○ Docker node update

Referencia de comandos Docker node update.

https://docs.docker.com/engine/reference/commandline/node_update
--availability   #Disponibilidad del nodo ("active"|"pause"|"drain").
--label-add      #Agregar o actualizar una etiqueta de nodo (key=value).
--label-rm       #Eliminar una etiqueta de nodo si existe.
--role           #Rol del nodo ("worker"|"manager").


Comandos Docker Service

Referencia de comandos Docker Service.

https://docs.docker.com/engine/reference/commandline/service
docker service create     #Crear un nuevo servicio.
docker service inspect    #Mostrar información detallada sobre uno o más servicios.
docker service logs       #Obtener los registros de un servicio o tarea.
docker service ls         #Listar servicios.
docker service ps         #Listar las tareas de uno o más servicios.
docker service rm         #Eliminar uno o más servicios.
docker service rollback   #Revertir cambios a la configuración de un servicio.
docker service scale      #Escalar uno o múltiples servicios replicados.
docker service update     #Actualizar un servicio.
Crear un servicio. Se debe crear desde un nodo manager.
--publish: Publicar puertos
--replicas: Número de réplicas totales a repartir entre los nodos existentes.
--update-parallelism: Ejecución del número de contenedores/tareas por nodo.
--update-delay: Retraso entre las actualizaciones (ms|s|m|h)
--restart-condition on-failure: Reiniciar la tarea en caso de fallo.
--constraint node.role manager: Los nodos solo admitirán tareas de un nodo manager
test: Imagen a ejecutar.
docker service create --name test -p 80:80 --replicas 3 --update-parallelism 1 --update-delay 5s --restart-condition on-failure --constraint 'node.role == manager' test
Otra forma de crear un servicio es añadiendo \ para un salto de línea y seguir definiendo los parámetros del servicio.
docker service create \
--name test \
--publish 80:80 \
--replicas 3 \
--update-parallelism 1 \
--update-delay 5s \
--restart-condition on-failure \
--constraint 'node.role == manager' \
test


Docker service update

Referencia de comandos Docker service update.

https://docs.docker.com/engine/reference/commandline/service_update

Actualizar réplicas de un Swarm de modo que se pueda controlar un escalado elástico.
docker service update --replicas=50 test
docker service scale test=50
Forzar actualización de un servicio, incluso si ningún cambio lo requiere. Útil para actualizar un cluster de nodos Swarm en los que se actualizaron réplicas en un servicio con un paralelismo concreto y Docker Swarm ignoró el balanceo de tareas (réplicas del servicio) a nuevos nodos worker unidos al Swarm.
docker service update --force test

Comandos Docker Compose

Referencia de comandos Docker Compose.

https://docs.docker.com/compose/gettingstarted (docker-compose --help)
docker-compose up              #Crear y ejecutar los servicios y ver el proceso.
docker-compose up -d           #Crear y ejecutar los servicios en segundo plano, seguir desde la misma tty.
docker-compose run <servicio> <comando>  #Ejecutar un comando único para un servicio concreto.
docker-compose stop            #Parar todos los servicios.
docker-compose down            #Eliminar los servicios.
docker-compose down --volumes  #Eliminar los servicios y los volúmenes asociados.
docker-compose ps              #Listar los servicios.
docker-compose ps --services   #Listar solo los nombres de los servicios.
docker-compose restart         #Reiniciar los servicios.
Docker-compose rm              #Parar y eliminar los servicios.

Comandos Docker Stack

Referencia de comandos Docker Stack.

https://docs.docker.com/engine/reference/commandline/stack
docker stack deploy     #Implementar o actualizar un stack.
docker stack ls         #Lista de pilas.
docker stack ps         #Listar las tareas en la pila.
docker stack rm         #Eliminar una o más pilas.
docker stack services   #Listar los servicios en la pila.
Implementar o actualizar un stack a partir de un fichero “Docker-Compose”. Debe ejecutarse desde un nodo manager.
docker stack deploy --compose-file docker-compose.yml test
Saludos!

06 diciembre, 2018

Implementación de Docker Swarm en Amazon Web Services usando Auto Scaling Groups y Elastic Load Balancing

Implementación de Docker Swarm en Amazon Web Services usando Auto Scaling Groups y Elastic Load Balancing

En esta entrada quiero hacer referencia al proyecto de fin de curso del ciclo superior de "Administración de Sistemas Informáticos y Redes" que presenté en Noviembre de 2018 en el centro "CIFP A Carballeira - Marcos Valcárcel" de Ourense.

Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups y Elastic Load Balancing

▶ Repositorio Github

https://github.com/adrianlois/Docker-Swarm-AWS-ASG-ELB


▶ Documentación del proyecto

▶ Presentación Slides

https://www.slideshare.net/adrianlois/implementacin-docker-swarm-en-amazon-web-services-usando-auto-scaling-groups-y-elastic-load-balancing-124979842


▶ Video demo de la prueba de concepto (PoC) 

https://www.youtube.com/watch?v=HzsBiJjgrOo


Saludos!

Autor: Adrián Lois

16 noviembre, 2018

Montar carpeta remota FTP o FTPS en Linux con CurlFtpsFS y SSHFS

Para montar una carpeta de un directorio FTP o FTPS remoto en un sistema Linux y acceder a ella de forma local como un volumen más del sistema. Se puede usar CurlFtpFS o SSHFS.

CurlFtpFS

CurlFtpFS lo usaremos sino disponomes de conexión SSH hacia el servidor FTP remoto (la transferencia de datos es más lenta).

[1] Instalamos curlftpfs.
sudo apt install curlftpfs
[2] Creamos el directorio en el que montaremos el FTP/FTPS.
sudo mkdir /backups
[3] Montamos la carpeta remota FTP en el sistema local.
sudo curlftpfs -o allow_other usuarioftp:password@servidorftp.com /backups -v
Si queremos que se monte de forma persistente en el sistema, agregamos un nueva entrada al fichero /etc/fstab. Cambiaremos el uid según corresponda al usuario que tendrá acceso a la carpeta.
curlftpfs#servidorftp.com /backups fuse auto,user,uid=1000,allow_other,_netdev 0 0
Para desmotar la carpeta.
fusermount -u /backups
o
umount /backups
CurlFtpFS cuanta con múltiples opciones, para consultar su ayuda.
curlftpfs --help
o
man curlftpfs

SSHFS

SSHFS los usaremos si disponemos de una conexión SSH hacia el servidor FTP remoto (la transferencia de datos es más rápida que CurlFtpFS).

[1] Instamos sshfs.
sudo apt install sshfs

[2] Creamos el directorio en el que montaremos el FTP/FTPS
sudo mkdir /backups
[3] Montamos la carpeta remota FTP en el sistema local.
sudo sshfs -o allow_other usuarioftp@servidorftp.com:/ /backups
Nos pedirá que aceptemos el fingerprint y que introduzcamos el password de usuario.

Con "df -h" podremos ver el directorio remoto FTP/FTPS montamo en el directorio /backup (en este caso) como un volumen del sistema local.

Para montarlo permanentemente en el fichero /etc/fstab lo haremos con la misma sintaxis que en el caso de CurlFtpFS. 

SSHFS cuenta con opciones muy similares a las de CurlFtpFS, para consultar su ayuda.
sshfs --help
o
man sshfs
Saludos!

12 octubre, 2018

Gestión de credenciales y passwords almacenadas de los recursos de Windows

Existen varias formas de poder visualizar las credenciales "dominio\usuario y password" de los recursos de red almacenados, servicios de RDP entre otro tipo de credenciales almacenadas de Windows.

Para que este almacenamiento sea posible debemos tener habilitado y en ejecución (por defecto ya suele estarlo) el servicio de "Administrador de credenciales" (VaultSvc) que proporciona el almacenamiento seguro y recuperación de credenciales de usuarios.

Hace uso de LSASS (Local Security Authority Subsystem Service) responsable de la política de seguridad en el sistema, audita y verifica quien inicia sesión en sistemas Windows, cambios de contraseñas y crea tokens de acceso.

Figura 1: Servicio de administrador de credenciales.

Cuando se accede a un recurso de red el cual nos solicita usuario y contraseña mediante una autenticación NTLM y se marca el checkbox de "recordar esta contraseña" esta se almacena en un fichero cifrado en nuestro perfil de usuario añadiéndose al Windows Vault.
C:\Users\USUARIO\AppData\Roaming\Microsoft\Credentials

C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials

C:\Users\USUARIO\AppData\Local\Microsoft\Vault

C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Vault

C:\ProgramData\Microsoft\Vault


Administrador de credenciales

Una de las formas más habituales para visualizar las credenciale almacenadas de Windows es a través del Administrador de credenciales situado en el panel de control. Ahí veremos tanto las credenciales de Windows como las credenciales web, en caso de que tengamos guardadas credenciales de sitios web en Internet Explorer únicamente.

Figura 2: Administrador de credenciales de Windows.

KRShowKeyMgr

Otra forma de gestionar estas credenciales es través del "KRShowKeyMgr", se puede ver las credenciales almacenadas, borrarlas y agregar nuevas de forma gráfica.

Para invocar esta ventana escribimos en una cmd o una ventana ejecutar:
rundll32.exe keymgr.dll, KRShowKeyMgr
Figura 3: KRShowKeyMgr - Administrador de nombres de usuario y contraseñas alamacenadas.

cmdkey

Si no tenemos acceso (por restricciones GPO de dominio o similar) al panel de control o poder invocar desde ejecutar, pero si a una consola cmd. Podemos ver estas credenciales a través del comando cmdkey.

Realmente esto es lo que se está usando de forma subyacente a las interfaces gráficas anteriores


Figura 4: cmdkey - Administrador de crecenciales.

Mostrando la ayuda con "cmdkey /?" vemos las posibilidades que tenemos.
Para mostrar la lista de credenciales disponibles:
   cmdkey /list
   cmdkey /list:destino

Para crear credenciales de dominio:
   cmdkey /add:destino /user:usuario /pass:contraseña
   cmdkey /add:destino /user:usuario /pass
   cmdkey /add:destino /user:usuario
   cmdkey /add:destino /smartcard

Para crear credenciales genéricas:
El modificador /add puede reemplazarse por /generic para crear credenciales genéricas

Para eliminar credenciales existentes:
   cmdkey /delete:destino

Para eliminar credenciales RAS (Remote Access Service):
   cmdkey /delete /ras


Herramientas de terceros

Todo lo anterior son formas nativas del sistema de poder gestionar estas credenciales alamacenadas. Pero no permite visualizar las contraseñas en texto plano. Para ello podemos usar algunas herramientas de terceros. Nirsoft desarrolla multitud herramientas de este tipo para sistemas Windows.

CredentialsFileView descifra y muestra las contraseñas en texto plano almacenadas en los archivos de credenciales de Windows (C:\Users\USUARIO\AppData\Roaming\Microsoft\Credentials).

Figura 5: Credentials File View.

VaultPasswordView descifra las contraseñas y otros datos almacenados en Windows Vault (C:\Users\USUARIO\AppData\Local\Microsoft\Vault) del sistema actual o de una unidad externa que se le indique.

Figura 6: Vault Password View.

EncryptedRegView según se le indique escanea el registro de Windows del disco local o de un disco externo. Busca datos cifrados con DPAPI (Data Protection API), intenta descrifralos y mostrarlos en texto plano. No solo mostrará contraseñas almacenadas sino también otro tipo de datos que estuviesen cifrados de productos de Microsoft y también de terceros.

Figura 7: Encrypted Registry View.

Network Password Recovery similar a CredentialsFileView con la diferencia de que este solo muestra aquellas credenciales que afecten con recursos de red.

Figura 8: Network Password Recovery.


Saludos!

15 agosto, 2018

Seguridad en redes Wifi: Fuerza bruta al sistema WPA (Wi-Fi Protected Access)

Actualmente ya hay suficiente información sobre este tipo de técnicas de ataque para compromenter al seguridad de redes WPA. Recientemente he tenido que realizar una auditoría a redes Wi-Fi y revisando entradas del blog aún no había comentado nada sobre esto por lo que a modo de guía comentaré el procedimiento habitual en una conocido y funcional ataque de deautenticación (Wi-Fi deauth attack) donde habrá que desconectar a un cliente previamente conectado a la red que vamos a realizar el ataque, capturar el WPA handshake y finalmente aplicar fuerza bruta al fichero de captura de tráfico .cap obtenido.

A día de hoy pocas redes inalámbricas están operando bajo el sistema de protección WEP (Wired Equivalent Privacy) o el estándar "IEEE 802.11" debido a las debilidades que este mecanismo de protección presenta. 

En la actualidad la mayoría ya están configuradas con WPA (Wi-Fi Protected Access) o el estándar "IEEE 802.11i" la cual mejora sustancialmente su seguridad respecto a WEB, aunque igualmente sigue siendo igual de susceptible a ataques de fuerza bruta y de ahí la importancia de proteger estas redes a través de una contraseña muy robusta y establecer el algoritmo de cifrado más robusto disponible como por ejemplo PSK y no la combinación de ambos (PSK-TKIP) ya que TKIP presenta principalmente la vulnerabilidad de ataques de recuperación de keystream al contrario que PSK.

En este escenario se ha utilizado un adaptador USB Alfa Network AWUS036NH como interface de red para la captura inalámbrica. Usaremos Aircrack-ng una suite de herramientas para la evaluación de seguridad en redes inalámbricas.

macchanger

MAC Changer nos permite la manipulación de las direcciones MAC de las interfaces de red. Nos podremos encontrar redes inalámbricas en las que están configuradas restricciones de conexión según la dirección MAC origen. Es decir, que solo una whitelist conocida de direcciones MAC se puedan conectar a ese AP (Access Point).

Vamos a ver que estas limitaciones no es una buena medida de seguridad. Ya que podremos suplantar o cambiar la MAC por otro de los dispositivos que ya esté previamente conectado y que podamos conocer su MAC simplemente analizando el tráfico estemos o no conectados al AP. 

El cambiar la dirección MAC (aunque sea a una aleatoria como veremos en este caso) de nuestra inferface evitará que dejemos rastros en los logs de conexión del AP de nuestra verdadera MAC.

ifconfig wlan0 down
macchanger -A wlan0
ifconfig wlan0 up

Figura 1: macchanger - cambiar dirección MAC en la interface de red de captura de tráfico.

Airmon-ng

Airmon-ng nos permite activar o desactivar el modo monitor de nuestra interface de red. En este caso tendremos que habilitar el modo monitor para nuestra interface de red wlan0 donde quedará establecida como wlan0mon.

  • Modo monitor: Este modo permite la captura de los paquetes de una red inalámbrica sin estar asociados o conectados a una red.
  • Modo promiscuo: Este modo permite la captura de los paquetes tanto en red cableada como inalámbrica que esté previamente conectado a una red.

airmon-ng start wlan0

Figura 2: Habilitar el modo monitor en la interface de red inalámbrica wlan0.

Airodump-ng

Airodump-ng se usa para capturar paquetes inalámbricos y es útil para ir acumulando vectores de inicialización IVs con el fin de intentar usarlos con Aircrack-ng y obtener la clave WEP o WPA. Puedes convertir archivos .cap / .dump a formato .ivs o juntarlos.

Como conceptos principales debemos saber que es un SSID y BSSID. 

  • SSID o ESSID (Service Set Identifier): Compuesto por un máximo de 32 octetos será el nombre que identifica la red inalámbrica.
  • BSSID (Basic Service Set Identifier): Será la dirección MAC del punto de acceso.
Si el SSID estuviese oculto en la red inalámbrica Airodump-ng intentará averiguarlo analizando los paquetes "probe responses" y "association requests" (son paquetes enviados desde un cliente al AP).

En este escenario nos enfocaremos en la red con ESSID "testing"
airodump-ng wlan0mon
Figura 3: Capturar tráfico y descubrir redes inalámbricas con Airodump-ng.
airodump-ng -c 8 –-bssid 72:B4:E6:CE:01:2D --write wpa2-salida-01 wlan0mon
-c: Número del canal de la red que aparece en la columna CH. En este caso es 8.
--bssid: Dirección MAC de la red objetivo. En este caso "testing" y el BSSID 72:B4:E6:CE:01:2D.
--write: Archivo de captura en la que se guardarán los paquetes. En este caso "wpa2-salida-01".
wlan0mon: Nombre de la interface inalámbrica.

Aireplay-ng

Aireplay-ng se usa para inyectar paquetes. Su función principal es generar tráfico para usarlo más tarde con aircrack-ng y poder crackear claves WEP y WPA-PSK. Hay varios ataques diferentes que se pueden utilizar para hacer deautenticaciones con el objetivo de capturar un handshake WPA, para realizar una falsa autenticación, un reenvio interactivo de un paquete, o una reinyección automática de un ARP-request. Con el programa packetforge-ng es posible crear paquetes "ARP request" de forma arbitraria.

En este escenario usaremos el tipo de ataque deautth que consiste en enviar paquetes de deautenticación a uno o más clientes que están actualmente asociados a un punto de acceso (este ataque es totalmente inútil si no existen clientes wireless asociados).

aireplay-ng -0 1 -a 72:B4:E6:CE:01:2D -c 70:3A:51:01:62:A3 wlan0mon

-0: Significa deautenticación.
1: Número de deautenticaciones a enviar (puedes enviar todas las que quieras), 0 significa enviarlas continuamente.
-a: Dirección MAC del punto de acceso (72:B4:E6:CE:01:2D).
-c: Dirección MAC del cliente previamente conectado a deautenticar (STATION: 70:3A:51:01:62:A3), si se omite o con el parámetro -e se especifica el SSID (nombre de la red) serán deautenticados todos los clientes.
wlan0mon: Nombre de la interface inalámbrica.

Figura 4: Ataque deauth para capturar el handshake con Aireplay-ng.

Aircrack-ng

Aircrack-ng será la herramienta principal para el descifrado de claves 802.11 WEP y 802.11i WPA/WPA2-PSK.

aircrack-ng -w /usr/share/wordlist/rockyou.txt wpa2-salida-01.cap

Con el parámetro -w indicaremos el diccionario (será uno de los diccionarios más utilizados y por defecto en máquinas Kali "rockyou.txt") que se utilizará para llevar a cabo el ataque de fuerza bruta y posteriormente indicamos el fichero .cap que se obtuvo con Aireplay-ng.

Figura 5: Usando Aircrack-ng para descifrar la clave de la red inalámbrica.

En este escenario de ejemplo para hacerlo más formativo y rápido se estableció una contraseña sencilla y común en prácticamente cualquier diccionario empleado para fuerza bruta. Se puede ver como se encontró con éxito la clave de la red inalámbrica en unos 5 segundos.

Figura 6: Descifrado con éxito y clave inalámbrica encontrada.

Más info sobre la suite de Aircrack-ng: https://www.aircrack-ng.org/doku.php?id=Main

Recomendaciones para mejorar la seguridad de redes inalámbricas

En escenarios empresariales existen muchos otros mecanismos e integraciones así como la posibilidad de añadir capas adicionales de seguridad perimetral, segmentación y monitoreo continuo de puntos de red inalámbricas.

Pero estas recomendaciones van más enfocadas a las redes domésticas de hogar para intentar proteger lo máximo posible dentro su limitado alcance tecnológico y de configuración.

1. Deshabilitar WPS (Wi-Fi Protected Setup)

Se trata de un mecanismo de seguridad wifi para conectar a un router con otro dispositivo a través de un WPS PIN (una clave de 8 dígitos) la cual se puede introducir manualmente o autenticarse automáticamente dependiendo el tipo de dispositivo. Esto es verdad que facilita la autenticación en una primera vez entre dispositivos a la red pero también es un punto muy débil de seguridad tenerlo habilitado existen multitud de herramientas para realizar fuerza bruta a este tipo de autenticaciones WPSPinGenerator, Wash, Reaver, Bullycioso, PixieWPS, entre las más conocidas.

2. Establecer una contraseña de autenticación robusta

En tecnologías inalámbricas Wifi es la medida principal de protección a día de hoy. Considero que es el punto más importante, en ataques WEP no es así, pero en WPA/2 independientemente de la técnica realizada finalmente todo se resume en capturar un handshake y aplicar fuerza bruta a través de diccionarios. Por lo que cambiar la contraseña por defecto a una contraseña lo suficientemente robusta y compleja (alfanumérica, signos, longitud mínima de 35 caracteres en el caso de WPA) es un básico a realizar para que sea difícilmente costoso o prácticamente imposible por cuestión de tiempo físico poder ser crackeada o descifrada.

3. Usar los sistemas y cifrados más robustos disponibles

Toda contraseña tiene que estar protegida por un buen cifrado. Será fundamental acompañar la contraseña compleja comentada anteriormente con el último sistema de autenticación disponible como puede ser WPA2 con cifrado PSK (AES). Sistemas WEP o cifrados TKIP ya han sido ampliamente vulnerados y no se consideran seguros.

4. Mantener actualizado el software del punto de acceso o enrutador

Recomendación de seguridad básica para cualquier tecnología o servicio. Intenta mantener actualizados todos tus dispositivos.

5. Apagar la red inalámbrica si no la usas

Alto ten sencillo como "Si no lo usas, desactívalo".

6. Recomendaciones de seguridad adicionales 

Ahora podría indicar una serie de recomendaciones adicionales que se pueden encontrar en la mayoría de webs cuando buscas sobre esto como puede ser: "cambia el nombre SSID del dispositivo, no permitas que el dispositivo inalámbrico indique su presencia (ocultar SSID), disponer de un whitelist de direcciones MAC permitidas para conectarse, etc.

Como ya hemos visto en este artículo mostrando un sencillo ataque deauth. Opciones como limitar a las MAC conocidas y ocultar el SSID es algo que no no resta seguridad pero tampoco nos aporta gran protección, ya que es fácil suplantar direcciones MAC (macchanger) y poder encontrar redes ocultas (airodump-ng). 

Saludos!

Autor: Adrián Lois

01 agosto, 2018

Crear un túnel SSH con PuTTY para escritorio remoto RDP - Local port forwarding

Un tunel SSH se utiliza principalmente para tunelizar tráfico sobre internet o sobre una red local de una manera segura. Podemos encapsular un tipo de protocolo sobre una conexión establecida SSH (Secure SHell).

Supongamos que nos queremos conectar a un servidor interno de una red local a través de Internet, pero el firewall de la compañía restringe las conexiones origen dirigidas a determinados puertos, entre ellos el 3389 (puerto por defecto usado para RDP), sin embargo si permite conexiones al puerto 22 (puerto por defecto para SSH). 

La compañía expone un único equipo accesible desde la WAN (Wide Area Network) de Internet. Por lo que tienen definada una regla en el firewall que hace port forwarding permitiendo las conexiones origen dirigidas al puerto 22 a través de la dirección IP pública se redirigen a una determina IP interna que pertenece a un servidor Linux, este será el servidor SSH que usaremos para hacer pivoting al servidor al que nos conectaremos por Escritorio remoto RDP por el puerto 3389. 

El equipo cliente definirá mediante una herramienta de terceros la configuración de tunel SSH y se conectará a la IP pública de la compañía por el puerto 22, una vez establecida la conexión al servidor SSH el cliente se conectará por Escritorio remoto a sí mismo (127.0.0.1 o localhost) por el puerto configurado en el tunel SSH, ese puerto redirigirá la conexión al servidor SSH que a su vez redirigirá a la IP interna del servidor que aceptará la conexión de Escritorio remoto.

En el siguiente squema se muestra un funcionamiento de ejemplo para establecer conexiones de Escritorio remoto sobre un tunneling SSH. Se encapsulará el protocolo RDP sobre un el protocolo SSH.

Figura 1: Esquema de conexión tunneling SSH para conectarse por Escritorio remoto (RDP).

Para establecer la configuración usaremos el cliente SSH PuTTY (podría ser otro que tenga la opción de poder configurar túneles SSH). Abrimos Putty y nos desplazamos a la sección: "Conecction > SSH > Tunnels".

Indicamos el puerto origen para nuestro equipo y el destino IP:PUERTO al que se redirigirá la conexión. En este caso el puerto 3333 sería el puerto origen local de la máquina cliente y redirigirá las peticiones a ese puerto al destino 10.0.0.12:3389 sería el servidor remoto al que nos conectaremos por Escritorio remoto.

Figura 2: Putty - Configurar conexión port forwarded tunelizada para usar con SSH.

En la sección "Session" especificamos el nombre o IP del que sería el servidor SSH remoto al que nos conectaremos inicialmente. (Para este ejemplo me he conectado a una IP local sería la miasma configuración para una IP Pública en Internet de un sitio remoto).

Figura 3: Putty - Conectarse al equipo servidor SSH.

Una vez nos conectamos a al servidor SSH remoto, en el equpo cliente abrimos una ventana de conexión de Escritorio remoto (Windows +R > mstsc) y nos conectamos como localhost:3333. Ese puerto reenviará la pentición al servidor SSH al que estamos conectados pivotando a través de este se establecerá la comunicación tunelizará de forma segura (previamente así lo habíamos definido -ver figura 2-) autenticándonos hacia el servidor destino que aceptará la conexión de Escritorio remoto.

Figura 4: Autenticación para Escritorio remoto usando un reenvío de puertos configurado para un tunel SSH.

Finalmente la conexión se estableció correctamente. En la siguiente captura de pantalla se puede ver como la conexión por Escritorio remoto se hizo a través de localhost:3333, en el servidor SSH se ve la redirección de puertos y en el eventlog de Putty el tunel SSH definido inicialmente. 

Las peticiones que vengan del puerto local 3333 las renviará al destino 10.0.0.12:3389 (IP del servidor al que nos conectaremos y puerto por defecto RDP).

Figura 5: Conexión de Escritorio remoto establecida usando un tunel SSH.

Saludos!

Autor: Adrián Lois

19 julio, 2018

Solución al problema de licencias de conexiones RDP entre Windows Server 2016 y Windows Mobile (RDM), Windows CE o versiones antiguas RDP 5.x / 6.x

Actualmente RDP (Remote Desktop Protocol) está en versión 10.x,versiones más actualizadas que incluyen importantes mejoras de seguridad. Como pueden ser: mayor longitud de clave generada por el servidor de licencias RDS 4096 bits con un algoritmo de seguridad SHA256, soportando SSL/TLS y NLA (Network Level Authentication).

Versiones iguales o inferiores a RDP 6.x no soportan las características anteriores. El límite de longitud para las claves es de 2048 bits con algoritmo de seguridad SHA1 (Secure Hash Algorithm 1).

Esta clave se genera en base al método de activación de licencias del administrador de licencias de Escritorio remoto. Si el método empleado es "Web Browser" (Explorador Web) las claves de licencias, se pueden generar un requisitos más bajos que si lo activásemos con otro método, con una longitud de 2048 bits SHA1.

Si aún no tenemos activado el servidor de administración de licencias de Escritorio remoto y queremos tener la compatiblidad entre vesriones más antiguas y actuales para establecer conexiones RDP. Selecionaremos la opción de activar por el método de conexión Web Browser.

En caso de que ya tengamos activado el servidor de licencias procederemos del siguiente modo.

En el servidor Windows Server 2016 que recibirá la conexión RDP desde el dispotivo Windows Mobile o Windows CE comprobamos que NLA esté desactivado.

Figura 1: Desactivar NLA (Autenticación a nivel de red) en Windows Server 2016.
Añadir un rol de instalación de Servicios de Escritorio remoto para VDI (Virtual Desktop Infraestructure).

Figura 2: Añadir rol de instalación de RDS.

En este paso podría ser "Implementación estándar" o "Inicio rápdio".

Figura 3: Implementación estándar para el rol RDS.

Para este esceneario será implementación de escritorio basada en sesión.

Figura 4: Implementaicón de escritorio basada en sesión.

Una vez agregados los servicios RDS. Creamos una colección y no dirigimos a ella.

Figura 5: Colleción de host de sesión de Escritorio remoto.

Dentro de las tareas de colección de RDS configuramos las opciones de seguridad para conexiones RDP.
  • Nivel de seguridad de protocolo de Escritorio remoto (RDP).
  • Nivel de crifrado: Bajo.
  • Deshabilitamos NLA.
Figura 6: Configuración de opciones de seguridad para conexiones RDP.

Como comentaba al princpio, si eligimos un método de conexión basada en Explorador Web. No es necesario realizar ninguna otra acción y las conexión RDP entre Windows Mobile o Windows CE y Windows Server 2012/2016 estarán funcionales.

De igual modo, selecionamos el método de conexión por Explorador Web o Web Browser y aceptamos.

Figura 7: Selección del método de conexión "Web Browser". 

Eliminamos los tipos de claves REG_BINARY correspondientes a las claves de certificado X509 del método anterior de licencias RDS. En el registro del servidor de administrador de licencias de Escritorio remoto.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM
  • Certificate
  • X509 Certificate
  • X509 Certificate ID 
  • X509 Certificate2

Figura 8: Eliminación de claves de licencias generadas por el administrador de licencias de Escritorio remoto.

¿Por qué eliminar estas claves de certificados del registro? 

Entre versiones de RDP actuales la longitud de clave de certificados es de 4096 bits con un algoritmo de seguridad SHA256, estas claves se generan en la primera instancia de conexión entre un acuerdo entre el nivel de seguridad compatible entre las dos máquinas que establecen la conexión RDP.

El equipo del usuario que mantiene la conexión con el servidor al que se conecta establece la longitud y algoritmo de esta clave, si el equipo que se conecta usa una versión de protocolo reciente no habrá problemas, pero si el equipo cliente se trata de un sistema Windows Mobile o similar este no podrá conectarse debido a que el servidor administrador de licencias no puede generar claves de una longitud y algoritmo inferior a los requisitos mínimos que establece el método de conexión (figura 7), por ese motivo el método de conexión Web Browser tiene unos requisitos menos restrictivos y puede generar claves de longitud más corta y cifrados de menor nivel.

Conexión establecida

Como equipo cliente para este ejemplo usaré un Windows XP SP1 que dispone de versión RDP v5.x (funcionaría igual para Windows Mobile, Windows CE o similares con versiones RDP v5.x o v6.x).

Vemos como la conexión RDP se estableció correctamente. En ese momento Windows XP SP1 estableció el acuerdo de certificados X509 de conexión. Si añadimos la desactivación de NLA y el nivel de cifrado más bajo sin SSL/TLS, la conexión es posible.

Figura 9: Conexión RDP establecida entre versioens RDP antiguas y Windows Server 2016.

Saludos!