Servidor Web .NET y SQL con Windows 2016 core

24 noviembre 2015
Josep Ma Solanes 0

Despliegue de un servidor Web para aplicaciones .NET y bases de datos Microsoft SQL Server sobre Microsoft Windows Server en la modalidad CORE.

Aprovechando el lanzamiento de Microsoft Windows Server 2016 Technical Preview 4 (TP4, para los amigos) el proceso de instalación del servidor se hace con esta versión, pero también es válido para servidor Microsoft Windows Server 2012 R2. Si queréis probar esta versión sólo tenéis que inscribiros para su evaluación https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview

El motor de base de datos escogido es la versión SQL Server Express 2014, pero también sirve para la versión Estándar y Enterprise. La versión Express la podéis descargar del siguiente enlace: https://www.microsoft.com/en-us/download/details.aspx?id=46697

 

Los puntos a tratar en el despliegue del servidor en modo core:

 

Instalación de Microsoft Windows Server 2016 core

Iniciar la máquina (ya sea física o virtual) desde el medio de instalación (DVD, USB o imagen ISO) de Microsot Windows Server 2016 TP4. Alerta al inicio que se debe pulsar cualquier tecla para iniciar la instalación.

servidor-web-sql-windows-core-001

Seleccionar el idioma del entorno y teclado. En mi caso, Español.

servidor-web-sql-windows-core-002

Se carga la aplicación de instalación, hacer clic en el botón Instalar ahora.

servidor-web-sql-windows-core-003

Se inicia el proceso de instalación. En primer lugar se pide por el tipo de instalación a realizar: por defecto (que ahora es la de modo consola) o con la experiencia del escritorio (la que tiene el entorno gráfico). Seleccionar la primera, la por defecto, y hacer clic en el botón Siguiente.

servidor-web-sql-windows-core-004

Aceptar los términos de la licencia marcando el checkbox correspondiente y hacer clic en el botón Siguiente.

servidor-web-sql-windows-core-005

Se está haciendo una actualización del sistema operativo o se quiere hacer una instalación personalizada. Como no, hacer clic en Instalación personalizada.

servidor-web-sql-windows-core-006Seleccionar el disco duro donde hacer la instalación del sistema operativo y hacer clic en el botón Siguiente. En el caso que el disco duro contenga particiones anteriores, os recomiendo que las borréis todas las del disco donde se instala el sistema operativo (siempre y cuando no contengan datos) ya que el propio instalador las creará de nuevo según sus necesidades.

servidor-web-sql-windows-core-007

Esperar a que haga la instalación del sistema operativo.

servidor-web-sql-windows-core-008

El instalador ya se encarga de reiniciar el equipo cuando es necesario.

servidor-web-sql-windows-core-009

Una vez ha terminado de instalar el sistema operativo y la personalización del mismo, se puede iniciar la sesión como Administrador (administrator en inglés), que es el usuario seleccionado por defecto. En el primer inicio de sesión se nos pregunta para cambiar, más bien establecer, su contraseña. Seleccionar OK con las flechas del cursor del teclado y hacer clic en la tecla Enter.

servidor-web-sql-windows-core-010

Introducir la nueva contraseña para el Administrador y validar con la tecla Enter.

servidor-web-sql-windows-core-011

Se nos confirma el cambio de contraseña. Pulsar la tecla Enter encima de la opción OK.

servidor-web-sql-windows-core-012

Ya tenemos el sistema arrancado, con la consola de sistema preparada para recibir instrucciones.

servidor-web-sql-windows-core-013

Desde la consola de sistema podemos hacer alguna cosita, pero lo suyo es saltar rápidamente a la PowerShell donde sí podemos trabajar al 100%. Observar la diferencia entre estar trabajando con la consola de sistema, en que la solicitud de comandos empieza directamente por la unidad de disco duro donde nos encontramos (C:\….>), o si estamos en la PowerShell en que empieza por PS seguida por la unidad de disco duro (PS C:\…>). Para acceder a la Powershell desde la consola de sistema introduciendo el comando:

powershell

servidor-web-sql-windows-core-014

