Tuesday, December 9, 2008

Active Directory con Windows 2008 (y anteriores también)

Aunque tengo pendiente un par de posts sobre linux, y una curiosidad sobre un cambio de comportamiento de mkfs.ext3 de un tiempo a esta parte, hoy vuelve a tocar hablar de windows. Estoy haciendo un curso de migración a Windows 2008, y he querido recoger aquí algunos comandos curiosos.

Antes de empezar, un breve resumen sobre los roles en el AD: en total hay 5 roles (Flexible Single Master Operation role, o sea: FSMO role para empezar a googlear). Tres son a nivel de dominio (RiD master, PDC, Infrastructure master) y dos se dan a nivel de bosque: Naming master y Schema master.

Así que por cada dominio tendremos un pdc, un infrastructure master, un Rid master, pero puede que no tengamos ningún schema o naming master en el dominio, ya que sólo hay un Domain Controler (DC) que tenga ese rol en todo el bosque de dominios. Esto es así porque todo el bosque debe tener el mismo schema del AD por una parte, y por otra porque sólo un equipo debe gestionar los nombres asignados a los dominios para evitar colisiones.

Para ver más sobre los roles buscar FSMO roles wikipedia.

Para ver desde línea de comandos quien tiene asignado los roles:
C:> netdom query fsmo

Para transferir roles desde línea de comandos de un servidor activo a otro activo:
C:> ntdsutil roles
fsmo maintenance: ?

y aquí elegimos un comando con transfer. Si hemos perdido el servidor que ostentaba uno de esos roles, podemos forzar que el servidor en que estamos lo asuma:

C:> ntdsutil roles
fsmo maintenance: seize ...

las opciones que empiezan por seize fuerzan al servidor a asumir el rol, y sólo deben usarse cuando el servidor que ostentaba dichos roles es irrecuperable. En este caso debe además realizarse un metadata cleanup completo tal y como indican aquí: http://support.microsoft.com/kb/216498. Ojo a la distinción entre w2003sp1 y posteriores, y w2000 y w2003.

Buenas noches.

Thursday, November 27, 2008

Cosas de la virtualización: upgrade de windows server 2000 a 2003

Hace poco me tocó upgradar un Windows 2000 server a 2003. Para prepararlo, me instalé sobre virtualbox un 2000, le instalé las tools del cliente, le puse los parche del windows update, y a continuación después de los reboots necesarios, introduje el cd del windows 2003 Enterprise y me dispuse a actualizar.

Los primeros pasos fueron bien, al meter el cd salta el autorun y te muestra una ventana en que nos da la opción de Upgrade (recommended), la elegimos, nos pregunta si queremos que se baje los cambios al instalador de 2003 de MS, tanto da que digamos sí como no (para el caso que nos ocupa), y empieza a modificar algunos ficheros, copia otros y se reinicia. Y ENTONCES ... al reiniciar, pues no llega a arrancar y no hay forma ni de volver atrás, ni de seguir adelante sin perder la instalación. Sin embargo, sin las tools del cliente; o sin el update del windows. Funcionó sin ningún problema.

Las pruebas sobre máquinas físicas no fallaron jamás.

En fin, parece que la virtualización no es un paradigma universal.

En próximas entregas intentaré depurar los errores.

Monday, November 24, 2008

Clonar una Red Hat Enterprise Linux (RHEL 5.0)

El viernes me pidieron hacer un clon de una máquina en explotación y que bajo ningún concepto podía reiniciarse ni verse afectada en su rendimiento.

La petición concreta fue la de obtener una copia exacta de la RHEL en explotación sobre un hardware muy parecido.

Se valoraron dos opciones, ambas empiezan por arrancar el clon con una LiveCd:
  1. copiar todos los ficheros de la máquina por scp, gracias al uso del phreakietar que algún día postearé.
  2. instalar un cliente de nuestro programa de backup sobre la LiveCd y realizar una recuperación del otro servidor sobre el clon, y luego cambiar la ip y el nombre de máquina, así como otras configuraciones menores.

Optamos por la segunda pero entonces una actualización del firmware de la placa base y de la scsi hizo que ninguna LiveCd arrancase sobre la máquina. Así que sobre la partición correspondiente al /home original instalamos un ubuntu 8.10 server como minimal, sobre el que se instaló el cliente del programa de backup (legato networker).

Una vez recuperado, configuré el grub propio de la ubuntu para arrancar la RHEL, pero... daba un error ... bueno dos:

* se quejaba de no encontrar la etiqueta de la partición de swap
* daba un error muy breve de algo del /dev/console y se reiniciaba

Para solucionar el primer problema:
# desmontamos la partición de swap
$>swapoff

# ejecutamos mkswap
$>mkswap -L <etiqueta> /dev/sda5

Para solucionar el segundo problema:
En las distribuciones basadas en debian, los devices (/etc/dev) se crean cada vez que el equipo arranca. Sin embargo, las RHEL y los solaris no. En RHEL deben crearse:
$>/sbin/start_udev

y tira millas!! con start_udev recreamos los devices del /dev

Y con esto el equipo vuelve a arrancar.

Antes de despedirme ... la máquina en cuestión tiene 16 procesadores, 24 GB de ram, un mirror SCSI donde está el sistema, y los datos en dos luns de la SAN de más de un tera cada uno ... es que se me pone dura sólo de pensarlo.

Buenas noches.

Tuesday, November 18, 2008

Fijar la zona horaria (time zone) en LINUX

La zona horaria marca el desfase en horas con respecto al GMT (meridiano de Greenwitch). Gracias a que el sistema conoce su zona horaria nos basta con un único servidor ntp para que varios sistemas sepan que tienen la misma hora a pesar de que su reloj marque números diferentes... Vaya, que forma más difícil de decirlo. Gracias a que un equipo sabe en qué zona horaria está, sabe que la hora de Madrid es la del GMT + 1, y por eso puede sincronizarse con otros equipos del mundo.

Basta de rollo:
Para saber la Time Zone de un equipo:
ls -l /etc/localtime
lrwxrwxrwx 1 root root 33 2006-11-27 11:43 /etc/localtime - > /usr/share/zoneinfo/Europe/London


Para cambiarla a Madrid:
ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime

Wednesday, November 12, 2008

fijar puertos RPC en windows 2003

Cuando los DC están tras un firewall hay que fijar los puertos que asigna el RPC, ya que por defecto asigna puertos entre el 1024 y el 5000.

Hay dos procedimientos, uno más pedestre y que exige reboot; otro que utiliza una herramienta del Ressource kit de microsoft y que no exige reboot: rpccfg.exe

Para el rpccfg:
  1. descargar e instalar el Resource Kit de MS Windows 2000 o 2003, y es una de las herramientas que se instalan. También se puede copiar el ejecutable en el equipo que nos interese.
  2. ejecutarlo con los parámatros: c:>rpccfg /pe 50000
  3. ejecutarlo con los parámatros: c:>rpccfg /d 0
donde en /pe le indicamos los puertos que asignará el RPC, en mi caso el 50000. Si quieres asignara varios los separas por espacios, y para intervalos con un guión: 50000-50100.
Con /d le indicamos si debe atender a la intranet o a internet. En mi caso como se trata de equipos de otros rangos, pongo 0. Si no, se pone un 1.

Editando el registro:
  1. Inicio -> Ejecutar -> regedt32
  2. Ir a HKLM/Software/Microsoft/Rpc y crear la clave InternetDentro de HKLM/Software/Microsoft/Rpc/Internet,
  3. crear las siguientes claves:
    • Ports de tipo REG_MULTI_SZ: en sus valores pondremos los puertos o rangos de puertos por los que queramos atender los rpc.

    • PortsInternetAvailable de tipo REG_SZ , si le damos el valor Y los puertos son accesibles desde internet, en caso contrario N

    • UseInternetPorts de tipo REG_SZ , si le damos el valor Y los procesos con valores por defecto usarán los puertos de internet, con N a los procesos con los valores por defecto se les asignarán puertos del pool de la intranet.

  4. Reiniciar el equipo


De esta forma podemos tener los DC en una DMZ, protegidos tras un firewall.


Buenas noches.

Wednesday, November 5, 2008

Apache: RewriteRule a una url con caracteres especiales como pe.e %

Se trata de algo muy específico, tanto que te lleva un rato ingeniartelas para que funcione.

Contexto:
Se trata de redirigir el tráfico que entra a una url a una página index.php que recibe como parámetros otra página php con unos parámetros propios. Esta técnica se usa por ejemplo cuando queremos indicarle a la página inicial qué otras páginas debe cargar en cada uno de los frames definidos, en función p.e. del idioma.

index.php?url1=./body/index.php%3Flang%3Des&n=2&m=no

donde %3F es igual a '?'
y %3D es igual a '='

pero no podemos escribirlos tal cual ya que si no php los interpretaría y se volvería un poco loco.

index.php recibe 3 argumentos:
  1. url1=./body/index.php%3Flang%3Des
  2. n=2
  3. m=no
Solución:
RewriteRule /$ http://server2.dom.com/index.php?url1=./body/index.php\%3Flang\%3Des&n=2&m=no [L,R,NE]

Lo que está en negrita es el meollo del asunto.

Falsas soluciones:
RewriteRule /$ http://server2.dom.com/index.php?url1=./body/index.php\%3Flang\%3Des&n=2&m=no [L,R]

redirige a :
http://server2.dom.com/index.php?url1=./body/index.php%253Flang%253Des&n=2&m=no

RewriteRule /$ http://server2.dom.com/index.php?url1=./body/index.php%3Flang%3Des&n=2&m=no [L,R]

redirige a:
http://server2.dom.com/index.php?url1=./body/index.phpFlangDes&n=2&m=no



Bueno, no digo que sea algo que uno deba saber, pero sí algo que recordar vagamente para saber orientarnos.


Buenas noches.

Friday, October 31, 2008

Configuración Kernels paquetizados por Ubuntu

Recientemente me han planteado si el kernel que se ejecutaba en un equipo reconocería 32Gb de RAM. Me sonaba, que si una opción del kernel estaba activada al compilarlo, entonces la configuración del kernel en ejecución se encontraba en :


/proc/config


En los kernels paquetizados de Ubuntu no lo he encontrado allí, pero cotilleando encontré que para cada kernel instalado, hay en el /boot un ficherito config- donde salen las opciones de compilación.
toto@pitu:~/Documents/nagios$ ls /boot/
abi-2.6.22-15-generic
abi-2.6.24-21-generic
config-2.6.22-15-generic
config-2.6.24-21-generic
grub
initrd.img-2.6.22-15-generic
initrd.img-2.6.22-15-generic.bak
initrd.img-2.6.24-21-generic
initrd.img-2.6.24-21-generic.bak
memtest86+.bin
System.map-2.6.22-15-generic
System.map-2.6.24-21-generic
vmlinuz-2.6.22-15-generic
vmlinuz-2.6.24-21-generic
toto@pitu:~/Documents/nagios$



Su contenido tiene un aspecto parecido a este:

...
CONFIG_HID=m
# CONFIG_HID_DEBUG is not set
# CONFIG_HID_FF is not set
CONFIG_HIGHMEM4G=y
# CONFIG_HIGHMEM64G is not set
CONFIG_HIPPI=y
...


Aquí puede verse como para mi kernel de la versión desktop puede reconocer hasta 4Gb de RAM. En equipos con UBUNTU SERVER, viene activada por defecto la opción de hasta 64Gb.

Es curioso, porque recuerdo haber leído que esta opción tiene (o tenía) una incidencia muy negativa sobre el rendimiento a no ser que realmente haya mucha RAM en la máquina.

Monday, October 27, 2008

Nagios: servicios para hostgroups

Lo que viene a continuación no lo he probado todavía, pero según la documentación de Nagios2 debe funcionar. Se trata de ahorrar trabajo rutinario. Si para cada equipo windows, linux, sun ó aix se monitorizan un pool de servicios iguales, se pueden crear hostgroups por S.O. y definir servicios a aplicar a cada hostgroup.

Para cada equipo que añadamos p.e. al grupo Windows, se monitorizarán automáticamente determinados servicios.

El único problema es hacer que los mails de las alarmas lleguen a los admins de cada máquina:

 define service{
hostgroup_name hostgroup_Windows
service_description basic_services
check_command check_nrpe_parm!check_more_procs!"syslog*,twagent,nsrexec*"
}


Mi duda es si las notificaciones llegarán al contact_group por defecto de cada equipo o si simplemente dará un error.

Cuando lo pruebe lo posteo ;)

Thursday, October 23, 2008

Nagios: caducar los acknoledge con REMOVE_SVC_ACKNOWLEDGEMENT

Después de un tiempo intentando encontrar una manera de caducar los Acknoledge que hace la gente de monitorización de las alarmas en nagios, la otra noche me encontré con una solución de la mano de la propia documentación de nagios:

REMOVE_SVC_ACKNOWLEDGEMENT

Se trata de un comando externo, y según comentan los señores nagios en este link: http://www.nagios.org/developerinfo/externalcommands/commandinfo.php?command_id=117

Una muestra del código puede ser:
now=`date +%s`
commandfile='/usr/local/nagios/var/rw/nagios.cmd'

/bin/printf "[%lu] REMOVE_SVC_ACKNOWLEDGEMENT;host1;service1\n" $now > $commandfile



Si no recuerdo mal, tengo algún script en python para parsear el services.cfg y extraer los pares host-service_name necesarios para caducar todos los acknoledge.

A ver si todavía sigo aquí para cuando tenga mi flamante código python y lo puedo postear.

Buenas noches mundo.

El registro de Windows: internacionalización

Hoy he aprendido algo sobre el registro del windows que desconocía: la forma de ajustar la internacionalización desde el registro.

La estrella invitada es:
HKEY_CURRENT_USER\Control Panel\International

donde hay valores: REG_SZ

Aunque parezca inútil, si quieres hacer algún cambio por script, es muy cómodo conocer qué clave controla qué aspecto. También se puede hacer esto mismo por políticas, pero eso queda para otro día.

a continuación posteo todos los valores:

iCountry Country code is the international telephone code, except for Canada, which is 2. The default is 1.

iCurrDigits Number digits displayed after the decimal separator. The default is 2.

iCurrency Determines how currency is displayed:

ValueMeaning
0$2
12$
2$ 2
32 $

iDate Determines how dates are displayed:

ValueMeaning
0mm/dd/yy
1dd/mm/yy
2yy/mm/dd

iDigits The number of digits displayed after the decimal separator in numbers. The default is 2.

iLZero Leading zeros are not displayed if 0 (default). A Leading zero is displayed if set to 1.

iMeasure Metric is 0, U.S. is 1

iNegCurr Determines the format for displaying negative numbers (default is 1):

ValueMeaning
0($100.00)
1-$100.00
2$-100.00
3$100.00-
4(100.00$)
5-100.00$
6100.00-$
7100.00$-
8-100.00$
9-$ 100.00
10100.00 $-
11$ 100.00-
12$ -100.00
13100.00- $
14($100.00)
15(100.00 $)

iTime Determines if the clock is 12 hours (0) or 24-hour (1).

iTLZero The default of 0 means hours may have single digits, a 1 pads to double digits.

Locale locale ID for spoken language. The default is U.S. English which is 00000409.

s1159 AM indicator for a 12 hour clock.

s2359 PM indicator for a 12 hour clock.

sCountry Country name. The default for U.S. English is United States.

sCurrency Currency symbol. The default for U.S. English is $.

sDate Date separator. The default for U.S. English is /.

sDecimal Decimal separator symbol. The default for U.S. English is the . (period).

sLanguage Language abbreviation: (U.S. English is ENU)

Value Meaning
CSY Czech
DAN Danish
DEA German (Austrian)
DES German (Swiss)
DEU German
ELL Greek
ENA English (Australia)
ENC English (Canada)
ENG English (U.K.)
ENI English (Irish)
ENU English (U.S.)
ENZ English (New Zealand)
ESM Spanish (Mexican)
ESN Modern Spanish
ESP Castilian Spanish
ETI Estonian
FIN Finnish
FRA French
FRB French (Belgian)
FRC French (Canadian)
FRS French (Swiss)
HUN Hungarian
ISL Icelandic
ITA Italian
ITS Italian (Swiss)
NLB Dutch (Belgian)
NLD Dutch
NON Norwegian (Nynorsk)
NOR Norwegian (Bokmal)
PLK Polish
PTB Portuguese (Brazilian)
PTG Portuguese
RUS Russian
SKY Slovak
SVC Swedish
SVE Swedish
TRK Turkish

sList List separator character. The default for U.S. English is , (comma).

sLongDate Long Date format:

ValueMeaning
dddd, MMMM dd, yyyyWednesday, November 19, 1997
MMMM dd, yyyyNovember 19, 1997
dddd, dd MMMM, yyyyWednesday, 19 November , 1997
dd MMMM, yyyy19 November , 1997

sShortDate Short date:

ValueMeaning
MM/dd/yy03/08/99
M/d/yy3/8/99
M/d/yyyy3/8/1999
MM/dd/yyyyy03/08/1999
yy/MM/dd99/03/08
dd-MM-yy08-Mar-99

sThousand Thousands separator. The default for U.S. English is , (comma).

sTime Time separator. The default for U.S. English is : (colon).

sTimeFormat The default is HH:mm:ss


Tuesday, October 21, 2008

dos2unix | sed | awk > salida.txt

Se trata de parsear el visor de sucesos de un Windows para buscar un tipo de ocurrencia o suceso.

Para los impacientes, seré breve:
Ir al visor de sucesos (event viewer), clic dcho en security, guardar como, elegir texto tabulado (tab). En nuestro caso, el fichero se llama jl2.txt. Copiarlo a tu máquina con tu flamante linux y a continuación ejecutar:

dos2unix -b jl2.txt
sed 's/\t/;/g' jl2.txt | awk '$1 ~ /^"$/{printf "\n\n"} $1 !~ /^"$/{printf "%s",$0}' > log_G_repo.txt


y ya tienes todo el registro con una línea por entrada, y podeis empezar con los grep, egrep, ... que os vengan en gana.


La historia completa:


A raiz de un incidente de seguridad, me tocó repasar el event viewer del W2003 del repositorio de ficheros. Seguro que hay otras formas de hacerlo, pero un gran técnico (y un gran jefe, dicho sea de paso) me dió todo un recital de shell scripting tradicional-flauvored.

Así que aunque puede que no conduzca a ninguna parte, allí va. En algunas carpetas delicadas del repositorio alguna usuaria había detectado de cuando en cuando que faltaban contenidos que recuperábamos del backup (con un poco de suerte no había que mandar traer la cinta, ...). Por esto hace un año auditamos los accesos, cambios, ... de todo el contenido de esas carpetas. Esto genera un registro de seguridad gigante, unos 500Mb por semana. A veces hay más de 20 entradas por segundo.

Para parsear todo ese meollo, y llegar a los registros que nos interesan pensamos en exportar el registro de seguridad (Event Viewer - Security), pero la información que proporciona es menor que la del visor de eventos, y la necesitábamos toda.

Finalmente, nos acordamos que si en lugar de exportar haces un guardar como entonces sí que obtienes toda la información que ves desde el visor de sucesos. Puedes sacarlos como texto tabulado, o como csv. Este último formato no es fiable al pasarlo a una hoja de cálculo, ya que encontramos divergencias importantes. Así que nos quedamos con el tabulado.
Pero al guardarlo así, no muestra un registro por línea, y nuestro grep no es muy útil. Además los registros no tienen todos el mismo formato. Por eso buscamos una forma de meterlo cada evento en 1 línea (larga, pero eso no importa), y así luego hacer grep sobre el fichero y extraerlo los DELETE sobre el path deseado.

Monday, October 20, 2008

The WATCH

Hay dias de pena en que aprendemos algo que hace que ese día sea un poquito mejor. Y eso ha sido una pequeña instrucción *nix (linux en mi caso), que realmente me ha gustado.

Prueba a procesar a base de awk, grep, ... un fichero de 400Mb de txt ... En seguida andas desde otro terminal haciendo:

ls -lh <mi_ficherito_de_4TB.txt>

para ver como va creciendo el ficherito. Pues ahora podemos hacerlo así:

watch -n 1 ls -lh <mi_ficherito_de_4TB.txt>


y cada segundo que pasa nos va enseñando la salida de ls -lh , actualizando el tamaño del fichero.


y con esto y un bizcocho ...

y finalmente empezé

Muchas veces me he dicho, si tuviese un blog esto lo recogería. Finalmente me he decidido, como son las tantas no voy a decir de dónde sale el nombre, pero al tiempo ... porque la instrucción que da nombre a este blog tiene narices.

Así copié un DVD de mi hija, para salvar el original de sus zarpas y dejar que practique con la copia el mete-saca, para-arranca.

Uso Ubuntu Hardy, con los repositorios estándar de Ubuntu. He instalado el k9copy pero fallaba al hacer la copia. Faltaba dos paquetes: libdvdcss libdvdcss2 que están disponibles en el repositorio de medibuntu. Aquí hay un link fantástico sobre cómo hacerlo:

http://www.zaphu.com/2008/05/31/ubuntu-guide-ripping-and-burning-dvds-with-k9copy-and-brasero/


Un comentario sobre el link que hace a la instalación de los paquetes desde medibuntu (http://www.zaphu.com/2008/05/30/ubuntu-guide-installing-media-codecs-for-flash-dvd-quicktime-mov-mp3-wmv-wma-and-acc-mp4-m4a-playback/):

si substituyes aptitude install libdvdcss libdvdcss2
por : apt-get install libdvdcss libdvdcss2

revienta vivo. La verdad que como soy un ignorante del aptitude, pues no sé si es normal o no.
Por ahora sólo lo señalo.

Buenas noches yo.