Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

miércoles, 27 de julio de 2016

Obteniendo información del hardware con dmesg en Linux

En más de una ocasión he mencionado en este blog el hecho de que la información es poder, y es por ello que los logs cada día cobran más importancia... Generalmente cuando he hablado de logs, éstos han hecho referencia a eventos relacionados con ciertos servicios del sistema o con alguna conexión de red ¿Pero que pasaría si deseásemos buscar información y/o eventos relacionados con el hardware? Visitando los logs más habituales como podrían ser /var/log/syslog veremos que no siempre hay información, pues el syslog generalmente únicamente muestra los mensajes de error más críticos relacionados con el kernel, pero nada referente a errores "menores"; con lo que... ¿Donde podemos encontrar la tan ansiada información? Es aquí donde entra en juego un comando de gran relevancia y que en muchos casos es olvidado: dmesg.

dmesg_portada

Dmesg está diseñado principalmente para escribir los mensajes recibidos desde el kernel en un formato de salida legible para los humanos... El kernel es lo primero que se carga en el sistema operativo pues el núcleo que comunica el hardware con el software... Tras esto arrancaría el init (Sys V, systemd, etc...) e irían los siguientes procesos, pero el kernel siempre sería lo primero en arrancar. Obviamente dicho arranque deja ciertos mensajes grabados en un lugar llamado ring buffer, desde el cual dmesg extraería la información más adelante...

La información que se podría extraer inicialmente desde dicho buffer estaría relacionada con los mensajes generador por el kernel durante el arranque; cosa que principalmente implicaría la detección del hardware y el arranque de ciertos drivers... Pero eso no quedaría ahí... Cualquier nuevo evento relacionado con hardware como por ejemplo problemas de conexión de nuevos USBs, conexión de puertos COM, etc... También quedaría grabado dentro del buffer, siendo una valiosísima fuente de información, pues podría ayudarnos a depurar problemas de comunicación entre software y hardware.

Los mensajes del kernel se guardan en dos lugares: /var/log/kern.log y en el comando dmesg. El primero tendría todos los mensajes guardados hasta ahora, a excepción de los relacionados con la sesión actual que no se volcarían dentro de dicho fichero hasta reiniciar el sistema. La información más actual se obtendría mediante el comando dmesg, que se podría escribir sin parámetro alguno; es decir que bastaría con hacer:

dmesg

El problema del comando dmesg es que si bien plasma los eventos con bastante precisión, las fechas de dichos eventos no son mostradas de una forma demasiado amigable, pues lo muestra en un formato legible para el kernel, no para los simples mortales... Eso de por sí puede ser un problema, ya que si bien luego más adelante la información guardada en kern.log sí que muestra una fecha legible, el reiniciar el equipo simplemente para tener una fecha legible no es factible; es por eso que lo mejor es optar por un parámetro al que en mi opinión todo el mundo le saca mucho partido llamado -T (Time Stamp). Además, si habéis probado el comando "a pelo" veréis que la cantidad de mensajes mostrados es realmente abrumadora, así que lo más recomendable sería ir mostrando los mensajes progresivamente mediante la ayuda del comando less... Es por ello que el comando dmesg ideal que mezclaría precisión y legibilidad sería:

dmesg -T |less

Si en cambio deseásemos hilar más fino y quisiésemos buscar información más concreta como podrían ser eventos relacionados con los puertos serie o puertos USB, lo ideal sería combinar este comando con nuestro filtro favorito: grep. Gracias a dicho filtro podríamos buscar únicamente las líneas que tuviesen eventos relacionados con USB o con el puerto serie; este último es referenciado en Linux como ttySx.

dmesg -T |grep -i ttyS |less

A partir de aquí uno tendría que ver hasta que punto desea hilar, pero es innegable que este comando nos puede sacar de más de un problema de comunicación con el hardware, además de otros eventos derivados de éste.

Espero que os haya resultado útil.

Saludos.

sábado, 23 de julio de 2016

El comando dd y sus posibilidades en Linux

Hola a todos, tras unos días un poco ajetreados en los que me ha sido difícil encontrar hueco para escribir, hoy por fin os vengo con un nuevo post; en esta ocasión quiero hacer referencia a un comando bastante curioso al que se le puede sacar un partido más que considerable en Linux, ya sea en servidores o en entornos de escritorio: Se trata de la herramienta dd, conocido también con Dataset Definition.

CDROM_dd

La herramienta dd es de lo más versátil, pues permite manipular discos y/o particiones con mucha facilidad; ya sea para volcar datos de un sitio a otro, para transformar un CD-rom en ISO (o viceversa) o simplemente para borrar los datos de un disco duro de forma "segura". Si bien la sintaxis varía ligeramente en algunos casos especiales, la estructura general del comando dd es tan sencilla como hacer lo siguiente:

dd if=dispositivo_origen |pv|dd of=dispositivo_destino

Se podría ejecutar sin necesidad de usar |pv|dd, pero el agregar dichos parámetros hacen que la experiencia de usuario final sea más agradable, pues permiten saber el % de progreso del proceso dd... El uso del comando "a pelo" únicamente ejecutaría la operación; es decir que no sabríamos el estado de esta, pudiendo estar durante varios minutos esperando a que la acción se finalizase y sin conocer el estado de la operación ni el tiempo restante de esta... Es por ello que es recomendable agregar ambos parámetros, si bien no es una obligación.

Uno de los usos más básicos que podemos hacer gracias a este comando sería la clonación de discos... Imaginemos que tenemos dos discos duros; uno lleno y con información valiosa y otro vacío. Podemos recurrir a herramientas de terceros tales como Clonezilla ¿Pero para qué hacerlo pudiendo recurrir a la propia shell de Linux? El comando para volcar el contenido de un disco duro en otro sería tan simple como:

dd if=/dev/sdb |pv|dd of=/dev/sdc

Obviamente dependiendo del tamaño del disco, la velocidad de clonado variaría... Además dd también nos permitiría realizar volcado de datos por particiones y no por discos; lo cual sería exactamente lo mismo que lo anterior, con la diferencia de que especificaríamos el número de partición en vez del disco entero; algo como:

dd if=/dev/sdb1 |pv|dd of=/dev/sdc

El proceso también puede hacerse al revés; es decir que también podría hacerse un volcado desde un disco entero a una partición.

Por otro lado tendríamos una de las funcionalidades más conocidas y más "jugosas" que ofrece el comando dd... Generalmente para realizar una ISO, es necesario recurrir a programas de terceros que, si bien generalmente funcionan, no dejan ocupar espacio en el disco duro, espacio que nunca está de más ahorrar... Es por ello que teniendo nuestro creador de isos instalado por defecto en el sistema, ¿Por qué recurrir a otro? Más aún cuando el comando es realmente sencillo:

dd if=/dev/cdrom |pv|dd of=/tmp/mi_iso.iso

Al recibir como entrada un CD ROM y al poner como salida un archivo .iso; el programa de por sí ya es capaz de realizar la conversión de forma adecuada... Cosa que viene muy bien cuando por ejemplo quieres hacerte un liveUSB que te pide que especifiques la iso; o cuando quieres usar dicho CD constantemente y prefieres tener una imagen de disco con el fin de no rallar dicho CD.

Como veis todo se basa en volcados; simplemente se especifica un origen y un destino, sin importar qué hay en cada lado, pues dd simplemente lo volca... Esto obviamente nos permite hacer otras cosas... Una de ellas que en mi opinión es realmente interesante es el borrado seguro de discos duros. Cuando un disco duro se obsoleta, ya sea por que es viejo o por falta de capacidad... El tirarlo sin más o tirarlo tras simplemente formatearlo puede ser peligroso... A modo de recomendación diría que lo mejor sería romper el disco a base de taladro, martillo y fuego, pero en caso de no querer ponernos tan extremos, podemos intentar al menos dificultar lo mejor posible la recuperación de datos del disco duro. Ya en su día mostré en este blog cómo eliminar archivos de forma segura con shred pero el problema de dicha opción es que está orientada a borrados individuales y puntuales... En este caso vamos a optar por algo más global y, dicho sea de paso, peligroso dependiendo de qué queramos borrar, pues una vez borrado será muy difícil recuperarlo, y sin garantías de que conserve su integridad.

Existen una serie de "dispositivos" que no son tales sino que tienen funciones especiales y que aparecen dentro del directorio /dev/. Esos dispositivos, por llamarlos de alguna forma se llaman:

/dev/zero
/dev/random

Estos dos dispositivos están preparados para trabajar junto con dd y tienen la siguiente característica. El primero está lleno de bits con valor 0 que machacarían los bits existentes en el disco con ceros... Supuestamente hay empresas especializadas que pueden solventar dicho machaque de ceros y ver el contenido real, es por ello que el dispositivo random puede ser más interesante... El dispositivo random, sobrescribe el contenido del disco duro con bits aleatorios, haciendo que el contenido original sea sobrescrito con bits ficticios... Haciendo que el proceso de recuperación de datos sea muy difícil y haciendo está opción muy interesante que sería:

dd if=/dev/random |pv|dd of=/dev/sdb

Lo ideal con estos procesos suele ser que se repitan varias veces con el fin de estar completamente seguros de que la información es irrecuperable. Como amante de los scripts que soy, he realizado uno pequeño que simplemente cogería como argumento el número de pasadas; algo como:

  1. #!/bin/sh
  2. if ! [ "$1" -eq "$1" ] 2>/dev/null
  3. then
  4.         echo "Solo valen numeros enteros"
  5.         exit
  6. fi
  7. if [ $1 -lt "1" ]then
  8.         echo 'Por favor introduzca un valor mayor que 0'
  9. elif [ $1 -ge "1" ]then
  10.         i=1
  11.         while [ "$i" -le "$1" ]
  12.         do
  13.                 echo "Borrado numero $i"
  14.                 dd if=/dev/random |pv|dd of=/dev/sdb
  15.                 i=$[$i+1]
  16.         done
  17. fi

Como podéis ver dd es un comando de lo más útil que puede realizar múltiples tipos de volcado que pueden servirnos para diferentes ocasiones.

Espero que os haya resultado útil.

Saludos.

miércoles, 13 de julio de 2016

/etc/skel; ¿Qué es y qué podemos hacer con él?

El mundo de Linux es muy basto y adentrarse en cada una de sus características no es tarea fácil; en más de una ocasión podemos ver una serie de ficheros y directorios que, sabemos que están, pero que no sabemos qué hacen... Somos conscientes de que cada fichero o directorio cumple su labor, pero no sabemos qué función pueden cumplir o qué pasaría en caso de que éstos, por el motivo que sea, acabasen corruptos. Uno de esos directorios que pueden pasar inadvertidos es el directorio skel. ¿Qué hace y por qué se encuentra dentro del directorio etc? Puede parecer un fichero poco llamativo, pero cumple una función crucial relacionada con el comando adduser. La generación de unos ficheros y directorios pre-definidos para cada nuevo usuario.

carpeta_skel

Para entenderlo bien, lo mejor sería revisar el fichero de configuración de adduser; llamado /etc/adduser.conf. Dicho fichero de configuración establece las directivas que tiene que seguir el comando adduser cada vez que se añade un nuevo usuario... Es decir que con dicho fichero podemos modificar su comportamiento. Si observáis bien el contenido del fichero en cuestión veréis la siguiente línea:

SKEL=/etc/skel

Dicha línea se encarga de definir qué directorio servirá de "plantilla" para el contenido del directorio home de cada nuevo usuario que vayamos generando. La mejor forma de comprobarlo sería ejecutando un pequeño comando sobre el directorio skel tal que así:

ls -la /etc/skel

Con dicho comando haríamos un listado detallado del contenido del directorio, incluyendo los ficheros ocultos (cuyo nombre empezaría por .), que son los que generalmente van incluidos en todo directorio home, que serían los ficheros: .profile, .bashrc y .bash_logout.  Esto de por sí nos viene muy bien, pues supongamos que queremos que todo nuevo directorio home incluya un script que, por ejemplo, expulse al resto de usuarios que no sean ellos. se podría incluir un script con el nombre expulsor.sh con el siguiente contenido:

  1. #!/bin/bash
  2. $(who |grep -v $(whoami) |awk '{print $2}' > /tmp/resto.txt)
  3. while read SESION
  4. do
  5.         sudo pkill -9 -t ${SESION}
  6. done < /tmp/resto.txt

Al script en cuestión, por cuestiones de seguridad, haríamos que únicamente pudiese ser leído y ejecutado por el nuevo usuario pero que nadie más tuviese acceso a éste, lo cual traducido en permisos quedaría como:

chmod 500 /etc/skel/expulsor.sh

Ahora quedaría la "prueba de fuego": Basta con crear un nuevo usuario mediante el comando adduser con el fin de ver nuestro nuevo script incluido automáticamente dentro del directorio home. En mi caso en concreto he creado un usuario nuevo llamado skeletico, para después consultar el contenido del nuevo directorio home.

nuevo_usuario

Ahora cada nuevo usuario sería capaz de "expulsar" al resto de usuarios de sus sesiones activas, siempre y cuando (obviamente) tenga permisos de superusuario.

Como podéis ver, skel puede servirnos como un poderoso generador de plantillas para los nuevos usuarios que creemos, evitándonos tener que hacer tareas duplicadas y ahorrándonos un tiempo considerable; especialmente si hablásemos de un número alto de nuevos usuarios.

Espero que os haya resultado útil.

Saludos.

lunes, 11 de julio de 2016

Cómo crear nuestra propia wiki en Linux con DokuWiki

Hoy quiero traeros un recurso que, en mi opinión puede resultarnos realmente útil dentro de empresas pequeñas, departamentos, grupos de trabajo, etc... A nivel de documentación. La información es un recurso cada vez más valioso y es muy común que diferentes personas tengan diferentes campos de conocimiento que, si bien a veces quieren compartir, no pueden debido a falta de tiempo... Dicha compartición de conocimiento generalmente quiere hacerse por escrito y de una forma que. obviamente, sea de fácil acceso para todos... A veces un simple documento de texto es suficiente, pero otras se quiere implantar un recurso más accesible o más "profesional"... Es por eso que en muchas ocasiones una wiki interna es la mejor solución; solución que vengo a explicaros en el día de hoy.

Dokuwiki_logo

Crear nuestra propia wiki es mucho más sencillo de lo que parece gracias a las herramientas de las que disponemos en la actualidad... Hay una variedad bastante extensa hoy en día pero me he decantado por una de ellas en particular que me ha llamado más la atención: DokuWiki. Esta wiki es muy sencilla de implantar y requiere de unos pocos requisitos para funcionar en nuestro sistema; dichos requisitos serían que tuviésemos apache2 y php instalados, junto con una librería de php y un módulo de php... Todo esto se puede instalar desde los propios repositorios del sistema operativo con lo que la instalación es tan simple como introducir el comando de a continuación:

apt-get install apache2 php5 libapache2-mod-php5 php5-gd

El motivo de esto es que DokuWiki funciona sobre php con el fin de que pueda ser accedido vía web desde cualquier punto... Con los preparativos listos, lo que haremos a continuación será descargarnos el archivo DokuWiki que contendrá todo el contenido web en su interior; este archivo no está disponible en los propios repositorios así que no queda otro remedio que descargarlo directamente desde su página oficial mediante el comando curl o wget.

curl -O "http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz"

Esto nos descargará un fichero comprimido en formato tgz que deberemos descomprimir gracias al comando tar, que tendría esta estructura:

tar -xf dokuwiki-stable.tgz

Esto nos tiene que dar como resultado una carpeta; carpeta en la que no tendremos que entrar para nada pues ya contiene todos los ficheros php preparados para funcionar... Aún así, lo que sí que es necesarios es asignarle la propiedad y permisos adecuados para que el sistema pueda manipular/consultar el contenido de la carpeta adecuadamente... Carpeta que tendrá que encontrarse SIEMPRE dentro del directorio /var/www/; directorio que almacena todo lo relacionado con el contenido web. Para cubrir todos esos puntos tendríamos que realizar el siguiente procedimiento:

  1. mkdir /var/www/html/dokuwiki
  2. cp -R dokuwiki-2016-06-26a/* /var/www/html/dokuwiki/
  3. chown -R www-data:www-data /var/www/html/dokuwiki/
  4. chmod -R 755 /var/www/html/dokuwiki/

Ya tenemos todo preparado, con lo que acceder a la web es tan sencillo como escribir en cualquier navegador que queramos la URL: ip_servidor/dokuwiki; pero antes de usarla, habría que empezar configurando ésta, pues sino no podríamos usar la wiki en condiciones. Para ello tendríamos que acceder primero a la URL: ip_servidor/dokuwiki/install.php

install_dokuwiki


Es importante rellenar todos los parámetros; incluyendo el e-mail que debe ser una válido, pero en mi opinión lo más importante de esta sección es la licencia, pues establece bajo qué tipo de licenciamiento ha sido publicada la información de la wiki. Se puede también escoger no mostrar dicho dato, pero si se quiere hacer que la wiki sea pública, lo más recomendable sería dejar claro dicho dato para evitar malentendidos. Un buen ejemplo sería usar la licencia GNU, pues esta licencia garantizaría el uso, modificación y divulgación de la información, aunque obviamente cada uno es libre de escoger cualquier otra licencia.

Con la wiki preparada, ya tendríamos libertad total para usar la wiki a nuestro antojo; ya sea para subir información o para modificar algunos parámetros de su configuración, teniendo una wiki personalizada que estaría a nuestra entero control.

Espero que os haya resultado útil.

Saludos.

martes, 5 de julio de 2016

Cómo usar claves privadas Linux en PuTTY

En numerosas ocasiones he hablado sobre la utilidad del protocolo SSH en este blog; pues nos permite gestionar de forma muy cómoda y eficiente un sistema Linux remotamente aún estando éste a miles de kilómetros de distancia. Obviamente el acceso mediante dicho protocolo es muy codiciado por cybercriminales y es por ello que es altamente recomendable usar varias medidas de seguridad tales como cortafuegos, claves públicas y privadas y/o honeypots. Cada uno tiene sus ventajas y desventajas y generalmente se suele aplicar diferentes combinaciones para adaptarse lo mejor posible a las necesidades reales de cada situación... Hoy quiero centrarme en una de esas medidas en concreto: Las claves públicas y privadas. El uso de estas es cada vez más extendido, pero cualquiera que haya trabajado con éstas se habrá encontrado con un pequeño problema; y es que las claves privadas creadas en Linux no pueden funcionar en PuTTY (Herramienta para acceder por ssh desde Windows) ni viceversa... Entonces cual es la solución... ¿Crear dos claves públicas y privadas para que pueda accederse desde diferentes sistemas operativos? Hoy vengo a contaros como solventar ese pequeño, pero significativo problema.

Linux&putty

Para ello lo primero que habría que hacer sería crear un par de claves, pública y privada, SSH en Linux; dichas claves pueden tener diferente tipo de cifrado y/o longitud, pero a modo de recomendación personal es preferible que tengan cifrado rsa y que sean del mayor tamaño posible; es decir de 4096 bytes. Esto puede parecer complicado pero la verdad es que todo se resume en un solo comando:

ssh-keygen -t rsa -b 4096

Esto creará dos claves, una pública y una privada; clave privada que además podemos proteger con una contraseña, lo cual es muy recomendable y que podemos hacer durante el proceso de creación de la clave, pues ssh-keygen preguntará por una contraseña para proteger la clave privada; en caso de escoger no usar contraseña alguna dejaríamos dicha contraseña en blanco, en caso contrario deberíamos usar una clave de una longitud superior a 4 caracteres...

La ejecución exitosa del comando creará dos ficheros dentro del directorio .ssh del directorio home del usuario que ha ejecutado el comando; un fichero contendría la clave pública y otro sería la clave privada. La clave pública puede usarse en cualquier sitio para cualquier usuario pues sería algo así como un candado que no podría abrirse a menos que se tuviese la llave... La clave privada en cambio es algo que habría que guardar con cuidado, pues se trataría de la llave que abriría dichos candados, con lo que sería recomendable ser cuidadoso con ella. Las claves tendría la nomenclatura: id_rsa.pub, que sería la pública; y id_rsa para la privada... Para poder hacer uso de nuestro "candado", tendríamos que aplicarlo en el usuario que nosotros queramos proteger; dicho proceso consistiría en volcar la clave pública dentro del fichero authorized_keys, dentro del directorio .ssh del usuario en cuestión; esto es tan sencillo como hacer:

cat id_rsa.pub >> ~/.ssh/authorized_keys

Con el proceso finalizado, solamente con tener el fichero id_rsa dentro del directorio .ssh del usuario con el que nos queremos loguear, podríamos loguearnos desde Linux, pero ese no es el objetivo de este articulo; lo que queremos es aprovechar la clave privada para que sea válida para PuTTY... Para ello lo primero que habría que hacer sería descargarse el clave privada generada mediante algún método de transferencia de archivos... Teniendo en cuenta que probablemente se esté ejecutando Windows en la máquina en la que tengamos instalado PuTTY, podríamos usar Filezilla, pues permite realizar conexiones vía FTP o SFTP... Con únicamente conectarnos al puerto SSH (por defecto 22) del servidor por Filezilla mediante el protocolo SFTP, podríamos descargarnos el fichero...

Teniendo la clave privada bajo nuestro poder, veremos que esta clave no puede ser usada en Filezilla como una clave privada "normal", pues PuTTY solamente reconoce claves privadas en formato ppk... Es por eso que antes de usarla tendremos que hacer dicha clave "legible".

Como supongo que ya sabréis, PuTTY posee un generador de claves públicas y privadas llamado PuTTYgen. Dicho generador de claves es el usado para generar claves, pero no solo eso, sino que además puede importar claves "ajenas" y leerlas en caso de que contengan una clave legible, aún sin encontrarse en formato ppk; para ello lo que haríamos sería abrir PuTTYgen para después clickar en Conversións --> Import Key.

Convertir_clave

En caso de que la clave tenga una contraseña habría que introducirla primero para que la aplicación fuese capaz de reconocer su contenido, tras lo cual la aplicación cobraría una aspecto parecido a éste:

clave_importada

Con únicamente clickar el botón "Save private key" obtendríamos una clave privada en formato ppk, perfectamente legible para PuTTY, pudiendo ser usada en entornos Windows sin complicación alguna y evitando así el uso de claves innecesarias.

Como podéis ver el proceso de conversión de claves es realmente sencillo y gracias a dicha conversión usaremos menos claves públicas/privadas, mejorando la seguridad del servidor y haciendo que nos tengamos que preocupar únicamente por la seguridad de una clave privada y no de varias.

Espero que os haya resultado útil.

Saludos.