Servidor Web .NET y SQL con Windows 2016 core

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.
- Habilitar el servidor Web Internet Information Server (IIS)
- Habilitar el servicio de FTP en el servidor Web Internet Information Server (IIS)
- Instalar Microsoft SQL Server Express 2014.
- Resumen de los comandos para hacer scripts.
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.
Seleccionar el idioma del entorno y teclado. En mi caso, Español.
Se carga la aplicación de instalación, hacer clic en el botón Instalar ahora.
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.
Aceptar los términos de la licencia marcando el checkbox correspondiente y hacer clic en el botón Siguiente.
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.
Seleccionar 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.
Esperar a que haga la instalación del sistema operativo.
El instalador ya se encarga de reiniciar el equipo cuando es necesario.
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.
Introducir la nueva contraseña para el Administrador y validar con la tecla Enter.
Se nos confirma el cambio de contraseña. Pulsar la tecla Enter encima de la opción OK.
Ya tenemos el sistema arrancado, con la consola de sistema preparada para recibir instrucciones.
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
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!
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
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 core. Aquí 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.
Volver a lanzar el comando de instalación anterior. Ahora si hace más cosas.
Finalizada la instalación aseguramos que el resultado ha sido satisfactorio. En la consola tengo que encontrar el punto Setup result: 0.
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*
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.
Si todo está correcto accedemos a la administración del mismo, dando por terminada la instalación del servidor SQL Server propiamente dicha.
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:
- Microsoft SQL Server con SMB3
- Microsoft SQL Server amb SMB3
- Containers en Linux
- Containers amb Linux
- Migrar el servidor de archivos a Windows Server 2019
- Migrar el servidor de fitxers a Windows Server 2019
- Puerta enlace a Azure en el Windows Admin Center
- Porta enllaç a Azure en el Windows Admin Center
- Hola mundo! WordPress 5 y Gutenberg
- Hola món! WordPress 5 i Gutenberg