sábado, 22 de noviembre de 2008

Administracion básica MySql

Cada vez mas tengo la necesidad de documentar todo lo que me ocurre en la administración de MySql, para consultas posteriores.
Así que he ido recopilando de aquí y alla, todo lo que voy necesitando, y lo he agrupado en un documento vital para mi.
El documento está en continua evolución ya que se añaden puntos nuevos segun me surgen, pero no voy a ir actualizando el articulo cada vez ;)
Bueno como punto de inicio creo que puede ser util.

Las fuentes principales, estan al final del documento.



Estructura y Funcionamiento del servidor MySQL


-Desde el punto de vista del cliente:

El cliente se conecta al servidor, iniciando la autenticación, codifican, comprimen, cifran y envían las peticiones.
El servidor resuelve la petición y envía la respuesta que es cacheada por el cliente.

-Desde el punto de vista del servidor:

Existen dos capas en el servidor, con tareas independientes. Capa de Manipulación y Motores de almacenamiento.

Capa de manipulación:

Se encarga de desencriptar, validar la sintaxis y buscar en la cache, las peticiones de los clientes, así como de escribir logs y
actualizar la cache. Si no encuentra un resultado valido, envía esta petición al motor de almacenamiento correspondiente.

Motores de Almacenamiento (MyISAM, InnoDB….):

Obtiene los resultados de Memoria o Disco.


Como almacena la información MySQL

Almacenamiento en Disco

Los tipos de información que guarda MySQL en disco son:
1.-Bases de Datos
*.frm (Formato de tabla)-> Para todos los motores de almacenamiento
*.MYD (Fichero de datos) -> Para algunos motores de almacenamiento.
*.MYI (Ficheros de índices) -> Para algunos motores de almacenamiento.
2.-Programas de cliente y servidor así como sus librerías.
3.-Logs
4.-Tablespaces para InnoDB, si los hay
5.-Tablas temporales que hayan sobrepasado el tamaño máximo permitido en memoria


Almacenamiento en Memoria

Los tipos de información que guarda MySQL en memoria son:
1.-Copia de la tabla de permisos
2.-Caches de hosts, tablas y consultas
3.- Tablas temporales que NO hayan sobrepasado el tamaño máximo permitido en memoria
4.-Gestor de conexiones (Cada conexión establecida)


Limitaciones del sistema operativo.

Las limitaciones más significativas del sistema vienen dadas por:

1.-Numero máx. de ficheros abiertos.

Limite de Mysql:
su -m mysql
ulimit –a

Limite de SO:
[root@nodo]# sysctl -a|grep file
fs.file-max=206210

2.-Numero máx.. de hilos por proceso.
3.-Backlog del sistema, el cual indica el número máx. de clientes que pueden estar esperando una conexión.
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
4.-Sistema de ficheros, el cual limita el tamaño máx. de los mismos.


Tipo de motores de almacenamiento.

Breve descripción de las características de algunos motores de almacenamiento.

MyISAM
-No transaccional
-Bloqueo a nivel de tablas
-Los datos son almacenos en disco. Un fichero para la definición de tabla, uno para los índices y otro para los datos. (Esquema)
-Muy rápido en lectura y escritura, si no hay escrituras simultaneas.
-Para la recuperación de errores, necesita lanzar un proceso y recorrer las tablas.
-Consume poco espacio en disco y en memoria.
-Buena elección si necesitas velocidad y existen pocas modificaciones simultaneas.

InnoDB
-Transaccional
-Bloqueo a nivel de filas
-Restricciones de claves foráneas
-Los datos son almacenados en disco. Un fichero para la definición de las tablas y un tablaspace para datos e índices.
-Capaz de recuperarse de errores con los ficheros de log
-Consume mucho espacio en disco y en memoria.
-buena elección si necesitas transacciones, claves foráneas o si hay muchas modificaciones simultaneas.



Administración de usuarios.

Los usuarios en MySQL, quedan identificados por la tupla [usuario/host], por lo que el usuario X y el usuario X@localhost
pueden tener permisos diferentes, ya que para el servidor son usuarios distintos.
El carácter comodín es el “%”
Ejemplos:
celtha@’localhost’
celtha@’192.168.1.156’
celtha@’%’
%@’127.0.0.1’
celtha@’192.168.1.%’


Los usuarios son almacenados en la BBDD “mysql” en la tabla “user”


Listar usuarios

mysql> SELECT User,Host,Password FROM mysql.user;

Crear usuarios

mysql> create user anonimo@localhost;
o
mysql> create user anonimo@localhost IDENTIFIED BY 'password';

Eliminar usuarios

mysql> drop user anonimo@localhost

Renombrar usuarios

mysql> rename user anonimo@localhost to anonimo;

Cambiar y/o poner password de usuario

mysql> set password for anonimo@'%' = PASSWORD('1234');

Privilegios de usuarios

Cada usuario tiene unos privilegios específicos sobre una o varias BBDD.
Los privilegios son almacenados en la BBDD “mysql”, en las tablas ('user', 'db', 'tables-priv', 'columns_priv' y 'host')

Ver privilegios de un usuario

mysql> show grants for root;

Asignar privilegios

Nota: Si el usuario objetivo no existe será creado en la misma operación.
Sintaxis:
grant privilegios ON base_datos.tabla(columnas) TO usuario

Tipos de privilegios:
ALL, ALTER, CREATE, CREATE USER, CREATE VIEW, DELETE, DROP, EXECUTE, INDEX, INSERT, LOCK TABLES, RELOAD,
SELECT, SUPER, UPDATE, GRANT OPTION, ...


mysql> grant all on *.* to operador@'%' identified by '1234';

Eliminar privilegios

mysql> REVOKE ALL ON *.* FROM operador@'%';

Recuperar password

Podemos iniciar el servidor haciendo que este no tenga en cuenta los privilegios de los usuarios.

mysqld --skip-grant-tables --skip-networking

Lanzamos el cliente, haciendo que ejecute un update del usuario root.

mysql -e "UPDATE mysql.user SET Password = PASSWORD('nuevo') WHERE User = 'root'"



Conexiones al servidor

Listar conexiones

mysql> show full processlist;
o
mysql> show processlist;


Matar conexiones

Kill ID

mysql> kill 5;


Ejemplos de Consultas.

SELECT

SELECT City.Name, Country.Name FROM City, Country
WHERE City.CountryCode=Country.Code ORDER BY Country.Name;

DELETE

DELETE FROM City WHERE CountryCode='ESP' AND Population>500000;

INSERT

INSERT INTO City (Name, CountryCode, District, Population)
VALUES ('JoanBrossa','ESP', 'Katalonia', 3500000);
INSERT INTO City SET Name='JoanBrossa', CountryCode='ESP',
District='Katalonia', Population=3500000;


UPDATE

UPDATE City SET Population=5000000 WHERE Name='JoanBrossa';
UPDATE City SET Population=5000000 WHERE Population>1000000;


NOTAS

FROM:
Especifica la tabla de la cual se seleccionan los registros

WHERE:
Detalla las condiciones que han de reunir los registros resultantes

GROUP BY:
Separa los registros seleccionados en grupos específicos

HAVING:
Expresa la condición que debe cumplir cada grupo

ORDER BY:
Ordena los registros seleccionados de acuerdo a una ordenación específica

LIMIT:
Restringe el número de resultados devueltos.



Administración de Tablas

Crear una BBDD:
CREATE DATABASE nombre_BBDD;

Borrar toda una BBDD:
DROP DATABASE nombre_BBDD;

Ver las BBDD del sistema:
SHOW DATABASES;

Seleccionar una BBDD para ser usada:
USE nombre_BBDD;

Crear una tabla:
CREATE TABLE nombre_tabla definición;

Borrar toda una tabla:
DROP TABLE nombre_tabla;

Cambiar la definición de una tabla:
ALTER TABLE tabla modificación;

Ver las tablas de una base de datos:
SHOW TABLES;

Ver la descripción de los campos de una tabla:
DESCRIBE nombre_tabla;

Bloquea una tabla y sólo deja leer:
LOCK TABLES nombre_tabla READ;

Bloquea una tabla y sólo deja leer y escribir a quien la bloqueo:
LOCK TABLES nombre_tabla WRITE;

Desbloquea las tablas:
UNLOCK TABLES;

Ejecuta un fichero de sentencias SQL:
SOURCE fichero_SQL;


Copias de Seguridad.

Las BBDD están almacenadas en el directorio de trabajo de MySQL, por defecto “/var/lib/mysql”, para verificarlo, desde MySQL se puede ejecutar:

mysql> show variables like 'datadir';

Existen muchos métodos para realizar esta tarea, aquí se muestran solo algunos.

COPIAS EN FRIO
1.- Paramos el servidor:
/etc/init.d/mysqld stop

2.- Copiamos o Restauramos los ficheros de BBDD que tienen nuestros datos.
MyISAM
*.frm
*.MYI
*.MYD
InnoDB
*.frm
ibdataX
ib_logfileX
3.- Arrancamos el servidor.
/etc/init.d/mysqld start


COPIAS EN CALIENTE

Utilidad “mysqldump”, estas copias son portables, a otros gestores de BBDD, ya que crean un fichero .
de texto , con las sentencias sql para crear la BBDD y hacer los “INSERTS” necesarios.

Copiar Datos.

#mysqldump --add-locks --add-drop-table -u usuario --password=password "nombre_BBDD" > /tmp/copia.sql

Restaurar Datos.

#mysql –u usuario –p BBDD < /tmp/copia.sql


COPIAS Herr. GRAFICA


Existe una herramienta grafica “MySQL Administrator”, la cual nos permite programar tareas para las copias de seguridad.

Checkeo y Reparación de Tablas.

En el proceso de reparación se suelen perder los registros defectuosos.

CHECK TABLE Nombre_tabla EXTENDED;
REPAIR TABLE Nombre_tabla;

Para este propósito se suelen usar aplicaciones externas. Uno ejemplos son los siguientes.


MYISAMCHK

Esta aplicación accede directamente a los ficheros de datos por lo que necesita que este parado el servidor de mysql.

Solo para MyISAM

/etc/init.d/mysql stop
myisamchk --check /var/lib/mysql/*/*.MYI
myisamchk --recover /var/lib/mysql/BBDD/*.MYI
myisamchk --safe-recover /var/lib/mysql/BBDD/Tabla.MYI
myisamchk --key_buffer_size=64M --sort_buffer_size=64M
--read_buffer_size=1M --write_buffer_size=1M
--silent --force --fast --update-state /var/lib/mysql/BBDD/*.MYI

/etc/init.d/mysql start


MYSQLCHECK

Esta aplicación, ejecuta sentencias sql por lo que necesita que el servidor esté en ejecución. Para tablas MyISAM, InnoDB, BDB.

mysqlcheck -u root -p --check BBDD Tabla
mysqlcheck -u root -p --repair BBDD Tabla
mysqlcheck -u root -p --force BBDD Tabla

También se puede realizar fácilmente las tareas de reparación con PhpMyAdmin (Entorno Web).


Ficheros y Directorios importantes.

/var/lib/mysql
Guarda las bases de datos del servidor. Los archivos y directorios contenidos aquí son propiedad de MySQL.

/var/log/mysql/
Anotaciones y alertas del servidor.

/etc/mysql/
Ficheros de configuración general (my.cnf). Cada vez que cambiemos la configuración deberemos reiniciar el servidor para que se activen los nuevos cambios.

/etc/init.d/mysql
Script para arrancar, parar y reiniciar el servidor

/usr/bin/ , /usr/sbin/ , /usr/share/mysql/
Programas de MySQL


Arranque y Parada del servidor

Se puede iniciar la ejecución de varias maneras:

/etc/init.d/mysql start
/usr/sbin/mysql start
/usr/bin/mysqld-multi
/usr/bin/mysqld-safe

Se puede parar la ejecución de varias maneras:

/etc/init.d/mysql stop
/usr/sbin/mysql stop
mysqladmin -u root -p shutdown

NOTA: El puerto por defecto del servidor MySQL es el TCP/UDP 3306.

Si quiero acceder remotamente al servidor debo modificar
/etc/mysql/my.cnf

Comentar la línea "bind-address" o comentar la línea "skip-networking"

Si quiero los mensajes en otro idioma debo modificar /etc/mysql/my.cnf y cambiar
[mysqld]
language =

Por ejemplo

"laguage = spanish"


Cache de Querys

Esta explicado en un articulo anterior.


Logs de consultas pesadas.

Una buena practica ante situaciones donde el rendimiento de MySQL no es el que se espera, es comprobar si existen consultas demasiado pesadas.Estas pueden ser logeadas, para su posterior análisis.


Cuantas Slow Querys

[celtha@legolas ~]$ mysqladmin version -u root -p
Enter password:
mysqladmin Ver 8.41 Distrib 5.0.45, for redhat-linux-gnu on i686
Copyright (C) 2000-2006 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version 5.0.45
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/lib/mysql/mysql.sock
Uptime: 1 hour 24 min 11 sec

Threads: 1 Questions: 5 Slow queries: 0 Opens: 12 Flush tables: 1 Open tables: 6 Queries per second avg: 0.001
[celtha@legolas ~]$

Este valor se puede configurar en “my.conf”

Se crea el fichero y se le dan los permisos pertinentes.

[mysqld]
log-slow-queries=/var/log/mysql/log-slow-queries.log



Para profundizar.

Referencia oficial.
http://dev.mysql.com/doc/refman/5.0

Excelente documento en castellano.
http://www.xtec.net/~acastan/textos/Administracion%20de%20MySQL.html

lunes, 13 de octubre de 2008

Nagios - Instalacióm rápida - Parte 1

Bueno, pues tal como dice el título del articulo, estoy rompiendo mano con Nagios por primera vez, y buscando información encontré informacion en castellano bastante completa ;)

En esta web existe un manual de instalación rápida de Nagios para distintas distribuciones, asi que siguiendo las indicaciones, lo instalé en Centos, que aunque no está si hay un manual para Fedora :)

Como he tenido que instalarlo en distintas máquinas de pruebas, me ha resultado interesante hacer un script con las ordenes necesarias para la instalación, incluida la descarga de los fuentes, compilación y creación de usuarios y grupos necesarios.

Simplemente existen 4 requisitos, tener instalados los siguientes paquetes:
http
gcc
glibc-common
gd-devel

Una vez instalados, (fácil usando yum), simplemente ponemos el script en tmp con permisos de ejecucion para root y ejecutamos.

Solo necesita nuestra intervencióndos veces, para introducir passwords, la primera para el usuario nagios en la instalación y la segunda para el usuario nagiosadmin de acceso web.
Generamos dos ficheros de logs, uno para la instalación de Nagios en /tmp y el otro para la instalación de los Plugins, también en /tmp .

El script es el siguiente:

# rpm -qa|grep http
# rpm -qa|grep gcc
# rpm -qa|grep glibc-common
# rpm -qa|grep gd-devel

echo "Creando el usuario nagios"
useradd -m nagios
echo "Password para el usuario nagios : "
passwd nagios
echo "Password cambiado correctamente"
echo "Creando el Grupo nagcmd"
groupadd nagcmd

echo "Insertando usuarios nagios y apache al grupo nagcmd"
usermod -G nagcmd nagios
usermod -G nagcmd apache

echo "Creando el el directorio temporal de descarga /tmp/down_nagios"
mkdir /tmp/down_nagios

echo "Entrando en el directorio temporal de descarga /tmp/down_nagios"
cd /tmp/down_nagios/

echo "Descargando nagios y plugins"
wget http://osdn.dl.sourceforge.net/sourceforge/nagios/nagios-3.0.3.tar.gz
wget http://downloads.sourceforge.net/nagiosplug/nagios-plugins-1.4.13.tar.gz?modtime=1222335829&big_mirror=0

echo "Desempaquetando nagios"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "tar de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
tar -xvf nagios-3.0.3.tar.gz>>/tmp/log_install_nagios.`date +%d%m%y`

echo "Entrando en el directorio de los fuentes de Nagios"
cd nagios-3.0.3

echo "Haciendo ./cofigure"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "configure de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
./configure --with-command-group=nagcmd>>/tmp/log_install_nagios.`date +%d%m%y`

echo "Haciendo make all"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "make all de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
make all>>/tmp/log_install_nagios.`date +%d%m%y`

echo "Haciendo make install"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "make install de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
make install>>/tmp/log_install_nagios.`date +%d%m%y`
echo "Haciendo make install-init"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "make install-init de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
make install-init>>/tmp/log_install_nagios.`date +%d%m%y`
echo "Haciendo make install-config"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "make install-config de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
make install-config>>/tmp/log_install_nagios.`date +%d%m%y`
echo "Haciendo make install-commandmode"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "make install-commandmode de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
make install-commandmode>>/tmp/log_install_nagios.`date +%d%m%y`

#vi /usr/local/nagios/etc/objects/contacts.cfg

echo "Haciendo make install-webconf"
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
echo "make install-webconf de Nagios">>/tmp/log_install_nagios.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios.`date +%d%m%y`
make install-webconf>>/tmp/log_install_nagios.`date +%d%m%y`

echo "Estableciendo password para nagiosadmin :"
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

echo "Reiniciando Apache"
/etc/init.d/httpd restart

cd ..

echo "Desenpaquetando plugins"
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "tar de Plugins">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
tar -xvf nagios-plugins-1.4.13.tar.gz>>/tmp/log_install_nagios_plugins.`date +%d%m%y`

echo "Entrando en directorio de Plugins"
cd nagios-plugins-1.4.13

echo "Haciendo configure de Plugins"
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "configure de Plugins">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
./configure --with-nagios-user=nagios --with-nagios-group=nagios>>/tmp/log_install_nagios_plugins.`date +%d%m%y`

echo "Haciendo make de Plugins"
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "make de Plugins">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
make>>/tmp/log_install_nagios_plugins.`date +%d%m%y`

echo "Haciendo make install de Plugins"
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "make install de Plugins">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
echo "####################################################">>/tmp/log_install_nagios_plugins.`date +%d%m%y`
make install>>/tmp/log_install_nagios_plugins.`date +%d%m%y`

echo "Configurando el servicio de Nagios"
chkconfig --add nagios
chkconfig nagios on

echo "Verificando Errores de Instalacion Nagios"
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

echo "Iniciando Nagios"
/etc/init.d/nagios start

echo "instalacion Finalizada
"

jueves, 2 de octubre de 2008

HowTo - Configuración Multipath

Instalación.
El paquete necesario para la instalación del multipath es el:
device-mapper-multipath.i386

Podemos instalarlo desde el repositorio, mediante el comando:
yum install device-mapper-multipath.i386

Este paquete tiene una serie de dependencias que podemos ver con el comando siguiente:
[root@nodo2 ~]# yum deplist device-mapper-multipath.i386|grep provider|sort -u
provider: bash.i386 3.2-21.el5
provider: chkconfig.i386 1.3.30.1-2
provider: device-mapper.i386 1.02.24-1.el5
provider: device-mapper-multipath.i386 0.4.7-17.el5
provider: glibc.i386 2.5-24
provider: glibc.i686 2.5-24
provider: kpartx.i386 0.4.7-17.el5
provider: libsysfs.i386 2.0.0-6
provider: ncurses.i386 5.5-24.20060715
provider: readline.i386 5.1-1.1


Con esto tenemos el multipath instalado, y listos para empezar.


Configuración inicial.

Para una configuración inicial hay que revisar esencialmente 3 partes del fichero de configuración.

1.- En primer lugar existe una parte que por defecto hace que se ignoren todos los dispositivos, habrá que comentarla
para que multipath pueda detectar los dispositivos existentes.

blacklist {
devnode "*"
}


por

#blacklist {
# devnode "*"
#}


2.- La siguiente sección, permite que multipath detecte por defecto todos los dispositivos, por lo que debe estar
sin comentar.

defaults {
udev_dir /dev
polling_interval 10
selector "round-robin 0"
path_grouping_policy multibus
getuid_callout "/sbin/scsi_id -g -u -s /block/%n"
prio_callout /bin/true
path_checker readsector0
rr_min_io 100
max_fds 8192
rr_weight priorities
failback immediate
no_path_retry fail
user_friendly_names no


NOTA:
path_grouping_policy multibus
Esto hace que también sean escaneados los dispositivos IDE y Floppy, si queremos ignorar dichos dispositivos,
esta entrada debería quedar como sigue:
path_grouping_policy failover

3.- En esta sección se definen los dispositivos que queremos que multipath ignore. Esto se detalla en otra sección.
Dejaremos esta parte según las necesidades de cada caso.
Por defecto:

#blacklist {
# wwid 26353900f02796769
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
# devnode "^hd[a-z]"
#}


Por último solo nos queda hacer que los datos tengan efecto.

modprobe dm-multipath
modprobe dm-round-robin
/etc/init.d/multipathd restart
multipath -v2


Ahora configuramos multipath para que arranque en el inicio.

chkconfig --level 35 multipathd on

Por último vaciamos la cache de multipath , reiniciamos el servicio y reescaneamos los dispositivos.

multipath -F
/etc/init.d/multipathd restart
multipath -v2


Ahora podemos ejecutar el comando:

multipath -ll

y obtendremos una salida de este tipo:

mpath1 (360060480000287971039523544343331)
[size=49 GB][features="0"][hwhandler="0"]
_ round-robin 0 [enabled]
_ 0:0:0:11 sdg 8:96 [active][ready]
_ 1:0:0:11 sdo 8:224 [active][ready]


Donde vemos información como:

mpath1 --> El nombre de pseudo-dispositivo que podemos montar desde /dev/mapper/mpath1
(36...................331) --> wwid del dispositivo.
size --> Tamaño del disco.
round-robin 0 [enabled] --> Tipo de balanceo
_ 0:0:0:11 sdg 8:96 [active][ready] --> Información del camino y el LUN SCSI
_ 1:0:0:11 sdo 8:224 [active][ready] --> Información del camino y el LUN SCSI

Configurando Blacklist. - Ignorando dispositivos

Algunas veces necesitaremos que multipath no tenga presente algunos dispositivos.
Esto se indica dentro del fichero de configuración global de multipath
/etc/multipath.conf

En el existe una seción comentada por defecto donde indicaremos que dispositivos queremos ignorar.
#blacklist {
# wwid 26353900f02796769
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
# devnode "^hd[a-z]"
#}


Para este fin podemos expresar los dispositivos mediante expresiones regulares, wwid o ambas, como
en el siguiente ejemplo, donde xxxxxx es un wwid valido y "^sd[ab]$" indica los dispositivos
sda y sdb como sdaa y sdba.
blacklist {
wwid xxxxxxxxxxxxxxx
devnode "^sd[ab]$"
}


Para aplicar estos cambios basta con ejecutar:
multipath -F

Esto vacía la cache del multipath.

luego reiniciamos el servicio.
/etc/init.d/multipathd restart

Podemos ver los resultados ejecutando y reescanear los discos, mediante.
multipath -v2
o
multipath -ll
Observaremos que los dispositivos ignorados no aparecen.


Visualización de dispositivos.

Los dispositivos detectados por multipath, son creados bajo
/dev/mapper/XXXXXXXXXXXXXXXXXXXXXXXXXXX
/dev/mapper/XXXXXXXXXXXXXXXXXXXXXXXXXXX
..............


Si por el contrario preferimos ver los dispositivos de un modo un poco más amigable (Yo no lo prefiero ;))
podemos activar en el fichero de configuración la opción:

user_friendly_names yes

De este modo los dispositivos serán creados de la siguiente manera.
/dev/mapper/mpath0
/dev/mapper/mpath1
.....


La relación entre el nombre que les da a los dispositivos y su wwid, está en:
grep mpath /var/lib/multipath/bindings
mpath0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
mpath1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



Prevenir Errores.

En caso de que se produzca un fallo general en la comunicación y todos los caminos cayeran, podemos
configurar multipath para que use una "cola" de I/O, para que las aplicaciones no detecten la ciada de servicio. Esta cola se actualizará cuando alguna de las rutas este disponible.
Para configurar el uso de de esta cola, editamos el fichero de configuración general y actualizamos
el valor "features", en la sección del dispositivo.

devices {
device {
vendor "COMPAQ "
features "1 queue_if_no_path"
...............

sábado, 27 de septiembre de 2008

Introducción iptables - Ejemplos

Intraduccion.

Iptables, es una herramienta que usa Netfilter que es un FrameWork que está integrado en el kernel de Linux, el cual permite interceptar paquetes de red, analizarlos y tomar decisiones en funcion de unas reglas.

Al gunas opciones que componen las reglas que vamos a usar son las siguientes:

INPUT --> Especifica los paquetes de entrada en la maquina donde ejecutamos las reglas.
OUTPUT --> Especifica los paquetes desalida en la maquina donde ejecutamos las reglas.
FORWARD --> Especifica los paquetes de entrada en la maquina donde ejecutamos las reglas, pero que no tienen como destino la misma. Es decir paquetes de paso por nuestra maquina.

-t --> Especifica la tabla sobre la que trabajamos, por ejemplo (-t nat)
-i --> Especifica la interfaz sobre la que trabajamos como entrada de los paquetes, por ejemplo (-i eth0)
-o --> Especifica la interfaz sobre la que trabajamos como salida de los paquetes, por ejemplo (-o eth0)
-m --> Especifica el estado de la conexion, por ejemplo (-m ESTABLISHED)
-p --> Especifica el protocolo al que aplicamos la regla, por ejemplo (-p tcp)
-s --> Especifica la direccion ip o red de origen de los paquetes, por ejemplo (-s 192.168.1.12 / -s 192.168.1.0/24)
-d --> Especifica la direccion ip o red de destino de los paquetes, por ejemplo (-s 192.168.1.12 / -s 192.168.1.0/24)
--dport --> Especifica el puerto al que va dirigido el paquete, por ejemplo (--dport 22)
-j --> Especifica la acción que realizamos con el paquete, por ejemplo Aceptar / Rechazar(-j ACCEPT / -j DROP)

Script para proteger un servidor local.

#!/bin/bash
#
#Borramos todas las reglas existentes y los contadores, comenzamos en un estado limpio
#
iptables -F
iptables -X
iptables -Z
#
# Politicas por defecto INPUT, FORWARD y OUTPUT Todas las entradas cerradas
#
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#
#Permitimos las conexiones entrantes a la interfaz loopback
#
iptables -A INPUT -i lo -j ACCEPT
#
#Permitimos conexiones entrantes iniciadas desde nuestra maquina servidor
#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#LAN

#Permitimos las conexiones entrantes desde la LAN a eth0 para cada servicio
#
#Servicio SSH para una maquina concreta
iptables -A INPUT -p tcp -s 192.168.1.101 --dport 22 -i eth0 -j ACCEPT
#Servicio HTTP 80
para una maquina concreta
iptables -A INPUT -p tcp -s 192.168.1.101 --dport 80 -i eth0 -j ACCEPT
#Permitimos los Pings
para una maquina concreta
iptables -A INPUT -p ICMP -s 192.168.1.101 -j ACCEPT
#
#
#Servicio HTTP 8080 a toda la LAN
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 8080 -i eth0 -j ACCEPT

#Salvamos las politicas
#
/sbin/service iptables save
#
#Liastamos las reglas cargadas
#
iptables -L -v
#######################################################



Para cada caso las condiciones que nos interesara controlar serán unas, así que habrá que diseñarlo para cada caso.
El script anterior, está pensado para aislar un servidor que esta dentro de una Lan y que no ofrace servicios fuera de ella, de momento.
Por defecto rechaza las conexiones de entrada, para luego ir permitiendo solo las que necesitemos.
Lo primero que necesitamos es permitir las conexiones origen/destino Loopback, y las que hemos iniciado desde el servidor.
Tras esto, vamos especificando servicio por servicio las conexiones permitidas. Para una maquina que uso para administrar el servidor, habilito (ssh/ping/http), y para toda la LAN icluida esta maquina, el puerto 8080, para el servicio de Plone.

miércoles, 17 de septiembre de 2008

Vsftpd - Enjaulando usuarios

Vsftpd (Very Secure FTP) es un servidor de ftp "seguro". Ya que esta palabra va directamente reñida con el protocolo en si que usa el servidor, creo que esto no puede considerarse del todo cierto.
Aunque se dice que es de los servidores ftp mas seguros, si no el mas.... creo que ningún server ftp puede considerarse seguro, pero... según ocasiones, valorando las necesidades concretas, puede considerarse la opción más adecuada.

Instalación.
Nada que comentar al respecto ya que se obtiene vía yum.
#yum install vsftpd

Ficheros de configuración.

/etc/vsftpd/vsftpd.conf
Fichero de configuración general

/etc/vsftpd.user_list
Lista de usuarios que SI pueden iniciar sesión

/etc/vsftpd.ftpusers
Lista de usuarios que no pueden iniciar sesión (No se usa ya que por defecto son todos)

/etc/vsftpd.chroot_list
Lista de usuarios NO enjaulados, estos podrán navegar por la máquina, siempre que tengan los permisos necesarios.

Directivas vsftpd.conf.

Algunas de las directivas mas relevantes son las que se comentan a continuación.

anonymous_enable=NO
Deniega el acceso al usuario anónimo.

local_enable=YES
Permite el login usando los ficheros /etc/passwd y /etc/shadow

chroot_local_user=YES
Enjaula por defecto a los usuarios locales.

chroot_list_enable
Permite excluir de la jaula a los usuarios de "chroot_list_file"

chroot_list_file=/etc/vsftpd.chroot_list
Path del fichero de usuarios excluidos.

userlist_enable=YES
Verifica si el usuario esta en el fichero antes de intentar el login local.

userlist_file=/etc/vsftpd.user_list
Path del fichero de usuarios admitidos.

userlist_deny=NO
Si se pone a YES, la lista de "vsftpd.user_list" se toma como la lista de usuarios denegados.


Nota: Con estas directrices se puede securizar un poco más, de manera muy sencilla, el servicio de FTP

jueves, 11 de septiembre de 2008

Configurando Plone - CMS - Gestiona tus contenidos

Introduccion.
Bueno tras solucionar el tema de las versiones... se me planteaba otro gran problema y era poder gestionar grandes cantidades de documentación (grandes para mi ;)), ya que pasaba casi más tiempo buscando la informacion en directorios de lo que tardaria con google.
Por esto me surgio la necesidad de montar algun gestor de contenidos, que me indexara los mismos, y ahi es donde entra Plone.........

HowTo.
S.O. Centos4

1.- Descargamos y descomprimimos Plone

[root@nodo1 ~]# cd /tmp/

[root@nodo1 tmp]# wget http://launchpad.net/plone/3.1/3.1.5.1/+download/Plone-3.1.5.1-UnifiedInstaller.tgz
--10:53:06-- http://launchpad.net/plone/3.1/3.1.5.1/+download/Plone-3.1.5.1-Uni

.....

10:53:57 (720 KB/s) - `Plone-3.1.5.1-UnifiedInstaller.tgz.1' saved [36687150/366 [root@nodo1 tmp]# tar -zxvf Plone-3.1.5.1-UnifiedInstaller.tgz
.....

2.- Instalamos Plone

[root@nodo1 tmp]# cd Plone-3.1.5.1-UnifiedInstaller
[root@nodo1 Plone-3.1.5.1-UnifiedInstaller]# ./install.sh standalone


Nota: Las distintas opciones que tiene las puedes ver si ejecutas install.sh sin parametros.
Path,Nombre de la instancia, usuario efectivo para ejecutar la instancia, password de la instancia y compilacion de python que quieres usar. standalone o zeo(cluster)

Note: g++ is required for the install. Exiting now.

mmmm primera dependencia, pero... salvable.

[root@nodo1 opt]# yum install gcc-c++.i386

Instala:
gcc-c++
libstdc++-devel

Tras instalar estos paquetes repetimos la instalacion y funciona correctamente.

Al terminar la instalación, nos proporciona información bastante interesante:

##################################################################### ###################### Installation Complete ######################
Plone successfully installed at /opt/Plone-3.1
See /opt/Plone-3.1/zinstance/README.txt

for startup instructions

Use the account information below to log into the Zope Management Interface

The account has full 'Manager' privileges.


Username: admin

Password: ------------


This account is created when the object database is initialized. If you

change the password later, you'll need to use the new password.


Ask for help on plone-users list or #plone

Submit feedback and report errors at http://dev.plone.org/plone .

For install problems, specify component "Installer (Unified).



3.- Para que Plone en su version 3.x pueda indexar documentos ".doc" y ".pdf", es necesario instalar previamente, si se instalan despues, los documentos que ya se hayan subido no seran reindexados, una librerias especificas.

doc->wwware
pdf->xpdf

4.- Descargamos e "instalamos" xpdf

[root@nodo1 tmp]# wget ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.02pl2-linux.tar.gz [root@nodo1 tmp]# tar -zxvf xpdf-3.02pl2-linux.tar.gz
[root@nodo1 tmp]# cd xpdf-3.02pl2-linux

Nota esto está explicado en el fichero "INSTALL"
[root@nodo1 xpdf-3.02pl2-linux]# cp pdffonts /usr/local/bin/.
[root@nodo1 xpdf-3.02pl2-linux]# cp pdfimages /usr/local/bin/.

[root@nodo1 xpdf-3.02pl2-linux]# cp pdfinfo /usr/local/bin/.

[root@nodo1 xpdf-3.02pl2-linux]# cp pdftoppm /usr/local/bin/.
[root@nodo1 xpdf-3.02pl2-linux]# cp pdftops /usr/local/bin/.
[root@nodo1 xpdf-3.02pl2-linux]# cp pdftotext /usr/local/bin/.
[root@nodo1 xpdf-3.02pl2-linux]# cp xpdf /usr/local/bin/.

[root@nodo1 xpdf-3.02pl2-linux]# cp *.1 /usr/local/man/man1/.


5.- Descargamos e instalamos wwware

[root@nodo1 tmp]# wget http://downloads.sourceforge.net/wvware/wv-1.2.4.tar.gz?modtime=1161798556&big_mirror=0
[root@nodo1 tmp]# tar -zxvf wv-1.2.4.tar.gz
[root@nodo1 tmp]# cd wv-1.2.4


Ahora compilamos e instalamos..
[root@nodo1 wv-1.2.4]# ./configure
...........
configure: error: No package 'glib-2.0' found

Resolvemos la dependencia... y repetimos
[root@nodo1 wv-1.2.4]# yum install glib2-devel.i386
..........
[root@nodo1 wv-1.2.4]# ./configure
..........
configure: error: No package 'libgsf-1' found

Resolvemos la dependencia... y repetimos
[root@nodo1 wv-1.2.4]# yum install libgsf-devel.i386
..........
[root@nodo1 wv-1.2.4]# ./configure
..........
[root@nodo1 wv-1.2.4]# make
..........
[root@nodo1 wv-1.2.4]# make install
..........

Una vez llegados a este punto, ya tenemos instalado todo lo necesario.

La información sobre como parar y arrancar la instancia, como ajustar la configuración (puerto, etc), como acceder y demás, está en el fichero "README"

Nota: Para terminar, un par de cosas:
*He estado mirando aunque aun no lo he verificado el tema de las copias de seguridad y parece ser que el sistema almacena el contenido en un fichero de BD:
/opt/Plone-3.1/zinstance/var/filestorage/Data.fs
Bastaría copiar ese fichero para tener tus datos a buen recaudo.

*El uso de la aplicación se escapa de este HowTo, ya que hay estupendos manuales de usuario

martes, 9 de septiembre de 2008

Google - Chrome ¿El nuevo BigBrother?

La verdad es que no soy mucho de meter "artículos" de opinión ya que prefiero que cada uno obtenga las suyas propias en base a datos objetivos (Todo lo posible) y no en base a artículos de opinión que creo que siempre son SUBjetivos.

Esta vez es diferente, porque hace unos días apareció una noticia, de la cual se hizo eco prácticamente todo el mundo, que era recibida en su mayoría con "ilusión", y que a mi personalmente cuanto menos me inquietaba bastante. "El lanzamiento de la beta de Chrome".

Nota: Por lo general a mi, cuando una empresa, "engorda" y entra en demasiados aspectos, me hace como mínimo tener cierto sentimiento de "alerta".

Bueno y como conclusión, me da la sensación de que google está o ha, entrando demasiado en nuestras vidas, con "poder" suficiente para influir en nuestra forma de pensar o percivir el mundo.

Noticia al respecto

viernes, 5 de septiembre de 2008

Apache + Subversion. Una pareja interesante ;)

Desde hace ya bastante tiempo estaba pensando en montar algún tipo de sistema para control de versiones, ya que llega un punto en que se me están haciendo ingestionables.
Por otro lado también me resultaba interesante, poder acceder a estas versiones desde cualquier parte, fué por estos motivos por los que me decante por algun soft. de control de versiones, integrable con apache, y como ya había trabajado con Subversion.. la decisión era bastante clara.

Introducción.

Se va ha configurar Apache para que "arranque" Subversion como un modulo más, dentro del proceso "httpd"
Este documento está realizado en un sistema Centos 4.

[root@nodo1 ~]# uname -a
Linux nodo1 2.6.18-92.1.1.el5.028stab057.2 #1 SMP Mon Jul 21 20:55:45 MSD 2008 i686 i686 i386 GNU/Linux


Con Apache 2

[root@nodo1 ~]# httpd -v
Server version: Apache/2.2.3 Server built: Jan 15 2008 20:33:30



How-To.

1.- Lo primero que necesitamos evidentemente es tener instalado Apache2, sobre este punto no vamos a incidir ya que lo tenía instalado desde la instalación del sistema. Basta con decir que se puede realizar, compilando los fuentes, desde RPM's o yum, etc..

2.- Lo siguiente es instalar los modulos de subversion que vamos a cargar junto con Apache.
mod_dav_svn
subversion

[root@nodo1 ~]# yum install mod_dav_svn subversion

.....

=============================================================================
Package Arch Version Repository Size
============================================================================= Installing: mod_dav_svn i386 1.4.2-2.el5 base 70 k
Installing for dependencies:
subversion i386 1.4.2-2.el5 base 2.3 M Transaction Summary
=============================================================================
Install 2 Package(s)
Update 0 Package(s) Remove 0 Package(s) Total download size: 2.4 M Is this ok [y/N]: y



3.- Hay que asegurarse también que Apache esta configurado para arrancar en los niveles de ejecución que nos interesen.

[root@nodo1 ~]# chkconfig --list httpd
httpd 0:desactivado 1:desactivado 2:desactivado 3:desactivado 4 :desactivado 5:desactivado 6:desactivado


En nuestro caso el 345

[root@nodo1 ~]# chkconfig --level 345 httpd on


4.- Ahora vamos a modificar los ficheros de configuración para adaptarlos a nuestras necesidades, tanto el httpd.conf como el fichero de configuracion de subversion en conf.d, que se ha creado automaticamente, en la instalación anterior
En el fichero de conf de Apache, he optado por crear un nuevo VirtualHost para esta prueba.

<VirtualHost 192.168.150.128:80>
ServerAdmin maalgi@ono.com
DocumentRoot "/var/www/html/svn"
ServerName 192.168.150.128
ErrorLog logs/error_svn_log
CustomLog logs/access_svn_log combined
<
Directory "/var/www/html/svn">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
<
/Directory>
<
/VirtualHost>


Evidentemente esto se puede afinar tanto como se quiera, pero para realizar la prueba me valia con esto, ;)
Ahora hay que hacer unas pequeñas modificaciones en el fichero de configuracion propio de subversion.

[root@nodo1 conf.d]# vi /etc/httpd/conf.d/subversion.conf


Si estas lineas no están o están comentadas, hay que meterlas, ya que son las encardas de cargar los modulos.

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so



Hay que añadir al final del fichero lo siguiente.

<Location /repos>
DAV svn
SVNPath /var/www/html/svn/repos
AuthType Basic
AuthName "Subversion repos"
AuthUserFile /etc/svn-auth-conf
Require valid-user
</Location>


Aquí indicamos entre otras cosas el fichero de passworsd que se usuará para el login, el tipo de autenticación, y el directorio del repositorio.


5.- Ahora vamos a crear el repositorio que usaremos para esta prueba. Lo creamos dentro de la estructura de directorios que usa por defecto el Apache como DocumentRoot, para agilizar aunque claro está se podria modificar.


[root@nodo1 ~]# cd /var/www/html/
[root@nodo1 html]# mkdir svn

[root@nodo1 html]# chmod 755 svn

[root@nodo1 html]# cd svn
[root@nodo1 svn]# svnadmin create repos
[root@nodo1 svn]# chown -R apache:apache
/var/www/html/svn

6.- Vamos ha crear usuarios para poder acceder a los repositorios.

[root@nodo1 conf.d]# htpasswd -cm /etc/svn-auth-conf celtha_svn
New password:

Re-type new password:

Adding password for user celtha_svn


El resto de usuarios se añadiran igual pero sin el parametro "c"

7.- Ya estamos en condiciones de iniciar, o reiniciar el servidor http.

root@nodo1 ~]# /etc/init.d/httpd restart
Parando httpd: [FALLÃ]
Iniciando httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]


NOTA.

Tube bastantes problemas a la hora de conseguir cargar los modulos de subversion, ya que estaba intentando hacer que se gargarran en el httpd.conf con un LoadModule, en lugar de desde el subversion.conf , jejeje un pequeño error ;)

Por otro lado en el SVNPath, en lugar de poner la ruta, /var/www/html/svn/repos, ponia /var/www/http/svn/repos, y no conseguia verlo ;)


NOTA2.

El uso de la aplicación está fuera de lo que intentaba plasmar este documento, solo comentar que desde Windows una bueno aplicacion para la explotación de este sistema es tortoisesvn

Tambien se puede hacer desde consola claro:

[root@nodo1 svn]# svn import /tmp/prueba_subversion/ file:///var/www/html/svn/repos/prueba_subversion -m "Repo para pruebas"

Añadiendo /tmp/prueba_subversion/uno
Añadiendo /tmp/prueba_subversion/uno/uno1

Añadiendo /tmp/prueba_subversion/uno/uno1/hola.txt

Añadiendo /tmp/prueba_subversion/dos

Añadiendo /tmp/prueba_subversion/dos/uno1

Añadiendo /tmp/prueba_subversion/tres


Commit de la revisión 1.


El acceso web se ve de este modo :)


jueves, 4 de septiembre de 2008

Controlando el incremento de las particiones

Una de las tareas, a la hora de monitorizar un sistema, es tener controlado el espacio usado en cada partición del sistema. Hay bastantes maneras de gestionar esto:
1.- Manualmente, lo cual es bastante "aburrido".
2.- Instalndo algun soft para este menester, aunque no siempre es viable, bien por ser demasiado completo para usarlo solo por esto, o bien porque no te apetece meter nada mas en tu server.
Sea por el motivo que sea, esta tarea también se puede automatizar mediante un script, con una ejecución periódica en el cron. (Este es el tema que nos concierne)

Este dos script, controlan los incrementos o decrementos, que sufre cada partición. Yo lo tengo montado con una ejecución diaria.

1.- Tomar datos de inicio

Primero debemos tomar los valores iniciales, sobre los cuales vamos a ir calculando.

#################################################################
#
/base_calculo_incr/ (md0,md1,md2,md4)
#################################################################
#Comtiene un fichero por particion, en el que hay un valor entero del tamaño en Kb de espacio ocupado
#cat /base_calculo_incr/md0
3130302
#cat /base_calculo_incr/md1
4154624
.....


Esto lo realizamos para cada partición que queramos controlar

2.- Script de calculo de incrementos

##################
#calcular_tam #
##################
#Calcula el incremento de una particion

#!/bin/bash

#Particion a estudiar valor de origen
NOMBRE=tam_$1

#Particion a estudiar
PARTICION=$1

#Directorio donde estan los valores iniciales
#/base_calculo_incr/

#Directorio donde se generaran los mails de notificacion
#/base_calculo_incr/mail/

#Obtiene el espacio actual en Kb de la particion dada como parametro en la llamda.
ESPACIO=`df -k|grep /dev/$PARTICION|tr -s ' '|cut -d ' ' -f 3`

#Obtiene el valor en Kb de inicio, para esta particion.
ORIGEN=`cat /base_calculo_incr/$NOMBRE`
RESULTADO=$(($ESPACIO-$ORIGEN))

echo "Subject:Incremento espacio Maquina1" > /base_calculo_incr/mail/inc_$1
echo La particion $1 se ha incrementado en $RESULTADO Kb >> /base_calculo_incr/mail/inc_$1

if [ $RESULTADO -gt 100000 ];
then
su - usuario -c "/usr/lib/sendmail mail@mail.es < /base_calculo_incr/mail/inc_$1"
fi

echo "Subject:Decremento espacio ALFARA" > /base_calculo_incr/mail/dec_$1
echo La particion $1 se ha decrementado en $RESULTADO Kb revisa el valor de origen >> /base_calculo_incr/mail/dec_$1

if [ $RESULTADO -lt -100000 ];
then
su - operador -c "/usr/lib/sendmail mail@mail.es < /base_calculo_incr/mail/dec_$1"
fi



3.- Ahora necesitamos algo que nos lance este script para cada particion

#################################################################
#/base_calculo_incr/comparar_part
#################################################################

#lanza el script, pasandole la particion a comprobar, seria diferente para cada
#maquina segun sus particiones

/base_calculo_incr/calcular_tam md0

/base_calculo_incr/calcular_tam md1

/base_calculo_incr/calcular_tam md2

/base_calculo_incr/calcular_tam md4


Bien con estos dos pequeños scripts, y tomando previamente los valores origen, podemos controlar cuanto sube o baja el tamaño de una particion diariamente.
habria que adaptar los valores a cada caso, pero como solucioón rápida a mi me sirvió y como ejemplo tanbién sirve.


viernes, 29 de agosto de 2008

Conexión mediante SSH sin password - Claves Públicas y Privadas

Introducción

Cuando entré a trabajar como becario en el departamento de sistemas informáticos, con funciones de Administrador de sistemas. (jejeje parece que no.. pero de esto hace ya unos añitos).
Una de mis primeras tareas fue la de configurar el ssh de diversas máquinas, (RedHat, Suse y Solaris), para que la conexión no necesitara de intervención humana, ya que era necesario para automatizar tareas mediante el cron. (Copias, Sincronizaciones, etc)
Hoy por casualidad he visto varias webs donde se hace referencia en una especie de mini How-To de como configurar esto, y.... me ha parecido que oviaban determinados aspectos de la configuración, posiblemente porque en los sistemas donde lo han configurado no se han encontrado con este problema de permisos en algunos ficheros que intervienen en el proceso.
Por este motivo me he animado a hacer uno más, donde si aparezcan estos aspectos puntuales, que pueden hacer como me ocurrió a mi.... que se "pierda" más tiempo del necesario, para configurar algo que debería ser bastante sencillo.

How-To

Nombraremos los nodos como n_origen y n_destino, y los usuarios como u_origen y u_destino.

1.- En n_origen, iniciamos sesion con u_origen, y vamos a "/home/u_origen/.ssh" (No omitir el ".")

2.- Miramos "ls -las" si existen los ficheros "id_dsa" y "id_dsa.pub", si no existen los creamos de la siguiente manera.

3.-
[u_origen@n_origen .ssh]#ssh-keygen -t dsa

*Cuando ssh nos solicita la passphrase, dejamos esta en blanco.

*Si al generar este par de claves, se introduce la passphrase, ssh seguirá pidiendo password, solo que en este caso, hay diferencias con la otra opción, en la que pide el password:
1.-La password que solicita no es la del usuario, sino las passphrase, que sirve para cifrar nuestra clave privada, por si acaso fuera sustraída.
2.-La passphrase, no viaja en ningún momento a través de la red, solo se utiliza localmente para descifrar nuestra clave privada.

4.- Se debe copiar la clave publica de (u_origen@n_origen), en el home/XXX/.ssh de (u_destino@n_destino), con el nombre de "authorized_keys" o "authorized_keys2" según se este usando el protocolo ssh1 o ssh2 (mas seguro), esto se puede ver en la configuración de ssh, en /etc/ssh/sshd_config --> "#Protocol 2".

#scp /HOME/u_origen/.ssh/id-dsa.pub u_destino@n_destino:/HOME/u_destino/.ssh/fich

(Se copia como fich ya que en la maquina remota, es posible que ya exista un fichero id-dsa.pub) (Solicita el password del usuario)
<n_origen>#ssh usuario_remoto@maquina
(solicita el password del usuario)
#cd .ssh
<n_origen>#cat fich>>authorized_keys2
(Doble redirección, por si ya existen mas claves en este fichero)

A partir de este momento, si todo ha sido correcto ya no debería solicitarnos password, debería usar la password que esta en este fichero, cuando la conexión sea a este usuario.

NOTA.

Esta es la parte a la que me referia al comienzo del How-To, y es que los permisos afectan al funcionamiento de esto, no por temas de ejecución sino por temas de seguridad.

*El fichero authorized_keys o authorized_keys2, deben tener exactamente los permisos 644 y ser propiedad del usuario y su grupo.
4 -rw-r--r-- 1 root root 602 mar 1 2007 authorized_keys2

*Si hay más permisos en los directorios home o .ssh, como medida de seguridad se desactivaba la posibilidad de usar ssh sin password (Linux, segun versiones), por lo visto en los Solaris ocurre lo mismo
ssh-->755
home-->700

4 drwxr-xr-x 2 stats operatoria 4096 2006-01-26 08:47 . (.ssh)

4 drwx------ 3 stats operatoria 4096 2006-01-25 13:08 ..(Home del usuario)


Weno ahora creo que esta todo explicado.