Autenticación de apache con Directorio Activo. LDAP, NTLM

Queremos que una serie de máquinas con apache, usen el siguiente método de autenticación:

  1. Validar usuario en directorio activo
  2. Validar usuario local (si hay problemas con el directorio activo).

Instalamos los módulos de apache para aceptar ldap:

apt-get install -y libapache-authznetldap-perl  libapache-session-ldap-perl libapache2-mod-ldap-userdir

Activamos el módulo de ldap en apache

a2enmod authnz_ldap

Versión 1: Usuario válido en dominio

El excelente tutorial de adam.shand.net , nos propone una primera versión:
<Location /aplicacion1>
AuthType Basic
AuthBasicProvider ldap
AuthName "Restricted Directory"
require valid-user

AuthLDAPURL ldap://adserver.domain.com/dc=domain,dc=com?sAMAccountName?sub
AuthLDAPBindDN anonymous@domain.com
AuthLDAPBindPassword secretpassword
</Location>

Para probar la cadena de conexión, se puede usar Apache Directory Studio.

Versión 2: Usuario válido en dominio de un grupo concreto (member of)

Añadimos en el parámetro AuthLDAPURL, la consulta después de sub, para que coja los usuarios de un dominio concreto.

<Location /aplicacion1>
AuthType Basic
AuthBasicProvider ldap

AuthName "Restricted Directory"
require valid-user

AuthLDAPURL ldap://adserver.domain.com/dc=domain,dc=com?sAMAccountName?sub?(memberOf=CN=departmentA,CN=Users,DC=domain,DC=com)
AuthLDAPBindDN anonymous@domain.com
AuthLDAPBindPassword secretpassword
</Location>

Versión 3: Aceptar también usuarios locales

Cambiamos el comportamiento de la autenticación ldap, para que no sea la única opción, con AuthzLDAPAuthoritative off

Además, aceptamos también la configuración desde nuestro fichero local de usuarios

<Location /aplicacion1>
AuthType Basic
AuthName "Restricted Directory"
AuthBasicProvider ldap
require valid-user

# Configuracion contra directorio activo:
AuthLDAPURL
ldap://adserver.domain.com/dc=domain,dc=com?sAMAccountName?sub?(memberOf=CN=departmentA,CN=Users,DC=domain,DC=com)
AuthLDAPBindDN anonymous@domain.com
AuthLDAPBindPassword secretpassword

AuthzLDAPAuthoritative off

# Configuración local

AuthUserFile /etc/apache/.htpasswd
AuthGroupFile /dev/null

Para crear el archivo local de contraseñas en apache:

htpasswd -c .htpasswd user

 

Para editar las contraseñas de un usuario concreto:

 

htpasswd .htpasswd user

 

Versión 4: aceptando también ntlm

 

Para rizar el rizo, querríamos que acepte las credenciales de windows de forma directa, sin que el usuario tenga que introducir las credenciales.

Vamos a usar el módulo Apache2::AuthenNTLM

El problema es que no se verifica el grupo de dominio, cualquier usuario que exista en dominio, entra en el apache.

<Location /aplicacion1>
AuthType ntlm, Basic
AuthBasicProvider ldap
AuthName "Restricted Directory"
require valid-user

# Configuracion contra directorio activo:
AuthLDAPURL
ldap://adserver.domain.com/dc=domain,dc=com?sAMAccountName?sub?(memberOf=CN=departmentA,CN=Users,DC=domain,DC=com)
AuthLDAPBindDN anonymous@domain.com
AuthLDAPBindPassword secretpassword

AuthzLDAPAuthoritative off

# Configuración local
# Configuración ntlm:
# domain pdc bdc
# pdc: primary domain controller
# bdc: backup domain controller
PerlAddVar ntdomain “name_domain1 name_of_pdc1”
PerlAddVar ntdomain “other_domain pdc_for_domain bdc_for_domain”

PerlSetVar defaultdomain wingr1
PerlSetVar splitdomainprefix 1
PerlSetVar ntlmdebug 1

