jueves, 16 de marzo de 2017

Comandos de Supervivencia en Windows Server

Debido a mi actual trabajo, en los últimos años he tenido mas acercamiento a Windows Server y definitivamente no fue tan fácil ya que te acostumbras a tus herramientas GNU que cuando te lo cambian es como volver a empezar casi desde cero.

Dicho lo anterior, les traigo el siguiente listado de comandos de supervivencia básica que he documentado en los últimos años para Windows Server 2003, 2018 y 2012 (No powershell).

Problemas con Remote Desktop

Cuando he tenido problemas para ingresar por remote desktop, algunas veces reiniciando el servicio de Remote Desktop o terminal services logramos volver a ingresar al servidor. A continuación muestro como el proceso su no se presenta ningún problema.

sc \\IP_ADDRS STOP TERMSERVICE
sc \\
IP_ADDRS START TERMSERVICE 

Si por alguna razón el servicio se queda en status de "STOPPING" al momento de detener el servicio aun podemos matar el proceso usando fuerza bruta, primero debemos conseguir el identificar del proceso, luego matar el proceso y despues iniciar el servicio.

sc \\
IP_ADDRS queryex termservice
taskkill /s
IP_ADDRS /u Administrator /PID
sc \\
IP_ADDRS START TERMSERVICE



Ahora supongamos que tenemos un servidor en otra ciudad a 300km de distancia y no podemos ingresar al sistema operativo por remote desktop, el servidor no tiene configurada o simplemente no tiene una interface de  administración como la iLO o el IMM y tampoco contamos con un ingeniero en sitio. Despues de agotar varias opciones solo queda intentar el reinicio remoto y espera que levanta bien todo el sistema operativo y escritorio remoto. Con el siguiente comando se nos muestra un cuadro de dialogo para reiniciar uno o varios servidores.


shutdown /i




Sesiones de usuarios y terminal services.
Por default windows server acepta dos usuarios simultáneos por remote desktop, si alguien quiere mas usuarios simultáneos debe comprar licenciamiento. En windows server 2003 muchas veces llegamos a tener problemas para ingresar ya que una sesion iniciada y no cerrada impide que alguien mas ingrese. La manera de ver que usuarios no cerraron bien su sesion y cerrarles la misma es con los comandos qwinsta y rwinsta.

qwinsta /server:IP_ADDRS

La tercer columna nos muestra el identificador de sesion, con este identificador podemos finalizar una sesion.

rwinsta /server:
IP_ADDRS 3




Puertos de red abiertos

En todo momento resulta útil conocer que puertos están abiertos en el sistema, pero resulta mas útil conocer que procesos abrieron cada puerto.

#Conexiones establecidas y el PID que lo atiende
netstat -oan

#Puertos abiertos en modo LISTENING
netstat -an | find /i "listening"


Depuración de espacio en disco

Aunque siempre es posible depurar usando herramientas como ccleaner y remover aplicaciones que ya no usamos, existen unos directorios asociados las actualizaciones y services packs del sistema operativo. Estos deben ejecutarse como administrador.

#Archivos viejos de Service pack anteriores ya no usados
Dism /online /cleanup-image /spsuperseded
#Archivos viejos de actualizaciones ya no usados.
Dism /online /Cleanup-Image /StartComponentCleanup       

Para el caso de que tengamos archivos muy viejos que ya no se usan podemos borrarlos, colocandonos en el directorio donde se encuentran todos esos archivos, ejecutamos el siguiente comando donde borrariamos todos los archivos con antigüedad mayor a 45 días. Esto resulta ideal para una aplicación que escribe logs diariamente.

forfiles /m *.* /d -45 /c "cmd /c del @file"


Windows Update, reinicio no programado

Si por alguna razón se nos quedaron los windows update encendidos configurados para actualizarse de manera automática, muy probablemente nos reiniciara el servidor sin darnos cuenta hasta afectar alguna plataforma de la empresa. La recomendación es controlar estas actualizaciones, permitiendo que se descarguen o no pero lo mas importante es que seamos nosotros quienes definamos el momento en que estas se realizan. Una manera de evitarlo, es decir, cancelar el reinicio automatico de windows server podemos dar de baja el servicio como se indica:

sc stop wuauserv


Información rapida de usuarios en dominio

Si queremos conseguir informacion mas rapida de un usuario de dominio sin ingresar al domain controller o sin tener instalado la aplicacion de Active Directory, podemos consultar de la siguiente manena

net user /DOMAIN USERNAME


Ligas simbólicas
Confieso que esto me sorprendió mucho, nunca pensé que en Windows se podría crear ligas simbólicas dentro de la misma unidad de disco o incluso hacia otro volumen. Esto puede resultar útil cuando el volumen no viene de una SAN y no se puede crecer. Una solución puede ser agregar mas disco local y con una liga simbólica escribir en el nuevo disco local añadido. Con el parametro /D definimos la liga simbólica y usamos rutas absolutas para el origen como el destino.


mklink /D c:\dell\logs e:\dell\logs


Uptime

Si queremos saber desde cuando esta corriendo un windows server podemos ejecutar el comando siguiente y ver la parte de "Statistics Since".

net stats server

jueves, 23 de febrero de 2017

Nuevo proyecto - Anuncios en Mexico - www.anunciosenmexico.com.mx

Hace unos días acabo de iniciar un nuevo proyecto, el cual consiste en un sitio de anuncios gratuitos. Dada la situación económica de México en los últimos años creo que un gran volumen de la población tiene necesidad de vender y buscar productos con precios atractivos.

Queda a su disposición el sitio:
www.anunciosenmexico.com.mx

martes, 9 de agosto de 2016

Primer prototipo LoadBalancer con IPtables

El siguiente script en bash es el primer prototipo de LoadBalancer para un servicio TCP en dos o mas servidores simultaneamente utilizando iptables.
#!/bin/bash
local_ip="10.10.50.81"

ip1="10.10.96.50"
ip2="10.10.50.106"
tcp_port="80"


#Se valida que los servicios esten disponibles
nmap $ip1 -p $tcp_port | grep -i open >> /dev/null
service1=$?
nmap $ip2 -p $tcp_port | grep -i open >> /dev/null
service2=$?
let status=$service1+$service2
echo "Valor: $status"
let remakerules=10

while [ 0 -eq 0 ]; do

        if [ "$remakerules" != "$status" ]; then
                # You need these system settings.
                echo 1 > /proc/sys/net/ipv4/ip_forward
                for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

                # Clear iptables/netfilter settings.
                iptables -F
                iptables -X
                iptables -t nat -F
                iptables -t nat -X
                iptables -t filter -F
                iptables -t filter -X
                iptables -t mangle -F
                iptables -t mangle -X


                iptables -P INPUT ACCEPT
                iptables -P OUTPUT ACCEPT
                iptables -P FORWARD ACCEPT
                iptables -t nat -P PREROUTING ACCEPT
                iptables -t nat -P POSTROUTING ACCEPT

                if [ "$service1" == "0" -a "$service2" == "0" ]; then
                        #Los dos servicios estan disponibles
                        iptables -t nat -A PREROUTING -p tcp -d $local_ip --dport $tcp_port -m state --state NEW -m statistic --mode random --probability .5 -j DNAT --to $ip1:$tcp_port
                        iptables -t nat -A PREROUTING -p tcp -d $local_ip --dport $tcp_port -m state --state NEW -m statistic --mode random --probability .5 -j DNAT --to $ip2:$tcp_port
                else
                        if [ "$service2" == "0" ]; then
                                #Unicamente el servicio2 esta arriba
                                iptables -t nat -A PREROUTING -p tcp -d $local_ip --dport $tcp_port -m state --state NEW -m statistic --mode nth --every 1 --packet 0 -j DNAT --to $ip2:$tcp_port
                        else
                                if [ "$service1" == "0" ]; then
                                        #Unicamente el servicio1 esta arriba
                                        iptables -t nat -A PREROUTING -p tcp -d $local_ip --dport $tcp_port -m state --state NEW -m statistic --mode nth --every 1 --packet 0 -j DNAT --to $ip1:$tcp_port
                                else
                                        echo "CRITICAL: Los dos Servicios estan abajo"
                                fi
                        fi
                fi


                iptables -A INPUT -j ACCEPT
                iptables -A OUTPUT -j ACCEPT
                iptables -A FORWARD -j ACCEPT
                iptables -A INPUT -j LOG --log-prefix "iptables: " --log-level 4
                iptables -A OUTPUT -j LOG --log-prefix "iptables: " --log-level 4
                iptables -A FORWARD -j LOG --log-prefix "iptables: " --log-level 4

                iptables -t nat -A POSTROUTING  -j MASQUERADE
                echo "Cambio de reglas..."
        fi

        #sleep 1200
        sleep 1

        #Se valida que los servicios esten disponibles
        nmap $ip1 -p $tcp_port | grep -i open >> /dev/null
        service1=$?
        nmap $ip2 -p $tcp_port | grep -i open >> /dev/null
        service2=$?
        let remakerules=$status
        let status=$service1+$service2
        echo "Valor: $status"