Lo primero es lo primero y, naturalmente, en un servidor hay que configurar el direccionamiento IP a estático. Para averiguar que adaptador y dirección IP tenemos:

Get-NetAdapter | Get-NetIpAddress

Para establecer la dirección IP estática (192.168.0.10 con máscara 255.255.255.0) con su puerta de enlace (192.168.0.1) correspondiente a la interfaz/adaptador Ethernet:

Get-NetAdapter | ? {$_.Name -eq "Ethernet"} | New-NetIPAddress –IPAddress "192.168.0.10" –PrefixLength 24 -DefaultGateway 192.168.0.1

La configuración IP también necesita de los servidores DNS:

Get-NetAdapter | ? {$_.Name -eq "Ethernet"} | set-dnsclientserveraddress -serveraddresses 192.168.0.2

Para ver la dirección IP que ahora tiene el adaptador, el resultado tiene que ser sólo la dirección IP (192.168.0.10):

(Get-NetAdapter |? {$_.Name -eq "Ethernet"} | Get-NetIpConfiguration).Ipv4Address.IpAddress

Si nos hemos equivocado o se quiere cambiar la dirección IP por otra, antes tenemos que eliminar la existente:

Get-NetAdapter | ? {$_.Name -eq "Ethernet"} | Remove-NetIpAddress -IPAddress 192.168.0.10 -Confirm:$false

También se tiene que hacer lo mismo para la puerta de enlace, en caso que cambie. Recuerdo que la puerta de enlace corresponde a la ruta de encaminamiento en la red 0.0.0.0 con máscara 0.0.0.0.

Get-NetAdapter | ? {$_.Name -eq "Ethernet"} | Remove-NetRoute -AddressFamily IPv4 -DestinationPrefix 0.0.0.0/0 -Confirm:$false

Si se vuelve a comprobar la dirección IP de la interfaz, se observa que ahora tiene asignada una dirección IP APIPA (del rango 169.254.0.0):

(Get-NetAdapter |? {$_.Name -eq "Ethernet"} | Get-NetIpConfiguration).Ipv4Address.IpAddress

El panel de encaminamiento del equipo no tiene la ruta 0.0.0.0/0 correspondiente a la puerta de enlace por defecto:

Get-NetAdapter |? {$_.Name -eq "Ethernet"} | Get-NetRoute

En caso de querer disponer de una dirección asignada por DHCP de nuevo, se tiene que habilitar en la interfaz:

Get-NetAdapter |? {$_.Name -eq "Ethernet"} | set-netipinterface -Dhcp Enabled

Comprobar el nombre del equipo, ¿no gusta demasiado el resultado, verdad?

$env:computername

Se puede cambiar el nombre del equipo con el comando (se debe indicar el nombre actual que se obtiene con el comando anterior y el nuevo nombre):

Rename-computername -ComputerName $env:computername -newname servidorweb

Como es habitual hay que reiniciar el equipo para aplicar los cambios:

Restart-computer

Reiniciado el equipo, se puede comprobar de nuevo el nombre del equipo con el comando:

$env:computername

Añadir el equipo al dominio, como no. Atentos al comando, se pasa el dominio donde unirse, el usuario y la contraseña con permisos para añadir equipos al dominio:

Add-computer -DomainName "dominio.local" -Credential (New-Object System.Management.Automation.PSCredential("DOMINIO\administrador",("ContraseñaUsuario" | ConvertTo-SecureString -AsPlainText -Force)))

Volver a reiniciar el equipo para aplicar los cambios:

Restart-computer

Al iniciar seguramente pide volver a validarse con el usuario por defecto administrador, en caso de querer cambiarlo, pulsar la tecla ESC dos veces para pasar a la opción de escoger otro usuario. Indicar el nombre de usuario y contraseña del dominio y ¡ya estamos dentro!

servidor-web-sql-windows-core-015

Como que la idea es desplegar un servidor un poco fortificado de cara al exterior, afinamos la configuración del cortafuegos para bloquear todo el tránsito de entrada por defecto:

Get-netfirewallprofile | set-NetFirewallProfile -DefaultInboundAction Block

