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.