AuthUserFile /etc/apache/.htpasswd
AuthGroupFile /dev/null

Versión 5: ntlm con módulo python

Legrandin  nos propone un módulo python para hacer más sencilla la integración con ntlm version 2.

El problema de este tipo de acceso, es que no permite autenticar sin el dominio. En caso de caida o aislamiento del dominio, no se puede recaer en los usuarios locales de nagios.

Existe opción de especificar grupos de dominios, aunque es experimental.

Instalar módulos que nos faltan:


sudo apt-get update
sudo apt-get install libapache2-mod-python python-crypto git
git clone https://github.com/Legrandin/PyAuthenNTLM2.git
cd PyAuthenNTLM2
sudo python setup.py install -f

La configuración de apache quedaría:

<Location /aplicacion1>
AuthType ntlm
AuthName "Restricted Directory"
require valid-user
# Configuración de autenticación ntlm:
PythonAuthenHandler pyntlm
PythonOption Domain adserver.domain.com
# pdc : Primary Domain Controller
PythonOption PDC 192.1.2.45
# bdc : Backup Domain controller.
PythonOption BDC 192.1.2.46
Require group grupo_dominio1,grupo_dominio2

Versión 6: libapache2-authenntlm-perl

Vamos a probar authenntlm-perl, que, según este tutorial es ridículamente fácil:

apt-get install libapache2-authenntlm-perl

Citrix XenApp: Visión general

Básicamente, el objetivo de Xen APP 5 es publicar aplicaciones en el cliente, cómo si fueran parte de su sistema.

Para ello, necesitamos una infraestructura capaz de autenticar a nuestro usuario, ver qué aplicaciones tiene disponibles en el sistema y mantener la conexión para enviar la ventana de aplicación a su sistema.

Arquitectura básica Xen APP 5

  •  gestor para la granja de Citrix, donde se instalará, entre otros “Citrix delivery services console”.
  • servidores de licencia
  • Servidores de Citrix XenAPP (granja).

Configuración básica de servidores

En el gestor  “Citrix delivery services console”, se organizan los servidores en granjas.

Cada Granja tiene:

  • Administradores
  • Servidores: máquinas con Citrix XenAPP
  • Aplicaciones: los ejecutables que se van a publicar a través de citrix.

Una aplicación, a su vez, tiene entre sus propiedades:

  • Location: El ejecutable que invoca realmente en las máquinas citrix.
  • Servers: Servidores donde, debe estar el ejecutable, y donde se redirigirán los ejecutables.
  • Users: Usuarios que pueden acceder a la aplicación con citrix

Citrix secure gateway

Es el componente encargado de gestionar una comunicación segura entre XenAPP y los usuarios finales. Se coloca en la DMZ de la organización y encripta las conexiones con los servidores de la granja citrix.

Puede ponerse dentro o fuera de las máquinas con Citrix XenAPP.

Desde winadmins.wordpress.com explican fenomenal cómo es una arquitectura básica de Citrix.

Configuración de clientes.

Los clientes, acceden a la plataforma vía web, y necesitan un cliente citrix (aka icaclient) para poder abrir las conexiones.

En el caso de Debian de 64bits, os recomendamos esta guía para el cliente citrix.

Migración a Vmware Vsphere 5.5.0a

Como siempre hay que moverse en esta vida, y más en un departamento de sistemas, ha llegado el momento de migrar de vmware 5.1 a 5.5

La guía completa de instalación  es tan completa, que asusta.
Vamos a probar la virtual Appliance para analizar sus posibilidades.
La guía de buenas prácticas de vcenter 5.5 también es más extensa de lo que nos gustaría.

Revisión rutas de red – Cortafuegos

Tendremos que revisar las rutas de red del firewall, ya que hay pequeños cambios de puertos respecto de las versiones anteriores.

Definición de los puertos para la versión 5.5.0a

Exportación de la información de inventario