Comprobar las reglas habilitadas en el cortafuegos que permiten el tránsito de entrada al servidor:

Get-netfirewallrule -enabled true -direction Inbound -Action Allow | ft DisplayName

Si alguna no gusta, como no, proceder a cerrarla lo antes posible:

get-netfirewallrule *nombredelaregla* -enabled true | set-netfirewallrule -enabled false

 

Habilitar el servidor Web Internet Information Server (IIS)

Tenemos las bases del sistema operativo establecidas, pero como tal no hace nada de nada. Es hora de empezar a activar los servicios que tiene que ofrecer el servidor. Empecemos importando el módulo de administración del propio servidor en la Powershell para poder activar las funciones del mismo.

Import-module ServerManager

Para ver los roles y las características disponibles y su estado, si está instalada o no:

Get-WindowsFeature

¡Que lista más larga! Para concentrarnos en un grupo concreto se puede filtrar:

Get-WindowsFeature "Web*"

Como que el servicio que se ofrece es un servidor de aplicaciones web, este requiere del Internet Information Server y el entorno de ejecución de aplicaciones .NET. Del .NET utilizaremos la última versión del framework, la ASP.NET 4.

Install-WindowsFeature Web-Common-http,Web-Health,Web-Performance,Web-Asp-Net45,Web-ISAPI-Ext,Web-Windows-Auth,Web-http-redirect,web-request-monitor,web-http-tracing -Confirm:$false

Sólo habilitando el rol el sistema ya se encarga de crear dos nuevas reglas en el cortafuegos que permiten el tránsito de entrada HTTP y HTTPS:

Get-NetFirewallRule -Enabled true -Direction Inbound -Action Allow | ? {$_.DisplayName -like "*Web*"} | ft DisplayName

El servidor web ya está servido. Comprobar que ya nos funciona el acceso al servidor Web desde un equipo conectado a la red con un navegador en que tiene que cargar la página de bienvenida estándar de Internet Information Server:

http://nombreservidor

servidor-web-sql-windows-core-016

 

Habilitar el servicio FTP en el servidor Web Internet Information Server

El acceso por FTP permite subir y descargar los archivos del servidor desde cualquier equipo. El hecho de hacerlo por FTP y no por CIFS asegura que el acceso al servidor será universal, pudiendo hacerlo desde cualquier punto, no sólo desde la red local. Para habilitar el servicio en el servidor desde la Powershell:

Install-WindowsFeature Web-ftp-server -IncludeAllSubFeature -Confirm:$false

Con el servicio dado de alta, hay que crear un sitio FTP en el puerto TCP 21 (el estándar de FTP) ubicando la carpeta raíz en la ruta del disco duro C:\FTP Server:

New-WebFtpSite -Name "Servidor FTP" -Port 21 -PhysicalPath "c:\FTP Server" -Force

Se ha creado el sitio, pero la carpeta raíz también tiene que existir en el disco duro. Para crearla y así asegurar que no hay problemas de acceso en la misma más adelante porque no existe:

mkdir "c:\FTP Server"

Continuando con la configuración de sitio FTP, se establecen las propiedades de autenticación básica:

set-ItemProperty "IIS:\Sites\Servidor FTP\" -Name ftpServer.security.authentication.basicAuthentication.enabled -value $true

Una de las otras configuraciones recomendadas en los servidores Web es aislar a los usuarios entre ellos, que no vean los archivos y carpetas de los otros, cada uno su carpeta:

Set-ItemProperty "IIS:\Sites\Servidor FTP\" -Name ftpServer.userisolation.mode -value 3

Cuando se utiliza el aislamiento del directorio raíz (IsolateRootDirectoryOnly) o de todos los directorios (IsolateAllDirectories) para los usuarios, la estructura física o virtual de directorios tiene que seguir la siguiente pauta:

Tipo de cuenta de usuario Estructura del directorio raíz
Usuarios anónimos %FtpRoot%\LocalUser\Public
Usuarios locales de Windows
Con autenticación básica.
%FtpRoot%\LocalUser\%UserName%
Usuarios del dominio
Con autenticación básica.
%FtpRoot%\%UserDomain%\%UserName%
Administrador IIS o cuentas de usuario con autenticación personalizada ASP.NET %FtpRoot%\LocalUser\%UserName%

