# rm-rf.es | Administración de sistemas

Blog de un SysAdmin Unix, Gnu/Linux, Windows y lo que haga falta.

Control de acceso (ACL) con Squid Web Proxy

proxyMontar un servidor Web Proxy Cache con Squid es bastante sencillo, no solo a nivel de instalación sino también de configuración. La instalación de Squid es posible a través de repositorios oficiales, tanto de CentOS, RHEL, Fedora, Scientific Linux, etc como Debian o Ubuntu. Para quien tenga dudas sobre su instalación y configuración mínima inicial, tanto a nivel de servidor como de cliente (navegadores) le recomiendo pasarse por este otro artículo que publiqué hace ya unos años: instalación básica de Proxy Squid y configuración en navegadores.

En este artículo nos vamos a centrar en algunas posibilidades que nos ofrece Squid para los controles de acceso y configuración personalizada de parámetros por grupos, entre ellas se encuentra el bloqueo de determinados sitios web y URLs, segmentación de configuraciones por rangos IP, ACLs, etc.

Por un lado, Squid ofrece determinados tipos de elementos ACL que utilizaremos para construir nuestras reglas de control de acceso, algunos de estos elementos son, por ejemplo: src, dst, srcdomain, dstdomain, proto, browser, etc. Luego, tenemos las Access Lists que se combinan con los elementos mencionados anteriormente, algunas de ellas son: http_access, url_rewrite_access, cache, log_access

Ahora veremos algunos ejemplos, si quereéis profundizar y ver todas podéis echar un ojo a la documentación de Squid. Nosotros vamos directos a una serie de ejemplos para ver como construir ACLs. Todo se realiza dentro del archivo de configuración /etc/squid/squid.conf, en la parte final de archivo se especifica la sección en la que añadir nuestra configuración personalizada:

/etc/squid/squid.conf
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

Bloquear acceso a sitios web y URLs

Una de las opciones interesantes a la hora de configurar un Proxy Web a través del cual se ofrece salida a Internet a una determinada LAN es la capacidad de bloquear el acceso a ciertos sitios web. Con las ACL de Squid podemos especificar un listado de sitios web a bloquear a partir de una lista en un fichero de texto y si es necesario especificar un mensaje de error de acceso personalizado.

Con la siguiente configuración, denegamos el acceso a toda la LAN a los sitios web especificados en el archivo /etc/squid/urls-bloqueadas.txt, si os fijais bien usamos url_regex así que podemos usar expresiones regulares al especificar URLs en el archivo de texto (*.foo.com,www.b*.com, etc)

acl urls-bloqueadas url_regex "/etc/squid/urls-bloqueadas.txt"
http_access deny urls-bloqueadas
http_access allow all

La última línea es para especificar que tras todas las restricciones, el resto está permitido. Cuando un usuario que esté conectado al proxy intente acceder a una de esas URL recibirá un error de acceso denegado:

The following error was encountered while trying to retrieve the URL: http://facebook.com/

Access Denied.

Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect.

Your cache administrator is root.

Y en el log de squid quedará registrado (realmente todo queda registrado) en el log de acceso:

/var/log/squid/access.log
1413298896.553 1 192.168.1.128 TCP_DENIED/403 3894 GET http://facebook.com/favicon.ico - NONE/- text/html
1413298896.614 1 192.168.1.128 TCP_DENIED/403 3926 GET http://facebook.com/favicon.ico - NONE/- text/html

Podemos personalizar el mensaje de error con la directiva “deny_info”, se puede especificar directamente la URL a la página de error o a un archivo local, siempre especificando a que ACL queremos que se aplique (en este caso urls-bloqueadas):

acl urls-bloqueadas url_regex "/etc/squid/urls-bloqueadas.txt"
deny_info http://miproxy.com/acceso-denegado.html urls-bloqueadas
http_access deny urls-bloqueadas
http_access allow all

Si especificamos un archivo local, debemos crear el archivo en la ruta “/usr/share/squid/errors/templates/” con el mismo nombre indicado en el fichero de configuración. En esa misma ruta tenéis todos las páginas de error por defecto:

/usr/share/squid/errors/templates/ERR_ACCESO_DENEGADO
acl urls-bloqueadas url_regex "/etc/squid/urls-bloqueadas.txt"
deny_info ERR_ACCESO_DENEGADO urls-bloqueadas
http_access deny urls-bloqueadas
http_access allow all

Por supuesto estas páginas de error pueden contener código HTML.

Bloquear acceso a sitios porno, ilegales, maliciosos y de piratería

Si bien esta parte podría entrar en la sección anterior, le he dedicado un punto aparte para que sepáis que existe el website www.squidblacklist.org que cuenta con listados gratuitos de websites por categorías para establecerlos en nuestros filtros. Entre ellos, listas de sitios web porno, sitios web maliciosos, de piratería, web proxies, sites ilegales, etc.

Podemos usar esas listas directamente en nuestro Proxy Squid descargandola e invocandola con una ACL:

acl PornSites url_regex "/usr/local/squid/etc/pornlist"
http_access deny PornSites

Permitir acceso a una URL sólo a una IP o segmento de red

Podemos necesitar que un sitio web o URL sea accesible sólamente desde determinadas IPs o segmentos de red. Lo podemos hacer con una ACL del siguiente modo:

acl vip_users src 192.168.1.0/25
acl vip_url url_regex ^http://www.miurl.com*
http_access allow vip_users vip_url
http_access deny special_url

ACLs basadas en MAC en lugar de IP

Si necesitamos establecer control de acceso en capa 2 a través de las MAC podemos hacerlo con la siguiente configuración

acl MAC1 arp A1:C2:E3:D4:c5:E6
acl MAC2 arp A1:C2:E3:D4:c2:E2
http_access allow MAC1
http_access deny MAC2

Permitir acceso por días u horas

Podemos especificar que ciertas IPs o segmentos de red tengan acceso a través del proxy únicamente en determinado momento, ya sean días u horas. Para ello creamos una ACL y con el valor “time” de ACL podemos especificar los días de la semana (MTWHF…) o el intervalo horario de acceso:

acl USUARIOS_SOLO_TARDES src 192.168.1.100 192.168.1.101 192.168.1.102
acl TARDES time MTWHF 16:00-20:00
http_access allow USUARIOS_SOLO_TARDES TARDES
http_access deny USUARIOS_SOLO_TARDES

Estos son algunos ejemplo de lo que podemos hacer con Squid en relacion a control de acceso. Son bastante útiles cuando usamos el proxy como salida para una conexión común a Internet y queremos establecer distintas políticas de acceso y seguridad por usuarios. Existen muchas más opciones y granularidad a la hora de aplicarlas, si queréis investigar más lo dejo en vuestras manos.

Cómo instalar Nginx

nginxEn esta entrada vamos a ver como instalar en Linux y *nix el servidor web Nginx, un servidor web ligero y robusto que permite alta concurrencia y además tiene función de proxy inverso para protocolos HTTP, SMTP, POP3 e IMAP.

Existen varios métodos de instalación, lo normal suele ser elegir entre la instalación a través de repositorios o descargar las fuentes del sitio web oficial de Nginx.

El punto a favor de la instalación por repositorio es su sencillez, el paquete puede o no estar en los repositorios oficiales pero siempre se puede encontrar el RPM de forma sencilla con repositorios de terceros. El punto en contra de este tipo de instalación es que la versión disponible nunca es la última estable oficial. Por otro lado, la instalación con las fuentes es un poquito más complicada pero permite una personalización mucho mayor y elegir la versión que queramos.

Instalando Nginx por repositorio

CentOS y RHEL

La instalación por repositorio no tiene ningún misterio, en el caso de CentOS, RHEL, Fedora, Scientific Linux, etc, podemos instalarlo con el repositorio EPEL (versión 1.6.1) O a través del repositorio oficial de Nginx disponible, lógicamente es preferible usar el repositorio oficial así que lo instalamos y después el paquete. Veréis que se puede descargar el repo según versión de CentOS y RHEL, en este caso para CentOS 7:

# wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm

Una vez instalado el repositorio podemos instalar Nginx:

# yum install nginx

Debian y Ubuntu

En Debian y Ubuntu también podemos usar el repositorio oficial, así que nos bajamos la PGP key y configuramos el repositorio en el sources.list:

# apt-key add nginx_signing.key

/etc/apt/sources.list de Debian

deb http://nginx.org/packages/debian/ codename nginx
deb-src http://nginx.org/packages/debian/ codename nginx

/etc/apt/sources.list de Ubuntu

deb http://nginx.org/packages/ubuntu/ codename nginx
deb-src http://nginx.org/packages/ubuntu/ codename nginx

Actualizamos los repositorios e instalamos:

# apt-get update
# apt-get install nginx

FreeBSD

En FreeBSD, Nginx puede ser instalado tanto a través de los paquetes como el sistema de puertos. Como con otros paquetes, a través del sistema de puertos tenemos una gran flexibilidad para configurar Nginx.

Instalando Nginx con el código fuente

Descarga del código fuente del sitio web de Nginx:

# cd /var/tmp
# wget http://nginx.org/download/nginx-1.7.6.tar.gz

Descomprimimos en una ruta temporal.

# tar -xzvf nginx-1.7.6.tar.gz

A partir de aquí llega el momento de la personalización a través del comando “configure“. Con este comando podemos definir las opciones de compilación y opciones de Nginx, ruta de instalación, módulos a activar, etc. Con todas estas opciones se crea un Makefile que será utilizado para compilar. Todos los parámetros de compilación disponibles se pueden visualizar del siguiente modo, os dejo una muestra:

# configure --help

  --help                             print this message

  --prefix=PATH                      set installation prefix
  --sbin-path=PATH                   set nginx binary pathname
  --conf-path=PATH                   set nginx.conf pathname
  --error-log-path=PATH              set error log pathname
  --pid-path=PATH                    set nginx.pid pathname
  --lock-path=PATH                   set nginx.lock pathname

  --user=USER                        set non-privileged user for
                                     worker processes
  --group=GROUP                      set non-privileged group for
                                     worker processes

  --build=NAME                       set build name
  --builddir=DIR                     set build directory

  --with-file-aio                    enable file AIO support
  --with-ipv6                        enable IPv6 support

  --with-http_ssl_module             enable ngx_http_ssl_module
  --with-http_spdy_module            enable ngx_http_spdy_module
  --with-http_realip_module          enable ngx_http_realip_module
  --with-http_addition_module        enable ngx_http_addition_module
  --with-http_xslt_module            enable ngx_http_xslt_module
  --with-http_image_filter_module    enable ngx_http_image_filter_module
  --with-http_geoip_module           enable ngx_http_geoip_module
[...]

Una vez elegidos los parámetros de configuración, ejecutamos el comando. Ejemplo en el que elegimos una ruta de instalación distinta y activamos el módulo de HTTP SSL y GZIP:

# ./configure \
  --prefix=/opt/nginx \
 --sbin-path=/opt/nginx/sbin \
 --conf-path=/opt/nginx/nginx.conf \
 --pid-path=/opt/nginx/run/nginx.pid \
 --with-http_ssl_module \
 --with-http_gzip_static_module

Aquí pueden surgir distintos errores provocados por fallos de dependencias, falta de compiladores instalados en el sistema, etc. Por ejemplo, por defecto se instala el módulo de reescritura http_rewrite, que tiene como dependencia PCRE:

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre= option.

Aquí tenemos dos opciones, instalar PCRE con paquete de sistema o bajar las sources. Lo más fácil, lo primero:

# yum install pcre pcre-devel

En estos casos instalo siempre el DEVEL por ser necesario por temas de compilación.

Una vez instalada la dependencia, volvemos a probar el configure, y:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl= option.

Está claro, para solucionar este otro error instalamos OpenSSL y su paquete DEVEL:

# yum install openssl openssl-devel

Y así hasta que termináramos con un configure limpio. Este sería el resultado:

# ./configure \
>   --prefix=/opt/nginx \
>  --sbin-path=/opt/nginx/sbin \
>  --conf-path=/opt/nginx/nginx.conf \
>  --pid-path=/opt/nginx/run/nginx.pid \
>  --with-http_ssl_module \
>  --with-http_gzip_static_module
checking for OS
 + Linux 3.10.0-123.el7.x86_64 x86_64
checking for C compiler ... found
 + using GNU C compiler
 + gcc version: 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) 
checking for gcc -pipe switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
checking for gcc variadic macros ... found
checking for unistd.h ... found
checking for inttypes.h ... found
checking for limits.h ... found
checking for sys/filio.h ... not found
checking for sys/param.h ... found
checking for sys/mount.h ... found
checking for sys/statvfs.h ... found
checking for crypt.h ... found
checking for Linux specific features
checking for epoll ... found
checking for EPOLLRDHUP ... found
checking for O_PATH ... found
checking for sendfile() ... found
checking for sendfile64() ... found
checking for sys/prctl.h ... found
checking for prctl(PR_SET_DUMPABLE) ... found
checking for sched_setaffinity() ... found
checking for crypt_r() ... found
checking for sys/vfs.h ... found
checking for nobody group ... found
checking for poll() ... found
checking for /dev/poll ... not found
checking for kqueue ... not found
checking for crypt() ... not found
checking for crypt() in libcrypt ... found
checking for F_READAHEAD ... not found
checking for posix_fadvise() ... found
checking for O_DIRECT ... found
checking for F_NOCACHE ... not found
checking for directio() ... not found
checking for statfs() ... found
checking for statvfs() ... found
checking for dlopen() ... not found
checking for dlopen() in libdl ... found
checking for sched_yield() ... found
checking for SO_SETFIB ... not found
checking for SO_ACCEPTFILTER ... not found
checking for TCP_DEFER_ACCEPT ... found
checking for TCP_KEEPIDLE ... found
checking for TCP_FASTOPEN ... not found
checking for TCP_INFO ... found
checking for accept4() ... found
checking for int size ... 4 bytes
checking for long size ... 8 bytes
checking for long long size ... 8 bytes
checking for void * size ... 8 bytes
checking for uint64_t ... found
checking for sig_atomic_t ... found
checking for sig_atomic_t size ... 4 bytes
checking for socklen_t ... found
checking for in_addr_t ... found
checking for in_port_t ... found
checking for rlim_t ... found
checking for uintptr_t ... uintptr_t found
checking for system byte ordering ... little endian
checking for size_t size ... 8 bytes
checking for off_t size ... 8 bytes
checking for time_t size ... 8 bytes
checking for setproctitle() ... not found
checking for pread() ... found
checking for pwrite() ... found
checking for sys_nerr ... found
checking for localtime_r() ... found
checking for posix_memalign() ... found
checking for memalign() ... found
checking for mmap(MAP_ANON|MAP_SHARED) ... found
checking for mmap("/dev/zero", MAP_SHARED) ... found
checking for System V shared memory ... found
checking for POSIX semaphores ... not found
checking for POSIX semaphores in libpthread ... found
checking for struct msghdr.msg_control ... found
checking for ioctl(FIONBIO) ... found
checking for struct tm.tm_gmtoff ... found
checking for struct dirent.d_namlen ... not found
checking for struct dirent.d_type ... found
checking for sysconf(_SC_NPROCESSORS_ONLN) ... found
checking for openat(), fstatat() ... found
checking for getaddrinfo() ... found
checking for PCRE library ... found
checking for PCRE JIT support ... found
checking for OpenSSL library ... found
checking for zlib library ... found
creating objs/Makefile

Configuration summary
  + using system PCRE library
  + using system OpenSSL library
  + md5: using OpenSSL library
  + sha1: using OpenSSL library
  + using system zlib library

  nginx path prefix: "/opt/nginx"
  nginx binary file: "/opt/nginx/sbin"
  nginx configuration prefix: "/opt/nginx"
  nginx configuration file: "/opt/nginx/nginx.conf"
  nginx pid file: "/opt/nginx/run/nginx.pid"
  nginx error log file: "/opt/nginx/logs/error.log"
  nginx http access log file: "/opt/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"


Como véis, al final de la salida estándar de la generación del MakeFile vemos un resumen con las rutas de instalación, módulos a activar, etc.

Finalmente compilamos e instalamos ejecutando un “make” y “make install”:

# make
# make install

Ya tenemos instalado Nginx. Hay que tener en cuenta que al haberlo compilado manualmente no se ha creado el script de arranque en /etc/init.d así que podemos crearlo nosotros o arrancar directamente el servicio:

# /opt/nginx/sbin/nginx
# ps -ef | grep nginx
 root 10471 1 0 13:44 ? 00:00:00 nginx: master process /opt/nginx/sbin/nginx
 nobody 10472 10471 0 13:44 ? 00:00:00 nginx: worker process

Si accedemos por el navegador a la IP del servidor web o lanzamos un cURL veremos que ya está instalado correctamente.

# curl localhost

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.

Commercial support is available at
nginx.com.

Thank you for using nginx.

Como véis, la diferencia entre instalar por paquete (yum, apt, puertos) a compilar a mano es bastante grande, todo depende de las necesidades de cada uno. Si queremos sencillez de instalación y actualización iremos con los repositorios, si necesitamos máxima personalización iremos a por la instalación por código fuente.

Configurar red en CentOS 7 | RHEL 7

En esta entrada vamos a aprender a configurar las interfaces de red en el sistema operativo GNU/Linux CentOS 7, lo mismo servirá para RHEL 7 ya que es exactamente igual.

¿Qué es lo que cambia respecto a la configuración de red de versiones anteriores de CentOS y Red Hat? Vamos a ir viéndolo.

Lo primero que os llamará la atención, aunque es algo que se sabía desde versiones anteriores es la desaparición del comando ifconfig para la estandarización completa del comando ip:

[root@localhost ~]# ifconfig
-bash: ifconfig: command not found

[root@localhost ~]# whereis ifconfig
ifconfig:

Para los que todavía no sepáis usar bien el comando IP, hace ya dos años (como pasa el tiempo) que hice un tutorial de uso comparando comandos de ip e ifconfig:

Cómo usar el comando ip en Linux (ejemplos vs ifconfig)

# ip addr list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:99:f6:7a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.130/24 brd 192.168.1.255 scope global dynamic enp0s3
       valid_lft 258471sec preferred_lft 258471sec
    inet6 fe80::a00:27ff:fe99:f67a/64 scope link 
       valid_lft forever preferred_lft forever

Nomenclatura de interfaces de red

Como podéis ver en la salida del comando ip addr list, las interfaces de red ya no se llaman eth0,eth1,ethN. Este es el otro gran cambio en esta nueva versión. Este cambio (Predictable Network Interface Names) pretende asignar identificadores estables a las interfaces de red basándose en el tipo (local Ethernet, WLAN, WWAN…) y evitar los problemas de la nomenclatura clásica. Si os interesa profundizar en el tema recomiendo leer la documentación al respecto. Básicamente tenemos:

Names incorporating Firmware/BIOS provided index numbers for on-board devices (example: eno1)
Names incorporating Firmware/BIOS provided PCI Express hotplug slot index numbers (example: ens1)
Names incorporating physical/geographical location of the connector of the hardware (example: enp2s0)
Names incorporating the interfaces’s MAC address (example: enx78e7d1ea46da)
Classic, unpredictable kernel-native ethX naming (example: eth0)

¿Qué pasa si quiero volver a la nomenclatura anterior? Aquí la respuesta:

Configurar interfaces de red como “eth” en CentOS 7 y RHEL 7

Configuración manual de interfaces de red

La configuración manual sigue siendo exactamente igual que en versiones anteriores. Los ficheros que contienen la configuración de cada interfaz de red se encuentran en:

# ls -l /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r--. 1 root root 321 ago 22 23:54 /etc/sysconfig/network-scripts/ifcfg-enp0s3
-rw-r--r--. 1 root root 254 abr  2 17:30 /etc/sysconfig/network-scripts/ifcfg-lo

Sólo hay que editar el de la interfaz correspondiente y modificar según requerimientos:

Configuración IP dinámica DHCP

# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
HWADDR="08:00:27:99:F6:7A"
TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="enp0s3"
UUID="30d5594c-d4db-4f2d-bc0d-91ffd2571035"
ONBOOT="yes"

Configuración IP estática

# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
HWADDR="08:00:27:99:F6:7A"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="192.168.1.199"
NETMASK="255.255.255.0"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="enp0s3"
UUID="30d5594c-d4db-4f2d-bc0d-91ffd2571035"
ONBOOT="yes"

Reiniciar red

Para aplicar los cambios hay que reiniciar el servicio de red (Arrancar / Parar / Reiniciar servicios en RHEL 7 y CentOS 7):

# systemctl restart network.service

Y para ver el estado:

# systemctl status network.service
network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network)
   Active: active (exited) since dom 2014-08-24 10:16:49 CEST; 3s ago
  Process: 11002 ExecStop=/etc/rc.d/init.d/network stop (code=exited, status=0/SUCCESS)
  Process: 11169 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)

ago 24 10:16:48 localhost.localdomain systemd[1]: Starting LSB: Bring up/down networking...
ago 24 10:16:48 localhost.localdomain network[11169]: Bringing up loopback interface:  Could not load file '/etc/sysconfig/network-scripts/ifcfg-lo'
ago 24 10:16:48 localhost.localdomain network[11169]: Could not load file '/etc/sysconfig/network-scripts/ifcfg-lo'
ago 24 10:16:48 localhost.localdomain network[11169]: Could not load file '/etc/sysconfig/network-scripts/ifcfg-lo'
ago 24 10:16:48 localhost.localdomain network[11169]: Could not load file '/etc/sysconfig/network-scripts/ifcfg-lo'
ago 24 10:16:48 localhost.localdomain network[11169]: [  OK  ]
ago 24 10:16:49 localhost.localdomain network[11169]: Bringing up interface enp0s3:  Connection successfully activated (D-Bus active path: /org/free...ction/3)
ago 24 10:16:49 localhost.localdomain network[11169]: [  OK  ]
ago 24 10:16:49 localhost.localdomain systemd[1]: Started LSB: Bring up/down networking.
Hint: Some lines were ellipsized, use -l to show in full.

Gateway, Hostname y DNS

La configuración de Gateway, Hostname sigue siendo exactamente igual Especificaremos nuestro HostName y puerta de enlace en el siguiente fichero:

vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=pruebas
GATEWAY=192.168.1.1

Y los DNS en lugar de configurarlos en /etc/resolv.conf vemos que es preferible añadirlos dentro del fichero de configuración de la interfaz de red:

vi /etc/resolv.conf

# Generated by NetworkManager


# No nameservers found; try putting DNS servers into your
# ifcfg files in /etc/sysconfig/network-scripts like so:
#
# DNS1=xxx.xxx.xxx.xxx
# DNS2=xxx.xxx.xxx.xxx
# DOMAIN=lab.foo.com bar.foo.com

Configuración en módo gráfico

La configuración en modo gráfico se basa en Network Manager, que en instalaciones MINIMAL de CentOS 7/RHEL 7 no está disponible. No obstante, si lo utilizáis (no lo recomiendo) veréis que es muy intuitivo, aunque no es recomendable utilizar ambos métodos a la vez (modificaciones manuales y network manager) por que los cambios del Network Manager suelen pisar a las configuraciones manuales.

Os dejo un screenshot del Network Manager disponible durante la instalación del SO:

instalacion centos 8 network configuration

 

Guía de instalación GNU/Linux CentOS 7

Ya lo hice con CentOS 5 y CentOS 6 así que no quedaba otra que hacer una guía de instalación del recién salido GNU/Linux CentOS 7. Me voy a basar, como a mí me gusta en el modelo de instalación minimal, no obstante ya sabéis que en los repositorios podéis encontrar el DVD completo, la instalación en red y los instaladores con escritorio KDE y Gnome.

Lo primero que hacemos es bajarnos la ISO de un repositorio:

$ wget http://ftp.udl.es/pub/centos/7.0.1406/isos/x86_64/CentOS-7.0-1406-x86_64-Minimal.iso

Una vez disponible la ISO, arrancamos el equipo a instalar con ella como primer elemento de arranque. De momento es sencillo, seleccionamos “Install CentOS“. Para los curiosos, en la sección de Troubleshooting tenemos lo siguiente (de utilidad en momentos de pánico):

  • Rescue a CentOS system
  • Run a memory test
  • Boot from local drive
instalacion centos 7 parte 1

Comenzamos la instalación y lo primero que vemos es una interfaz ligeramente distinta a la que estábamos acostumbrados para Red Hat y CentOS. Lo primero es seleccionar el idioma, personalmente siempre me gusta instalar los sistemas en inglés, cuestión de gustos:

instalacion CentOS 7 parte 2

En el siguiente paso sí que me ha chocado un poco el cambio tan grande de interfaz. Está basada en una pantalla general con acceso a las distintas opciones en lugar de un paso a paso como siempre había sido el instalador. Todo lo bonita que tú quieras pero la he notado más lenta de lo habitual. Incluso veréis que tiene botones de ON/OFF como los de los Smartphones…

instalacion centos 7 parte 4

Así pues, es cuestión de ir entrando en las que queramos personalizar, cuando el sistema esté listo para instalarse y no haya requisitos pendientes el botón de instalar se activará.

La configuración regional tiene una novedad, y es que si os fijáis en la parte superior derecha se puede activar la sincronización horaria por red (NTP), eligiendo si se quiere los servidores de sincronización pinchando en el engranaje (Network Time).

instalacion centos 7 configuracion regional

La selección del teclado  no tiene mayor misterio, pese a instalar el sistema en inglés configuramos el teclado en español por tema de compatibilidad (olvidé hacer la captura). Simplemente es una interfaz gráfica donde añadir y quitar idiomas.

La selección de software en este caso aparece vacía porque estamos utilizando una instalación MINIMAL. Si fuera el DVD completo os aparecería todo el software disponible para instalar a golpe de click, ya sea entornos de escritorio, grupos de servicios (base de datos, servidor web, etc).

instalacion centos 7 seleccion paquetes

Pero lo que sí que podemos hacer es añadir repositorios (EPEL, RPMForge, …). Tan sencillo como incluir el nombre del repo (a nuestra elección) y la URL del mismo. Sino, siempre los podemos añadir instalándolos por RPM como ofrecen muchos de estos repositorios de terceros o añadiéndolos manualmente.

Si os fijáis, también podemos elegir hacer la instalación en red en lugar de con el CD, de ese modo haríamos una instalación como si fuera un NET-INSTALL. Si tuviéramos que salir a Internet a través de un proxy, en este apartado es donde lo podemos configurar:

instalacion centos 7 repositorios

Llegamos a los dos apartados más importantes. Primero vamos a ver la configuración de red. Por defecto las interfaces de red aparecen desactivadas. Veréis que hay un botón como los típicos de móvil para activar/desactivar cada una de las tarjetas del equipo. Si las activamos, por defecto siempre estarán configuradas como DHCP. Para un equipo casero funcionará el 99% de las veces. Si queréis configurar IP estática (IPv4/IPv6) y personalizar DNS, GATEWAY, etc simplemente pinchad en “Configure” y aparecerá el típico Network Manager para realizar todas estas gestiones (modo MANUAL en el desplegable). Sobre los cambios en la nomenclatura de interfaces de red hablaré en breve en un post aparte ;)

instalacion centos 7 network configuration
instalacion centos 8 network configuration

Por último tenemos la configuración de discos, particionado y filesystems. Para el usuario novato lo más sencillo es dejar la configuración por defecto, elegir el disco en el que instalar el sistema y no hay que tocar nada más. Se creará una estructura basada en LVM (Logical Volume Manager). En este punto también podemos añadir sistemas de ficheros en red (NFS por ejemplo) u otro tipo de discos (iSCSI, SAN…). Otra opción disponible es la de cifrar el sistema de ficheros (os pedirá una contraseña).

instalacion centos 7 particionado

Y en el caso de que personalicemos la configuración de particionado y filesystems tenemos una sección renovada pero cuyo funcionamiento es prácticamente igual al de versiones anteriores. Podemos añadir/eliminar/modificar particiones manualmente, asignar el filesystem que queramos (ext2, ext3, ext4, xfs…), puntos de montaje personalizados, LVM, swap… Sobre xfs hablaré en otro post, es el nuevo sistema de ficheros por defecto de RHEL y CentOS.

instalacion centos 7 particionado

¡Y ya lo tenemos! Si avanzamos en la instalación aparecerá una nueva ventana con la barra de progreso de instalación en la parte inferior, mientras tanto tenemos que establecer la contraseña de root y si queremos, añadir nuevos usuarios de sistema:

instalacion centos 7 fin

Esperamos unos minutos, reiniciamos, desmontamos la unidad de CD con el instalador y ya tenemos nuestro CentOS 7 listo. En próximos artículos hablaré sobre la configuración y gestión de la red, el nuevo sistema de ficheros, etc.

[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.0.1406 (Core) 

Cómo crear tu propio RPM

rpmEn esta entrada vamos a ver los pasos necesarios para crear nuestro propio paquete rpm (Red Hat Package Manager). En este caso se trata de un paquete muy sencillo que únicamente va a tener un script ejecutable y unos ficheros extra de configuración, pero una vez que sabemos como hacerlo podemos hacer paquetes muchos más complejos y similares a los reales que nos podemos encontrar en cualquier repositorio.

Lo primero es instalar los paquetes y herramientas necesarias para poder crear rpms (rpm-build y rpmdevtools):

# yum install rpm-build rpmdevtools -y

Vamos a trabajar con un usuario sin privilegios y comenzamos creando una carpeta en nuestra home que contendrá los ficheros que formarán el RPM:

$ ls -l test-package-1.0/
total 8
-rw-rw-r--. 1 alex alex 27 Nov 10 16:04 README.txt
-rw-rw-r--. 1 alex alex 92 Nov 10 16:06 test-check
-rwxr--r--. 1 alex alex  0 Nov 10 16:38 configure

Como podéis ver simplemente he creado un fichero de texto README.txt y un script en bash llamado “test-check”. El fichero configure es necesario aunque no vayamos a compilar nada de código fuente, si no lo incluís os aparecerá un error al crear el RPM:

/var/tmp/rpm-tmp.zzXus7: line 32: ./configure: No such file or directory
error: Bad exit status from /var/tmp/rpm-tmp.zzXus7 (%build)
$ touch configure 
$ chmod 0744 configure

Esto va a ser todo lo que contendrá nuestro RPM. Para poder comenzar a crearlo antes debemos crear en nuestra home la estructura de directorios necesaria para la gestión de rpms, código fuente, specs, etc. En lugar de crearlo a mano utilizamos el comando “rpmdev-setuptree” disponible gracias a la instalación de los paquetes del comienzo de la entrada:

$ rpmdev-setuptree

Y ya tenemos la estructura creada:

$ ls -ltrh rpmbuild/
total 20K
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 RPMS
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 SOURCES
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 SPECS
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 SRPMS
drwxrwxr-x. 2 alex alex 4.0K Nov 10 16:08 BUILD

Lo siguiente que debemos hacer es comprimir las sources de nuestro paquete (carpeta test-package-1.0/) y copiarla o moverla a la carpeta SOURCES dentro de rpmbuild:

$ tar -czvf test-package-1.0.tar.gz test-package-1.0/
test-package-1.0/
test-package-1.0/README.txt
test-package-1.0/test-check
$ cp -p test-package-1.0.tar.gz rpmbuild/SOURCES/

El último fichero que tenemos que crear para poder construir el rpm es el fichero.spec. Este fichero contiene toda la información del paquete rpm: nombre, número de versión, arquitectura, descripción, dependencias, ordenes de ejecución para la instalación… no es necesario crearlo desde cero. Podemos ejecutar el siguiente comando dentro de la carpeta SOURCES para que nos cree uno de muestra:

$ rpmdev-newspec 
Skeleton specfile (minimal) has been created to "newpackage.spec".

Lo copiamos o renombramos con el nombre de nuestro paquete:

$ cp -p newpackage.spec test-package.spec

Ahora lo editamos añadiendo los parámetros correspondientes, los más importantes serían:

El nombre del paquete rpm:

Name:          test-package

Número de versión:

Version:       1.0

Release de la distribución (lo dejamos por defecto):

Release:        1%{?dist}

Summary, simplemente descriptivo. Indica el contenido del rpm, no es necesario:

Summary:        Paquete de muestra que contiene un fichero de texto y un ejecutable

Group hace referencia al grupo al que pertenece el paquete (definidos en un XML en el sistema), en nuestro caso no pertenece a ningún grupo concreto (Base, System Environment, Database…) así que ponemos uno genérico:

Group:          Miscellaneous

También podemos especificar términos de licencia del paquete y URL en la que revisarlos:

License:        RPM de prueba sin licencia
URL:            http://rm-rf.es

Ojo con el siguiente parámetro pues sí que es importante, especifica donde se encuentran las sources (del paquete, en este caso nuestro tar.gz (podría ser una url remota), no se especifica rpmbuild/SOURCES porque es la ruta en la que tienen que estar:

Source0:        test-package-1.0.tar.gz

En nuestro caso no hay ninguna dependencia para el paquete RPM, pero para paquetes complejos puede ser necesario que algún paquete extra esté instalado para el funcionamiento correcto, los especificaríamos en este punto:

#BuildRequires:
#Requires:

Podemos especificar una descripción del paquete que se verá al buscarlo por yum o el comando rpm:

%description
Este es un paquete de prueba para el artículo de http://rm-rf.es

Los dos comandos siguientes sirven para preparar el código fuente antes de su instalación, en este caso básicamente descomprimirán el .tar.gz en el directorio rpmbuild/SOURCES:

%prep
%setup -q

El siguiente apartado sirve para compilar el código fuente (cuando es necesario). Como nuestro RPM es muy sencillo y no necesita compilación comentamos las líneas:

%build
#%configure
#make %{?_smp_mflags}

El siguiente apartado (%install) es en el que se especifican las acciones a realizar cuando instalemos el RPM. En nuestro caso básicamente es crear una nueva carpeta en “/usr/local” y copiar ahí los ficheros. Por defecto aparece así:

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

Lo que hace es en primera instancia borrar cualquier resto de instalaciones anteriores del mismo paquete y después ejecuta un make si hemos realizado tareas de compilación. Vamos a comentar el make ya que nosotros no compilamos nada:

%install
rm -rf $RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
install -d -m 0755 /var/tmp/test-package
install -m 0644 README.txt /var/tmp/test-package
install -m 0755 test-check /var/tmp/test-package

El comando install -d nos permite crear un directorio e install -m mover ficheros. Lo instalamos en /var/tmp simplemente porque es un rpm de prueba, lo normal sería /usr/local, /opt o lo que quisierais. Finalmente se limpian restos de la instalación:

%clean
rm -rf $RPM_BUILD_ROOT

Así quedaría nuestro test-package.spec:

Name:          test-package
Version:       1.0 
Release:        1%{?dist}
Summary:        Paquete de muestra que contiene un fichero de texto y un ejecutable

Group:		Miscellaneous
License:        RPM de prueba sin licencia
URL:            http://rm-rf.es
Source0:        test-package-1.0.tar.gz
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

#BuildRequires:  
#Requires:       

%description
Este es un paquete de prueba para el artículo de http://rm-rf.es

%prep
%setup -q

%build
#%configure
#make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT
#make install DESTDIR=$RPM_BUILD_ROOT
install -d -m 0755 /var/tmp/test-package
install -m 0644 README.txt /var/tmp/test-package
install -m 0755 test-check /var/tmp/test-package

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
%doc

%changelog

El último paso ya es empaquetar todo y crear el RPM, para ello utilizamos el siguiente comando pasando como argumento el fichero spec. Debemos esperar un exit 0 al final para descartar fallos:

$ rpmbuild -ba rpmbuild/SOURCES/test-package.spec 
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.9azqfP
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd /home/alex/rpmbuild/BUILD
+ rm -rf test-package-1.0
+ /bin/tar -xf -
+ /usr/bin/gzip -dc /home/alex/rpmbuild/SOURCES/test-package-1.0.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd test-package-1.0
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.VqJuDV
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd test-package-1.0
+ CFLAGS='-O2 -g -march=i386 -mtune=i686'
+ export CFLAGS
+ CXXFLAGS='-O2 -g -march=i386 -mtune=i686'
+ export CXXFLAGS
+ FFLAGS='-O2 -g -march=i386 -mtune=i686'
+ export FFLAGS
+ ./configure --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.U4egr2
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd test-package-1.0
+ rm -rf /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386
+ install -d -m 0755 /var/tmp/test-package
+ install -m 0644 README.txt /var/tmp/test-package
+ install -m 0755 test-check /var/tmp/test-package
+ /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
+ /usr/lib/rpm/brp-compress
/usr/lib/rpm/brp-compress: line 8: cd: /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386: No such file or directory
+ /usr/lib/rpm/brp-strip
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
+ /usr/lib/rpm/brp-strip-static-archive
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
+ /usr/lib/rpm/brp-strip-comment-note
find: `/home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386': No such file or directory
Processing files: test-package-1.0-1.el6.i386
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386
warning: Could not canonicalize hostname: CentOS
Wrote: /home/alex/rpmbuild/SRPMS/test-package-1.0-1.el6.src.rpm
Wrote: /home/alex/rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.byNcVu
+ umask 022
+ cd /home/alex/rpmbuild/BUILD
+ cd test-package-1.0
+ rm -rf /home/alex/rpmbuild/BUILDROOT/test-package-1.0-1.el6.i386
+ exit 0

Vemos que todo ha ido bien así que ya deberíamos tener nuestro nuevo RPM en la carpeta RPMS:

$ ls -l rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm 
-rw-rw-r--. 1 alex alex 1365 Nov 10 16:43 rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm

Y el RPM de las sources:

$ ls -l rpmbuild/SRPMS/test-package-1.0-1.el6.src.rpm 
-rw-rw-r--. 1 alex alex 2458 Nov 10 16:43 rpmbuild/SRPMS/test-package-1.0-1.el6.src.rpm

Lo podemos instalar como cualquier otro rpm:

# rpm -ivh rpmbuild/RPMS/i386/test-package-1.0-1.el6.i386.rpm
Preparing...                ########################################### [100%]
   1:test-package           ########################################### [100%]

Vemos que se ha instalado correctamente:

# ls -l /var/tmp/test-package/
total 8
-rw-r--r--. 1 alex alex 27 Nov 10 16:43 README.txt
-rwxr-xr-x. 1 alex alex 92 Nov 10 16:43 test-check

Y podemos ver también toda la información del paquete rpm que indicamos en el fichero spec:

# rpm -qi test-package
Name        : test-package                 Relocations: (not relocatable)
Version     : 1.0                               Vendor: (none)
Release     : 1.el6                         Build Date: Sat 10 Nov 2012 04:43:48 PM CET
Install Date: Sat 10 Nov 2012 04:45:12 PM CET      Build Host: CentOS
Group       : Miscellaneous                 Source RPM: test-package-1.0-1.el6.src.rpm
Size        : 0                                License: RPM de prueba sin licencia
Signature   : (none)
URL         : http://rm-rf.es
Summary     : Paquete de muestra que contiene un fichero de texto y un ejecutable
Description :
Este es un paquete de prueba para el artículo de http://rm-rf.es

Este es el modo de crear un paquete rpm muy básico, a partir de aquí es cuestión de buscar más información para poder tener vuestras aplicaciones empaquetadas ;)

The Debian Administrator’s Handbook

The Debian Administrator’s HandbookGracias a www.ubuntips.com.ar he descubierto este recurso que seguro a más de uno le viene muy bien. Se trata de una guía disponible online, como eBook o en libro tradicional que comenzó siendo una traducción del best-seller francés “Cahier de l’admin Debia”.

The Debian Administrator’s Handbook enseña todo lo fundamental para ser un buen administrador de sistemas Debian GNU/Linux y derivados, y por consiguiente para tener una buena base en cualquier sistema GNU/Linux. El proyecto ha sido realizado por dos desarrolladores de Debian, Raphaël Hertzog y Roland Mas.

El libro está disponible bajo la licencia Debian Free Software Guidelines. Lo podéis conseguir por todas estas vías:

  1. Leerlo online.
  2. eBook/libro físico.
  3. Descargas las fuentes y contribuir.

FAQ de RHCS (Red Hat Cluster Suite)

Lo primero de todo, perdonad la falta de actualización durante las últimas semanas, no he estado en España y tampoco he tenido el tiempo suficiente para escribir en el blog, estudiar, etc. Vamos a ir retomando poco a poco el ritmo. Hoy simplemente os quiero dejar un enlace para que lo guardéis en vuestros favoritos. Os será de gran utilidad si administráis RHCS (Red Hat Cluster Suite).

Se trata de las FAQ (Frequently asked questions/Preguntas frecuentes) relacionadas con el clustering de Red Hat (en este caso a través de Fedora). Encontraremos un montón de preguntas resueltas sobre problemas comunes que nos encontramos en este sistema de Cluster, también configuraciones típicas, operación, etc. Para hacerlo más claro y fácil de revisar, está separado por secciones según componentes (cman, fencing, GFS, CLVM, DLM, rgmanager, etc).

¡Espero que os sean de utilidad!

Cómo instalar Oracle Solaris 11 Express

Hoy vamos a ver lo sencillo que resulta instalar Oracle Solaris 11 Express 2010.11 tanto en una máquina virtual como en un equipo físico. Lo primero que tenemos que hacer es descargar la imagen de instalación correspondiente desde este enlace del sitio web de Oracle (es necesario registro). En mi caso, como es habitual he utilizado la versión de instalación en modo texto para x86.

Vamos a ello, arrancamos el equipo con un CD con la imagen ISO grabada y empezamos la instalación. Seleccionamos el tipo de teclado, en nuestro caso ’39’ (español):

Ahora toca elegir el idioma, en mi caso selecciono inglés ya que prefiero instalar los sistemas en inglés que en español, sobre todo porque a la hora de buscar documentación y errores hay mucha más información:

Comienza la instalación de Oracle Solaris, elegimos ‘1’ para empezar:

Tras la pantalla de bienvenida, empezamos con la configuración de discos y particiones. Primero toca elegir el disco sobre el que hacer la instalación y después la estructura de particiones. En este caso es un disco virtual sobre Virtualbox, así que elegimos el único disco disponible y usamos todo el disco para instalar el sistema.

Ahora introducimos el nombre de la máquina (hostname) y especificamos si deseamos que la configuración de red sea automática o si preferimos realizarla de forma manual posteriormente:

Establecemos la configuración regional del equipo, fecha, etc:

Llega el momento de asignar una clave al usuario root y la creación de una cuenta de usuario extra:

Antes de comenzar la instalación, podemos ver un resumen de las opciones configuradas y elegir cambiar alguna de ellas volviendo atrás (F3):

Cuando todo esté correcto, presionamos F2 y la instalación comenzará:

Una vez finalizada la instalación sólo nos queda presionar F8 para hacer un reboot y ya podemos comenzar a disfrutar de nuestro sistema Oracle Solaris:

alex@solaris:~$ uname -a
SunOS solaris 5.11 snv_151a i86pc i386 i86pc

En las próximas entradas empezaremos a ver cómo configurar las interfaces de red, la instalación de paquetes y una visión general del sistema.

Lighttpd: proteger una carpeta o website con contraseña

LighttpdSi utilizamos Lighttpd y necesitamos una funcionalidad similar a la que nos ofrece el servidor web Apache para proteger con password un directorio o virtualhost (en este caso vía .htaccess o directamente en el virtualhost con AuthType, AuthUserFile…) debemos hacer uso del módulo mod_auth y sus directivas. Vamos a ver como configurarlo.

Lo primero que debemos hacer es ver si el módulo está cargado en la configuración, para ello abrimos el fichero de configuración y revisamos la sección server.modules, donde debería mod_auth, sino lo añadís:

/etc/lighttpd/lighttpd.conf
server.modules              = (
            "mod_access",
            "mod_accesslog",
            "mod_fastcgi",
            "mod_rewrite",
            "mod_auth",
            "mod_cgi"
)

Después tenemos que configurar las tres directivas disponibles para la autenticación, el tipo de autenticación, el fichero en el que se almacenarán los datos de usuarios y claves y el nivel de debug:

auth.backend               = "htpasswd"
auth.backend.htpasswd.userfile = "/home/miwebsite/.lighttpdpasswd"
auth.debug = 0

Mediante auth.backend podemos especificar el tipo de autenticación, puede ser en texto plano (plain) o mediante htpasswd o LDAP. Elegimos htpasswd para tener la clave encriptada. Luego el fichero donde se almacenan las claves lo especificamos también (auth.backend.htpasswd.userfile). Finalmente el debug para verificar el funcionamiento, con 0 queda desactivado, con 1 vuelca a los logs cuando la autenticación es correcta y con 2 vuelca todo (access.log y error.log).

Ahora creamos fuera de la carpeta pública del sitio web el fichero con los usuarios y sus claves encriptadas por htpasswd:

# vim /home/miwebsite/.lighttpdpasswd
foo:soAb7vp63UATv7uaA2
chown lighttpd /home/miwebsite/.lighttpdpasswd && chmod 0600 .lighttpdpassword

Finalmente sólo nos queda seleccionar que directorio o website queremos proteger. Para ello buscaremos la sección $HTTP["host"] que contenga la web/directorio a proteger:

En negrita lo relacionado con la autenticación:

$HTTP["host"]  =~ "test.com" {
  server.document-root = "/home/test-com/"
  accesslog.filename         = "/var/log/lighttpd/test-access.log"
 auth.require = ( "/carpeta-protegida/" =>
 (
  "method" => "basic",
  "realm" => "Password protected area",
  "require" => "user=foo" 
 ) 
 )
}

Y ya podemos reiniciar lighttpd para activar los cambios. En este caso la carpeta test.com/carpeta-protegida/ quedará protegida y únicamente el usuario foo podrá acceder.

# /etc/init.d/lighttpd restart

Cómo instalar CentOS 6

Vamos a ver como instalar paso a paso la nueva versión de CentOS (6.0) que salió a la luz hace pocos días y tras muchos meses de espera. Vamos a seguir los mismos pasos que con la instalación de CentOS 5. Realizaremos una instalación mínima a través de la ISO netinstall.

El primer paso es descargar la ISO correspondiente desde un mirror de CentOS, por ejemplo:

ftp://ftp.udl.es/pub/centos/6.0/isos/

Podréis seleccionar tanto la versión de 32 como 64 bits. En esta guía vamos a instalar la versión de 32 bits:

CentOS-6.0-i386-netinstall.iso

Una vez bajada comenzamos la instalación arrancando con la ISO grabada en un CD. Nos encontraremos la pantalla de bienvenida, seleccionamos la primera opción:

Como instalar CentOS (1)

La primera opción que encontraremos será la de realizar un test del CD de instalación, podemos saltarla sin problemas a no ser que encontremos fallos extraños durante la instalación provocados por un CD defectuoso.

Read the rest of this entry »