PAM como mecanismo de autenticación centralizada.


PAM como mecanismo de autenticación centralizada.

Los programas que conceden accesos a usuarios en un sistema utilizan autenticación para verificar sus identidades.

Históricamente, cada programa tiene su forma particular de realizar la autenticación. Bajo FreeBSD muchos programas son configurados para usar un proceso de autenticación centralizado llamado PAM (Pluggable Authentication Modules).

PAM utiliza una arquitectura conectable y modular, que otorga al administrador del sistema de una gran flexibilidad en establecer las políticas de autenticación para el sistema.

En la mayoría de los casos, el archivo de configuración PAM predeterminado para una aplicación que soporta PAM es suficiente. Sin embargo, a veces queremos almacenar los usuarios en una base de datos para centralizar algunos servicios.

Ventajas PAM

PAM ofrece las ventajas siguientes:

  • Un esquema de autenticación común que se puede usar con una gran variedad de aplicaciones.
  • Gran flexibilidad y control de la autentificación tanto para los administradores de sistemas como para los desarrolladores de la aplicación.
  • PAM es un mecanismo flexible para la autenticación de usuarios.
  • Permite el desarrollo de programas independientes del mecanismo de autenticación
  • Ofrece al administrador la posibilidad de implementar complejas políticas de autenticación para cada servicio.
  • Ofrece un esquema de autenticación centralizado.
  • Permite a los desarrolladores de aplicaciones abstraerse de los mecanismos de autenticación.
  • Facilita el mantenimiento de las aplicaciones

Como podemos ver PAM ofrece muchas ventajas que en ocasiones los administradores ignoramos.

Archivos de configuración y servicios PAM

El directorio /etc/pam.d/ contiene los archivos de configuración de PAM para cada aplicación tipo PAM. En versiones antiguas de PAM se utilizaba /etc/pam.conf, pero este archivo ya no se utiliza y solamente es usado si el directorio /etc/pam.d/ no existe.

Cada aplicación tipo PAM o servicios tiene un archivo dentro del directorio /etc/pam.d/. Cada uno de estos archivos lleva el nombre del servicio para el cual controla el acceso. Depende del programa tipo PAM definir el nombre de su servicio e instalar su archivo de configuración en el directorio /etc/pam.d/. Por ejemplo, el programa login define su nombre de servicio como login e instala el archivo de configuración PAM /etc/pam.d/login, el programa squid necesita el archivo /etc/pam.d/squid y asi con cada uno de los servicios.

Un ejemplo para aprender

Para comprender mejor el uso de PAM, en este ejemplo veremos como podemos autenticar Squid contra una Base de Datos de MySql. Daremos por sentado que tenemos pam, mysql y squid instalados y configurados correctamente.

1. Por lo general PAM viene por defecto en todos los sistemas FreeBSD.

2. Necesitamos instalar pam_mysql. Un modulo para autenticar contra mysql

# cd /usr/ports/security/pam-mysql
# make install clean

3. También es necesario tener instalado mysql-server, en mi caso tengo la version 5.0, que nos servirá para almacenar el nombre de usuario y contraseña de cada usuario.

# cd /usr/ports/databases/mysql50-server
# make install clean

Tambien podemos instalar phpmyadmin para que nos ayude a gestionar la base de datos de usuarios:

# cd /usr/ports/databases/phpmyadmin
# make install clean

4. Vamos a suponer que tenemos una Base de datos con la siguiente estructura:

Nombre Base de Datos: bd_usuarios
Tabla de usuarios: usuarios
Campo de Usuario: n_usuarios
Campo de Password: p_usuario

Como es lógico el password debe estar encriptado. Para este ejemplo nos sirve cualquier BD siempre que tenga un campo usuario y password.

5. Nos vamos al directorio /etc/pam.d/ y creamos un fichero llamado squid, en caso de que no exista

# cd /etc/pam.d
# touch squid

Lo editamos con el editor favorito y añadimos el siguiente texto:

auth required /usr/local/lib/pam_mysql.so user=user_mysql passwd=clave_mysql host=localhost db=bd_usuarios table=usuarios usercolumn=n_usuario passwdcolumn=p_usuario crypt=1

account required /usr/local/lib/pam_mysql.so user=user_mysql passwd=clave_mysql host=localhost db=bd_usuarios table=usuarios usercolumn=n_usuario passwdcolumn=p_usuario crypt=1

session required /usr/local/lib/pam_mysql.so user=user_mysql passwd=clave_mysql host=localhost db=bd_usuarios table=usuarios usercolumn=n_usuario passwdcolumn=p_usuario crypt=1

Como podemos ver este fichero esta compuesto por 3 lineas, solo explicare una, ya que es valido para las demás.

auth: comprobación de que el usuario es realmente quien dice ser.

required: Es necesario tener éxito. Aunque falle la autenticación se sigue la pila

/usr/local/lib/pam_mysql.so: indica la ruta de la librería pam_mysql. Cambia en otros SO.
user=user_mysql: Indica un usuario valido de mysql con acceso a la Base de Datos de usuarios (bd_usuarios)

passwd=clave_mysql: La clave de acceso a mysql del usuario explicado en el paso anterior.

host=localhost: El servidor que aloja la base de datos.

db=bd_usuario: La base datos de usuarios.

table=usuarios: La tabla que almacena los campos de usuario y password

usercolumn=n_usuario: el nombre del campo que almacena los nombre de los usuarios

passwdcolumn=p_usuario: El nombre del campo que almace el password del usuario.

crypt=1 : El tipo de encriptación de la clave del usuario (0= texto plano) (1=crypt) (2=Crypt mysql) (3=md5)

6. Con esto ya tenemos ha PAM listo para actuar como un mecanismo de autenticación de squid..

7. Ahora debemos configurar squid, solamente modificaremos el siguiente parámetro de squid:

auth_param basic program /usr/local/squid/libexec/pam_auth

8. Ahora podemos reiniciar la maquina e intentar acceder a Internet, si tenemos algún problema podemos verificar en los logs y comprobar. También podemos crear una pequeña página en php para que los usuarios tengan la posibilidad de cambiar el password.

Espero que les sea util….

Anuncios

Paginación con Django


Introducción

Las tareas de paginación son unas de las mas tediosas a la hora de programar un sitio Web. Django incluye herramientas para hacer todo este trabajo de una forma fácil y rápida.

En el siguiente tutorial explicaré un método para realizar paginación de noticias en una aplicación Web.

Este ejemplo esta basado en la version de desarrollo de Django en la fecha de hoy (0.97)

Creando nuestra aplicación

Vamos a suponer que tenemos una aplicación de noticias, la cual posee un modelo para almacenar las mismas:

models.py:

from django.db import models

class Noticias(models.Model):
    Titulo = models.CharField(maxlength=100)
    Cuerpo = models.TextField()
    Fecha_pub = models.DateField('Fecha', auto_now_add=True)
    Imagen = models.ImageField(upload_to= "noticias/%Y/%m/%d", blank=True)

    class Admin:
	list_display = ('Titulo', 'Fecha_pub')

    def  __str__(self):
	return self.Titulo

Para paginar utilizaremos el siguiente módulo de Python el cual puede estar en la raíz de la aplicación y ser incluído en esta con su include correspondiente:

paginator.py

from django.core.paginator import ObjectPaginator, InvalidPage

def Paginador(request, modelo, paginas):
	result_list = Paginator(modelo, paginas)
	try:
		page = int(request.GET.get('page')); #Tomamos el valor de parametro page, usando GET
	except:
		page = 1
	if (page < result_list.page(page)):
		pagina = result_list.page(page)
		Contexto = {'modelo': pagina.object_list, #Asignamos registros de la pagina
			 'page': page, #Pagina Actual
			 'pages': result_list.num_pages, #Cantidad de Paginas
			 'has_next': pagina.has_next(), #True si hay proxima pagina
			 'has_prev': pagina.has_previous(), #true si hay Pagina anterior
			 'next_page': page+1, #Proxima pagina
			 'prev_page': page-1, #Pagina Anterior
			 }
		return Contexto

Este modulo recibe dos argumentos: 1 es un objeto request, 2 un modelo (tabla), en este caso el modelo de las noticias. Como podemos ver la variable resul_list almacenaría solo tres registros de la tabla. “Contexto“ es un diccionario con todos los que nos interesa para realizar el paginado en la plantilla HTML.

También necesitaremos otra pequeña plantilla:

pagination.html:

{% if paginator.has_prev %}
	<a href="/noticias/?page={{ paginator.prev_page }}"><</a>
{% else %}
{% endif %}
Página {{paginator.page}} de {{paginator.pages}}
{% if paginator.has_next %}
	<a href="/noticias/?page={{ paginator.next_page }}">></a>
{% else %}
{% endif %}

Esta plantilla la debemos incluir en la plantilla HTML en la cual realmente queremos realizar el paginado.
Por último la vista que queremos muestre las noticias paginadas debe quedar de la siguiente manera:

views.py:

# importamos el modulo Paginador
from proyecto.Paginador import Paginador

def index(request):
	noticias = Noticias.objects.all().order_by('-Fecha_pub')
	pag = Paginador(request, noticias)
	plantilla = loader.get_template('noticias/noticias_list.html')
	c = RequestContext(request, {'noticia_list': pag['modelo'],
				     'request': request,
				     'paginator': pag,
	return HttpResponse(plantilla.render(c))

La función index es una función común,

  • Primero ordenamos el módulo Noticias por fecha para que se muestren primero las últimas noticias.
  • pag es un objeto del tipo Paginador el cual recibe dos argumentos y devuelve un diccionario.
  • Posteriormente pasamos los datos a la plantilla noticias_list.html
  • pag[‘modelo’] es el modelo(tabla) noticias con solamente 3 registros. Los que necesitamos.
  • pag es un diccionario con todos los datos necesarios para paginar.

Hasta aquí esta pequeña guía sobre cómo paginar. Espero sea de utilidad al lector, me gustaría recibir algunas opiniones al respecto y de ser posible también sugerencias, esta guía está implementada aquí

Contador de visitantes


Introducción

En el siguiente ejemplo crearemos un contador de visitas para tener constancia de las visitas que nuestro sitio recibe. Asumiremos que el lector tiene Django instalado y configurado y que posee conocimientos mínimos sobre el mismo.

Aunque el lenguaje de plantillas de Django incorpora varias etiquetas y filtros, es posible que usted quiera escribir los suyos propios, y es fácil hacerlo.

Creando nuestro propio contador de visitas

Primero, debemos crea un paquete (directorio) “templatetags“ dentro del paquete de la aplicación apropiada. Debería estar en el mismo nivel que “models.py“, “views.py“, etc. Por ejemplo:

visitantes/
    models.py
    templatetags/
    views.py

Añadimos dos ficheros al paquete “templatetags“: un “__init__.py“ (para indicar a Python que es un módulo que contiene código de Python) y un fichero que contendrá las definiciones de sus etiquetas y filtros personalizados llamado “my_tags.py“ (puede nombrarse como usted lo desee) y añadimos lo siguiente a “my_tags.py“:

from django import template
register = template.Library()

def contador(request):
	if request.session.get('contador', False):
		contador = GetContador()
		return str(contador)
	request.session['contador'] = True
	contador = GetContador()
	contador = contador + 1
	SetContador(str(contador))
	return str(contador)
	
def GetContador():
	f_contador = open('/path/to/contador/contador', 'r') 
	contador = f_contador.read()
	return int(contador)

def SetContador(contador):
	'''Funcion que guarda la posición actual del visitante'''
	f_contador = open('/path/to/contador/contador', 'w')
	f_contador.write(contador)
	f_contador.close()

register.simple_tag(contador)

Explicación

  1. Para que sea una biblioteca de etiquetas válida, el módulo debe contener una variable llamada “register“ que sea una instancia de “template.Library“, en la que se registran todas las etiquetas y los filtros.
  2. Definimos la función contador que recibe el parámetro “request“.
  3. Comprobamos la sesión, esto es importante para que el contador no se aumente cuando recargamos la página. En este caso si la sesión existe el contador no se aumentará
  4. Obtenemos el valor del contador a través de la función “GetContador()“
  5. Retornamos el valor del Contador sin aumentar.
  6. Si la sesión no existe la creamos.
  7. Obtenemos el valor del contador a través de la función “GetContador()“
  8. Aumentamos el contador en 1.
  9. Guardamos el valor del contador aumentado en uno en el fichero a través de la función “SetContador()“
  10. Retornamos el valor del contador aumentado en 1.
  11. Definimos la función “GetContador()“
  12. Abrimos el fichero contador en modo sólo lectura.
  13. Leemos el contenido del fichero.
  14. Retornamos el valor
  15. Definimos la función “SetContador()“
  16. Abrimos el fichero contador en modo escritura para añadir el nuevo valor
  17. Escribimos el nuevo valor
  18. Por último cerramos el fichero.
  19. Para facilitar la creación de este tipo de etiquetas, Django proporciona una función de conveniencia, “simple_tag“. Esta función es un método de “django.template.Library“, que toma como argumento una función que a su vez acepta un argumento, la inserta en una función “render“, y la registra en el sistema de plantillas.

Debemos crear el fichero contador en la ubicación /path/to/contador/contador.
Ahora nos vamos a la plantilla donde queremos insertar el contador de vistas e insertamos lo siguiente al inicio de la plantilla:

{% load my_tags %}

La etiqueta {% load %} hace una búsqueda según la opción “INSTALLED_APPS“ y sólo permite la carga de bibliotecas de plantillas pertenecientes a aplicaciones instaladas. Esto es una medida de seguridad: le permite tener el código de muchas librerías de plantillas escritas en Python en un único computador sin habilitar a cada instalación de Django el acceso a todas ellas.
Posteriormente en de la misma plantilla anterior donde queremos que el contador sea visible insertamos lo siguiente:

...
...
<tr>
    <td>
    Visitante #: {% contador request %}
    </td>
</tr>
...
...

“contador“ es el nombre de la función que esta dentro de “my_tags.py“ y debe recibir un parámetro “(request)“ que debe ser pasado a la plantilla para comprobar la sesión y así el contador no será aumentado cuando se recargue la página.

Hasta aquí el contador de visita. No soy un experto en Django, quizás existan otros métodos más fáciles pero este ha sido el que he encontrado. Este contador esta implementado

No esta fiero el Beastie como lo Pintan


En muchas ocasiones, colegas administradores me preguntan. Que distro usas en el server?, y respondo, Unix FreeBSD, ha lo cual quedan asombrados, pues piensan que FreeBSD es un sistema muy difícil de administrar y mantener

FreeBSD es un sistema operativo libre para ordenadores personales basado en las CPU de arquitectura Intel, incluyendo procesadores 386, 486 (versiones SX y DX), y Pentium. También son soportados los procesadores compatibles con Intel como AMD y Cyrix. Actualmente también es posible utilizarlo hasta en once arquitecturas distintas como Alpha, AMD64, IA-64, MIPS, PowerPC y UltraSPARC.

FreeBSD está basado en la versión 4.4BSD-Lite del Computer Systems Research Group (CSRG) de la University of California, Berkeley siguiendo la tradición que ha distinguido el desarrollo de los sistemas BSD. El proyecto FreeBSD ha invertido miles de horas en ajustar el sistema para ofrecer las máximas prestaciones en situaciones de carga real.

La mascota del sistema operativo es Beastie.

Características
FreeBSD es un sistema operativo multiusuario, capaz de efectuar multitarea con apropiación y multiproceso en plataformas compatibles con múltiples procesadores; el funcionamiento de FreeBSD está inspirado, como ya se dijo, en la variante 4.4 BSD-Lite de UNIX. Aunque FreeBSD no puede ser propiamente llamado UNIX, al no haber adquirido la debida licencia de The Open Group, FreeBSD sí está hecho para ser compatible con la norma POSIX, al igual que varios otros sistemas “clones de UNIX”. El sistema FreeBSD incluye el kernel, la estructura de ficheros del sistema, bibliotecas de la API de C, y algunas utilerías básicas.

FreeBSD ofrece muy altas prestaciones en comunicaciones en red, rendimiento, seguridad y compatibilidad, todavía inexistentes en otros sistemas operativos, incluyendo los comerciales de mayor renombre.

  • Multitarea expropiativa con prioridades dinámicamente ajustadas para asegurar que distintas aplicaciones y usuarios compartan el ordenador de un modo equitativo, incluso bajo la mayor de las cargas.
  • Servicios multiusuario que permiten a mucha gente usar un sistema FreeBSD simultáneamente para distintas cosas.
  • Conexión de redes TCP/IP muy robusta, con soporte para estándares industriales como SLIP, PPP, NFS, DHCP, y NIS. Esto quiere decir que su máquina FreeBSD puede interoperar fácilmente con otros sistemas y hacer de servidor en una empresa, proporcionando importantes funciones como NFS (acceso a ficheros remotos) y servicios de correo electrónico, o poniendo a tu organización en Internet con WWW, FTP, servicios de enrutado y cortafuegos.
  • La protección de memoria garantiza que las aplicaciones (o los usuarios) no pueden interferirse. Un error fatal en una aplicación no afecta al resto.
  • FreeBSD es un sistema operativo de 32-bits (de 64-bits en Alpha, Itanium, AMD64, y UltraSPARC) y fue diseñado como tal desde el comienzo.
  • X Window System (X11R6), estándar de la industria, provee a los usuarios una interfaz gráfica (GUI) por el coste de una tarjeta VGA y un monitor comunes, y viene con los fuentes completos.
  • Compatibilidad binaria con muchos programas nativos de Linux, SCO, SVR4, BSDI y NetBSD.
  • Miles de aplicaciones listas para usarse estan disponibles en Internet. FreeBSD es compatible a nivel de código fuente con la mayoria de sistemas UNIX® comerciales por tanto la mayoría de aplicaciones requieren muy pocos o ningún cambio para compilar.
  • Miles de aplicaciones fáciles de portar se encuentran disponibles en Internet. FreeBSD tiene un código fuente compatible con el de los más populares sistemas Unix comerciales y por ello la mayoría de las aplicaciones tan sólo necesitan unos pocos cambios, si es que necesitan alguno, para compilar.
  • El diseño de la memoria virtual con paginación bajo demanda y de la “caché unificada de VM/buffer” satisface a aplicaciones que requieren grandes cantidades de memoria de forma eficiente aun dando respuestas interactivas a otros usuarios.
  • Soporte para SMP en máquinas con múltiples CPUs.
  • Una colección completa de herramientas de desarrollo en C, C++, Fortran, y Perl. Muchos más lenguajes adicionales para investigación y desarrollo avanzados se encuentran también disponibles en la colección de ports y paquetes.
  • Disponer del código fuente del sistema entero significa contar con el mayor nivel de control posible sobre su entorno.
  • Extensa documentación en línea.
  • ¡Y mucho más!

Todas esta características, hacen de FreeBSD uno de los más completos sistemas operativos Unix libres de hoy en día.

Distribución

Los instaladores, código fuente y paquetería del sistema operativo FreeBSD se distribuyen de manera gratuita[1] al público, en forma de archivos disponibles en servidores FTP y a través de la WWW. También es posible comprarlos en forma de CD-ROM o DVD de algunos distribuidores.

FreeBSD se distribuye bajo licencia BSD [2]

FreeBSD es un sistema Libre y Gratuito[1], esta disponible completamente incluyendo el código fuente.

Compatibilidad con Linux

FreeBSD es compatible con varios sistemas operativos del tipo Unix, incluyendo Linux. La razón de esto es la necesidad de ejecutar aplicaciones desarrolladas para Linux, en las que el código fuente no se distribuye públicamente y no pueden ser portadas a FreeBSD.
Algunas de las aplicaciones usadas bajo esta compatibilidad son StarOffice, la versión de Linux de Firefox, Netscape, Adobe Acrobat, RealPlayer, VMware, Oracle, WordPerfect, Skype, Doom 3, Quake 4, Unreal Tournament, SeaMonkey, y varias mas. Generalmente no se siente perdida de rendimiento, y funcionan igual de rápido que las versiones nativas. Incluso puede ser más veloz ejecutar un binario de Linux en FreeBSD, que un binario nativo (como en el caso de Firefox, no obstante es muy relativo ya que FreeBSD compila el código y Linux en la mayoría de las distros no, pero si compilara obtendría una funcionalidad similar al de FreeBSD, unos programas funcionan mejor en Linux mientras que otros en FreeBSD).

¿Quién usa FreeBSD?

Algunos de los mayores sitios Web de Internet utilizan FreeBSD.

Yahoo!
Apache
Blue Mountain Arts
Pair Networks
Sony Japón
Netcraft
Weathernews
Supervalu
TELEHOUSE America
Sophos Anti-Virus
JMA Wired

y muchos más.

CONCLUSIONES

Se puede concluir que FreeBSD es un sistema operativo con muchas ventajas para los usuarios ya que los requerimientos a nivel hardware son mínimos, pues podemos instalar en cualquier máquina con microprocesador 386 o superior y con un mínimo de 5Mb de memoria RAM. Acepta cualquier disco duro de tipo IDE o SCSI y diferentes tarjetas de red de diferentes fabricantes. Podemos hacer uso de los entornos gráficos Gnome y KDE, editar documentos, presentaciones, escuchar música y mucho mas.

1- http://www.freebsd.org/es/copyright/index.html
2- http://es.wikipedia.org/wiki/Licencia_BSD

Cómo realizar copias de seguridad con rsyncd


Una de las tareas más importantes de un administrador, y muchas veces olvidada, es la realización de copias de seguridad. Hay multitud de aplicaciones comerciales y open source que nos permiten realizarlas de una forma más o menos potente o sencilla. En este artículo vamos a explicar mediante un ejemplo práctico como obtener una réplica de la información de un servidor mediante el comando rsync. Para ello antes de nada vamos a dar una breve introducción a este comando y sus características fundamentales, las cuales nos permitirán montar el sistema de réplica en muy pocos pasos y de forma sencilla. Dejamos al interés del usuario el ir más allá y montar sistemas más potentes aprovechando todas las posibilidades existentes.

Introduction a rsync
La utilidad rsync, escrita inicialmente por Andrew Tridgell y Paul Mackerras, viene prácticamente con la totalidad de distribuciones Linux y sistemas Unix. En caso de no ser así se dispone del código fuente en rsync.samba.org. La principal utilidad de rsync es la de sincronizar estructuras de árboles de directorios a través de la red, aunque puede ser utilizado perfectamente también dentro de una máquina de forma local.
Es muy fácil de utilizar y configurar, y al contrario que la utilización de programas de script basados en FTP, ofrece una serie de funcionalidades que lo diferencian claramente. El algoritmo que utiliza envía únicamente la información que ha cambiado dentro de cada archivo, evitando enviar el archivo completo, y permite comprimirla para reducir la utilización de ancho de banda, o enviarlo a través de ssh si se requiere un nivel extra de seguridad en la transmisión.
Hay diferentes maneras de utilizar rsync en función de lo que necesitemos. Permite realizar copias locales, copias desde y hasta un servidor que corra un demonio de rsync, copias desde y hasta un servidor utilizando un shell remoto como transporte, y por último nos permite listar archivos de un servidor remoto. Todas estas características nos permiten realizar multitud de posibilidades como copias locales, copias de servidores remotos, sistemas de mirroring, mantenimiento sincronizado de sistemas de preproducción y producción, etc…

Qué es lo que queremos hacer
En el ejemplo que desarrollaremos esta basado en un servidor remoto que que corre un demonio rsync, que exporta diferentes arboles de directorios llamados modulos. y utilizaremos otra maquina que actuara como backup, donde salvaremos toda la informacion del servidor.

Los backups que se realizan de esta forma son realmente una réplica de lo que hay en el servidor, por lo que si tenemos algún problema bastará con subir los archivos o carpetas directamente.

Estas son las carpetas del servidor de las que queremos hacer copias:

/usr/local/www/ (Directorio raiz de apache)
/var/lib/mysql/ (Directorio raiz de mysql)

Esta es la carpeta donde haremos las copias de seguridad en la maquina que actua como backup.

/var/salvas/

Esta carpeta debemos de crearla con permiso 600 en la maquina backup para que solo sea accesible por el root de ese sistema.Debemos de tener en cuenta que hay espacio suficiente en la particion donde realizaremos las copias.

Configuración del servidor

Debemos instalar rsync en el servidor.

Para preparar la configuración del servidor debemos editar/crear dos archivos:

/usr/local/etc/rsyncd.conf
/usr/local/etc/rsyncd.secrets.

El primero de ellos contiene la configuración de los módulos exportados, mientras que el segundo contiene la información de los usuarios que tienen permisos para realizar conexiones. Estos son los contenidos de cada archivo:

rsyncd.conf

uid = nobody
use chroot = yes
max connections = 1
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

#Modulo MySql
[mysql]
#Directorio que vamos ha exportar
path = /var/lib/mysql/
#Un comentario
comment = Directorio de las Bases de Datos
#Enjaular para no escalar directorios
use chroot = true
#Una sola conexion permitida
max connections = 1
#Solamente leer
read only = true
#No se permite listar
list = false
#Un usuario con permiso sobre este directorio, puede ser root, pero no es recomendable
uid = mysql
#Usuario de autenticacion contra el servidor rsyncd
auth users = backup
#Donde se encuentra el fichero que contiene el password
secrets file = /usr/local/etc/rsyncd.secrets
strict modes = true
#Solo permitido desde esta ip
hosts allow = 172.16.7.1

#Modulo de WWW
[www]
path = /usr/local/www
comment = Directorio del web
use chroot = true
max connections = 1
read only = true
list = false
uid = www-data
auth users = backup
secrets file = /usr/local/etc/rsyncd.secrets
strict modes = true
hosts allow = 172.16.7.1

El archivo rsyncd.conf se puede observar que se compone de una primera parte en la que se configuran parámetros genéricos del servidor, y una segunda parte donde se muestra la configuración exacta de cada módulo exportado. En la configuración se ha puesto por defecto que se use como usuario local nobody, y que se haga bajo un entorno chroot por seguridad. Esto hace que por defecto cuando nos conectemos a un módulo lo hagamos con ese usuario, y no podamos salir de él a otras zonas del servidor. Dentro de cada módulo se indica la carpeta a la que apunta, se dice que únicamente se pueden leer archivos, mediante read only = true, pero no modificarlos ni crear nuevos. Se dice también que si se socilita un listado de módulos al servidor estos estén ocultos, que se utilice como datos de conexión un usuario de nombre backup cuyo password está en el archivo /usr/local/etc/rsyncd.secrets, y que únicamente se permitan conexiones desde la ip 172.16.7.1

Editamos el fichero /usr/local/etc/rsyncd.secrets y dentro escribimos el usuario y la clave de conexion de la siguiente forma:

backup:clave

backup: es el usuario que hemos declarado en cada modulo, donde dice:

auth users = backup

clave: puede ser cualquiera.

Estos deben ser lor permisos para ambos archivos:

-rw-r–r– 1 root root 472 Dec 31 14:01 rsyncd.conf
-rw——- 1 root root 21 Dec 31 14:00 rsyncd.secrets

Solo falta añadir el servicio para que se inicie con el sistema. Editamos el fichero /etc/rc.conf y añadirmos.

rsyncd_enable=”YES”

Ahora podemos dar un rehash para actualizar el path del sistema.

Configuración del Cliente

Nos vamos ha la maquina que actuara de respaldo de nuestros ficheros e instalamos el rsyncd de la misma forma que en el servidor.

Despues el directorio /var/salvas/ lo debemos de crear con permiso 600, tambien podemos seleccionar otra ubicacion, siempre teniendo en cuenta el espacio que necesitaremos.

Dentro de la carpeta /var/salvas/ creamos el archivo password.rsync, en el que escribimos el password con el que queremos conectarnos al servidor rsync:

clave

Esta clave debe ser identica ha la escrita en el fichero rsyncd.secrets en el servidor, de lo contrario las copias no se realizaran.

Debemos darle permisos de sólo lectura para el usuario que vaya a ejecutar la copia.

# chmod 600 password.rsync

ademas de presionar enter al final de la clave para que funcione correctamente.

Ahora ya podemos probar la conexión al servidor, para ello lo más sencillo es pedirle que nos dé un listado de lo exportable en uno de de los módulos, por ejemplo :

rsync –password-file=/var/salvas/password.rsync rsync://backup@server.dominio.cu/www

Con esta orden el servidor nos contestará con el conjunto de archivos y carpetas disponibles en el módulo www. Si quisiéramos que lo hiciera de manera recursiva, recorriendo las subcarpetas, deberíamos haberle pasado el parámetro -r. Hay que prestar atención a como acaba la información que pedimos al servidor.

Si el servicio no funciona disponemos de la opción de mirar el log del servidor /var/log/rsyncd.log para investigar las posibles causas del problema. Conviene asegurarse de que el servicio está disponible en xinetd reiniciando éste si es necesario, y que los datos de usuario son correctos.

Una vez probado que funciona el servicio podemos preparar un pequeño script que ejecute la petición al servidor para cada módulo disponible. Este script podríamos luego incorporarlo a un cron, o modificarlo lo que hiciera falta para montar copias totales semanales e incrementales diarias.

Creamos el archivo replica.sh:

#!/bin/sh
#Carpeta www
rsync –delete -arzvl –password-file=/var/salvas/password.rsync rsync://backup@server.dominio.cu/www /var/salvas/www

#Carpeta mysql
rsync –delete -arzvl –password-file=/var/salvas/password.rsync rsync://backup@server.vn.pri.jovenclub.cu/mysql /var/salvas/mysql

Dándole permisos de ejecución ya es suficiente para lanzar el script y obtener una copia de toda la información del servidor. Sucesivas ejecuciones del script producirán que se actualice la información existente en base al algoritmo de rsync, consiguiendo una replica actualizada con un consumo de ancho de banda óptimo.

La opcion –delete hace que se borren los fichero que han cambiado, dando la posibilidad de tener una replica bien actualizada.

La opcion del final, /var/salva/www hace que la salva se realice justo en esa ruta.

Para finalizar

# chmod 755 replica.sh
#./replica.sh

Ahora podemos ejecutar el scrip ./replica.sh y veremos como se crea una replica de los directorios que tenemos en el servidor en la carpeta /var/salva/, la proxima ves que se ejecute el script solo se transferiran los ficheros que cambien en el servidor. de esta forma podemos tener una replica de todos los datos que deseemos actualizada

!Bienvenidos a mi blog!


Este es mi primer articulo, en lo adelante publicare artículos relacionados con varias ramas de la informática los cuales espero compartir con todos ustedes.

Muchas Gracias por leerme