Por defecto está habilitado el cifrado con SSL del sitio FTP. Para que funcione, el servidor tiene que disponer de un certificado. Si no disponemos de este certificado o no necesitamos cifrar estas comunicaciones se puede Deshabilitar el cifrado con SSL:

Set-ItemProperty "IIS:\Sites\Servidor FTP" -Name ftpServer.security.sll.controlChannelPolicy -Value 0
Set-ItemProperty "IIS:\Sites\Servidor FTP" -Name ftpServer.security.sll.dataChannelPolicy -Value 0

Dar permisos a los usuarios para que puedan acceder al servidor FTP. Si el usuario o grupo no está presente en esta dirección, no pueden acceder al servicio. Hay que añadir los grupos según los privilegios de lectura o lectura y escritura.

Add-webconfiguration "/system.ftpServer/security/authorization" -value @{accessType="Allow";roles="Administrators";permissions="Read,Write"} -PSPath IIS:\ -location "Servidor FTP"

Para el resto de usuarios o grupos concretos se puede dejar con lectura, por ejemplo.

Add-webconfiguration "/system.ftpServer/security/authorization" -value @{accessType="Allow";roles="All Users";permissions="Read"} -PSPath IIS:\ -location "Servidor FTP"

O incluso, si se pertenece a un grupo concreto no se deja acceder. Todo depende de las necesidades del momento.

Add-webconfiguration "/system.ftpServer/security/authorization" -value @{accessType="Deny";roles="NoFTP";permissions="Read,Write"} -PSPath IIS:\ -location "Servidor FTP"

Para aplicar los cambios de configuración en el sitio FTP se tiene que reiniciar:

Restart-webitem "IIS:\Sites\Servidor FTP\"

Con la carpeta raíz creada y la estructura de carpetas según sean usuarios locales o de dominio que utilicen el servicio, se pueden crear directorios virtuales en cada una de ellas, por ejemplo, para acceder a la carpeta de la aplicación del servidor Web. En el caso de los usuarios locales sería:

New-Item "IIS:\Sites\Servidor FTP\LocalUser\Operador\Web" -physicalPath "c:\inetpub\wwwroot" -type VirtualDirectory

Para un usuario del dominio el directorio virtual se crea de esta otra forma:

New-Item "IIS:\Sites\Servidor FTP\dominio\Operador\Web" -physicalPath "c:\inetpub\wwwroot" -type VirtualDirectory

Si se hace ahora la conexión en el servidor FTP nos damos cuenta que el usuario NO visualiza las carpetas virtuales, pero si sabe el nombre, se puede navegar. Eso es debido a una característica del sitio FTP. Para permitir visualizar directamente los directorios virtuales en los clientes FTP:

Set-ItemProperty "IIS:\Sites\Servidor FTP" -Name ftpServer.directoryBrowse.showFlags -Value "DisplayVirtualDirectories"

Se puede parar y volver a iniciar el sitio FTP para aplicar los cambios de configuración:

Restart-webitem "IIS:\Sites\Servidor FTP\"

Para reiniciar completamente el servicio de FTP:

Get-service *ftp* | restart-service

Para comprobar que el servicio de FTP está operativo:

Get-service *ftp*

Y antes de conectar, asegurar que las reglas del cortafuegos del servidor permiten las conexiones en el servidor FTP, por defecto se habilitan al instalar el rol, pero no está de más echarle un vistazo:

Get-netfirewallrule *ftp* | ft DisplayName,Enabled,Action

¡Ya tenemos servicio de FTP en funcionamiento!

 

Instalar Microsoft SQL Server Express 2014

La última parte de la entrada es instalar el Microsoft SQL Server Express 2014 sobre el servidor Microsoft Windows 2016 en modo coreAquí tenéis una entrada referente a la instalación de un servidor Microsoft SQL Server 2012 en modo completo. Por si es de vuestro interés. La instalación no cambia demasiado en las diferentes versiones 2012, 2014 y 2016.

