Información blog

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

domingo, 30 de agosto de 2015

Cómo usar Wireshark sin ser root

En esta ocasión vengo a hablaros sobre una de las herramientas favoritas de todos aquellos que se interesan por el mundo de las redes: Wireshark. Esta herramienta es mundialmente famosa, y ya he mostrado algunos usos de ésta realizando análisis de red; además al ser usada en sistemas Windows y Linux, el uso de ésta es enormemente popular en todos los ámbitos. Aún así hay algunas pequeñas diferencias al usar esta magnifica herramienta, ya que mientras que en Windows se trata de un simple instalar y ejecutar el programa, en Linux no es tan sencillo debido a las restricciones que el sistema impone debido a los permisos que uno posee para ejecutar este programa... Si uno tratase de ejecutar el programa, en efecto podría abrirlo, pero no sería capaz de seleccionar la interfaz de red en la que desea "escuchar", ya que el usuario y la aplicación en cuestión no están capacitados para realizar las tareas pertinentes. Para resolver ese pequeño problema existen dos opciones: Ejecutar la aplicación desde la consola como root (cosa peligrosa y que los desarrolladores de Wireshark NO recomiendan) o preparar wireshark para que alguien que no sea root pueda usar la aplicación con tan solo clickar en su icono, sin maniobras ni procedimientos "extraños". En este post me centraré en la segunda opción, ya que es la más práctica y segura de los dos.

logo_wireshark

Este procedimiento es relativamente sencillo y la mayor parte de éste se tendrá que hacer una única vez, ya que los cambios que realizaremos serán de caracter permanente y no será necesario repetirlo en el futuro. Para ello habrá que recurrir a la consola de Linux como root y comenzar comprobando si existe el grupo llamado wireshark... Para ello habría que recurrir a un comando muy sencillo que comprobaría dicha existencia y que en caso de que no existiese lo crearía; dicho comando sería:

  1. groupadd wireshark

Con este punto resuelto, habría que realizar un pequeño cambio en el fichero /usr/bin/dumpcap; este fichero es el encargado de "capturar" el tráfico de red y por defecto está diseñado para que pertenecer al usuario root y al grupo root... Esta es una de las principales causas por las que un usuario normal es incapaz de usar wireshark como es debido por defecto, con lo que habría que hacer que este fichero perteneciese a otro grupo; concretamente al grupo wireshark... Para lograr dicho objetivo habría que recurrir al comando chgrp de la siguiente forma:

  1. chgrp wireshark /usr/bin/dumpcap

Desgraciadamente, este pequeño cambio no es de por sí suficiente, ya que aunque el fichero de por sí no está preparado para que alguien que NO sea administrador, sea capaz de analizar la red... Afortunadamente esto puede resolverse fácilmente mediante un comando que únicamente ocupa una línea:

  1.  setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap

Gracias a esto ya tendríamos todos los preparativos realizados a falta de un último paso que debería repetirse para todos los usuarios que deseemos que sean capaces de usar wireshark. ¿Recordáis cómo hemos hecho que dumpcap pertenezca al grupo wireshark? Bien, ahora es el turno de hacer que nuestros usuarios pertenezcan también a dicho grupo para que puedan ejecutar el fichero dumpcap sin restricciones. Esto se logra usando el comando usermod que os dejo a continuación, teniendo en cuenta que $USER es una variable que coge el nombre del usuario que tiene la sesión iniciada... En caso de ejecutar este comando con otro usuario o querer hacer esta tarea para todos los usuarios como root, lo mejor sería sustituir dicha variable con el nombre del usuario en cuestión:

  1. usermod -a -G wireshark $USER

El cambio en cuestión ya nos capacitaría para que poder usar wireshark, si bien es necesario reiniciar el equipo o cerrar sesión para que el cambio sea efectivo... Esto es debido a que la sesión de escritorio actual está iniciada teniendo en cuenta que el usuario que tiene iniciada ésta, todavía no pertenecía al grupo wireshark cuando se inició la sesión; con lo que hasta que éste no vuelva a iniciarla no podrá ejecutar la aplicación con libertad.

Como veis el procedimiento es bien sencillo... Lo único que habría que tal vez habría que volver a usar de nuevo en el futuro sería el comando usermod, con el fin de que los nuevos usuarios tengan permisos para ejecutar esta excelente aplicación.

Saludos.

viernes, 28 de agosto de 2015

Los anuncios Flash serán bloqueados en chrome a partir del 1 de Septiembre

Flash lleva tiempo de capa caída (con razón en parte); tras diferentes críticas sufridas por diferentes empresas y el enorme escándalo que hizo que Firefox bloquease Flash Player, ahora llega otro evento que hará que Flash vaya perdiendo relevancia paulatinamente y que los desarrolladores tomen más en serio el uso de HTML5; pues ahora los anuncios creados mediante Flash serán bloqueados por defecto en Chrome, teniendo que verificarle al navegador que en efecto deseamos ver dicho anuncio. Esto no significa que los vídeos o audios "normales" (es decir, los que no sean considerados como anuncios) no puedan ser ejecutados con normalidad; si bien este pequeño detalle supone un golpe más para el ya maltrecho Flash. 

Portada_chrome
Los motivos de Google son simples: Desean reducir el consumo de batería que supone la reproducción de un contenido basado en Flash en su navegador; pues al parecer el consumo que realiza este servicio es exageradamente alto. El otro motivo está relacionado con la seguridad del usuario final, ya que al parecer los anuncios basados en esta tecnología pueden contener malware peligroso para el usuario final; y teniendo en cuenta las cada vez mayores amenazas existentes nunca está de más fortificar la seguridad del navegador en cuestión. 

Este bloqueo no será obligatorio, pero sí que estará por defecto establecido en el navegador, con lo que la mayoría de los usuarios tendrán la alternativa de querer ver el anuncio o no. ¿Y quien quiere ver específicamente la publicidad? Aún así, siempre podemos eliminar esta restricción alterando las preferencias de nuestra navegador, para lo cual nos dirigiríamos a "Configuración --> Mostrar configuración avanzada --> Configuración del contenido" y activaríamos la opción  "Ejecutar todo el contenido importante de complementos" en vez de la seleccionada por defecto, que sería "Detectar y ejecutar el contenido importante de complementos". 

Complementos

Lo más relevante con respecto a esta noticia es que, por un motivo u otro, ya hay otro aspecto de Flash que ha sido bloqueado por otro navegador; suponiendo otro clavo en el ataúd de Flash... ¿Será ésta otra señal del fin inminente de Flash? ¿O tal vez éste resurja de sus cenizas y vuelva a ser considerado como una alternativa "Válida"? 

De momento el escenario que se le presenta es realmente oscuro, pero todavía es demasiado pronto para saber como acabará todo ésto. Aún así es innegable que con esto ya existirá otro motivo para optar por HTML5.

Saludos.

jueves, 27 de agosto de 2015

Controlando la rotación de logs con logrotate

Uno del los aspectos más fundamentales a la hora de monitorizar un sistema o mantener un cierto control sobre éste, es el control de los ficheros de log del sistema... Estos ficheros son fundamentales en nuestro sistema, ya sea para solventar incidencias o para comprobar si algún fichero ha tenido algún comportamiento inesperado. Aunque la información de estos logs es muy importante, hay otro factor casi tan importante que dicha información: La gestión de éstos. Imaginemos que tenemos que gestionar todo tipo de mensajes de log, los cuales aparecen en distintos días... Aunque encontrar la información deseada sería posible, habría que recurrir al uso de múltiples grep con el fin de encontrar la aguja en el pajar... Es por ello que mediante el uso de logrotate, estos ficheros pueden aparecer mejor distribuidos y mejor clasificados, facilitando nuestras búsquedas y haciendo que tardemos muchísimo menos en encontrar lo que buscamos. Aunque logrotate ya tiene una serie de configuraciones por defecto, es muy interesante tener ciertas nociones sobre este concepto para poder personalizar nuestra gestión de logs y adaptarla a nuestras necesidades lo mejor posible; es por ello que en el post de hoy me centraré en las posibilidades que ofrece esta utilidad.


Logrotate se trata de un servicio que ya se encuentra por defecto instalado en el sistema operativo, con lo que no requiere de instalación alguna, pues ya los logs por defecto tienen cierta gestión establecida por defecto por este servicio para facilitar la vida al administrador del equipo o servidor. Esto significa que no habrá que recurrir a ningún método de instalación y podremos dirigirnos directamente a lo que nos incumbe: es decir a la configuración de éste.

Este servicio estaría distribuido en tres lugares distintos; cada uno de ellos con su propia relevancia y función, con lo que lo mejor sería analizar cada uno de éstos individualmente con el fin de tener una comprensión adecuada del conjunto:


Cron.daily

El primero y el que en un principio no sería necesario tocar, sería el fichero logrotate alojado en la ruta /etc/cron.daily/. Dicho fichero no sería necesario modificarlo ya que simplemente se trata de un script que es ejecutado diariamente; script cuya única función sería ejecutar la rotación de logs de acuerdo con lo establecido el fichero de configuración de logrotate que explicaré más adelante.


Fichero de configuración principal

El pilar central de la rotación de logs y el que determina la configuración que tendrán por defecto todos los logs almacenados en /var/log, a menos que especifique alguna configuración especifica a alguno de éstos. Este fichero está almacenado en /etc/ y su nombre es logrotate.conf y aquí es interesante analizar meticulosamente este fichero para entender como funciona esta utilidad. Es por ello que a continuación explicaré algunas las posibilidades que ofrece logrotate, que si bien no son todas (para ello es recomendable hacer uso de man) sí que son las más importantes y usadas:

1.Intervalo de rotación:

Este podría considerarse como uno de los parámetros más importantes dentro de este fichero, ya que establece cada cuanto se realiza la rotación... Aquí no hay prefijo alguno ni ninguna referencia sino que habría que optar por una de estas tres palabras, las cuales representarían que la rotación sería diaria, semanal o mensual respectivamente. El valor por defecto es weekly:

  1. daily
  2. weekly
  3. monthly

2.Número de rotaciones:

Casi tan importante como el parámetro anterior sería el número de rotaciones totales que admite el equipo... Esto es debido a que el equipo necesita establecer un número de rotaciones máximas, ya que cada rotación realizada hará que el log actual se sobrescriba con un nombre como por ejemplo nombrelog.1 y creará uno nuevo que almacenará los nuevos logs. Estableciendo un número de rotaciones determinadas determinaremos el número de logs antiguos que almacenaremos con el fin de que no desbordar el servidor de viejos logs. Por ejemplo si pusiésemos 4 rotaciones, tendríamos el fichero actual más 4 ficheros antiguos en los cuales el .1 sería el más nuevo y el .4 el más antiguo. Para establecer dicho límite se hace uso del parámetro rotate junto con el número de rotaciones, siendo 4 el número de rotaciones por defecto. Es decir que la línea encargada de esta tarea sería:

  1. rotate 4

3. Tamaño de logs

Se trata de un parámetro opcional que puede establecer el límite de tamaño máximo que deben tener los logs... Esto únicamente puede ser útil en equipos con poco espacio en el disco duro, pero aún así es interesante tener constancia de la existencia de esta utilidad... Para establecer un tamaño habría que recurrir al parámetro size, junto con el tamaño a especificar, el cual puede ser especificado en Kilobytes (K) Megabytes (M) o Gigabytes (G) sin impedimento alguno:

  1. size 100K
  2. size 100M
  3. size 100G

4. Creación o no creación

Este concepto puede parecer un poco extraño, pero tiene su significado. El sistema está pensado por defecto para crear un nuevo fichero de log cada vez que se realiza la rotación, con la creación de un nuevo fichero de log. Esto puede ser especificado de dos formas: La primera es agregando el parámetro create mientras que la segunda es simplemente no agregando nada, ya que el servicio está diseñado para tener ese comportamiento por defecto. Aún así, a veces uno quiere simplemente sobrescribir el contenido del fichero de log actual y actuar como si se registrasen los logs desde 0... No es una práctica muy habitual, pero en ocasiones puede llegar a ser útil. Para lograr dicho propósito habría que recurrir al parámetro nocreate, y en este caso sí que es 100% necesario especificarlo. Eso significa que si queremos que se almacenen nuestros antiguos logs necesitamos recurrir a create, mientras que si no queremos que sea así habría que usar nocreate.

  1. create
  2. nocreate

5.Compresión de logs

Generalmente estos logs no serán consultados a menos que nos veamos en la necesidad explicita de ello; es por eso que por cuestiones de ahorro de espacio en el disco duro se tiene la opción de que los ficheros más antiguos sean comprimidos en formato gzip para ahorrar espacio... Esta opción suele ser muy usada dado su ahorro de espacio en el disco duro y además logrotate está diseñado para mantener descomprimido el último log almacenado (es decir que estarían descomprimidos el log actual y el último almacenado por la rotación), facilitando así la consulta de los datos de éste. El uso de esta funcionalidad es tan sencillo como recurrir al parámetro compress, sin la necesidad de parámetros adicionales ni ningún tipo de especificación; lo cual lo convierte en un recurso muy práctico de usar.

  1. compress

6.Comprobación de logs faltantes

Esto se trata de una comprobación de logs faltantes o erroneos... Durante la rotación de logs se comprueban los logs faltantes y/o erróneos y en caso de que hubiese un problema, el sistema estaría pensado por defecto para no continuar con la rotación de éste fichero... Esto es debido a que el servicio tiene implícitamente "incrustado" el parámetro nomissingok que se encarga de comprobar si hay alguna falla. Esto suele ser muy útil para comprobar que todo está correctamente, pero en ocasiones uno quiere que simplemente se rote, sin que nos importe si falta o falla algo, es por ello que afortunadamente existe un parámetro que nos permite "esquivar" esta traba llamado missingok y que suele ser usado en ficheros vitales, tales como syslog, entre otros. Es decir que si queremos que todo esté revisado a la perfección habría que usar el parámetro nomissingok o no agregarlo directamente mientras que para esquivar dicha comprobación habría que hacer uso de missingok.

  1. nomissingok
  2. missingok

7.Prevencíon de rotaciones innecesarias

Imaginemos que un fichero de log en concreto no ha recibido ningún evento y/o notificación durante el intervalo de rotación que hemos impuesto... Esto crearía un fichero vacío que no tendría nada que aportar y que además podría dar una sensación de seguridad engañosa a aquel que note la presencia de logs antiguos. Afortunadamente este pequeño problema se puede evitar con facilidad, ya que le podemos decir a nuestro fichero que en caso de que un log se encuentre vacío, este no entré en el proceso de rotación... Esto se realiza mediante el uso del parámetro notifempty. Un parámetro sencillo y muy útil que nos puede evitar búsquedas infructuosas entre nuestros ficheros de log antiguos... Es por ello que este parámetro es especialmente usado para los logs más relevantes.

  1. notifempty

8. Acciones post rotación

Aunque no es un parámetro obligatorio, sí que puede ser interesante usarlo dependiendo del tipo de log que queramos rotar... Simplemente establece una serie de acciones y/o comandos que logrotate debe hacer tras realizar la rotación... Dicha acción sería declarada primero especificando que se trata de una acción post-rotación, la cual se declara mediante el parámetro postrotate y al finalizar dicha acción o acciones habría que declarar la finalización de éstas añadiendo la palabra endscript. Esto significa que toda acción que se quiera realizar tras hacer una rotación tendrá la siguiente estructura:

  1. postrotate
  2.         ...
  3. endscript

9.Include

Dentro del fichero de configuración notareis que hay una línea que comienza con include; aquí se incluye la ruta de la carpeta que almacenará los ficheros de configuración específicos para algunos logs en concreto... Esta línea es recomendable dejarla intacta y a continuación explicaré más detalladamente el contenido de esta carpeta.


Ficheros de configuración específicos

Estos ficheros almacenan la configuración de ciertos logs en concreto que queremos que funcionen de forma distinta a lo especificado en el fichero de configuración principal... Todo aquello que se especifique en estos prevalecería sobre lo escrito en el fichero principal, cosa útil si queremos que por ejemplo el log syslog tenga un comportamiento distinto al "habitual". Todos estos ficheros de configuración son almacenados en /etc/logrotate.d/ y aunque todas estas configuraciones personalizadas pueden ir dentro de un mismo fichero; lo ideal a nivel de gestión suele ser almacenar la configuración de un solo log en concreto dentro de un fichero, y en caso de que se almacenen varios, lo ideal es que todos pertenezcan a la misma temática. Esta configuración específica sigue las mismas normas que las seguidas en logrotate.conf, con la diferencia que en este caso, para concretar que se está actuando en un fichero en concreto se escribe la ruta completa del fichero y luego entre llaves se especifica la configuración específica de éste. Es decir que si por ejemplo deseásemos especificar unas reglas en concreto para el log syslog, habría que escribir:

  1. /var/log/syslog
  2. {
  3.         ...
  4. }

En el caso de este log en concreto, veremos que efectivamente está configurado para tener un comportamiento distinto, aunque siempre manteniendo las directrices descritas para el fichero de configuración principal:

  1. /var/log/syslog
  2. {
  3.         rotate 7
  4.         daily
  5.         missingok
  6.         notifempty
  7.         delaycompress
  8.         compress
  9.         postrotate
  10.                 invoke-rc.d rsyslog rotate > /dev/null
  11.         endscript
  12. }

Como podéis comprobar, aunque los logs ya poseen una rotación por defecto, la modificación de ésta es muy sencilla y puede resultarnos especialmente útil si queremos tener todo más registrado o queremos controlar lo máximo posible nuestros entornos más sensibles.

Espero que os resulte útil.

Saludos.

martes, 25 de agosto de 2015

Como crear una sesión enjaulada sin usar chroot

Anteriormente he hablado sobre las bondades que ofrece chroot y las posibilidades que puede ofrecer esta herramienta. Si bien es cierto que es muy útil; a veces queremos que un usuario acceda remotamente a la consola de nuestro sistema y que simplemente ejecute un script o que tenga que realizar una acción muy concreta, cosa que a veces requiere múltiples binarios y que puede resultar muy aparatoso y poco práctico en algunos casos concretos. Es por ello que a veces lo que nos interesa es que el usuario que se vaya a loggear, simplemente tenga acceso a un script o una TUI (Text User Interface) con un menú o un cuadro de entrada de texto en el que se hagan unas labores muy concretas y muy limitadas sin permitirle que "juegue" con la consola y sin que el usuario final necesite tener conocimientos sobre la consola de Linux, que probablemente sea uno de los mayores problemas con los que se puede encontrar éste.

jaula

Este proceso es algo más limitado que chroot, pero por otro lado es mucho más restrictivo y no deja la integridad del sistema en manos del usuario final, ya que solamente hará lo que nosotros le permitamos hacer en el script, sin la posibilidad de que éste introduzca comandos directos a menos que nosotros hayamos diseñado el script estrictamente para ello.

Comenzaríamos creando un pequeño script que representará aquello a lo que el usuario estará limitado hacer... No debe de ser un script realmente espectacular ni tampoco tenemos que seguir unas directrices especificas en la creación de éste; es decir que puede ser un script que interactue con el usuario o que simplemente se limite a realizar una tarea en concreto... En este caso optaré por la primera opción, que suele ser la más práctica de las dos. Para ello crearé una TUI muy sencilla que se limite a que el usuario pueda escoger entre apagar el equipo, reiniciarlo o salir del script... Esto a nivel de código podría ser algo parecido a lo siguiente:

  1. #!/bin/bash
  2. INPUT=~/input.sh
  3. dialog \
  4. --title "SESION LIMITADA" \
  5. --menu "Usuario con permisos limitados. Escoja una opcion" \
  6. 15 100 3 \
  7. APAGAR "Apagar equipo" \
  8. REINICIAR "Reiniciar equipo" \
  9. SALIR "Salir" 2>"${INPUT}"
  10. SELECCIONADO=$(<"${INPUT}")
  11. case ${SELECCIONADO} in
  12. APAGAR) sudo shutdown -h now;;
  13. REINICIAR) sudo reboot;;
  14. SALIR) exit;;
  15. esac
  16. rm ${INPUT}

Esto se trata de evidentemente un ejemplo, pero podría aplicarse a un caso practico en el que queramos un usuario que únicamente se pueda limitara a reiniciar o a apagar el equipo. A este script podríamos denominarlo jaula.sh y en este caso es necesario almacenarlo en una carpeta en concreto; dicha carpeta se trata de /bin y más adelante veremos el motivo de ésto... También es importante otorgarle a nuestro nuevo script permisos de ejecución con el fin de que éste pueda ser ejecutado por cualquiera.

Ahora sería el turno de crear un nuevo usuario que estaría pensado únicamente para desempeñar esta tarea; un usuario que en ningún momento podrá actuar con "normalidad" sino que estaría limitado por unas directrices muy específicas. Aún así, la creación de este usuario no difiere del procedimiento habitual; es decir que bastaría con el mismo comando usado para la agregación de nuevos usuarios: adduser. Supongamos que por ejemplo deseamos agregar un usuario denominado testuser; el comando para agregar dicho usuario sería:

  1. adduser testuser

Como podéis ver, se trata del procedimiento habitual de agregación de usuario, pero en este caso necesitaremos hacerle unos pequeños retoques a éste tras su creación. Dichos retoques habría que hacerlos concretamente en el fichero /etc/passwd, fichero que almacena información importante sobre los usuarios. Dicho fichero mostrará línea por línea todo lo referente a nuestros usuarios, más únicamente nos interesará modificar aquella que haga referencia a nuestro nuevo usuario; es decir a testuser. En la línea en cuestión veremos diferentes parámetros, tales como el user id, el group id, la carpeta home y el interprete que se ejecuta tras loggearse. Sería este último parámetro en concreto el que nos interesa modificar, pues si si observais bien muestra que el interprete en cuestión es /bin/bash, interprete usado por defecto por todos los usuarios que agreguemos... 

La cuestión es que dicho valor puede ser modificado por nosotros para que apunte a otro destino; destino que se ejecutaría automáticamente tras loggearse el usuario, con lo que... ¿Qué pasaría si apuntásemos al script jaula.sh que recién hemos creado? Que éste sería ejecutado en caso de que el usuario en cuestión se loggearse, impidiendo que éste pueda navegar por la consola. Eso significaría que mientras que antes la línea en cuestión mostraba un aspecto parecido a éste:

bash
Ahora mostraría este aspecto:
jaula

Además, al ejecutar procesos de cierta relevancia, tales como apagar o reiniciar el sistema, se necesitan tener permisos de administrador, es decir, privilegios de sudo. Al ser un nuevo usuario que nosotros hemos creado, esto no es así con lo que necesitamos remediar ésto. Por fortuna dicha solución es tan sencilla como escribir el comando que muestro a continuación:

  1. echo 'testuser ALL=(ALL) NOPASSWD:ALL' >> /etc/passwd

Ahora si nos loggeasemos como testuser en vez de mostrarse la típica consola, tendríamos ante nuestros ojos la TUI que hemos creado sin tener la posibilidad de salir de ésta.

TUI_jaula


Espero que os haya resultado útil.

Saludos.

sábado, 22 de agosto de 2015

Usando memoria swap en Linux

En más de una ocasión he hablado de la importancia que posee la memoria RAM en nuestro equipo, por ejemplo cuando hemos querido controlar la salud de nuestro equipo. Este recurso es bastante polémico entre aquellos que no poseen demasiados conocimientos informáticos, pues muchos piensan que tener muchísima RAM instalada en nuestro equipo es bueno, cuando a veces no se le saca todo el partido a ésta y de 8 GB se tienen 4 o más libres, cuando la memoria está instalada con un único propósito: Sacarle partido. En otras ocasiones mucha gente se encuentra en la posición contraria; es decir con un equipo con poca memoria ejecutando procesos que requieren de mucha... haciendo que se consuma un recurso del que os vengo a hablar hoy: La memoria swap
Portada_swap
Esta memoria es usada cuando un equipo carece de la memoria suficiente para tratar los datos que se encuentra en ejecución y no es ni más ni menos que un área de la memora física (del disco duro) que es usada cómo una memoria ram virtual... El problema de ésto es que el volcado de la memoria en el espacio de memoria virtual, es mucho más lento y laborioso que el realizado en la memoria física (memoria RAM) con lo que no es un recurso que se tenga que usar para trabajar, sino un recurso de emergencia para evitar que el equipo se bloquee; con lo que lo ideal suele ser que si uno se encuentra en la situación de usar memoria swap constantemente, amplíe la memoria RAM instalada. Esto no significa que la memoria swap sea inútil, nada más lejos, pero sí que debe de ser considerado como un recurso auxiliar que nos ayudará en caso de emergencia.

Ahora que tenemos clara la utilidad de dicha memoria, lo ideal suele ser tener claro cuanta swap queremos tener asignada en nuestro equipo... Esta memoria se almacenará en un partición especialmente creada con dicho propósito; partición requerirá ocupar cierto espacio en nuestro disco duro, pero con las actuales capacidades de los discos duros no deberíamos tener problema alguno... Aunque no hay unas reglas propiamente dichas para asignar espacio swap, sí que existen una serie de recomendaciones de asignación de área de intercambio en función de la cantidad de memoria RAM instalada en nuestro equipo. Dichas recomendaciones serían:
  • Con 512 MB de RAM o menos, la swap debería ser el doble de grande que la memoria RAM... Es decir que si tuviésemos 256 MB de RAM asignaríamos 512 de swap, y si tuviésemos 512 MB deberíamos asignar 1024 MB.
  • En caso de tener entre 1 y 4 GB de RAM instalada en el equipo; bastaría con establecer exactamente el mismo tamaño de swap.
  • Si tuviésemos más de 4GB de RAM, por lo general bastaría con poner únicamente 4GB de swap, a menos que tuviésemos un equipo que anduviese muy justo de recursos o fuese un servidor que temamos que en algún momento se quede sin memoria.

Para poder usar nuestra swap. lo primero que deberíamos hacer sería comprobar nuestro espacio en el disco duro y aprovechar el espacio libre que haya en éste para crear la partición con dicho espacio; en caso de no tener espacio disponible, no quedaría otra que redimensionar las particiones. Ambas tareas se pueden hacer sin ningún problema mediante la herramienta gparted, herramienta especializada en la creación y gestión de particiones... El único detalle que habría que tener en cuenta para crear la nueva partición sería que ésta debe de ser del tipo swap y que preferiblemente habría que asignarle un tamaño en función de los puntos atrás señalados. No voy a extenderme explicando el funcionamiento de gparted, ya que éste no es el objetivo de este post, si bien en caso de no tener muy claro su funcionamiento, tal vez este enlace os sirva de ayuda: http://gparted.org/screenshots.php

Otra opción, un poco menos visual, pero igualmente efectiva y que no requeriría reiniciar el equipo no recurrir a herramientas de terceros sería usar la herramienta fdisk, de la cual ya he hablado anteriormente. En este caso en concreto la partición que habría que crear sería una partición del tipo 82 desde fdisk. Aquí si quisiésemos sincronizar las tablas de particiones para poder trabajar con la nueva partición correctamente habría que ejecutar el comando partprobe, el problema radica en que dicho comando no se puede ejecutar debido a que no el paquete del que depende no está instalado en el sistema, con lo que si queremos ejecutarlo deberemos de escribir dos comandos; uno para instalar el paquete del que depende, llamado parted, y otro para ejecutar el comando:

  1. apt-get install parted
  2. partprobe

En caso de haber optado por este segundo método, habría que preparar la partición para funcione como swap, lo cual significa que debemos escribir un pequeño comando que hará que la partición funcione como tal; dicho comando se denomina mkswap y tiene la siguiente estructura:

mkswap /dev/${nombre_partición_swap}

En mi caso la partición swap se denomina sda5 (lo mas común es que reciba este nombre) con lo que simplemente habría que escribir:

  1. mkswap /dev/sda5

Con la partición creada y preparada para trabajar tenemos dos opciones para activarla:


Opción manual

Esta opción es la menos usada, ya que requiere que el usuario tenga que activar y desactivar la swap manualmente... El proceso en sí es sencillo pero si en algún momento nos olvidásemos de activar dicha memoria no estaríamos preparados para cualquier uso excesivo de memoria... Es por ello que, aunque viene bien tener conocimiento de este método, no recomiendo usarlo... La activación y desactivación manual es tan sencilla como escribir los comandos swapon, para la activación de la swap, y swapoff para la desactivación de ésta. Si por ejemplo quisiésemos manipular nuestra recién creada partición escribiríamos:

Para activar la swap:
  1. swapon /dev/sda5
Para desactivar la swap: 
  1. swapoff /dev/sda5


Montaje y activación de la partición swap en el arranque

La segunda y la más común es dirigirnos al fichero fstab para incluir nuestra nueva partición en el arranque.  Dependiendo del contenido del fichero tendremos que usar un método u otro:

En caso de trabajar con UUID:

Si trabajamos con las versiones más nuevas tendremos que hacer referencia al UUID de la partición, el cual se obtiene mediante el comando:

  1. blkid

Ahí veremos el listado de particiones con su correspondiente UUID; por ejemplo en mi caso el UUID referente a la swap sería 7ac07077-c21e-4111-8a90-b8100891376e; teniendo esa información presente habría que dirigirse al fichero fstab y añadir una línea de forma que la partición swap se ejecute automáticamente... En este caso al ser una memoria de intercambio, no habría que poner punto de montaje alguno, con lo que en mi caso, usando el UUID obtenido con el último comando añadiría:

  1. UUID=aad0119f-b19f-45e7-b621-88362cef80ab none            swap    sw              0       0

En caso de trabajar con nombre de particiones:

Este caso es cada vez menos común debido al cada vez mayor uso de las últimas versiones, a excepción de los servidores que suele correr versiones bastante antiguas de sistemas operativos...  Aún así es importante tenerlo en cuenta por si nos llegásemos a encontrar en una situación de éstas, y además es un método aún más sencillo, ya que únicamente requiere conocer el nombre de la partición, desechando el uso del comando blkid... Por ello, suponiendo que nuestra partición swap sea /dev/sda5 esta sería la línea a añadir en el fichero:

  1. /dev/sda5 none            swap    sw              0       0

Con dicha modificación en el fichero, estaríamos seguros que nuestra partición swap estaría preparada para asistirnos en cada arranque.


Espero que os haya resultado útil.

Saludos.

miércoles, 19 de agosto de 2015

Android 6 y el administrador de permisos ¡Por fin!

Ayer se hizo oficial el lanzamiento de la nueva versión de Android: El hasta ahora conocido como Android M, por fin se ha anunciado oficialmente como Android 6.0 Marshmallow, lo cual traducido al castellano sería denominado como malvavisco o nube. En un principio parecía que no iba a presentar una gran mejora con respecto a su predecesor más allá de nuevas funcionalidades creadas con el fin de mejorar la experiencia del usuario final, si bien leyendo diferentes artículos he observado dos mejoras que me llaman especialmente la atención: La primera se trata de ni más ni menos que el uso de memorias USB como discos de almacenamiento internos en lo cuales poder instalar aplicaciones de la misma forma en que lo haríamos en una tarjeta micro SD... Una novedad de lo más curiosa que los móviles con poco espacio sin duda aprovecharán para poder expandir su memoria y no tener que sufrir tanto para ahorrar espacio en el disco aunque habría que tener dicho USB siempre conectado para sacarle partido. La segunda opción que es la que realmente me ha llamado la atención ha sido la nueva mejora de seguridad implantada por Android: La administración de permisos.
Android_6_Logo

Dos de los problemas principales de Android que han ido arrastrándose desde hace años son la fragmentación y la seguridad, y si bien con lo primero todavía les queda un largo camino, al menos parece que en lo segundo están intentando mejorarlo todo lo posible. Cualquier aplicación descargada e instalada en nuestro móvil (ya provenga del Play Store o de cualquier otro origen) pedirá una serie de permisos a nuestro móvil; permisos que la mayoría de las personas no se molesta en leer, pero que aún así siguen ahí y en algunos casos son más que innecesarios como ocurrió en su día con la famosa linterna. Juegos que piden permisos para usar la cámara o el micrófono, aplicaciones "fabulosas" que piden tener acceso a prácticamente todo lo posible, etc... Es por ello que en esta versión por fin tendremos la deseada posibilidad de administrar los permisos que queremos otorgar a la aplicación en cuestión desde "Ajustes --> Aplicaciones" y dentro de la aplicación seleccionada veremos una opción denominada "Permisos" en la cual podremos activar o desactivar los permisos.

Permisos_Android_M
Fuente imagen: Xakatandroid

Esta funcionalidad en un principio controlaría "solamente" las funciones de: calendario, cámara ,contactos, micrófono, SMS, sensores, teléfono y ubicación; dejando de lado por ejemplo la información personal del teléfono que contempla el modelo de teléfono y la versión de Android (entre otras cosas). Desgraciadamente de momento hay que ser muy cuidadoso con esta utilidad ya que si desactivásemos algún permiso importante que requiera la aplicación para funcionar adecuadamente, ésta dejaría de funcionar hasta que la reactivásemos con lo que habría que ver si en efecto esta utilidad será capaz de aportar realmente a la seguridad o si por lo contrario el hecho de "capar" cualquier permiso nos impedirá utilizar nuestra aplicación. De momento se tendrán que adaptar las aplicaciones a la nueva versión para que en caso de faltarles un permiso vital pidan al usuario la reactivación de éste para poder funcionar, aunque probablemente veamos dichas adaptaciones pronto, especialmente en las aplicaciones más populares tales como Whatsap.

Aún así es innegable que este cambio probablemente marque un antes y un después en la seguridad de nuestro sistema operativo móvil aunque desafortunadamente deja la seguridad en manos del usuario final... ¿Es realmente prudente ésto? Evidentemente yo o aquellos a los que nos guste la tecnología no dudaremos en sacarle provecho a esta opción, ¿Pero que hay de aquellos que simplemente compran un móvil que funcione y en el que puedan instalar Whatsap y juegos que bajan sin molestarse siquiera en comprobar su origen y/o credibilidad? ¿Realmente serán conscientes siquiera de la existencia de esta opción? De momento tengo mis dudas con respecto a este punto, aunque con el tiempo se verá si en efecto esta medida ha supuesto un gran cambio para aquellos usuarios que no tienen nociones sobre tecnología o si en cambio se quedará como una excelente funcionalidad que solamente que cuatro "geeks" conoceremos.

Saludos.

martes, 18 de agosto de 2015

Linux TUI: Qué es y cómo usarlo.

En varias ocasiones he hablado de las bondades y la potencia que ofrece bash; ya sea mediante trucos, scripts u otros puntos interesantes... La cuestión está que la mayoría de las veces lo he expuesto como un entorno muy minimalista; en el sentido de que suelo mostrar un texto en la terminal que lee un valor, lo procesa y realiza una serie de acciones ya definidas en el código. Esto está bastante bien y cumple su función, pero a veces necesitamos de un entorno más interactivo o más vistoso, ya que hay que reconocer que aunque la terminal es muy fascinante, no ofrece un aspecto precisamente moderno... En los lenguajes de programación de alto nivel se suelen usar las famosas GUI (Graphical User Interface) pero esto en bash no es una opción; por ello existe una versión  más simplificada de éstas: Las TUI (Text User Interface).

TUI_portada
Una TUI no es ni más ni menos que una interfaz gráfica basada en texto plano; sin florituras ni imágenes ni efectos gráficos. Esto puede parecer burdo, pero lo cierto es que mejora gratamente la experiencia del usuario, especialmente si hablamos de menús interactivos; es por ello que suelen ser usados en entornos en los que queremos que el script interactue con un usuario que quiera ejecutar el contenido del script de forma simple e intuitiva.

Para lograr el resultado deseado requeriremos tener previamente instalada una herramienta que servirá de base para todo lo que trataremos de aquí en adelante. Dicha herramienta se denomina dialog y su objetivo es mostrar una ventana emergente que mostrará una serie de opciones previamente establecidas por nosotros. Dicha herramienta no está instalada por defecto pero al estar incluida en los repositorios oficiales la instalación sería tan sencilla como recurrir a apt o yum (según el sistema que usemos); algo como:

  1. apt-get install dialog

Con la herramienta instalada ya podríamos empezar a crear nuestras interfaces de texto, pero no es tan sencillo como escribir dialog y programar con normalidad... Es necesario entender algunos conceptos antes de comenzar a crear estas interfaces pues en caso contrario las interfaces probablemente no muestren nada. Una opción podría ser el comando man sobre dialog con el fin de obtener la información más detallada posible, si bien con tener unas nociones generales sería suficiente para desenvolvernos en la creación de este tipo de interfaces. Lo primero y fundamental sería entender las bases que componen cualquier "dialog".


Bases:

Toda interfaz está compuesta por distintas partes que serán comunes para cualquier tipo de éstas... Es decir que aunque los distintos tipos de interfaces tienen sus diferencias, siguen el mismo tipo de estructura y se podría decir que está dividido en varias partes:
  • Interfaz: La primera parte es la encargada de llamar a la herramienta dialog; encargada de mostrar la interfaz de texto que usaremos a partir de ahora... Dicho llamamiento va habitualmente seguido del parámetro --clear. El parámetro --clear serviría para "limpiar" el contenido mostrado en la consola y mostrar únicamente nuestra interfaz; además para tener todo mejor estructurado podemos usar como apoyo el carácter para tener todo estructurado en distintas líneas que nos facilitarán su interpretación. Dicho carácter iría al final de cada línea y teniendo en cuenta dicha inclusión el primera parte quedaría así:
  1. dialog --clear \
  • Título: Aún con la terminal limpiada y la interfaz preparada, hemos de tener en cuenta que toda interfaz posee un título descriptivo que aparecerá en la parte superior de éstas; éste es implantado haciendo uso del parámetro --title sumado del título en cuestión. Al no ser la última línea (ya que queremos tener todo estructurado línea por línea) incluiríamos el carácter al final de la sección, con lo escribiríamos:
  1. --tittle "Prueba TUI" \
  • Tipo de interfaz: La parte más importante en la que cada tipo posee su propia estructura. Basta decir que siempre sería la tercera parte y que dependiendo de lo que escojamos, nuestro dialog tendrá un comportamiento distinto. Este punto será explicado en profundidad más adelante.
  • Tamaño de la TUI: El último parámetro, y no por ello menos importante sería el tamaño de la interfaz... No importa lo bien que hayamos declarado los anteriores parámetros, es importante declarar un tamaño adecuado si no queremos que el texto que vayamos a mostrar se nos acople. El tamaño de ésta suele ir al final y es asignado mediante dos parámetros numéricos: El primer número constaría de el número de líneas que ocuparía la TUI; es decir, el tamaño vertical que tendría; mientras que el segundo número, el cual estaría separado del primero por un espacio en blanco, especificaría el número de caracteres que ocuparía la interfaz... Es decir el tamaño horizontal que ocuparía. En caso de quedarnos cortos con estos valores nos quedaría una interfaz desagradable y aparatosa de usar, con lo que siempre es recomendable establecer este valor al alza. Un ejemplo de dos valores válidos para esta parte sería: 6 30.
Si juntásemos todos estos ejemplos, un esqueleto que serviría de plantilla para la mayoría de las ocasiones sería:

  1. #!/bin/bash
  2. dialog --clear \
  3. --title "Prueba TUI" \
  4. --tipo ... \
  5. 6 30

Obviamente esto es un esqueleto que no valdría para un caso real, ya que no hemos especificado qué tipo de interfaz se trata ni tampoco hemos visto cuales son las posibilidades que nos ofrece dicha parte... Cómo la mayoría de los tipos difieren bastante entre sí a nivel de sintaxis y estructura, lo mejor es ver cada uno de éstos uno por uno; aprovechando el esqueleto que recién acabamos de crear.


Mensaje de texto

Con diferencia la opción más sencilla y usada de todas. Esto no es más que un mensaje de texto, comúnmente denominado message box, el cual simplemente habría que leer y presionar la tecla "INTRO" una vez leído el mensaje. Para crear dicho mensaje haría falta muy poca cantidad de código, ya que simplemente habría que escribir en la parte del tipo el parámetro --msgbox seguido del texto que deseásemos mostrar. Es decir que si quisiésemos mostrar el mensaje "Esto es un mensaje de texto" usando como base nuestro anterior código, tendríamos el siguiente resultado:

  1. #!/bin/bash
  2. dialog --clear \
  3. --title "Prueba TUI" \
  4. --msgbox "Esto es un mensaje de texto" \
  5. 6 30

Cuadro de texto

El nivel de dificultad de este comando es muy similar al de nuestro anterior ejemplo, con la diferencia de que en este caso es importante calcular un tamaño adecuado para nuestra interfaz para hacer que el resultado aparezca de forma integra y sin interrupciones. El objetivo de esta opción es mostrar el contenido de un fichero; algo parecido a lo que hace cat pero mostrado de forma más vistosa. El llamamiento a esta opción se realiza mediante la utilización del parámetro --textbox seguido de la ruta completa del fichero que queremos consultar; Con lo que la diferencia con respecto a nuestro anterior ejemplo es muy leve:

  1. #!/bin/bash
  2. dialog --clear \
  3. --title "Prueba TUI" \
  4. --textbox "/etc/issue" \
  5. 6 30

Cuadro de información

Esta opción es también muy simple pero no es tan útil como el resto, en mi opinión, ya que se trata de un simple marco informativo que no permite que el usuario interactue con él; es decir que no importa lo que el usuario final realice que la interfaz permanecerá inamovible... Por lo general estas interfaces van a acompañadas por un sleep (espera) de x segundos; y el objetivo de éstas es mantener al usuario final en espera. Este cuadro se puede utilizar gracias al parámetro --infobox; una pega que tienen esta opción es que, por motivos que desconozco, no es compatible con el parámetro --clear declarado al principio, ya que este último elimina lo mostrado por el infobox (aún cuando la limpieza de pantalla ha sido declarada primero). Esto alteraría ligeramente nuestra plantilla inicial y haría que tuviesemos un resultado parecido al siguiente:

  1. #!/bin/bash
  2. dialog \
  3. --infobox "Espere 4 segundos" \
  4. 6 30
  5. sleep 4

Si/No

A veces necesario recurrir a un entorno que requiera la intervención del usuario... Ya sea para aceptar o denegar una cosa o simplemente para preguntar si realmente desea ejecutar una acción delicada (como por ejemplo eliminar un fichero). Esto no es posible con los cuadros de texto, ya que simplemente te muestra un mensaje y punto; es por ello que para lograr éste objetivo habría que pasar al siguiente nivel: Los cuadros de dialogo Si/No. Este tipo de TUI es creado mediante el parámetro --yesno, a continuación del texto o pregunta que se quiera realizar a continuación. Esto de por sí puede parecer suficiente, pero en verdad no es así ya que es necesario volcar la respuesta sobre una variable para luego procesar dicha respuesta.

El volcado de la respuesta es tan sencillo como añadir una variable después de "dialog" creado y asignarle el valor $?. Dicho valor puede parecer un sinsentido, pero la función de dicho valor es almacenar la respuesta enviada por nosotros... Valor enviado cuando hemos hecho la selección. El valor que la variable puede recibir puede ser uno de estos tres:
  • 0 --> Hemos seleccionado Si.
  • 1 --> Hemos seleccionado No.
  • 255 --> Hemos pulsado la tecla [Esc].
Con esta información y con nuestro "esqueleto" podríamos crear el siguiente código con el que podríamos sacar el máximo partido a esta opción:

  1. #!/bin/bash
  2. dialog --clear \
  3. --title "Prueba TUI" \
  4. --yesno "Seguro que quieres borrar el archivo /tmp/prueba.txt?" \
  5. 6 30
  6. respuesta=$?
  7. case $respuesta in
  8.         0) echo "Hemos seleccionado Si";;
  9.         1) echo "Hemos seleccionado No";;
  10.         255) echo "Hemos pulsado la tecla [Esc]";;
  11. esac


Cuadro de entrada de texto o Inputbox

Siguiendo por la línea del volcado de valores, tendríamos algo menos cerrado que la opción anterior... Cuando queremos limitarnos a acciones de sí o no, la anterior opción se ajusta a nuestras necesidades a la perfección; en cambio si quisiésemos meter un valor completamente definido por nosotros, ya sea un número o un texto, deberíamos recurrir a una opción más flexible: los inputboxes. Dicho tipo de dialog se declaran mediante el parámetro --inputbox seguido del texto que querríamos mostrar a continuación... 

La cuestión está en que a diferencia de con nuestro anterior caso, aquí el volcado de datos cambia ligeramente ya que no se realizaría sobre una variable, sino sobre un fichero... Cosa que cambia ligeramente el tratamiento del volcado de datos. En este caso para volcar los datos habría que escribirlo después del texto que queremos mostrar y con la estructura 2>fichero_de_destino. Con el valor volcado en dicho fichero, habría que consultar éste para cualquier interacción con el valor introducido... Cosa muy útil cuando estemos tratando con el valor en cuestión, pero es recomendable eliminar dicho fichero tras interactuar con éste para evitar fugas de información y ocupación innecesaria de espacio en el disco duro. 

Dicho esto, un script válido que respetaría estos principios sería:

  1. #!/bin/bash
  2. FICHERO='/tmp/input.txt'
  3. dialog --clear \
  4. --title "Prueba TUI" \
  5. --inputbox "Introduzca el texto" 2>${FICHERO} \
  6. 6 30
  7. echo ''
  8. cat ${FICHERO}
  9. echo ''
  10. rm ${FICHERO}


Menú interactivo

En mi opinión se trata de la opción más interesante que ofrece este tipo de interfaz. Queremos poner a disposición del usuario una serie de opciones predefinidas... Sin la intervención de interfaces tendríamos que hacer que el usuario escribiese las elecciones a mano y esperar a que la elección realizada coincida con aquellas que nosotros somos capaces de procesar... Aquí eliminamos dicha posibilidad de error y limitamos al usuario a una serie de opciones que nosotros ya hemos predispuesto para él; opciones que podemos escoger mediante las flechas de dirección del teclado sin problema alguno.

Las ventajas que ofrece este menú son obvias, es por ello que es una de las opciones más usadas por aquellos que optan por presentar sus scripts en TUIs para los usuarios.

Para llamar a un menú se requiere del uso del parámetro --menu; pero es necesario incluir una serie de características que harán posible la aparición de éste... Para empezar, en el establecimiento del tamaño de la interfaz, hemos de especificar el número exacto de elementos que aparecerán en el menú; eso significaría que dicha sección constaría ahora de tres parámetros, entre los cuales el número de elementos del menú sería el último de éstos tres.

Después de establecer dicho tamaño habría que imponer los elementos del menú con la siguiente estructura:

Nombre_elemento) Texto a mostrar \

El texto a mostrar sería lo representación que aparecería en pantalla mientras que el nombre que se establece antes del caracter ) sería el nombre del elemento que seleccionaríamos en el menú... Esta línea habría que repetirla tantas veces como elementos queramos incluir; a excepción del último que variaría ligeramente,  en vez de establecer el carácter \ habría que especificar el fichero en el que volcaríamos nuestro resultado.

Nombre_elemento) Texto a mostrar  2>"Fichero"

Después de dicho volcado, únicamente habría que asignar el valor que hemos introducido dentro de una variable, y tratar la información de dicha variable dentro de un case que contemplaría cada opción que hemos incluido en el menú... Eso significaría que si por ejemplo el menú tuviese tres opciones, el case tendría el mismo número de elementos... Un script bastante completo que agruparía todo esto sería este:

  1. #!/bin/bash
  2. INPUT=/tmp/input.sh
  3. dialog --clear \
  4. --title "Prueba TUI" \
  5. --menu "Escoge uno" 15 100 3 \
  6. OPCION1 "Opcion1" \
  7. OPCION2 "Opcion2" \
  8. SALIR "Salir" 2>"${INPUT}"
  9. SELECCIONADO=$(<"${INPUT}")
  10. case ${SELECCIONADO} in
  11. OPCION1) echo "Opcion1";;
  12. OPCION2) echo "Opcion2";;
  13. SALIR) exit 0;;
  14. esac
  15. rm ${INPUT}


Mostrando los resultados de cada script

Probablemente os preguntéis por qué no he compartido el resultado de cada script al final de cada sección; esto se debe a que al ser muchas interfaces con distintos resultados, he preferido agruparlas dentro de un mismo espacio con el fin de no alargar este post innecesariamente; es por ello que os incluyo a continuación un slideshare con todos y cada uno de los resultados de cada script válido escrito hasta ahora:


Saludos.