done

domingo, 29 de mayo de 2016

Certificados SSL para Web Server

La instalación de certificados sobre un web server es muy sencilla. En este post vamos a mostrar como instalar un certificado en Apache Web Server.

En sintesis primeramente debemos escoger un proveedor de certificados digitales para hacer el proceso de compra con el, este proveedor requiere que le enviemos una solicitud conocido como archivo CSR, es muy importante generar este archivo CSR en el servidor donde vamos a instanciar el web server y que al mismo tiempo debe ser el mismo donde se colocara el certificado. Despues de que enviemos el CSR el proveedor nos enviara un archivo CRT, con este archivo podremos configurar el certificado.




Realizáremos paso a paso el proceso en el interprete de comandos de GNU/Linux, como buena practica recomiendo llamar al archivo igual que el FQDN a certificar, para nuestro caso vamos a suponer que nuestro objetivo es certificar a www.midominio.com.

Creamos una llave de seguridad de 2048 bits, se nos pedirá que ingresemos el passphrase. Desde luego es muy importante guardar el passphrase.
openssl genrsa -des3 -out www.midominio.com.key 2048

Creamos el archivo csr a partir de la llave que creamos anteriormente y con una vigencia de 365 dias. Se nos pedirá información del FQDN a certificar y datos de ubicación de la empresa que solicita el certificado.
openssl req -days 365 -new -key www.midominio.com.key -out www.midominio.com.csr

Ahora ya podemos enviarle el csr al proveedor para que el nos regrese el CRT, este crt debe incluir el certificado para el webserver y un certificado de autoridad (CA). Ya que tenemos todo, podemos configurar los certificados en la secciones de host virtuales en el FQDN que estamos configurando, se modificaran los siguientes parametros:
SSLCertificateFile: Archivo CRT con el certificado para el web server.
SSLCertificateKeyFile: Archivo llave
SSLCACertificateFile: Archivo CRT con el CA.

Despues de hacer estos cambios se reiniciara el web server y por cuestiones de seguridad, cada reinicio o inicialización del servicio pedirá la clave, por un lado es bueno que solo las personas autorizadas puedan reiniciar el servicio web, pero que pasa si el servidor completo se reinicia... el web server no arrancara por que se quedara esperando el passphrase. Existe una manera de evitar esto y es reemplazar la llave por otra que no requiera passphrase, eso se puede reaizar con el siguiente comando:

openssl genrsa -out www.midominio.com.key.nopass 2048

Finalmente solo reemplazamos en el parametro del Apache "SSLCertificateKeyFile" con valor www.midominio.com.key por www.midominio.com.key.nopass