De nuestra antigua máquina, queremos mantener parte del inventario.  Nos interesan:

  • Permisos de usuarios
  • Inventario de carpetas y asignación de máquinas virtuales a carpetas
  • Información de clusters, DRS y configuraciones de pool de recursos.

Vamos a usar el paquete Inventory snapshot que da vmware en sus labs

Despliegue del ovf

Hemos optado por la versión de la plantilla VMware-vCenter-Server-Appliance-5.5.0.5101-1398493_OVF10.ovf

Tras el despliegue, entramos en la máquina por la interfaz web con el usuario por defecto: root: vmware

Configuramos SSO con la base de datos empotrada (embedded) y dejamos para más adelante la configuración con el servidor de Active Directory.

Configuración active directory

Necesitamos unir la VCSA a dominio. Para ello, revisamos la información de red y la de autenticación:

https://my ip:5480/#virtualcenter.authentication

Al usar el OVA, no se puede usar la opción de Active directory Integrated Windows Authentication sin unir la máquina a dominio.

Necesitamos añadir Active Directory Enabled con un identificador de dominio y un usuario administrador de dominio.

Si al unir, da el error Invalid Hostname. FQDN is required for joining a domain, es necesario revisar la información de red, yponerle sufijo del dominio en la configuración de hostname dentro de la configuración de red.

Accedemos a la consola de gestión del vcenter con el usuario el usuario de sso: administrator@vsphere.local.

https://my-ip:9443/vsphere-client/#extensionId=sso.admin.manage.ids

Home > Administration > SingleSignOn> Configuration > Identity sources

Para evitar tener que introducir constantemente el dominio, se pincha sobre el icono “Set as domain default”. Parece un mundo con una flecha encima.

Esta vista, sólo aparece para el usuario administrator@vsphere.local .  El usuario root no tiene acceso aquí.

Más información en stepbystep 

Probar el acceso.

Para probar el acceso, hay que dar permisos a nivel del vcenter a nuestro usuario o grupo de administración.

Después, ya podemos entrar con el cliente VMware-viclient-all-5.5.0-1281650.exe a nuestra nueva instalación

Uso de credenciales de windows

Para usar en el cliente web las credenciales de windows, es necesario instalar en local el client Integration Plugin, que se indica en la página principal del web client

https://my-ip:9443/vsphere-client/

Creando Host Profile en Vmware 5.1

Un Host Profile de vmware contiene toda la información común de los hosts, y es útil para asegurar que todos nuestros hosts ESX están bien configurados tras su instalación.

Lamentablemente, tras la migración de vmware 4.1 a vmware 5.1, nuestros perfiles de servidor han dejado de funcionar.

Según la guía de vmware para host profiles:

Host profiles eliminates per-host, manual, or UI-based host configuration and maintains configuration consistency and correctness across the datacenter by using host profile policies.
Podemos asegurar que no es correcto, al menos en el caso del almacenamiento SAN.