Antes de empezar, asegurar los requerimientos, como tener habilitado el .Net Framework 2.0 y 3.5:

Install-WindowsFeature NET-Framework-Features -IncludeAllSubFeature -Confirm:$false

Cargar el medio de instalación del Microsoft SQL Server Express 2014, ya sea por una unidad de red con el comando Net use o con una ISO en la máquina virtual.

Ejecutar el comando de instalación del SQL Server Express con autenticación mixta y poniendo las bases de datos en la raíz de la unidad C, en una carpeta llamada Databases. Habilitar el servicio TCP en el servidor SQL para tener acceso desde el exterior del servidor. Definir la intercalación de las bases de datos por defecto (collation) como sql_latin1_genera_cp1_ci_as.

Setup.exe /QS /ACTION=Install /ADDCURRENTUSERASSQLADMIN /ENU /FEATURES=SQL /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT="ADMINISTRATOR" /SQLSVCPASSWORD="ContraseñaAdministrator" /SQLSYSADMINACCOUNTS="DOMINIO\Administradores SQL" /AGTSVCACCOUNT="NT AUTHORITY\Network Service" /TCPENABLED=1 /INSTALLSQLDATADIR="C:\Databases" /IACCEPTSQLSERVERLICENSETERMS /SECURITYMODE=SQL /SAPWD="ContraseñaSA" /SQLCOLLATION="sql_latin1_general_cp1_ci_as" /INDICATEPROGRESS

Sólo lanzarlo acaba de preparar el sistema operativo con requisitos. Eso quiere decir que se tiene que reiniciar el equipo para poder continuar. No os asustéis. Simplemente reiniciar.

servidor-web-sql-windows-core-017

Volver a lanzar el comando de instalación anterior. Ahora si hace más cosas.

servidor-web-sql-windows-core-018

Finalizada la instalación aseguramos que el resultado ha sido satisfactorio. En la consola tengo que encontrar el punto Setup result: 0.

servidor-web-sql-windows-core-019

Comprobar que se han instalado correctamente los servicios de SQL Server. Desde la PowerShell (recuerdo que para acceder sólo hay que escribir el comando powershell):

Get-service *sql*

servidor-web-sql-windows-core-020

Se han habilitado y puesto en marcha los servicios de SQL Server, pero el cortafuegos bloquea todos los puertos. Crear una nueva regla para permitir el acceso al servicio de SQL Server, en este caso el puerto TCP 1433 sólo para la red local:

New-netfirewallrule -Name "SQL Server" -DisplayName "Microsoft SQL Server Engine" -Enabled True -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1433 -RemoteAddress Localsubnet

Desde un equipo cliente realizar una conexión remota al servidor con las herramientas de administración de SQL Server. Introducir el nombre del servidor, en este caso autenticamos con el usuario SA y la contraseña definida durante la instalación. Hacer clic en el botón Conectar.

servidor-web-sql-windows-core-021

Si todo está correcto accedemos a la administración del mismo, dando por terminada la instalación del servidor SQL Server propiamente dicha.

servidor-web-sql-windows-core-022

De esta forma ya tenemos un servidor medio fortificado, más bien con los servicios y superfície de ataque mínimos, para recibir aplicaciones Web .NET con servicio bases de datos Microsoft SQL Server.

¡Desarrolladores de .NET al poder!

 

Resumen de comandos para ir «rapidito»

Os dejo el resumen de comandos Powershell por si queréis hacer algún script de instalación y así ir más rápido en el momento de hacer estos despliegues:

Post-instal·lación del servidor Windows 2016 core:

#Variables a cambiar en cada caso!
$DireccionIP="192.168.0.10"
$Submascara=24
$PuertaEnlace="192.168.0.1"
$NombreServidor="servidorweb"
$DominioAD="dominio.local"
$UsrAdministrador="DOMINIO\Administrator"
$ContraseñaAdmin="ContraseñaAdministrador"

#Comandos
Get-NetAdapter | ? {$_.Name -eq "Ethernet"} | New-NetIPAddress –IPAddress $DireccionIP –PrefixLength $Submascara -DefaultGateway $PuertaEnlace

