Mostrando entradas con la etiqueta sistema. Mostrar todas las entradas
Mostrando entradas con la etiqueta sistema. Mostrar todas las entradas

Link vmlinuz.old is damaged

Pues bien, hoy es uno de esos días en los que te pones a actualizar un equipo y te das cuenta de que queda poco espacio en la partición raíz. Investigando un poco más, observas que hay muchas versiones del kernel instaladas, pero que en realidad no se están empleando para nada, por lo que decides hacer limpieza. Concretamente, éste es el caso,

shell> dpkg -l |grep linux-image
ii linux-image-3.2.0-29-generic 3.2.0-29.46  Linux kernel...
ii linux-image-3.2.0-60-generic 3.2.0-60.91  Linux kernel...
ii linux-image-3.2.0-68-generic 3.2.0-68.102 Linux kernel...
ii linux-image-3.2.0-69-generic 3.2.0-69.103 Linux kernel...
ii linux-image-3.2.0-70-generic 3.2.0-70.105 Linux kernel...
ii linux-image-3.2.0-74-generic 3.2.0-74.109 Linux kernel...
ii linux-image-3.2.0-75-generic 3.2.0-75.110 Linux kernel...
ii linux-image-3.2.0-77-generic 3.2.0-77.114 Linux kernel...
ii linux-image-3.2.0-79-generic 3.2.0-79.115 Linux kernel...
ii linux-image-generic          3.2.0.79.93  Generic Linux
Como veis, hay algunas versiones del kernel instaladas, y que en realidad no son necesarias, así que vamos a realizar una purga de aquellas que no nos interesen. Lo primero es saber qué versión del mismo estamos usando, no vayamos a desinstalar el kernel que estamos empleando. Para ello,
shell> uname -r
3.2.0-75-generic
No está cargada la última versión y siendo un equipo de producción, reiniciar "por que sí", tampoco es posible, así que vamos a purgar aquellos que no nos interesan, es decir, todos menos la última versión (3.2.0-79) y la que estamos usando (3.2.0-75).
shell> apt-get remove --purge linux-image-3.2.0-29-generic
shell> apt-get remove --purge linux-image-3.2.0-60-generic
shell> apt-get remove --purge linux-image-3.2.0-68-generic
shell> apt-get remove --purge linux-image-3.2.0-69-generic
shell> apt-get remove --purge linux-image-3.2.0-70-generic
shell> apt-get remove --purge linux-image-3.2.0-74-generic
shell> apt-get remove --purge linux-image-3.2.0-77-generic
Y tras ello,
shell> apt-get autoremove --purge
Durante la desinstalación del kernel 3.2.0-77 ha aparecido un curioso error,
shell> apt-get remove --purge linux-image-3.2.0-77-generic
Desinstalando linux-image-3.2.0-77-generic ...
...
The link /vmlinuz.old is a damaged link
Removing symbolic link vmlinuz.old 
 you may need to re-run your boot loader[grub]
Purgando ficheros de configuración de linux-image-3.2.0-77...
...
Donde se nos está indicando que el link al fichero /vmlinuz.old está dañado y que no va a funcionar. Para corregirlo, simplemente debemos de recargar nuestro gestor de carga (en mi caso grub), tal como sigue.
shell> update-grub
Y problema solventado.
Leer más

Etiquetar particiones

Si bien el otro día hablamos de cómo manejar y cambiar el UUID de una partición, hoy vamos a ver cómo emplear las etiquetas (labels) para poder administrar nuestros puntos de montaje y que así tengan más significado. La idea es pasar de un /dev/sda1 a un /dev/disk/by-label/raiz. Algo más legible y entendible por cualquier persona.
Para hacerlo, lo primero que debemos es comprobar si nuestro disco tiene alguna etiqueta. Para ello,
shell> lsblk -f
NAME      FSTYPE      LABEL      MOUNTPOINT
sda                                         
├─sda1    ext4                   /boot
├─sda2    ext4                   /
└─sda3    ext4                                  
Como vemos, no hay ninguna etiqueta de nombre para las particiones. La solución está en el empleo del comando e2label, que sirve precisamente para asignarle etiquetas a las particiones. Procederemos por lo tanto como sigue,
shell> e2label /dev/sda1 boot
shell> e2label /dev/sda2 raiz
shell> e2label /dev/sda3 data
Puedes aplicar etiquetas únicamente a aquellas particiones que te interese, a mi me interesa etiquetarlas las 3 que voy a usar. Si ahora ejecutamos nuevamente el primer comando (lsblk),
shell> lsblk -f
NAME      FSTYPE      LABEL      MOUNTPOINT
sda                 
├─sda1    ext4        boot       /boot
├─sda2    ext4        raiz       /
└─sda3    ext4        data
A partir de este momento, bajo la carpeta /dev/disk/by-label existe los links a los disco y que se pueden usar, por ejemplo, para montar una partición.
shell> mount /dev/disk/by-label/data /mnt
Quizás acordarse de la nueva ruta para realizar los montajes de disco sea más complejo, pero desde luego, para saber qué es lo que se está haciendo, mucho más simple.

Referencias

Leer más

Cambiar UUID del disco

Hace ya un tiempo hablamos en este blog acerca del uso de los UUIDs y los discos. El que no sepa de qué estoy hablando, puede leer la entrada Obtener el UUID del disco. En él se indica de forma clara cómo obtener el identificador universal del disco para posteriormente trabajar con él, por ejemplo en fstab.

Cambiando UUID

Hoy vamos a dar un paso más allá y ver cómo cambiar dicho UUID. A priori, el algoritmo que se emplea para la creación de los UUID no permite que este identificador esté repetido en un mismo equipo, aunque como todo, siempre puede haber excepciones. En caso de que esto os haya pasado, sabréis que trabajar con UUIDs en un sistema con dos repetidos es imposible. En cada montaje del sistema, aparece un disco y otro y hay muchos fallos. Pues bien, la solución en esos casos no es otra que la de cambiar dicho UUID.
Con el comando blkid se puede obtener el listado de los IDs de las particiones del disco,
shell> blkid
/dev/sda1: UUID="e12c98df-7c8e-4f50-be39-e208597f71a7"
/dev/sda2: UUID="2bf49a55-f967-4fec-9127-9d049a5e7091"
/dev/sda3: UUID="a6a1fc9a-48e5-4cff-82b9-04f0afa925e3"
y también está el comando uuidgen, que permite precisamente crear "el churro" alfanumérico que se emplea como identificado.
shell> uuidgen
502eb30f-9c0c-4308-80d7-e1061ba39e4f
Para cambiar el ID de una partición debemos de emplear el comando tune2fs y pasarle el nuevo UUID que nos interese, es decir, uno aleatorio. Por lo tanto,
shell> tune2fs -U `uuidgen` /dev/sda3
tune2fs 1.42.9 (4-Feb-2014)
Y vemos ahora que los cambios han surtido el efecto deseado.
shell> blkid
/dev/sda1: UUID="e12c98df-7c8e-4f50-be39-e208597f71a7"
/dev/sda2: UUID="2bf49a55-f967-4fec-9127-9d049a5e7091"
/dev/sda3: UUID="c6dfe0b1-ceec-477b-a764-9db98439c5f9"

Referencias


Nota: La partición afectada que vayamos a cambiar debe de estar desmontada.
Leer más

Ghost in Linux (CVE-2015-0235)

Investigadores de la empresa Qualys han reportada una grave vulnerabilidad en la librería glibc
(biblioteca C de GNU Linux), que permite obtener un acceso no lícito al sistema sin la necesidad de usuario y contraseña.
Dicha vulnerabilidad ya está reportada y se ha identificado como CVE-2015-0235 y afecta a la mayoría de los sistemas ya que lleva 14 años ahí. Afecta a todos aquellos sistemas que tenga glibc-2.2 instalado, liberado en el año 2000! En mucho sitios ya comparan esta vulnerabilidad a heartbleed, que también movió cielo y tierra en su momento.
Las principales distribuciones GNU/Linux ya fueron notificadas de este bug antes de que se publicase, y ya hay parches al respecto para ellas.

Bug y explicación

Este fallo de seguridad afecta a la función gethostbyname, presente en glibc. Dicha función es usada en casi todos los sistemas Linux cuando se intenta acceder a otro equipo conectado en red. O dicho de otra forma, cuando se intenta resolver un nombre de dominio vía DNS.
El fallo se puede aprovechar si el atacante provoca un desbordamiento de buffer al usar un argumento hostname no válido. Es ahí cuando se permite ejecutar código arbitrario y con los permisos del usuario que está ejecutando DNS.
Qualys creó una prueba de concepto sobre un servidor Exim al enviarle un comando SMTP inválido. Un simple correo electrónico mal intencionado permite abrir una shell remota en el sistema.

Solución

Aplicar las actualizaciones de seguridad de los sistemas y reiniciar.

Más información




Leer más

Arrancar ISO desde grub

Una de las muchas sorpresas que depara GNU/Linux es la versatilidad que este ofrece para hacer cosas. Hoy vamos a ver una que nos puede ayudar e incluso sacar de más de un apuro y que es cómo arrancar una ISO desde Grub.
Por norma general, cuando queremos arrancar una ISO, debemos de grabarla en un CD o en un pendrive para poder iniciar con ella el equipo y así verla y probarla. Pues bien, este tipo de acciones se pueden terminar con la posibilidad de arrancar una ISO desde el propio grub. Este método no servirá, lógicamente, para una reinstalación completa de tu sistema, pero sí te brindará la posibilidad de reiniciar tu equipo y probar una ISO de cualquier otra distribución o arrancar algún CD de utilidades. Vamos ya, por lo tanto, a preparar nuestro entorno.

Preparación del sistema

Vamos a ver aquí los pasos que debemos de hacer antes de nada. Lo primero será obtener la ISO que queramos tener en el arranque. Por ejemplo, una Ubuntu, una copia de BackTrack o el mismo Gparted. Para ello, debemos de ir a la web oficial y descargarla. Este paso no tiene nada que ver con lo que vamos a comentar, pero sí es necesario para luego.
Una vez que tengamos la ISO, deberemos de colocarla en una ruta específica. Puesto que estamos hablando de ISO de arranque, a mi me gusta colocarlas en /iso, por lo tanto,
shell> mkdir /iso
shell> mv gparted-live-0.20.0-2-i486.iso /iso
shell> mv ubuntu-14.04.1-desktop-amd64.iso /iso
A continuación, vamos a hacer que el grub se muestre cuando arranque, pues en las últimas versiones arranca con un retraso de 0 segundos, lo que hace que se complique la elección del sistema operativo a arrancar. Si no tienes este problema, ignora este paso, sino, edita el fichero /etc/default/grub y déjalo como sigue.
...
#GRUB_HIDDEN_TIMEOUT=0
...
Y ya para finalizar el apartado de cosas que debemos de saber, necesitamos averiguar sobre qué disco y que partición está nuestra nueva carpeta (/iso). Si tienes una instalación de las típicas, se supone que estará en el disco 0 (/dev/hda o /dev/sda) y la partición 1, por lo tanto (hd0, 1). Esto es importante tenerlo identificado. Para asegurarte, compruébalo con fdisk y con mount.
shell> fdisk -l
Dispositivo Inicio Comienzo    Fin    Bloques  Id  Sistema
/dev/sda1   *      2048   29296639   14647296  83  Linux
/dev/sda2      29296640   33202175    1952768  82  Linux swap
/dev/sda3      33202176  234440703  100619264  8e  Linux LVM
shell> mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
...

Edición del grub

La parte común ya está. Ahora nos queda añadir las entradas necesarias a nuestro grub. Se recomienda no añadirlas directamente en /boot/grub/grub.cfg, puesto que en cada actualización este fichero se regenera y por lo tanto los cambios se pierden. Lo mejor es usar el fichero /etc/grub.d/40_custom, que es precisamente para estos casos, añadir entradas manualmente.

Ubuntu 64

menuentry 'Ubuntu 14.04 Live (64 bits)' {
   set isofile="/iso/ubuntu-14.04.1-desktop-amd64.iso"
   loopback loop (hd0,5)$isofile
   linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
   initrd (loop)/casper/initrd.lz
}

Ubuntu 32

menuentry 'Ubuntu 14.04 Live (32 bits)' {
   set isofile="/iso/ubuntu-14.04.1-desktop-i386.iso"
   loopback loop (hd0,5)$isofile
   linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
   initrd (loop)/casper/initrd.lz
}

Gparted

menuentry 'Gparted' {
   set isofile="/iso/gparted-live-0.20.0-2-i486.iso"
   set root=(hd0,5)
   loopback loop (hd0,5)$isofile
   linux (loop)/live/vmlinuz boot=live config union=aufs noswap noprompt ip=frommedia toram=filesystem.squashfs findiso=$isofile
   initrd (loop)/live/initrd.img
}
Cómo veis, cada ISO a arrancar tiene unas opciones diferentes y estas debes de averiguarlas antes de poder iniciarla. Por norma general, está documentado el proceso en la web principal.
Lo único que nos queda ahora por realizar es una actualización del grub.
shell> update-grub2

Arrancando desde la ISO

Llegados a este punto, ya estamos listos para poder reiniciar nuestro sistema. Así que, cerramos la consola y todo lo que estemos haciendo y reiniciamos.
Os debería, tras el reinicio salir una pantalla similar a esta donde destaqué con letra más clara las dos ISOs que tendremos disponibles para iniciar.





Qué significa cada uno de los parámetros

  • menuentry
    Nombre que aparecerá como entrada del grub.
  • set isofile
    Define una variable, isofile, que contendrá la ruta absoluta de la imagen a iniciar.
  • set root
    Indica la partición raíz sobre la que está la imagen.
  • loopback
    Indica la ruta donde localizar la imagen en el disco. Es una composición de disco + variable isofile.
  • linux
    Kernel que se usará para arrancar y la localización del mismo. También se le pasan aquí las opciones de arranque.
  • initrd
    Indica la localización del fichero initrd, pero siempre dentro de la imagen.
Leer más

Fallo de seguridad en wget

Descripción:


Vulnerabilidad en wget, CVE-2014-4877, que permite a un atacante crear una estructura malintencionada en un servidor FTP. Con la opción de descarga recursiva que tiene wget, dicho FTP preparado puede crear enlaces, ficheros y directorios con y asignar los permisos que le interesen en el equipo remoto.

Versiones afectadas: < 1.16

Fecha:


29/10//2014

Detalles:


wget es una herramienta que permite la descarga de contenido desde diversos protocolos (http, https y ftp). También, una de las características más destacadas es la descarga recursiva de dicho enlace, lo que permite descargar FTPs completos, por ejemplo. Un FTP creado con un directorio especificamente manipulado, puede llegar a crear ficheros, directorios y enlaces en el sistema remoto que según el contenido de éste puede llegar a ser peligroso.
La vulnerabilidad está identificada con el código CVE-2014-4877.

Solución:


Hay varias soluciones y la primera y principal, es actualizar wget a la última versión disponible, la 1.16, donde ya está corregido el fallo.
En caso de que esta actualización no se pueda realizar, para mitigar el fallo comentado, se pueden tomas estas dos opciones:
  • - -retr-symlinks
    Pasando esta opción en línea de comandos antes de usar wget.
  • retr-symlinks=on
    En el fichero de configuración general (/etc/wgetrc) o de usuario (~/.wgetrc).
Leer más

Recuperar contraseña de root

Aunque es una práctica que únicamente hay que llevar a cabo en casos extremos, hoy voy a explicar de forma sencilla cómo poder resetear la contraseña de root de prácticamente cualquier distribución GNU/Linux con tener únicamente acceso directo al equipo físico.
Lo primero es reiniciar la máquina y esperar a que salga el Grub. En cuanto lo tengamos delante, nos movemos para que no arranque con la opción por defecto, ya que vamos a querer introducirle una opción para que nos permita trabajar. Para hacerlo, únicamente debemos de presionar la tecla "e" sobre la línea del sistema que vayamos a arrancar. A continuación posicionarnos sobre la línea que pone algo referente al kernel y volver a presionar "e". Ahí ya nos dejará modificar la línea de arranque del sistema, con lo que podemos hacer cosas.

Lo primero es borrar las palabras quiet y splash (si aparecen) y añadir lo siguiente,
init=/bin/bash 
Quedando la línea como se muestra en la siguiente imagen, en capas los pasos que se han mencionado. Ahora ya estamos listos para arrancar el sistema, así que únicamente presionamos ENTER y a continuación "b".
Esto nos llevará a una shell básica del sistema GNU/Linux en la que tendremos a nuestra disposición pocos comandos, pero en realidad los necesarios. Si os dais cuenta, tenemos una shell como root, pero sin que nos haya pedido la contraseña, en un sistema de sólo lectura, eso sí.
Como bien hemos dicho, no hay posibilidad de escritura, así que vamos a conseguirla, para ello,
shell> mount -o remount,rw /
Nota: Si el sistema al que estáis accediendo tiene la carpeta /etc en una partición diferente a /, hay que efectuar la misma operación sobre /etc.

Ahora ya sólo nos queda cambiar la contraseña del usuario que nos interese, en este caso, root. Para ello, simplemente ejecutamos passwd y metemos la nueva contraseña. Contraseña que esta vez evitaremos olvidarnos.
Una vez finalizado todo el proceso, ejecutamos sync y tras ello reiniciamos la máquina. El comando reboot no está disponible, por lo que podemos hacerlo presionando Control + Alt + Supr.
Leer más

Cambio de hostname en RedHat/CentOS

Recientemente tuve que cambiarle el nombre FQDN (Fully Qualified Domain Name) a un servidor Red Hat y descubrí que es "un poco" lioso hacerlo, sobre todo si es la primera vez. Para recordar cómo se hace y por si le sirve de ayuda a alguien, opté por escribir esta entrada y dejar así constancia de los pasos a realizar. Por suerte, esta técnica sirve para sistemas Red Hat, Centos e imagino que Federa, aunque no lo probé en este último.
Lo primero de todo es crear el fichero, en caso de que no exista /etc/hostname con el contenido del fqdn que deseemos. En mi caso,
compile.server.loc
A continuación, debemos de cargar el nuevo nombre en el sistema, para ello,
shell> hostname -F /etc/hostname
Tranquilos, ya estamos llegando al final. Ahora debemos de editar el fichero de configuración de red, /etc/sysconfig/network y cambiar en él el HOSTNAME del equipo.
NETWORKING=yes
HOSTNAME=compile.server.loc
Y reiniciar la red del equipo para que pille los nuevos parámetros,
shell> service network restart
Y ahora ya deberíamos de tener el hostname completo,
shell> hostname --fqdn
compile.server.loc

En caso de que tengamos el siguiente error al ejecutar el comando hostname - -fqdn
hostname: `Host' desconocido
debemos de editar el fichero /etc/hosts y añadir el nuevo FQND con la IP del servidor.
Leer más

Búsqueda de archivos en GNU/Linux

Fijo que en muchas ocasiones te tocó buscar un archivo en un sistema GNU/Linux. Pues bien, hoy te dejo aquí una pequeña chuleta con los comandos que deberías saber, según velocidad y sensibilidad que desees para poder encontrarlos.
  • whereis
    El mejor buscando ejecutables dentro del sistema. No busca por nombre exacto, sino el comando o binario que le pasas, así como la documentación (páginas man), o el código fuente del mismo.
    shell> whereis ls
       ls: /bin/ls /usr/share/man/man1/ls.1.gz
    
  • type
    No es exactamente el buscador de comandos o ficheros, pero nos sirve, para entre otras cosas saber el comando que vamos a ejecutar, por ejemplo, si tenemos definido un alias para él.
    shell> type ls
       ls es un alias de `ls --color=auto'
    shell> type -a ls
       ls es un alias de `ls --color=auto'
       ls is /bin/ls
    
  • which
    Busca el binario dentro de la ruta del path. Si lo encuentra, devuelve la dirección completa.
    Aunque su utilidad puede estar en entredicho, puede sacarte de más de un apuro si tienes el mismo comando en diferentes localizaciones y no sabes cual ejecutar. Con él podrás pasar el path completo y ejecutar el que quieras.
    shell> which ls
       /bin/ls
    
  • locate
    Es una verdadera alternativa al último comando que veremos, el incombustible find, pero con la ventaja de que éste tiene previamente indexados los ficheros existentes, por lo que la búsqueda es mucho más rápida. Tras la instalación indexa los datos que hay, pero cada cierto tiempo es necesario realizar una actualización de su base de datos (comando updatedb) para que tenga indexados los nuevos ficheros.
    shell> locate fstab
       /etc/fstab
       /etc/fstab.d
       /lib/init/fstab
       /sbin/fstab-decode
       /usr/lib/udisks/udisks-helper-fstab-mounter
       /usr/share/doc/mount/examples/fstab
       /usr/share/doc/util-linux/examples/fstab.example2
       /usr/share/man/man5/fstab.5.gz
       /usr/share/man/man8/fstab-decode.8.gz
       /usr/share/vim/vim74/syntax/fstab.vim
    
  • find
    El mítico comando de búsqueda de Linux. Sobre él hay miles de páginas acerca de cómo se usa y todas las opciones que tiene. Realiza una búsqueda en todo el path pasado como parámetro y puede realizar filtros de casi todo tipo (permisos, propietarios, fechas, etc.). Saber usarlo cuesta, pero una vez aprendido compensa.
    shell> find /usr/share/doc/ -name fstab*
       /usr/share/doc/mount/examples/fstab
       /usr/share/doc/util-linux/examples/fstab.example2
    
Leer más

SSH terminal in web

Hoy os voy a mostrar una pequeña forma de tener accesible un servidor SSH desde un navegador. Supongo que a muchos de vosotros esto no os servirá de nada y a otras muchos les será de gran ayuda. Hay veces que tener una conexión segura SSH es más complicado, sin embargo, tener un servicio vía web que se encargue de ser servidor SSH, pues nos vendrá bien.
Por supuesto, lo que voy a contar ahora simplemente facilita la conexión a una máquina, pero para nada garantiza su seguridad. Así que un control de accesos y un extra de seguridad nunca está demás.

Instalación

Lo primero de todo es instalar el software necesario que vamos a emplear. En este caso usaremos shellinabox, que se define a si mismo como una línea de comandos encapsulada en código AJAX.
Puesto que está disponible desde los repositorios oficiales,
shell> apt-get install openssl shellinabox

Configuración de shellinabox

Una vez tenemos todo instalado, ya está el servicio prácticamente listo para arrancar. Lo único que nos queda pendiente es establecer el puerto por defecto en el que vamos a querer que se ejecute. En mi caso lo voy a poner en el 443 (https). Para ello, editamos el fichero de configuración, /etc/default/shellinabox y lo dejamos como sigue.
SHELLINABOX_DAEMON_START=1
SHELLINABOX_PORT=443
SHELLINABOX_ARGS="--no-beep"
Es decir, la configuración por defecto, únicamente cambiando el puerto de escucha.

Configuración avanzada

La configuración por defecto la verdad es que funciona perfectamente y nos permite ya de por sí abrir una consola en el equipo que está haciendo de servidor. Sin embargo, si nos interesa abrir una consola en otro equipo de la red local, también lo podemos hacer directamente empleando shellinabox. Un ejemplo de configuración para ello sería,
SHELLINABOX_PORT=443

# specify the IP address of a destination SSH server
SHELLINABOX_ARGS="--o-beep -s /:SSH:192.168.0.70"
En donde establecemos que se abra un túnel SSH hacia el servidor con IP 192.168.0.70.

Arrancando servicio

Una vez tengamos ya todo configurado simplemente tendremos que arrancar el servicio.
shell> /etc/init.d/shellinabox start
Y ya podremos conectarnos con un navegador al puerto descrito y tener nuestra shell en el equipo.
shellinabox example
shellinabox example

Certificado SSL

Por cierto, shellinabox trae por defecto un certificado autofirmado, pero lógicamente podemos crear nuestro propio certificado si así tenemos más confianza.
shell> cd /var/lib/shellinabox
shell> openssl genrsa -des3 -out server.key 1024
shell> openssl req -new -key server.key -out server.csr
shell> cp server.key server.key.org
shell> openssl rsa -in server.key.org -out server.key
shell> openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
shell> cat server.crt server.key > certificate.pem
Y con ello podemos conseguir, por ejemplo, que el certificado SSL que nos muestre sea de confianza para nuestro navegador, tras importar los certificados pertinentes, lógicamente.

Para más información acerca del servicio empleado o de cómo usarlo puedes ir a su página oficial o leer la página del manual en cuestión.
Leer más

Deshabilitar los USBs en Linux

No todos los ordenadores con GNU/Linux tienen por que ser para uso personal, sino que puede darse el caso de que tengas la suerte de trabajar con un equipo de empresa que tenga instalado GNU/Linux. Puesto que los datos suelen ser un tema muy importante, y cada vez más, muchas empresas optan por evitar la fuga de información a través de dispositivos USB. Así que, si eres el administrador de estos equipos, lee esta entrada entera, que te podrá ser útil.
La verdad es que es un truco muy sencillo, pero a la vez muy útil, y por supuesto, fácilmente implementable con Salt o Puppet. Deshabilitar los USBs de un equipo es tan sencillo como crear el fichero /etc/modprobe.d/no-usb con el siguiente contenido,
install usb-storage /bin/true
Y tras ello, reiniciar el equipo para que surjan efecto los cambios. Una vez lo hayas hecho, al conectar un UBS tu sistema no lo reconocerá y por lo tanto no se podrá usar.
En realidad lo que acabamos de hacer es forzar la 'no carga' del módulo de manejo de USBs por parte del kernel, con lo que los dispositivos no están habilitados. Esto lo puedes comprobar con un sencillo,
shell> lsmod | grep -i usb
Donde el módulo usb-storage no podrá salir.

Habilitarlo temporalmente

Por supuesto, si eres root y deseas usar el USB en un momento dado, lo puedes hacer recurriendo a la técnica de:
  1. Cargar el módulo
    shell> modprobe usb-storage
    
  2. Usar el USB
  3. Descargar el módulo nuevamente
    shell> modprobe -r usb-storage
    

Otra forma de deshabilitar el USB

Esta forma no es más sencilla de realizar, pero sí más simple de alterar por el usuario si lo sabe, pero aquí la dejo también. Consiste en alterar la línea del Grub que hace referencia a la carga del kernel y agregar el parámetro nousb. Con ello hará que no se carguen los módulos del USB.
kernel /vmlinuz-3.11.0-12-generic ro root=LABEL=/ console=tty0 nousb
Leer más

Empleando pagefile en GNu/Linux

Esta entrada va dedicado a toda aquella gente que viene de sistemas Windows, acostumbrada a tener un fichero de swap en disco y que lo desea seguir manteniendo en GNU/Linux.
Por defecto, cuando se instala un sistema Linux, siempre es aconsejable y muy recomendable crear un partición de tipo swap que el sistema manejará y empleará para dicha tarea de forma automática. Si tienes varias distribuciones instaladas en el mismo equipo, todas podrán compartir dicha partición, por lo que ahorrarás bastante espacio en disco.
Sin embargo, hay veces que puedes decidir no disponer de dicha partición. Por ejemplo, si tu equipo tiene mucha memoria RAM, más de 8Gb, es raro que termines usando la swap, por lo que podrás ahorrarte ese espacio de disco que nunca lo aprovecharás. Claro que siempre terminarás por hacer alguna tarea que requiera de swap, entonces en ese momento estás fastidiado y por suerte, gracias a dd, tendrás la solución al alcance del comando ;-)
La solución no es más que imitar lo que hace Windows con el fichero pagefile.sys, es decir, crear un fichero de tamaño limitado que se empleará dinámicamente de memoria swap. Para ello, y copiando el nombre empleado por Windows para dicho fichero, podemos hacer algo tal que así,
shell> dd if=/dev/zero of=/pagefile.sys bs=4k count=2048M
Con ello acabamos de crear sobre la partición raíz de nuestro sistema un fichero, pagefile.sys, de 2Gb de tamaño. A continuación tendremos que darle formato y emplearlo como memoria swap. Primeramente formateamos,
shell> mkswap /pagefile.sys
Y a continuación lo 'montamos' como memoria swap.
shell> swapon /pagefile.sys
Este sencillo truco lo tuve que usar un par de veces el mi portátil cuando comencé a darle mucha caña, tras seguir las recomendaciones de Optimización de Linux con discos SSD y la verdad es que me pareció muy interesante compartirlo con todos.
Leer más

Controlar actividad de usuarios en GNU/Linux

Una de las cosas más complejas a la hora de administrar un servidor compartido es controlar qué hace cada usuario. Es importante tener y poder saber qué hace cada usuario en su momento, no sin embargo verlo. Esta parte hay que dejarla clara: Poder saber no es lo mismo que saber. Cada usuario en su día a día de trabajo necesita hacer muchas cosas, y que seas root no te da derecho a "espiar" lo que hace cada usuario. Sin embargo, puede darse el caso de que pase algo en el sistema y quieras saber quién fue el responsable de tal fechoría. Para hacer este tipo de análisis, sí que se puedes emplear estas herramientas de auditaría.
Hoy vamos a hablar por lo tanto de acct, una utilidad para la contabilidad de procesos e inicios de sesión en GNU/Linux. Si la tienes que emplear, da mucho juego e información, así que no está demás tenerla como proceso en el sistema. No consume mucho y llegado el momento, puede ser de utilidad.
Lo primero es instalarla. Para ello,
shell> apt-get install acct
O en sistemas Red Hat,
shell> yum install psacct
Tras su instalación, tendremos que arrancar el proceso que lleva el mismo nombre que el paquete. A partir de este momento, acct estará ya recolectando datos para nosotros, así que toca ver la forma de explotar los datos que almacena.
  • ac
    Este comando se encarga de sacar información de tiempo de conexión de usuario al sistema.
    shell> ac -p
       root                  1823.40
       javier                0.00
    
       total     1823.40
    
  • sa
    No muestra un sumario de información relativa a las estadísticas de ejecución de cada usuario.
    shell> sa -u
       -7365568   0.00  cpu    979k  mem  accton
       -7365568   0.00  cpu  26288k  mem  touch
       -7365568   0.00  cpu  26608k  mem  psacct
       -7365568   0.00  cpu    979k  mem  consoletype
       -7365568   0.00  cpu  26528k  mem  psacct       *
       -7365568   0.00  cpu  26608k  mem  psacct
       -7365568   0.00  cpu  28928k  mem  ls
       -7365568   0.31  cpu  27696k  mem  bash
       -7365568   1.41  cpu  17472k  mem  sshd
       -7365568   0.00  cpu   4332k  mem  unix_chkpwd
       -7365568   0.00  cpu   4332k  mem  unix_chkpwd
       -7365568   0.00  cpu  16416k  mem  sshd         *
       ...
    
  • lastcomm
    Muestra todos los comandos que los usuarios han ejecutado en el sistema. Este es el comando más potente, sin dudarlo, ya que permite sacar mucha información o ser muy cotilla, lo que prefiramos.
    A parte del comando ejecutado, también nos indica la fecha, el usuario y dónde se ejecutó.
    shell> lastcomm
       gtbl           root   pts/0   0.00 secs Sun Jun 22 13:48
       sh         F   root   pts/0   0.00 secs Sun Jun 22 13:48
       gzip           root   pts/0   0.00 secs Sun Jun 22 13:48
       gzip           root   pts/0   0.00 secs Sun Jun 22 13:48
       gzip           root   pts/0   0.00 secs Sun Jun 22 13:48
       bash       F   root   pts/0   0.00 secs Sun Jun 22 13:23
       hostname       root   pts/0   0.00 secs Sun Jun 22 13:23
       bash       F   root   pts/0   0.00 secs Sun Jun 22 13:23
       id             root   pts/0   0.00 secs Sun Jun 22 13:23
       sshd      SF   sshd   ---     0.00 secs Sun Jun 22 13:23
       ...
    
    Como veis, información muy valiosa para análisis en caso de desastre.
Por supuesto, estos tres comandos tienen muchas más opciones que permiten extraer o simplificar la información mostrada, así que no dudes en echarle un vistazo a la página man de cada uno.
Leer más

Desfragmentar disco en Linux

Muchas veces la gente que está acostumbrada a emplear Windows, cuando comienza en el mundo de Linux le sorprende que no haya una forma fácil de desfragmentar el disco duro, como hacía en sus épocas Windowseras. La verdad es que siempre se suele decir que los sistemas ext3 y ext4, los más empleados últimamente en el mundo GNU/Linux, especialmente de escritorio, no sufren de fragmentación. Esto es una verdad a medias, o una mentira piadosa, como prefiráis decir. Todos los sistemas de ficheros, al trabajar con ellos se fragmentan y los de GNU/Linux no iba a ser menos. Es cierto, que por el diseño se fragmentan mucho menos, pero algo también sufren.
Pues bien, si sois de lo que preferís tener el sistema siempre muy controlado y os gusta tener el disco perfectamente ordenado e4defrag es vuestra utilidad para sistemas de ficheros extN.
Lo primero es instalarla y en sistemas basados en Debian esta utilidad está dentro del paquete e2fsprogs, así que...
shell> apt-get install e2fsprogs
Tras su instalación, podemos ver el porcentaje de fragmentación que tiene una de nuestras particiones tal que así,
shell> e4defrag -c /dev/mapper/vg0-data
Fragmented files                      now/best     size/ext
1. /data/01 - El big bang.avi         283/1        1869 KB
2. /data/02 - Agujeros negros.avi     234/1        2258 KB
3. /data/04 - Estrellas.avi           215/1        2458 KB
4. /data/08 - Lunas.avi               208/1        2544 KB
5. /data/05 - Planetas.avi            197/1        2688 KB

 Total/best extents                   44846/30877
 Average size per extent              4961 KB
 Fragmentation score                  0
 [0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
 This device (/dev/mapper/vg0-data) does not need defragmentation.
 Done.
Lo que está aquí representado es el resultado de ejecutar el comando en el disco que tiene las "copias de seguridad" de todo aquello que veo y que tras varios años escribiendo y borrando en él, apenas hay fragmentación. Por este detalle es por lo que se suele decir que GNU/Linux no sufre de este tipo de problemas.
Por supuesto, si vuestro sistema presenta más fragmentación o algún tipo de problema, la forma de ejecutar e4defrag es la misma, simplemente sin la opción -c.
shell> e4defrag /dev/mapper/vg0-data
Según el tamaño de los ficheros y el estado del disco, le llevarán un poco más o un poco menos. Al finalizar os presentará las estadísticas y vuestro disco quedará sin la tan temida fragmentación.

Nota: Es recomendable que durante el proceso de desfragmentado se emplee el acceso a disco lo menos posible.
Leer más

Deshabilitar la comprobación de discos en el arranque

Creo que a muchos, por no decir todos los que estemos leyendo esta entrada nos habrá pasado alguna vez, que tras reiniciar un equipo y teniendo prisa en que arranque, éste se pone a comprobar el disco en busca de problemas.
Esta tarea está por defecto en los sistemas de ficheros extN y reiserfs y, lógicamente, si está es por algo. Pero puesto que GNU/Linux es altamente configurable si deseamos que una partición nunca se compruebe, bien por que son muchos datos, bien por que lo hacemos nosotros manualmente, podemos indicárselo. Para ello existe el comando tune2fs.
shell> tune2fs -c0 -i0d /dev/sdXY
Según el manual, las opciones que le pasamos indican lo siguiente:
  • -c max-mount-counts
    Adjust the maximal mounts count between two filesystem checks. If max-mount-counts is 0 then the number of times the filesystem is mounted will be disregarded by e2fsck and the kernel.
  • -i interval-between-checks[d|m|w]
    Adjust the maximal time between two filesystem checks. No postfix or d result in days, m in months, and w in weeks.
    A value of zero will disable the time-dependent checking.
Como veis, en el man de tune2fs se explica el método para deshabilitar, aunque también recomienda no deshabilitarlo, ya que la comprobación del sistema de ficheros es algo importante, ya que garantiza la integridad y la consistencia de los datos.
Failure to do so may lead to filesystem corruption due to bad disks, cables, memory, or kernel bugs to go unnoticed until they cause data loss or corruption.
Así que ya sabéis, si necesitáis evitar que la máquina compruebe el disco tras un reinicio concreto, existen otras formas de hacerlo y si aun así queréis deshabilitarlo, tener presente los problemas futuros que pueda entrañar.
Leer más

Forzar chequeo de disco en reinicio del sistema

Hoy os quiero presentar un truco tan interesante como sencillo. Hay muchas veces que nos interesa forzar un chequeo de disco cuando el sistema se reinicie, pero que por lo que sea, no podemos reiniciarlo en ese momento. Luego lo reiniciamos y se nos olvida de indicárselo en el parámetro del shutdown, con lo que seguimos en la misma.
Para evitar que eso nos suceda, podemos crear un fichero vacío en la raíz del sistema y que se llame forcefsck. Tan simple como eso y conseguiremos que en el próximo reinicio el sistema compruebe los discos, para a continuación borrar automáticamente dicho fichero.
shell> touch /forcefsck
Leer más

Levantar red en inicio del sistema CentOS

Hoy Susi me preguntó por qué una máquina virtual con CentOS no levantaba automáticamente la red como el resto, máquinas Ubuntu. Lo cierto es que a mi esto mismo también me pasó en alguna instalación de CentOS sobre VirtualBox. No se por qué, pero durante la instalación el sistema decide que es mejor que el interfaz de red no se levante cuando la máquina arranca. Pero puesto que trabajando con máquinas virtuales para ofrecer servicios tener levantada la red es algo esencial, vamos a ver qué hacer para que el interfaz de red se levante cuando la máquina arranca.
CentOS tiene la configuración de las tarjetas de red por defecto bajo /etc/sysconfig/network-scripts y ahí, en un fichero de configuración ifcfg-iface, donde iface es el nombre dela tarjeta de red, por eejmplo eth0. Cuando instalas el sistema, si este detecta una tarjeta y se configuró, crea un fichero ifcfg-eth0, por ejemplo, con el siguiente contenido.
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="XX:XX:XX:XX:XX:XX"
NM_CONTROLLED="yes"
ONBOOT="no"
TYPE="Ethernet"
UUID="465985d0-ab5b-..."
El problema de que tras el reinicio del sistema el equipo no levante el interfaz de red radica en este fichero y concretamente en la variable
...
ONBOOT="no"
...
que como podemos observar indica que el interfaz no se levante por defecto en el arranque del sistema. Para solucionarlo, simplemente cambiamos el valor de la variable a yes,
...
ONBOOT="yes"
...
Y en el próximo reinicio ya no deberíamos de tener problemas.
Puesto que me parece algo interesante, mejor compartirlo con todos, pues no creo que nos pase únicamente a nosotros.
Leer más

Explicación de la bomba fork()

Aunque por suerte ya casi todos los sistemas GNU/Linux actuales no se ven afectados por el exploit local que se conocía como la bomba fork(), sí todavía sigue siendo algo de mucho interés: cómo una simple línea capaz de causar una denegación completa de servicio y terminar con los recursos de una máquina.
:(){ :|:& };:
La verdad, es que si vemos la línea tal que así, puede resultar cuanto menos confuso comprender lo que hacer. Es lo bueno de la ofuscación. Así que vamos a desglosarla un poco para poder explicarla, pero sin cambiarle el significado.
bomba_fork() {
   bomba_fork | bomba_fork &
}; bomba_fork
Empleando nombre más descriptivos y usando más de una línea, creo que la cosa ya mejora algo. Esta última función y la anterior son la misma y tiene el mismo efecto, pero una está un poco más clara que la otra y por lo tanto, es más sencilla de explicar.
  • bomba_fork()
    Es el nombre de la función y cómo se define ésta en bash.
    En el código ofuscado, el nombre de la función es ":".
  • bomba_fork
    Es la llamada a la función. Cada vez que escribimos esto, lo que hacemos es una llamada a la función previamente definida y por lo tanto ejecuta lo que hay dentro de la misma.
    Recordar que en el código ofuscado, el nombre de la función es ":".
  • bomba_fork | bomba_fork
    Esta en una llamada a la función y puesto que está dentro de la función es recursiva. Acordaros lo que vimos en el punto anterior, bomba_fork es el nombre de la función, cada vez que la llamemos se ejecuta la función.
    Con el pipe, "|", lo que conseguimos es que en cada llamada a la función se llame a la misma dos veces.
  • &
    Esto hace que la función quede en segundo plano y no se muera, consumiendo recursos de la máquina.
Quizás así ahora esté ya más claro de por qué este código tan simple hace tanto daño. Como vemos, consume recursos infinitamente hasta que estos se agotan, ya que las llamadas recursivas nunca terminan.
Leer más

Ocultar los procesos a usuarios

En el último artículo de Debian Administration leo un sorprendente post que habla sobre cómo esconder los procesos a usuarios sin privilegios, mediante un parámetro presente desde el kernel 3.2.
Para hacer este tipo de protecciones la única forma que existía con antelación era emplear utilidades y parches aplicados en el kernel. Por suerte, con las últimas versiones del kernel de Linux, esto ya lo podemos hacer de forma nativa e inmediata, lo cual facilita, y mucho, el trabajo a la hora de proteger y ocultar datos a los administradores de sistemas.

¿Cuándo emplear este truco?

En los equipos de sobremesa habituales, desde luego no tiene sentido hacer este tipo de filtros, pues no es necesario ocultar los proceso de otros usuarios; entre otras cosas, suelen ser mono-usuario.
En servidores, quipos compartidos por varios usuarios a la vez (GNU/Linux es multi-usuario de verdad!) o equipos en los que se están a ejecutar procesos críticos, pues quizás sí tenga más sentido ocultar los procesos que no son del propio usuario. Por qué el usuario X tiene que saber lo que está a ejecutar el usuario Y. Si no interesa que lo sepa, empleamos este truco y listo.

Cómo configurar esta nueva utilidad del kernel

La nueva utilidad descrita está basada en un parámetro, hidepid, que se le pasa como parámetro de montaje a la partición /proc. Los posibles valores que puede tomar son:
  • 0 - Valor por defecto del sistema. Todos los usuarios pueden ver todos los procesos.
  • 1 - Esta opción ya ofrece algo de restricción a lo que un usuario normal puede ver. Ante la salida estándar de "ps aux", por ejemplo, no se pueden ver procesos de otros usuarios, pero bajo /proc todavía puede ver estos procesos.
  • 2 - Esta es la opción más restrictiva. Un usuario normal no puede ver nada que otros estén ejecutando ni siquiera accediendo a la carpeta /proc. Todo está oculto para él.
Y la forma de emplearla es, en tiempo real y sin hacer nada, volver a montar la partición /proc, pasándole como parámetro esta nueva opción.
shell> mount -o remount /proc --options=hidepid=2
Al realizarlo, el cambio es inmediato y según el valor que le pasemos, dentro de los posibles, veremos el resultado en usuarios sin privilegios de root. Por ejemplo, si ejecutamos la línea que os acabo de indicar, cualquier usuario que no tenga permisos dejará de ver todos aquellos procesos que no sean suyos y para él, el servidor sólo ejecutará cosas suyas.
Si nos interesa emplear esta funcionalidad de forma permanente, tendremos que aplicar el cambio en el fichero /etc/fstab y añadir la opción comentada a la partición /proc, tal como sigue.
proc   /proc   proc   defaults,hidepid=2   0   0
Las diferentes salidas se muestran a continuación. La primer, en ejemplo de lo que ve un usuario sin privilegios antes de bloquearle el acceso a los procesos que no son suyos,
javier@shell> ps aux
USER      PID %CPU %MEM   VSZ   RSS TTY  STAT START   TIME COMMAND
root        1  0.0  0.0  2776  2864 ?    Ss   mar12   0:00 /sbin/init
root        2  0.0  0.0     0     0 ?    S    mar12   0:00 [kthreadd]
root        3  0.0  0.0     0     0 ?    S    mar12   0:00 [ksoftirqd/0]
root        4  0.0  0.0     0     0 ?    S    mar12   1:22 [kworker/0:0]
root        5  0.0  0.0     0     0 ?    S<   mar12   0:00 [kworker/0:0H]
root        7  0.0  0.0     0     0 ?    S    mar12   0:00 [migration/0]
...
Y a continuación, el mismo usuario una vez pasada la opción hidepid=2.
javier@shell> ps aux
USER      PID %CPU %MEM  VSZ   RSS TTY  STAT START   TIME COMMAND
javier   2589  0.0  0.0 3352  7876 ?    Ssl  mar12   0:00 x-session-manager
javier   2649  0.0  0.0 4444   500 ?    S    mar12   0:00 /usr/bin/dbus...
javier   2650  0.0  0.0 1856  2048 ?    Ss   mar12   0:09 //bin/dbus-...
javier   2661  0.0  0.0 9360  2548 ?    S    mar12   0:00 /usr/lib/x86...
javier   2665  0.1  0.2 3284 17076 ?    S    mar12   5:12 xfwm4
javier   2669  0.2  0.2 2584 20508 ?    Sl   mar12   7:34 xfce4-panel
...
Sin dudarlo, una opción muy interesante para equipos compartidos que debería de estar presente en muchos, por no decir todos los servidores de producción. 

Referencia: debian-administration.org
Leer más

Cambiar disco fallido en RAID software (mdadm)

mdadm es un método de implementar a nivel software las facilidades del RAID a nivel hardware. Aunque en la actualidad, especialmente los servidores de producción, suelen traer todos consigo la posibilidad de crear diferentes tipos de RAID hardware, es cierto que pueden no traerlo. En ese caso y como proteger nuestros datos (y por lo tanto la disponibilidad de los mismos) debería de estar por encima de todo, la opción de tener disponible una solución de RAID puede resultar francamente útil y para hacerlo está mdadm.
mdadm crea el RAID, pero no evita que un disco pueda fallar. Sí tenéis una salida similar a la siguiente,
shell> mdadm -D /dev/md0
/dev/md0:
        Version : 00.90.00
  Creation Time : Thu Ene  2 12:27:05 2014
     Raid Level : raid1
     Array Size : 64128 (62.63 MiB 65.67 MB)
    Device Size : 64128 (62.63 MiB 65.67 MB)
   Raid Devices : 2
  Total Devices : 1
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Tue Ene  2 18:54:59 2014
          State : active, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           UUID : 40e3ae0f:fd3ef12a...
         Events : 0.91

Number  Major  Minor  RaidDevice  State
0       0      0      0           faulty removed
1       8      1      1           active sync   /dev/sda1
querrá decir que uno de los discos que compone el RAID ha fallado. Como se puede observar, hay dos discos en el RAID y uno de ellos ya no está presente (/dev/sdb1).
La solución ahora pasa por marcar el RAID como fallido, cambiar el disco y volver a reconstruir el RAID nuevamente. Para hacerlo, os dejo aquí los pasos.
  • Indicamos al RAID que la partición ha fallado
    shell> mdadm --manage /dev/md0 --fail /dev/sdb1
    
  • Eliminamos la partición de RAID
    shell> mdadm --manage /dev/md0 --remove /dev/sdb1
    
  • Apagamos el equipo y cambiamos el disco
  • Replicamos estructura del disco sda al nuevo disco sdb
    shell> sfdisk -d /dev/sda | sfdisk /dev/sdb
    
  • Incluimos en nuevo disco en el RAID
    shell> mdadm --manage /dev/md0 --add /dev/sdb1
    
  • Esperamos a que sincronicen los datos (según el tipo de RAID)
    Durante este tiempo se puede trabajar perfectamente con el equipo, aunque irá un poco más lento, probablemente.
Si algún día lo tenéis que usar, espero que os sea de ayuda y sino, mejor que mejor.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios