Tag Archives: GNU/Linux - Page 3

Kernel 2.6.28

Una de las noticias importantes del mes pasado, que la que no le habíamos dedicado espacio en este blog aún, fue la publicación del Kernel de Linux 2.6.28 para la noche buena del 2008 (2008-12-24 23:45 UTC, que para Linus, si estaba en Helsinki, debían ser la 01:45 del 25).

GNU/Linux

GNU/Linux

Lo interesante de esta nueva versión es que incluye soporte para el sistema de archivos Ext4, que hasta el momento estaba marcado como en estado “experimental”. Según Linux Hispano, el paso entre Ext3 y Ext4 es más significativo que el experimentado entre Ext2 y Ext3. En aquel último pasaje, la característica fundamental que se incorporó fue el journaling o transacciones, capaces de restaurar la información en caso de que ocurra un error durante una de ellas. Ext4, en cambio, implica una modificación importante en la estructura de datos orientada a mejorar la performance y la estabilidad del filesystem. Además, Ext3 soportaba un tamaño máximo del sistema de archivos de 16 TB (Terabytes) con un tamaño máximo por archivo de 2 TB. Ext4 eleva esos límites a 1 EB (Exabyte) para todo el filesystem y 16 TB para los archivos. También, la cantidad de subdirectorios dentro de cada uno es ahora ilimitada (antes era de 32.000 con Ext3).

Para mayor información sobre Ext4, hay otro artículo interesante en Linux Hispano: Ext4. Y, por supuesto, su versión original en inglés en Kernelnewbies.org

Personalmente, aunque me parecen muy interesantes estas características, aún tengo ganas de probar ZFS.

Instalar mod_python para Apache 2.2

Apache Web Server

Revisando mis favoritos en busca de alguna guía interesante para publicar, encontré estos pequeños pasos para instalar mod_python para Apache 2.2. La guía original dice que es para instalar mod_python en servidores con Directadmin, pero lo cierto es que no tiene nada específico para este panel de control. La misma guía también advierte que estas instrucciones solamente sirven para Apache 2.2. La verdad es que yo lo probé únicamente para esa versión y no he intentado averiguar cómo hacerlo sobre otra versión.

cd /usr/local/src
wget http://www.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz
tar -zxvf mod_python-3.3.1.tgz
cd mod_python-3.3.1
./configure
make
make install
mod_python

mod_python

Luego hay que editar el httpd.conf, agregando la siguiente línea para cargar el módulo. Una buena práctica sería colocarlo a continuación de donde se carga el módulo de PHP.

LoadModule python_module /usr/lib/apache/mod_python.so

Para probar el funcionamiento del módulo debemos hacer lo siguiente. En primer lugar, vamos a necesitar definir un handler de python para los requests en un .htaccess. Allí escribimos algo como lo siguiente:

AddHandler mod_python .py
PythonHandler mod_python.publisher
PythonOption session DbmSession
PythonOption session_dbm /home/user/domains/test.com/session.dbm
PythonOption ApplicationPath /
PythonDebug On ## Turn this off when done with debugging

DirectoryIndex index.py

Por supuesto, habrá que ajustar los datos a lo que sea necesario.
Luego, creamos el índice de nuestro sitio, en este caso en /home/user/domains/test.com/public_html/index.py con el siguiente código:

## index.py
from mod_python import apache

def index(req):
req.content_type = 'text/plain'
req.write('Hello from mod_python\n')
return apache.OK

Luego accedemos a http://test.com/ y si vemos “Hello from mod_python”, es que hemos instalado correctamente mod_python.

Fuentes:

Estándar de jerarquía del sistema de archivos en Unix (FHS)

GNU/Linux

GNU/Linux

Para cualquiera de nosotros que empezamos a aprender computación cuando Microsoft ya dominaba el mercado y que conocimos las maravillas de Unix de grandes, la jerarquía del sistema de archivos puede resultar bastante confusa al principio. Además, los usuarios de Linux sabemos que, por lo general, cada distribución (o por lo menos cada familia de distribuciones), mete las cosas donde más le gusta.

Es interesante darle una mirada al FHS (Filesystem Hierarchy Standard), un estándar desarrollado por iniciativa de Linux, el cual otros SOs Unix suelen ignorar, pero que intenta una definición de los distintos directorios principales de un filesystem. Dejo el siguiente cuadro tomado de la versión en español del mismo artículo.

Directorio Descripción Simple
/ Jerarquía primaria, la raíz o root, y directorio raíz del sistema de jerarquía completo.
/bin/ Comandos y programas binarios esenciales necesarios para que estén disponibles para una sesión de usuario único, o para todos los usuarios (multiusuario), por ejemplo, cat, ls, cp, rm, mk, etc.).
/boot/ Archivos cargadores de arranque (por ejemplo, los núcleos, el initrd). A menudo en una partición separada.
/dev/ Contiene los Dispositivos esenciales (por ejemplo, /dev/null), incluso los que no se les ha asignado (montado) un directorio. Contiene también dispositivos que no sirven de almacenamiento (p.e. terminales de sonido y vídeo, micrófonos, impresoras, etc).
/etc/ Contiene archivos de configuración del sistema específicos del Host de todo el sistema. El nombre proviene de “etcétera”).
/etc/opt/
Archivos de configuración para los programas alojados dentro del directorio /opt.
/etc/X11/
Archivos de configuración para el X Window System, versión 11.
/etc/sgml/
Archivos de configuración para SGML.
/etc/xml/
Archivos de configuración para XML.
/home/ Contiene los directorios de los usuarios, home de los usuarios, excepto del superusuario administrador (root); contiene archivos guardados, ajustes personales, etc. Ofrece. A menudo en una partición separada.Si existe más de un usuario de un computador/ordenador o servidor, por ejemplo los usuarios usuario1 y usuario2, estos poseerían los directorios /home/usuario1 y /home/usuario2, respectivamente.
/lib/ Contiene todas las bibliotecas (mal traducidas como librerías) esenciales compartidas de los programas alojados, es decir, para los binarios en /bin/ y /sbin/. Contiene también las bibliotecas para el núcleo.
/media/ Contiene los puntos de montaje de los medio removibles de almacenamiento, tales como lectores de CD-ROM (aparecido en la versión 2.3 de FHS), Pendrives (memoria USB), e incluso sirve para montar otras particiones del mismo disco duro, por ejemplo alguna partición desde otro sistema operativo.
/mnt/ Sistema de archivos montados temporalmente. Es una directorio semejante a /media, pero es usada mayormente por los usuarios. Sirve para montar discos duros y particiones de forma temporal en el sistema.
/opt/ Contiene Paquetes de programas opcionales de aplicaciones estáticas, es decir, que pueden ser compartidas por los usuarios. Estas aplicaciones, utilizan el directorio de usuario para guardas sus configuraciones, y de esta forma, cada usuario puede tener una configuración diferente, de la misma aplicación.
/proc/ Contiene principalmente archivos de texto, sistema de archivos virtuales que documentan al núcleo y el estado de los procesos como archivos de texto (por ejemplo, uptime, network).
/root/ Directorio raíz del usuario root.
/sbin/ Sistema de binarios esencial, comandos y programas exclusivos del superusuario (root), por ejemplo, init, route, ifup).
/srv/ Lugar específico de datos, los cuales son servidos por el sistema.
/tmp/ Archivos temporales (véase también /var/tmp).
/usr/ jerarquía secundaria de los datos de usuario; contiene la mayoría de las utilidades y aplicaciones multiusuario. En otras palabras, contiene los archivos compartidos de solo lectura. Este directorio puede incluso se compartido con otras computadoras.
/usr/bin/
Comandos binarios no esenciales (no necesarios en el modo de usuario único); para todos los usuarios.
/usr/include/
Archivos de cabecera (Header files o Include files), es decir, archivos de inclusión estándar
/usr/lib/
bibliotecas compartidas de los binarios en /usr/bin/ y /usr/sbin/.
/usr/sbin/
Sistema de binarios no esencial (por ejemplo demonios para varios servicios de red.
/usr/share/
Arquitectura independiende, compartida de datos. En otras palabras, contiene los datos compartidos que no dependen de la arquitectura del sistema. Esto puede incluir imágenes, sonidos, etc., para la disponibilidad en el sistema.
/usr/src/
Códigos fuente, por ejemplo, el código fuente (es decir, programas y bibliotecas sin compilar) del núcleo con sus archivos de cabecera, (Header files o Include files).
/usr/X11R6/
Sistema X Window System, Versión 11, Release 6.
/usr/local/
Jerarquía terciaria para los datos locales, específicos a este host. Usualmente tiene subdirectorios, por ejemplo bin/, lib/, share/, de datos compartidos de sólo lectura específicos del ordenador o servidor que los comparte.
/var/ Archivos variables, tales como logs, archivos spool, bases de datos, archivos de e-mail temporales, y archivos temporales en general.
/var/cache/
Cache de las aplicaciones.
/var/crash/
Se depositan datos e información, referentes a las caídas o errores del sistema operativo.
/var/games/
Datos variables de los juegos del sistema. Este directorio no es imprescindible.
/var/lock/
Archivos Lock. Archivos que hacen el seguimiento de los recursos que se utilizan actualmente.
/var/log/
Archivos de registro, Log. Varios registros, logs.
/var/mail/
Buzón correos o mensajes de los usuarios.
/var/opt/
Posee los datos variables de /opt.
/var/run/
Información acerca del funcionamiento del sistema desde el último arranque. Por ejemplo, los usuarios actualmente registrados o logueados, que han ingresado; y los demonios que están corriendo.
/var/spool/
Bobinas o carretes (Spool), de tareas a la espera de ser procesados (por ejemplo, colas de impresión y correo no leído).
/var/spool/mail/
Ubicación de los correos de usuario desaprobados.
/var/tmp/
Archivos temporales que, a diferencia de /tmp, no se borran entre sesiones o reinicios del sistema.

Instalar bind en Linux

Siempre me parecieron un excelente recurso a publicar las guías de instalación y configuración de distintos servicios. Sobre todo porque cada uno tiene su forma particular de configurar algunas cosas, y además cada guía suele surgir con una versión en particular del software, y creo que nunca están de más. Además sirve de ayuda-memoria personal, para tenerlo a mano para distintas instalaciones.

BIND DNS

BIND DNS

Recientemente tuve que instalar bind y, como ahora tengo un blog donde hacerlo, escribo esta pequeña guía con los pasos que seguí. La idea será ir completándola luego con configuraciones más específicas, pero por lo pronto empecemos con lo básico.

¿Qué es un DNS?

Antes de instalar un servicio es muy importante saber de qué se trata y cuanto más sepamos al respecto, más vamos a entender lo que estamos haciendo y cómo hacerlo mejor. Hace algunos meses publiqué en el blog del Web & Beer un link a un artículo sobre DNS: ¿Cómo funciona el DNS? de Javier Smaldone.

Instalación de bind

Sin lugar a dudas bind es el servidor DNS más difundido, por ello esta guía se dedica a él. Particularmente yo trabajé sobre CentOS, pero como no quería instalarlo con yum (me encanta compilar mis servidores), lo hice directamente desde los fuentes. Partí de esta guía bastante clara, pero fui haciendo algunas modificaciones de acuerdo a las necesidades de la última versión de producción de bind. Adicionalmente, para darle mayor seguridad (y complicarla un poco más, porque me encanta), lo configuré para que corra en un chroot.

Antes de empezar, posiblemente sea necesario quitar versiones anteriores de bind que estén instaladas. Muchas distribuciones de Linux vienen con versiones de bind instaladas, pero si son tan obsesivos como yo, querrán quitarlas e instalar la propia. En CentOS podemos verificar esto con yum y con rpm.

# yum remove bind
# rpm -q bind
# rpm -e --nodeps bind-9.3.4-6.0.2.P1.el5_2

Para empezar, lógicamente, descargamos los fuentes de la página de descargas de ISC, descomprimimos, configuramos, compilamos e instalamos. Asumismos que, previamente, fueron instaladas las librerías necesarias que generalmente vienen en cualquier Linux. Entre ellas es importante destacar OpenSSL.

# cd /usr/src
# wget http://ftp.isc.org/isc/bind9/9.4.3/bind-9.4.3.tar.gz
# tar zxvf bind-9.4.3.tar.gz
# cd bind-9.4.3/
# ./configure --prefix=/usr \
                  --sysconfdir=/etc \
                  --enable-threads \
                  --localstatedir=/var/state \
                  --with-libtool \
                  --with-openssl=/usr/lib
# make && make install

Configurar el entorno

Si había una versión anterior de bind instalada, posiblemente todo esto ya esté hecho, pero no está de más revisarlo. Lo que haremos en este punto es crear un usuario y grupo llamados “named”, y configurar los permisos de las carpetas que vamos a utilizar. Téngase en cuenta que en este caso correremos el proceso en un chroot.

# groupadd named
# useradd -d /var/named -g named -G daemon -s /bin/false named
# mkdir -p /var/named/chroot/etc \
               /var/named/chroot/var/named \
               /var/named/chroot/var/run \
               /var/named/chroot/dev
# mknod /var/named/chroot/dev/null c 1 3
# mknod /var/named/chroot/dev/random c 1 8
# chmod 666 /var/named/chroot/dev/null
# chmod 666 /var/named/chroot/dev/random
# chown -R named:named /var/named
# cp /etc/localtime /var/chroot/etc/
# echo "nameserver 127.0.0.1" >  /etc/resolv.conf

Configurar bind

Ahora vamos a tener que definir los distintos archivos de configuración de bind. Con éstos vamos a definir el comportamiento general del servidor de DNS (en named.conf), definir las claves para utilizar rndc para controlar el demonio, y por último y fundamental, definir las zonas de nuestro DNS. Hay que tener en cuenta que este DNS que configuré yo es público, es decir que va a ser consultado por clientes de redes externas para obtener las IPs de mis dominios. La guía previamente citada, sirve para configurar un DNS de una red local que resuelve dominios externos para clientes de la LAN.

Repasemos los archivos sobre los que vamos a trabajar:

  • /var/chroot/etc/named.conf: configuración básica de bind.
  • /var/chroot/etc/rndc.conf: configuración de rndc
  • /var/chroot/etc/rndc.key: clave de rndc
  • /var/chroot/named: en este directorio guardaremos las distintas zonas de nuestro DNS.

Antes que nada, debemos generar la clave para rndc. Siguiendo el ejemplo citado usaremos como clave la palabra “hush”. Para generar el hash debemos usar el comando mmencode.

# mmencode
hush # nuestro password
aHVz # esto es lo que devuelve mmencode
^C # salimos con Ctrl+C

Esa clave es la que vamos a utilizar en nuestros archivos de configuración.
En el rndc.conf ponemos:

// this file is used by the rndc utility
        options {
        // what host should rndc attempt to control by default
            default-server localhost;
        // and what key should it use to communicate with named
            default-key "rndc-key";
        };

        server localhost {
        // always use this key with this host
            key "rndc-key";
        };

        key "rndc-key" {
        // how was the key encoded
            algorithm hmac-md5;
        // what's the password
            secret "aHVz";
        };

        // secret was generated by running mmencode on command line
        // and then entering a secret phrase

Luego, en nuestro rndc.key ponemos:

key "rndc-key" {
	algorithm	hmac-md5;
	secret		"aHVz";
};

Notesé que en ambos casos estamos utilizando el hash que generamos, pero para mayor seguridad sería conveniente generar un hash más largo.

Editado 25/12/2008 13:12: Un detalle importante es que los archivos rndc.conf y rndc.key hay que copiarlos a /etc para que cuando nuestro script del init.d llame a rndc, éste encuentre sus archivos de configuración.

# cp /var/named/chroot/etc/rndc.* /etc/

Luego el named.conf

// This is a configuration file for named (from BIND 9.0 or later).
        // It would normally be installed as /etc/named.conf.
        //
        // Changed to match secure example from LASG 5/17/00
        // Changed to match Linux Journal example 9/17/00
        // Added new "view' sections to stop fingerprinting of Bind 9.x per
        // Bugtraq 1/31/00
        // Added rndc key stuff per DNS & Bind (Rev. 4) Chapter 11
        // added use-id-pool and more comments based on above chapter

             options {
            // Directory where bind should create files if
            // not explicitly stated
            directory "/var/named";

            // whom do we allow to do zone tranfers
            allow-transfer { 192.168.1.0/24; };

            // tell Bind to check the names in zone files
            // since it no longer does this by default
            // (unimplemented 9.3.0+)
            check-names master warn;

            // sets the size of something or other to 20Mb
            datasize 20M;

            // sets the size of the journal to 5Mb
            max-journal-size 5M;

            // where should Bind put a dump of its cache
            // if told to dump it
            dump-file "named_dump.db";

            // how often should bind check for new
            // interfaces toi listen on. we turn
            // this off by setting it to 0
            interface-interval 0;

            // specify what interfaces/ips to listen on
            // as the default is all of them
            listen-on { 1.2.3.4; 2.3.4.5; 127.0.0.1; };

            // define a mximum size of cached records
            // new in Bind 9.x
            max-cache-size 20M;

            // where to right stats of memory usage
            // Bind 9.x doesn't recognize this yet
            memstatistics-file "named.memstats";

            // where to put out pid file
            // absolute path since we don't want
            // it in /var/named
            pid-file "/var/run/named.pid";

            // force Bind to use port 53 for its
            // network operation to other DNS
            // servers (Bind 9 uses high ports
            // by default). Makes firewalling easier
            // query-source address * port 53;
            // transfer-source * port 53;
            // notify-source * port 53;

            // where to dump Bind server stats
            statistics-file "named.stats";

            // force Bind to be "more" random in assiging
            // message ids
            // use-id-pool yes;

            // If the chaos view below doesn't work
            // for some reason, still give out a bogus
            // answer for Bind version requests
            version "This is not the port you're looking for.";

            // keep stats on a zone basis
            zone-statistics yes;
             };

             controls {
            // this allows rndc to be used from the localhost
            // to talk to bind on the loopback interface
            // using the key defined as 'rndc-key'
            inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
             };

             // the rest of the key configuration is in
             // /etc/rndc.conf and the key itself is in
             // /etc/rndc.key
             key "rndc-key" {
            // how was key encoded
            algorithm hmac-md5;
            // what is the pass-phrase for the key
            secret "aHVz" ;
             };

             logging {
            channel named_info {
                // log to syslog instead of a file
                syslog;
                // include the category of the event in the log
                print-category yes;
                // include the severity of the event in the log
                print-severity yes;
                // include the time of the event in the log
                print-time yes;
            };

            // Processing of client requests
            category client { named_info; };

            // named.conf parsing and processing
            category config { named_info; };

            // Messages relating to internal memory structures
            category database { named_info; };

            // This is the default for any category not specifically defined
            category default { named_info; };

            // The catch-all. Anything without a category of its own
            category general { named_info; };

            // Uncomment if you dont want to know about lame server.
            // Leave commented and it defaults to the
            // value of default above
            // category lame-servers { null; };

            // The NOTIFY protocol
            category notify { named_info; };

            // Network operations
            category network { named_info; };

            // DNS resolution like recursive lookups, etc..
            category resolver { named_info; };

            // Approval and denial of requests
            category security { named_info; };

            // Dynamic updates
            category update { named_info; };

            // Queries. Duh.
            category queries { named_info; };

            // Zone transfers received
            category xfer-in { named_info; };

            // Zone transfers sent
            category xfer-out { named_info; };
            };

	zone "." IN {
		type hint;
		file "named.ca";
	};

	zone "localhost" IN {
		type master;
		file "localhost.zone";
		allow-update { none; };
	};

	zone "0.0.127.in-addr.arpa" IN {
		type master;
		file "named.local";
		allow-update { none; };
	};

	include "/var/named/zones.list";

Estos archivos los tomé del ejemplo original pero tuve que hacer algunas modificaciones. Una importante a notar es que comenté la parte donde se forzaba el puerto del bind. Esto es un error de seguridad importante que se descubrió hace relativamente poco y a partir del cual bind (en la versión 9) empezó a utilizar puertos aleatorios mayores al 1024 para consultar otros DNS. Esto es para contrarrestar ataques de DNS Cache Poisoning.
Luego cambié la línea de listen-on, para definir que escuche en todas mis interfaces de red públicas. Yo puse IPs 1.2.3.4 y 2.3.4.5, pero allí deberían ir las IPs en las que ustedes quieran que su DNS escuche.
Por último, cambié la definición de vistas que no me hacía falta por una mera declaración de las zonas principales y agregué al final un include de un archivo /var/named/zones.list.
En ese archivo es donde definiré la lista de archivos con las zonas para cada uno de mis dominios.

Por ejemplo:

[root@tail-f]# cat var/named/zones.list
zone "domain.com.ar" { type master; file "/var/named/zones/domain.com.ar.db"; };

Y luego, en el archivo /var/named/zones/domain.com.ar.db defino la zona en sí.

[root@tail-f# cat var/named/zones/domain.com.ar.db
$TTL 14400
@       IN      SOA     ns1.domain.com.ar.      root.domain.com.ar. (
                                                2008120300
                                                14400
                                                3600
                                                1209600
                                                86400 )

domain.com.ar.        14400   IN      NS      ns1.domain.com.ar.
domain.com.ar.        14400   IN      NS      ns2.domain.com.ar.

domain.com.ar.        14400   IN      A       1.2.3.4
ftp     14400   IN      A       1.2.3.4
localhost       14400   IN      A       127.0.0.1
mail    14400   IN      A       1.2.3.4
pop     14400   IN      A       1.2.3.4
smtp    14400   IN      A       1.2.3.4
www     14400   IN      A       1.2.3.4

domain.com.ar.        14400   IN      MX      10 mail

domain.com.ar.        14400   IN      TXT     "v=spf1 a mx ip4:1.2.3.4 ?all"
domain.com.ar.        14400   IN      SPF     "v=spf1 a mx ip4:1.2.3.4 ?all"

Editado 23/12/2008 13:32: Por sugerencia de Walruz incluyo el registro SPF. Como bien dice él, a partir de la versión 9.4, bind acepta la definición de registros del Sender Policy Framework, un estandar de IETF (RFC 4408) para la verificación del remitente del email. Para mayor información, este artículo (en inglés) es bastate completo.

Configurar el init.d

Por último, queda instalar el script en el init.d para arrancar nuestro servicio y configurarlo de manera que corra en un chroot. Esto es muy sencillo, pero la versión que voy a dar es específica para Red Hat/CentOS. En otras distribuciones posiblemente cambie la forma de implementación.

Básicamente lo que vamos a necesitar es el script de init.d que levante el servicio con el siguiente comando:

named -u -t /var/named/chroot/

Para ello, en CentOs tendremos nuestro script del init.d y la definición de los parámetros en /etc/sysconfig/named. De esta forma:

[root@tail-f]# cat /etc/sysconfig/named
# This option will run named in a chroot environment.
ROOTDIR="/var/named/chroot/"
# These additional options will be passed to named at startup.
# Don't add .t here, use ROOTDIR instead.
#OPTIONS=""

Cuando nuestro script inicie el servicio, cargará las variables de /etc/sysconfig/named y verificará si definimos un directorio ROOTDIR para levantar el servicio con ese directorio como chroot.

Luego copiamos nuestro script al init.d y ejecutamos chkconfig.

# cp named /etc/init.d/
# chmod 700 /etc/init.d/named
# chkconfig --add named
# chkconfig named on

Descargas

Los archivos a descargar son varios, así que hice un tar con los archivos de ejemplo que utilicé yo, incluyendo también las zonas por default para dominios locales y el named.ca que tiene las IPs de los root DNS.

Descargar: bind.conf.tar.gz

Slackware 12.2 ya disponible

Luego de que hace unos días anunciáramos la pronta disponibilidad de la RC1 de Slackware 12.2, el día de hoy, leyendo en VivaLinux, veo que ya está disponible la versión definitiva de Slackware 12.2.

Pueden ver el anuncio oficial aquí.

Es para destacar que ahora Slackware soporta exclusivamente el kernel 2.6 y que ha hecho optimizaciones con ese fin.

Entre las novedades se incluye:

  • Kernel 2.6.27.7
  • KDE 3.5.10
  • XFCE 4.4.3
  • Firefox 3.0.4

Además, como indican en VivaLinux, Slackware 12.2 también incorpora soporte para la capa de abstracción de hardware HAL (Hardware Abstraction Layer), que hace que acceso a dispositivos removibles como pendrives USB, cámaras digitales, reproductores de MP3, CDs y DVDs, etc., pueda realizarse sin requerir montarlos manualmente antes.

Para obtener la nueva versión hay que visitar Get Slack.