Al contener información sobre las tarjetas de fibra (incluyendo su identificador de hba y la configuración de psp y satp, es imposible aplicar el perfil entre distintos hosts. Evidentemente, hacer un perfil por cada servidor no nos permite hacer instalaciones rápidas.

En la Base de conocimiento de vmware (2002488), este error está reportado.

Gracias a Yellow Brick, entendemos cómo aplicar los pasos que nos proponen desde vmware.

Estos son los pasos que hemos seguido nosotros:

  1. Crear de nuevo el perfil (host profile) desde un host correctamente configurado.
    Seleccionar host > Host profile
  2. Asignar el nuevo perfil al cluster correspondienteVista home > Managemente > Host Profiles
    Seleccionar el perfil > Attach host cluster > Check complianceAl menos debe ser compatible con el host que hemos cogido como referenciaEn el resto de hosts, tendrá problemas SATP
  3. Edit Profile >  “PSA Device Configuration”
    Borrar identificadores naa que dan problemas
  4. Edit Profile >  “PSA Device Settings”
    Borrar identificadores naa que dan problemas
  5. Edit Profile >  “Native Multi-Pathing (NMP)”
    Borrar identificadores naa que dan problemas
  6. Ahora ya sí debe ser compatible con los hosts:
    Seleccionar el perfil > Attach host cluster > Check compliance

Con estos pasos, seguimos teniendo un problema con los discos de arranque por SAN. Si no aparecen en el perfil, no se puede aplicar sobre el host; pero si aparecen, como cada host tiene un disco de arranque, todos se quejan de los discos de los otros.

SQL Server 2005 Plan de mantenimiento

Vamos a ver paso a paso cómo hacer un plan de mantenimiento con SqlServer 2005. No es lo más actual, en el momento actual, pero hay muchas aplicaciones antiguas que aún requieren está base de datos.

Descripción de nuestro backup

Queremos 4 copias completa de la base de datos cada martes

Queremos 4 copias incrementales de lunes a viernes

Destino del backup

Sql Server 2005 sólo deja sacar backups en carpetas locales.

Crear las tareas

Es el momento de crear las tareas de mantenimiento. Vamos a crear dos planes:

  • Uno para las copias completas, con persistencia de 4 semanas
  • Uno para los incrementales con persistencia de 1 semana

Cómo usuario administrador (normalmente sa) entramos en Microsoft SQL Server Management Studio.

Administracion > Planes de mantenimiento > Nuevo Plan de mantenimiento

Cada plan de mantenimiento constará de tareas del plan de mantenimiento: la de copia y la de limpieza.

La copia copia completa:

  • Nueva tarea “Tareas copia de seguridad de la base de datos”
    Destino: B:/SQLbackup
    Extensión del archivo: .bak
  • Nueva tarea: “Tarea Limpieza de mantenimientoDestino: B:/SQLbackup
    Extensión del archivo: .bak
    Antiguedad 4 semanas
  • Extender la línea verde desde la tarea “Copias de seguridad” hacia “limpieza” para que ejecuten en el orden correcto.

La copia incremental, tendrá su propia carpeta

  • Nueva tarea “Tareas copia de seguridad de la base de datos”
    Destino: B:/SQLbackup/Incremental
    Extensión del archivo: .bak2
  • Nueva tarea: “Tarea Limpieza de mantenimientoDestino: B:/SQLbackup/Incremental
    Extensión del archivo: .bak2
    Antiguedad 1 semanas
  • Extender la línea verde desde la tarea “Copias de seguridad” hacia “limpieza” para que ejecuten en el orden correcto.

Probar las tareas

Administracion > Planes de mantenimiento >

Seleccionamos nuestro plan de mantenimiento, pinchamos sobre Ejecutar y verificamos que se hayan creado los elementos.

Crear un servicio web REST con ASP 1.0 clásico

Evidentemente, la tecnología escogida no es una nuestra elección; viene dada por los requisitos, y, a pesar de todas las justificaciones esgrimidas no ha sido posible cambiarlo.

Servidor web

Nuestro servidor web es un W 2003 con las características IIS activadas.

En la carpeta INETPUB, hemos creado como primer paso una carpeta para javascript donde hemos puesto las librerías JSON y JQUERY (en versión 1).

Recoger parámetros en Javascript desde la URL

La url que se invoca es algo como:

http://www.anyserver.com/mypage.asp?Details=products

En nuestra página ASP, vamos a usar las funciones de purl para sacar valores de la línea de parámetros

Verificar parámetros con expresiones regulares.

...
<script src="js/purl.js" language="javascript" type="text/javascript"></script>
...
<script type="text/javascript">
ip=$.url().param("ip") </script>

Coger parámetros en Classic ASP 1.0 desde url o cabecera

Esta es la forma de recogerlo de URL

IP = Request.QueryString("IP")

Si hay una cabecera propia, hay que anteponer http_ para poder extraerla, cómo explican en el foro de microsoft:

If a client request includes a header other than those specified in the IIS Server Variables table, you can retrieve the value of that header by preceding the header name with “HTTP_” in the call to Request.ServerVariables. For example, if the client sends a header such as SomeNewHeader:SomeNewValue, you can retrieve SomeNewValue by using the following synta

<% Request.ServerVariables("HTTP_SomeNewHeader") %>

Nosotros nos hemos hecho una función, para aceptar parámetros por url y por cabecera indistintamente:

Function GetParam (strTarget)
Dim param
param = Request.ServerVariables("HTTP_"&strTarget)
if (Len(param) = 0) then
param = Request.QueryString (strTarget)
End if
GetParam=param 'Return value
End Function

Respuesta del servidor

Todas las respuestas se hacen en forma de texto:

response.write Linea 1 & vbcrlf
response.write Linea 2 & vbcrlf

Gestión de logs desde Classic ASP 1.0
Hemos usado el código de Digital Colony, por que es inmejorable.

En la carpeta donde se guardan los logs, se debe dar permisos al usuario ASPNET de lectura y escritura.

Conexión a base de datos desde Classic ASP 1.0

Vamos a usar esta solución para prevenir inyección de sql en la base de datos.

Además, hemos creado un usuario con privilegios sólo de escritura sobre la base de datos, para prevenir cambios o consultas sobre otras base de datos.

strConnect = "DRIVER={SQL Server};SERVER=server\instance;DATABASE=my_Db;UID=my_uid;PWD=my_pwd;"
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = strConnect
conn.Open
(...)
conn.Close

Transacciones en base de datos desde ASP 1.0

Algunas de nuestras conexiones, las vamos a hacer dentro de una transacción:

conn.BeginTrans
(...)
conn.CommitTrans

 Función ExecuteScalar contra la base de datos desde Classic ASP 1.0

Hemos creado una función para recoger el primer resultado de una sentencia select.

Function executeScalar (strCommand)
Set command = CreateObject("ADODB.Command")
command.ActiveConnection = conn
command.CommandText = strCommand
Set rs = command.Execute ()
if not rs.EOF then
rs.movefirst
executeScalar = rs.fields(0)
else
executeScalar  = 0
End IF
Set rs = nothing
Set command = nothing
End Function

Gestión de errores de ASP

Para nuestro servicio Rest, hemos escogido la gestión más simple de las que proponen desde  codeguru:

En la cabecera de la página ASP:
<%
' Error Handler
' Turn on page buffering:
Response.Buffer = True
' Turn On Error Handling:
' On Error Resume Next so that errors don't stop page execution
On Error Resume Next
%>

(…) Código ASP de la página

Al final, se captura el error, se limpia la respuesta y se responde con el texto que se espere.

<%
' Error Handler
If Err.Number <> 0 Then
'Clear response buffer
Response.Clear
End If
%>

Más información

Vamos a comenzar por repasar los siguientes foros de información:

Centreon discovery

Hemos intentado instalar centreon discovery en nuestro gestor centreon, sobre centos 6.4. y centreon 2.4.5

Instalación

Comenzamos con los prerequisitos:

yum install nmap python-devel python mysql-devel gcc -y

Para descargar los archivos de centreon-discovery, es necesario darnos de alta en las communities de Centreon. Tras ello, ya podremos descargar e instalar.

tar -xvzf Centreon-Discovery-2.3.1.tar.gz
cd Centreon-Discovery-2.3.1
./install.sh  -i -t central

Para localizar instCentWeb.conf

find / -name  instCentWeb.conf
/etc/centreon/instCentWeb.conf

Después, hay que habilitar el módulo, desde la interfaz de Centreon:

Administration > Modules > Setup

Configuración

La configuración es bastante básica. Tenemos que seleccionar el rango de direcciones, y la community de snmp que vamos a utilizar. tras ello, se lanza el descubrimiento, y nos dejará un listado de los nuevos elementos encontrados por snmp.

Debian: Instalar ICAClient

Hemos tenido algunos problemas al instalar ICAClient (aka citrix receiver) en una máquina debian.

Primero, hemos tenido que instalar los siguientes paquetes:
Debian wheezy
apt-get install ia32-libs ia32-libs-gtk ffmpeg lib32gcc libmotif4 motif-clients

Debian Jessie

apt-get install multiarch-support ffmpeg lib32gcc libmotif4 motif-clients

También hemos tenido que instalar nspluginwrapper_1.3.0-1, bajándolo directamente de la página de oldstable de debian

Al instalar, nos daba un error en la postinstalación de icaclient:

processing icaclient (--configure): subprocess installed
post-installation script returned error exit status 2

/var/lib/dpkg/info/icaclient.postinst
echo $?

Alrededor de la línea 2649, tal cómo explican en crazymadeagle, hemos tenido que sustituir la segunda línea, por la primera:

echo $Arch|grep -E "i[0-9]86|x86_64" >/dev/null
#echo $Arch|grep "i[0-9]86" >/dev/null

Tras ello, reconfiguramos el paquete con dpkg, y nuestro recién editado script de post-instalación:

dpkg --configure icaclient

Certificados

Con el cliente ya instalado, hemos tenido que editar para meter una nueva entidad certificadora en nuestro sistema. El error de citrix era

The server certificate received is not trusted (SSL Error 61)

Hemos copiado los certificados ya disponibles para firefox en la carpeta donde busca ICAclient, como indican desde el foro de ubuntu:


ln -s /usr/share/ca-certificates/mozilla/* /opt/Citrix/ICAClient/keystore/cacerts/

 

También, en el caso de no estar el certificado de la entidad certificado en nuestro firefox, se puede copiar a mano el certificado .cer o .crt en /opt/Citrix/ICAClient/keystore/cacerts/

F5. Monitorización del estado de un nodo de un pool en F5

Hemos llegado a un punto en que la monitorización del propio nodo está bien, pero a nivel de F5 puede estar deshabilitado. Hay dos razones para ello:

  • Un usuario lo ha configurado manualmente (Force Offline)
  • El monitor lo está marcando abajo.

Para ello, hemos desarrollado un script de nagios capaz de monitorizar en todo momento el estado del nodo en un pool concreto del F5:

check_bigip_node_status.sh

La verficación se basa en snmp, por lo que es necesario tener activado snmp en los F5, tener configurado una community, y tener visibilidad entre el motor de nagios y los F5 por el puerto 161 (snmp)-

Ejemplos de uso:

./check_bigip_node_status.sh -h bigip-p community -P Pool -n node

Para funcionar, requiere que tengamos cargados las MIBS de f5 en el directorio de snmp:

/usr/share/snmp/mibs/F5-BIGIP-APM-MIB.txt
/usr/share/snmp/mibs/F5-BIGIP-LOCAL-MIB.txt
/usr/share/snmp/mibs/F5-EM-MIB.txt
/usr/share/snmp/mibs/F5-BIGIP-COMMON-MIB.txt
/usr/share/snmp/mibs/F5-BIGIP-SYSTEM-MIB.txt
/usr/share/snmp/mibs/F5-BIGIP-GLOBAL-MIB.txt
/usr/share/snmp/mibs/F5-BIGIP-WAM-MIB.txt

 

Git: Iniciación a git

Instalación del servidor para acceso mediante ssh con usuario en Debian

sudo apt-get install git
sudo mkdir -p /var/cache/git
cd /var/cache/git
git init --bare mynewgit

 

Configuración de básica
git config --global user.name "Your Name Here"
git config --global user.email "your_email@example.com"
git config --global http.proxy   http://myproxy.org:80
#Añadir user a url
git remote set-url origin https://USER@github.com/user/mygit.git

Clonación de repositorio git

git clone https://server/repo

Bajar última versión

git pull

 Crear carpeta

mkdir folder1 folder2
git add  folder1 folder2
git commit -m "folder1"
git push origin

Cambiar el origen de git (servidor remoto)

git remote show origin

git remote rename origin old

git remote add origin myserver