Get-NetAdapter | ? {$_.Name -eq "Ethernet"} | set-dnsclientserveraddress -serveraddresses 192.168.0.2

Rename-computername -ComputerName $env:computername -newname $NombreServidor

Add-computer -DomainName $DominioAD -Credential (New-Object System.Management.Automation.PSCredential($UsrAdministrador,($ContraseñaAdmin | ConvertTo-SecureString -AsPlainText -Force)))

Get-netfirewallprofile | set-NetFirewallProfile -DefaultInboundAction Block

Restart-computer

Se reinicia el equipo para aplicar los cambios del nombre del servidor y juntarlo al Active Directory.

 

Habilitar el servidor Web:

Import-module ServerManager

Install-WindowsFeature Web-Common-http,Web-Health,Web-Performance,Web-Asp-Net45,Web-ISAPI-Ext,Web-Windows-Auth,Web-http-redirect,web-request-monitor,web-http-tracing -Confirm:$false

Habilitar el servicio FTP en el servidor Web:

#Variables
$DirectorioRaizFTP="C:\FTP Server"
$Dominio="dominio"


#Comandos
Install-WindowsFeature Web-ftp-server -IncludeAllSubFeature -Confirm:$false

New-WebFtpSite -Name "Servidor FTP" -Port 21 -PhysicalPath $DirectorioRaizFTP -Force

mkdir $DirectorioRaizFTP

set-ItemProperty "IIS:\Sites\Servidor FTP\" -Name ftpServer.security.authentication.basicAuthentication.enabled -value $true

set-ItemProperty "IIS:\Sites\Servidor FTP\" -Name ftpServer.userisolation.mode -value 3

mkdir $DirectorioRaizFTP"\LocalUser"

mkdir $DirectorioRaizFTP"\LocalUser\Public"

mkdir $DirectorioRaizFTP"\"$Dominio

set-ItemProperty "IIS:\Sites\Servidor FTP" -Name ftpServer.security.sll.controlChannelPolicy -Value 0

set-ItemProperty "IIS:\Sites\Servidor FTP" -Name ftpServer.security.sll.dataChannelPolicy -Value 0

Set-ItemProperty "IIS:\Sites\Servidor FTP" -Name ftpServer.directoryBrowse.showFlags -Value "DisplayVirtualDirectories"

Add-webconfiguration "/system.ftpServer/security/authorization" -value @{accessType="Allow";roles="Administrators";permissions="Read,Write"} -PSPath IIS:\ -location "Servidor FTP"

Restart-webitem "IIS:\Sites\Servidor FTP\"

Get-service *ftp* | restart-service

Instalación de Microsoft SQL Server Express 2014:

Install-WindowsFeature NET-Framework-Features -IncludeAllSubFeature -Confirm:$false

Aquí se tiene que cambiar este comando según vuestras necesidades:

Setup.exe /QS /ACTION=Install /ADDCURRENTUSERASSQLADMIN /ENU /FEATURES=SQL /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT="ADMINISTRATOR" /SQLSVCPASSWORD="ContraseñaAdministrator" /SQLSYSADMINACCOUNTS="DOMINIO\Administradores SQL" /AGTSVCACCOUNT="NT AUTHORITY\Network Service" /TCPENABLED=1 /INSTALLSQLDATADIR="C:\Databases" /IACCEPTSQLSERVERLICENSETERMS /SECURITYMODE=SQL /SAPWD="ContraseñaSA" /SQLCOLLATION="sql_latin1_general_cp1_ci_as" /INDICATEPROGRESS
New-netfirewallrule -Name "SQL Server" -DisplayName "Microsoft SQL Server Engine" -Enabled True -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1433 -RemoteAddress Localsubnet

restart-computer

Recordar que se tiene que lanzar dos veces porque se debe reiniciar el equipo, para aplicar la regla del cortafuegos.

 

¿Te ha gustado el artículo? Lo puedes compartir en las redes sociales. También puedes dejar tu opinión, comentario o sugerencia. ¡Gracias!

Similar Posts by The Author: