lunes, 27 de abril de 2009

Instalar rdiff-backup

Muchas veces queremos hacer respaldo de nuestros servidores pero no sabemos como hacer una manera es usar un rsync lo cual hace una copia diaria de todos nuestros archivos pero si pasado el tiempo queremos restaurar un respaldo vamos a tener que buscar los respaldos que tengamos guardado hay una manera de hacer esto mas facil y es con rdiff con este software podemos hacer los respaldos diarios y llegado el momento decirle al software que restaure los archivos o carpeta hasta la fecha que necesitamos.

Para instalarlo desde el codigo fuente se hace de la siguiente manera esta instalacion fue echa en slackware 12.1 en otras distribuciones debe de ser igual execto debian y ubuntu que lo traen entre sus repositorios.

Primero que nada tenemos que instalar las librerias rsync

wget http://internap.dl.sourceforge.net/sourceforge/librsync/librsync-0.9.7.tar.gz

tar xzf librsync-0.9.7.tar.gz

cd librsync-0.9.7

./configure

make AM_CFLAGS=-fPIC # Importante: Sin este flag, da un error al compilar rdiff-backup en sistemas de 64bits

make install

cd ..

Con esto ya tenemos instaladas las librerias necesarias ahora viene el rdiff

wget http://savannah.c3sl.ufpr.br/rdiff-backup/rdiff-backup-1.1.5.tar.gz

tar -xzf rdiff-backup-1.1.5.tar.gz

cd rdiff-backup-1.2.2

python setup.py install

domingo, 12 de abril de 2009

Enviar correo cuando se conectan por ssh

Existen muchas herramientas y técnicas que podemos usar para estar al tanto de las conexiones que se producen en un servidor desatendido (TCP wrappers, swatch, etc.). En lugar de usar alguna de estas técnicas ideé este método tan simple porque no requiere instalar ningún paquete que no tenga ya instalado. En mis sistemas la utilizo para que, en el momento en el que cualquier persona entre, enviar un mensaje SMS a mi correo. En caso de que esa persona no sea yo, tengo una oportunidad de echar al intruso o apagar la máquina ;-).
Requisitos previos

Se asume que los siguientes paquetes están ya instalados y funcionando:

* OpenSSH (net-misc/openssh).
* El cliente de correo mailX (mail-client/mailx), para enviar correos desde scripts de shell o desde línea de comandos.
* Un MTA ("mail transfer agent" o "agente de transferencia del correo") para mailX, como pueden ser Qmail, Postfix o Sendmail.
* Opcional: el sistema de ventanas X Window. No es obligatorio, pero debe de tenerse en cuenta a la hora de configurar SSH.

En caso de no cumplir alguno de los requisitos existen un montón de recursos para ayudarte, incluyendo los excelentes foros de Gentoo. Cómo configurar SSH o un servidor de correo está fuera del alcance de esta guía, que cubre solamente cómo conectar ambos.

Cómo funciona

En caso de que exista el script /etc/ssh/sshrc, SSH lo ejecuta después de cargar el entorno de un usuario pero antes de iniciar su intérprete de comandos. Este archivo nos proporciona las inicializaciones globales necesarias "antes de que el directorio /home del usuario llegue a ser accesible" (consultar # man 8 sshd). En mi caso, lo utilizo para enviar el correo con los detalles de la conexión.
Qué hacer

1. Hacer login como root.
2. Crear /etc/ssh/sshrc tal y como se muestra a continuación. En caso de que ya exista no sobreescribirlo, simplemente añadir en el punto adecuado los comandos que aparecen a partir de "Enviar una alerta con los detalles de la conexión".

# Establecer XAuthority usando el protocolo X desde stdin
# (ejemplo sacado de: man 8 sshd)
# Puedes omitir esta seccion si X (y por tanto xauth) no estan instalados.
#
if read proto cookie && [ -n "$DISPLAY" ]; then
if [ `echo $DISPLAY | cut -c1-10` = 'localhost:' ]; then
# X11UseLocalhost=yes
echo add unix:`echo $DISPLAY |
cut -c11-` $proto $cookie
else
# X11UseLocalhost=no
echo add $DISPLAY $proto $cookie
fi | xauth -q -
fi

# Enviar una alerta con los detalles de la conexión
#

cuando=`/usr/bin/date`
donde=`echo $SSH_CONNECTION|cut -f1 -d' '|cut -f4 -d:`
if [ -z "$SSH_TTY" ] ; then
que="Conexion de $USER"
else
que="Login de $USER en $SSH_TTY"
fi

mailto=""
cc_to=""
bcc_to=""
while read direccion mode
do
if [ -z "$direccion" -o "${direccion:0:1}" = "#" ] ; then continue; fi
if [ "x$mode" = "xcc" -o "x$mode" = "xCC" ] ; then
cc_to=${cc_to:+${cc_to},}$direccion
elif [ "x$mode" = "xbcc" -o "x$mode" = "xBCC" ] ; then
bcc_to=${bcc_to:+${bcc_to},}$direccion
else
mailto=${mailto:+${mailto},}$direccion
fi
done
mailto=${mailto:-operator}
cc_to=${cc_to:+"-c $cc_to"}
bcc_to=${bcc_to:+"-b $bcc_to"}
mail ${cc_to} ${bcc_to} -s "Alerta SSH" ${mailto} >&2 <<-EOM
${que} desde ${donde} el ${cuando}
EOM

#

Este archivo debe tener permisos de lectura para todos los usuarios (# chmod 644 /etc/ssh/sshrc) puesto que se ejecuta con los privilegios del usuario que conecta. No es necesario, ni recomendado, establecer permiso de ejecución en el archivo. Las direcciones de los destinatarios de las alertas se encuentran en otro archivo para facilitar el mantenimiento.

Lo anterior sigue la sintaxis de Bash y asume que en tu sistema /bin/sh es equivalente a /bin/bash (SSH ejecuta este archivo usando /bin/sh). Si no es ése tu caso entonces me temo que no puedo ayudarte, pero se aceptan contribuciones de algún script de shell equivalente :-). Para los detalles de los trucos usados en el script puedes consultar la página del manual del Bash, especialmente la sección "Extensión de parámetros".
# Crear el archivo con la lista de destinatarios, /etc/ssh/notify.

# Lista de destinatarios para las alertas de acceso SSH
#
# Formato:
# direccion[,direccion] [cc|bcc]
#
# Se pueden indicar varias direcciones en distintas lineas o separadas por comas
# Las opciones "cc" y "bcc" marcan la direccion(es) de destino como "Cc:" or
# "Bcc:", respectivamente.
#
# Las lineas en blanco o con # en la columna 1 son ignoradas.
#
# Es importante que la ultima linea del fichero sea una linea en blanco
#
123456789@pagina-de-sms.foo
root@localhost,yomismo@oficina.com bcc

3.

También en este caso el archivo debe tener permisos de lectura para todos los usuarios (# chmod 644 /etc/ssh/notify). Sustituye las direcciones del ejemplo por las direcciones que quieras que reciban las alertas de conexión.

Cuando alguno de los destinatarios sean direcciones SMS, es posible que te interese evitar la opción CC en favor de BCC. De esta forma no se incluyen en el mensaje las direcciones del resto de destinatarios y el SMS se mantiene breve.

Eso es todo. No es necesario reiniciar el servicio SSH.
Comprobación

Conéctate a la máquina vía SSH usando tu método preferido (ssh, PuTTY, sftp, etc.). En poco tiempo, los destinatarios listados en /etc/ssh/notify deberían recibir un mensaje similar a este:

Asunto: Alerta SSH De: stolz@foo.bar Para: admin@midominio.foo Fecha: Hoy 21:42:05 Login de stolz en /dev/pts/2 desde 216.16X.XX.XX el Wed Dec 21 21:42:05 CET 2005

Hay que tener en cuenta que los mensajes SMS pueden tardar varios minutos en llegar, dependiendo de la red de tu proveedor y de la propia disposición del MTA. En caso de ser una intrusión real, sabrías a quién "perseguir" y de dónde vino.

jueves, 9 de abril de 2009

Mandar correos desde la consola de linux

A veces programamos una tarea y no tenemos tiempo de verificar que dicha tarea se cumplio sin ningun error una buena solucion para esto seria programar que el servidor nos mandara un correo con la confirmacion de que la tarea se llevo a cabo sin errores o que dio errores y que errores dio.

Primero que nada instalamos el paquete y lo configuramos

apt-get --reinstall install exim4 exim4-config mailx
dpkg-reconfigure exim4-config

Como lo que nos interesa, de momento, solo es enviar e-mails, y no queremos convertirnos en una fuente de spam, activamos lo mínimo:

- Elegimos NO para no dividir la configuración en pequeños archivos
- Elegimos enviar los correos mediante un SMARTHOST y recibir via SMTP
- Como nombre del sistema elegimos el de nuestra máquina, si queremos.
- Como no vamos a recibir correo dejamos 127.0.0.1 como receptor de SMTP
- Dejamos en blanco otros destinos como correos aceptados
- Dejamos en blanco las máquinas a las que renviamos correo
- En el nombre del smarthost ponemos smtp.gmail.com::587
- En el nombre del correo saliente ponemos en de nuestra máquina, otro que queramos o ninguno.
- NO limitamos las consultas de DNS salientes

Editamos la cuenta de Gmail que hará el relay:

vim /etc/exim4/passwd.client

Añadimos:

gmail-smtp.l.google.com:TuNombreDeCuenta@gmail.com:TuPassword
*.google.com:TuNombreDeCuenta@gmail.com:TuPassword
smtp.gmail.com:TuNombreDeCuenta@gmail.com:TuPassword

/etc/init.d/exim4 restart

Y listo!

Una buena manera de empesar seria por ejemplo esta

cat archivo | mail -s "Asunto" correo@dominio.com

Aqui le estamos diciendo que haga un cat del archivo llamado archivo y lo mande por correo, tambien se le podria decir que mande el resultado de un comando un ejemplo serai el siguiente

df -h | mail hgeorge123@gmail.com -s "Espacio en el disco"

En la linea anterior le estamos diciendo que ejecute la sentencia df -h y el resultado lo mande por correo, si quieren mandar un archivo adjunto aqui les dejo el ejemplo de como deberia de funcionar.

mutt -s "Título del mensaje" -a /ruta/documento.pdf usuario@dominio.com < /ruta/archivodetexto.txt

En este caso, el usuario que posee el correo electrónico usuario@dominio.com recibirá un correo titulado “Título del mensaje”, el texto de este correo será el contenido de archivodetexto.txt, y se incluirá un PDF, documendo.pdf como archivo adjunto.

martes, 3 de febrero de 2009

Compilar servidor web con source code en linux

Aveces nesecitamos un servidor web y tenemos dos manera de hacerlo utilizando los paquetes precompilado o compilando tu propia paqueteria en este ejemplo les voy a mostrar como instalar un servidor web con extensiones oci8 para oracle y base de datos mysql ademas de las librerias graficas gd, freetype, t1, jpeg y gif

Primero que nada hay que instalar el apache nos descargamos la ultima version del mismo en formato .tar.gz

tar zxvf httpd-2.2.11.tar.gz

cd httpd-2.2.11

./configure --prefix=/etc/apache2 --exec-prefix=/etc/apache2 --bindir=/usr/sbin --sbindir=/usr/sbin --libexecdir=/etc/apache2/libexec --sysconfdir=/etc/apache2/conf --sharedstatedir=/etc/apache2/com --localstatedir=/etc/apache2/var --libdir=/etc/apache2/lib --datarootdir=/etc/apache2/share --datadir=/etc/apache2/share --infodir=/etc/apache2/share/info --localedir=/etc/apache2/share/locale --mandir=/etc/apache2/man --docdir=/etc/apache2/share/doc/PACKAGE --enable-authn-alias --enable-authn-anon --enable-authn-dbm --enable-auth-digest --enable-ext-filter --enable-deflate --enable-log-config --enable-env --enable-mime-magic --enable-cern-meta --enable-expires --enable-headers --enable-usertrack --enable-unique-id --enable-setenvif --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http --enable-ssl --enable-dav --enable-status --enable-autoindex --enable-asis --enable-info --enable-cgi --enable-dav-fs --enable-vhost-alias--enable-negotiation --enable-dir --enable-actions --enable-speling --enable-userdir --enable-alias --enable-rewrite --enable-so --enable-mods-shared=all --enable-substitute --enable-echo

make

make install

Con esto ya tenemos nuestro apache instalado y listo para funcionar ahora procedemos a instalar las librerias necesarias para los graficos y el oci8

tar zxvf jpegsrc.v6b.tar.gz

cd jpeg-6b

./configure --prefix=/usr/local/jpeg --exec-prefix=/usr/local/jpeg --bindir=/usr/local/jpeg/bin --sbindir=/usr/local/jpeg/sbin --libexecdir=/usr/local/jpeg/libexec --datadir=/usr/local/jpeg/share --sysconfdir=/usr/local/jpeg/etc --sharedstatedir=/usr/local/jpeg/com --localstatedir=/usr/local/jpeg/var --libdir=/usr/local/jpeg/lib --enable-shared --enable-static

make

make install

Cuando esta ejecutando el make install el da uns errores pero esos errores es porque no puede crear los directorios a donde se va a instalar lo uq ehay que hacer es agarrar las direcciones de los directorios y crearlas hasta que deje de dar error

tar zxvf t1lib-5.1.2.tar.gz

cd t1lib-5.1.2

./configure --prefix=/usr/local/t1 --exec-prefix=/usr/local/t1 --bindir=/usr/local/t1/bin --sbindir=/usr/local/t1/sbin --libexecdir=/usr/local/t1/libexec --datadir=/usr/local/t1/share --sysconfdir=/usr/local/t1/etc --sharedstatedir=/usr/local/t1/com --localstatedir=/usr/local/t1/var --libdir=/usr/local/t1/lib --with-x --with-gnu-ld --with-pic

make

make install

tar zxvf freetype-2.3.8.tar.gz

cd freetype-2.3.8

./configure --prefix=/usr/local/freetype --exec-prefix=/usr/local/freetype --bindir=/usr/local/freetype/bin --sbindir=/usr/local/freetype/sbin --libexecdir=/usr/local/freetype/libexec --sysconfdir=/usr/local/freetype/etc --sharedstatedir=/usr/local/freetype/com --localstatedir=/usr/local/freetype/var --libdir=/usr/local/freetype/lib --enable-biarch-config --with-old-mac-fonts --with-fsspec --with-fsref --with-quickdraw-toolbox --with-quickdraw-carbon --with-ats --with-pic --with-gnu-ld

make

make install

unzip instantclient-basic-linux32-10.2.0.1-20050713.zip
unzip instantclient-sdk-linux32-10.2.0.1-20050713.zip

Luego creas una carpeta en la siguiente ruta mkdir -p /opt/oracle/instantclient que es donde el oci8 va a leer las liberias después de esto el procedimiento es el siguiente:

mv instantclient_10_2/* /opt/oracle/instantclient/
cd /opt/oracle/instantclient/
ln -s libclntsh.so.10.1 libclntsh.so
ln -s libocci.so.10.1 libocci.so

echo /opt/oracle/instantclient >> /etc/ld.so.conf
ldconfig

tar zxvf oci8-1.3.4.tgz

cd oci8-1.3.4

phpize

./configure --with-oci8=shared,instantclient,/opt/oracle/instantclient

make

make install

Con esto ya tenemos todas las librerias graficas necesarias las gd no las vamos a compilar porque ella vienen nativas en casi todas las distribuciones entonces procedemos a compilar el php

tar zxvf php-5.2.8.tar.gz

cd php-5.2.8

./configure --with-apxs2=/usr/sbin/apxs --enable-mod-charset --enable-fastcgi --enable-debug --enable-sigchild --enable-magic-quotes --with-oci8=instantclient,/opt/oracle/instantclient --with-zlib-dir --with-jpeg-dir=/usr/local/jpeg --enable-ftp --with-gd --enable-gd-native-ttf --enable-sysvshm --enable-sysvsem --with-mysql --with-freetype-dir=/usr/local/freetype --with-zlib --with-mm --with-curl --enable-debug --enable-safe-mode --enable-sigchild --enable-libgcc --disable-ipv6 --enable-dba --enable-calendar --enable-dbase --enable-exif --enable-gd-jis-conv --enable-mbstring --enable-shmop --enable-soap --enable-sqlite-utf8 --enable-zip --enable-magic-quotes --enable-wddx --with-iconv --with-gettext --enable-bcmath --with-bz2 --with-t1lib=/usr/local/t1/ --with-mime-magic --with-openssl --with-pdo-mysql --with-mysqli --enable-sysvmsg

make

make install

Con esto ya tenemos nuestro servidor web casi listo solo nos falta cagarles las extensiones de php al apache y lo hacemos de la siguiente manera

vi /etc/apache2/conf/httpd.conf

Agregamos al final del archivos las siguientes lineas

AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps

Ya con esto esta listo nuestro servidor si queremos revisar si cargo todos los modulos creamos un info.php de la siguiente manera

vi /etc/apache2/share/htdocs/info.php

dentro de este archivo agregamos estas lineas

phpinfo();
?>

abrimos un navegador y escribes eta direccion http://tuip/info.php

domingo, 1 de febrero de 2009

Cambiar ruta de base de datos de mysql

A veces se llena el filesystem donde tenenmos alojada la base de datos aqui les pongo una manera de como cambiar la ruta de la base de datos con sus respectivos permisos y usuarios

mysql_install_db --datadir=/ruta/donde/quieras
chown -R mysql.mysql /ruta/donde/quieras
mysqld_safe --datadir=/ruta/donde/quieras --user=root &

Con esto ya tendremos nuestra base de datos en otro filesystem y funcionando correctamente.

viernes, 30 de enero de 2009

Configurar fecha y hora normal del equipo y fecha UTC en Linux

Cuando se instalar un servidor web y una base de datos algunos programadores juegan con el formatipo o tipo de fechas para guardar y hacer busquedas en la base de datos la manera para solucionar esto es la siguiente primero verificamos la fecha y la hora actual del sistema de la siguiente manera

date

Esto nos arrojar la hora y fecha actual del sistema en que caso de que este mala la cambiamos de la siguiente manera

date --set "2009-01-30 22:35"

El orden en el cual esta es año-mes- dia hora:minutos

Despues de esto verificamos la fecha y hora UTC de la siguiente manera

date -u

Esto nos va fecha y hora del sistema operativo pero en realidad nos interesa es la fecha nada mas en caso de estar mala la modificamos de la siguiente manera

date --utc 01302236

El orden de esto es MMDDhhmm que es igual a mes dia hora y minuto.

miércoles, 28 de enero de 2009

Borrar la clave de root de base de datos mysql

Para borrar la clave del root del mysql

killall mysqld
mysqld_safe --skip-grant-tables &
mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('nueva_contraseña') \
WHERE User='root'; FLUSH PRIVILEGES; \q
killall mysqld

Con esto ya esta listo solo vasta con arrancar el servico nuevamente y ya.

martes, 13 de enero de 2009

Hacer ssh sin clave

Cuando tenemos varios servidores y tenemos que pasarnos de uno a otro a cada rato resulta molesto tener que estar metiendo la clave a cada rato o simplemente para programar un rsync para esto podemos poner que para pasarnos de unservidor a otro no nos pida clave pero esto es bueno hacerlo en un solo centido no poner que que se pase de un servidor a otro y despues de eso servidor tambien pueda retornar por ssh sin clave.

Una manera de hacerlo seria la siguiente

ssh-keygen -t rsa

En este punto nos hara una serie de preguntas el cual le damos a todas enter sin escribir nada, luego de haber terminada con este paso copiamos la clave publica al otro o otros servidores a los cuales queremos acer ssh sin tener que estar escribinedo la clave de la siguiente manera

ssh-copy-id -i /root/.ssh/id_rsa.pub root@xxx.xxx.xxx.xxx

Hay nos va a pedir una clave esa clave es la del servidor a donde estamons intentando copiar el archivo con esto ya deberiamos de poder hacer ssh sin que nos pida clave.

viernes, 9 de enero de 2009

Saber que modulos estan cargados en el apache de nuestro servidor web

Para saber que modulos estan cargados en tu servidor web solo vasta con crear un archivo en el home del apache info.php el cual va a conetener algo como esto

// Muestra toda la información, por omisión INFO_ALL
phpinfo();

?>

Luego te metes en un explorador y escribes http://tuip/info.php y listo.