Instalación de un Nano Lynx Wireless-N USB 2.0 en una Raspberry Pi

Introducción

Los controladores para los adaptadores NanoLynx Wireless-N USB 2.0 ya se encuentran incluidos en las distribuciones actuales de Linux (Raspbian y DietPi entre otras) para la Raspberry Pi.

En caso de no tenerse se deberán obtener los controladores para rt2800 mediante la instalación del paquete firmware-ralink.

Verificación

Para verificar que el hardware se encuentra instalado y que ha sido reconocido exitosamente se debe ejecutar el siguiente comando.

$ lsusb

    Bus 001 Device 007: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter

Así mismo es conveniente verificar que los controladores necesarios hayan sido cargados exitosamente.

$ lsmod | grep rt2

    rt2800usb         18832    0 
    rt2800lib         81962    1    rt2800usb
    rt2x00usb         11918    1    rt2800usb
    rt2x00lib         47354    3    rt2x00usb,rt2800lib,rt2800usb
    mac80211         594951    3    rt2x00lib,rt2x00usb,rt2800lib
    cfg80211         477515    2    mac80211,rt2x00lib
    crc_ccitt          1620    1    rt2800lib

Configuración

La configuración de la interfaz de red se puede realizar mediante la herramienta de configuración de la red inalámbrica que viene con el sistema operativo o se puede realizar manualmente como se describe a continuación.

Instalar el paquete de wpasupplicant en caso de no tenerse aún.

# apt-get install wpasupplicant

Ejecute el siguiente comando reemplazando la palabra ssid por el identificador de la red inalámbrica a la cual se desea conectar y password por su respectiva contraseña.

$ wpa_passphrase ssid password 

Copie el resultado de la ejecución del comando anterior y agregue (o reemplace) la sección network en el archivo /etc/wpa_supplicant.conf.  Es posible que este archivo esté ubicado en /etc/wpa_supplicant/wpa_supplicant.conf (DietPi Jessie).

# vi /etc/wpa_supplicant.conf

 network={
   ssid="MiRed"
   psk=945609aab2413e64d57daef00eb5fab3acdde716e1e440981c004bc61dccc98c
 }

Para verificar la conexión con la configuración establecida en el paso anterior, ejecute el siguiente comando.  Una vez desee terminar la verificación presione CTRL+C.

$ wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf

Ajustar la configuración de las interfaces de red para incluir la información de wlan0 agregando la siguiente información.

# vi /etc/network/interfaces

    auto wlan0
    iface wlan0 inet dhcp
    wpa-driver wext
    wpa-conf /etc/wpa_supplicant.conf

Una vez terminados los ajustes, iniciar la interfaz de red para que tome la nueva configuración.

#  ifup wlan0

Finalmente si desea verificar los datos de configuración con los que se encuentra funcionando la interfaz de red inalámbrica ejecutar el siguiente comando.

# wpa_cli status

Recursos

  1. RPi Ralink WLAN devices
    http://elinux.org/RPi_Ralink_WLAN_devices
  2. RPi USB Wi-Fi Adapters
    http://elinux.org/RPi_USB_Wi-Fi_Adapters
  3. Rpi USB check-list (posible solución al bug de desconexión)
    http://elinux.org/Rpi_USB_check-list

Recursos interesantes de Laravel (2015-12)

Misceláneos

ROMs Android 5.1.1 (Lollipop) para Moto G LTE XT1040 (Peregrine)

Cifrado y firmado de archivos con GPG desde linea de comando

Generar un nuevo par de llaves

$ gpg --gen-key

gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:

(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)

Your selection? 1

RSA keys may be between 1024 and 4096 bits long.

What keysize do you want? (2048) 2048

Requested keysize is 2048 bits

Please specify how long the key should be valid.

0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years

Key is valid for? (0) 0

Key does not expire at all

Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Jorge I. Meza
Email address: jimezam @autonoma.edu.co
Comment: PGP certificate for work

You selected this USER-ID: "Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.

Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need 239 more bytes)

gpg: key 525E50C5 marked as ultimately trusted public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u pub 2048R/525E50C5 2015-10-15
Key fingerprint = 3792 F014 361E 93E7 355F 7FCA C153 2279 525E 50C5
uid Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co> sub 2048R/E56672A6 2015-10-15

Listar las llaves conocidas

Las llaves públicas

$ gpg --list-keys

/home/educacion/.gnupg/pubring.gpg
----------------------------------
pub 2048R/525E50C5 2015-10-15
uid Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>
sub 2048R/E56672A6 2015-10-15

Las llaves privadas

$ gpg --list-secret-keys

/home/educacion/.gnupg/secring.gpg
----------------------------------
sec 2048R/525E50C5 2015-10-15
uid Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>
ssb 2048R/E56672A6 2015-10-15

Exportar mi llave pública

$ gpg --armor --export -a 525E50C5 > public.key

Importar la llave pública de otro usuario

$ gpg --import public.key

Cifrar un archivo

$ gpg --recipient 525E50C5 --armor --encrypt ARCHIVO.EXT

En este caso se utilizará la llave pública identificada por el código 525E50C5 para cifrar el archivo.  Este proceso genera ARCHIVO.EXT.asc el cual corresponde a la versión cifrada de ARCHIVO.EXT y es el archivo que se podrá transmitir a través de un medio inseguro.

Descifrar un archivo

$ gpg --output ARCHIVO.EXT --decrypt ARCHIVO.EXT.asc

Firmar un archivo

$ gpg --detach-sign ARCHIVO.EXT

Se genera el archivo ARCHIVO.EXT.sig el cual corresponde a la firma del archivo ARCHIVO.EXT y se deberá transmitir junto con el archivo original.

Verificar la firma de un archivo

Se deberá contar con el archivo de la firma (.sig) y con el archivo original, así como con la llave pública de su supuesto autor.

$ gpg ARCHIVO.EXT.sig

En caso de que el documento corresponda con el expedido por el autor original se obtendrá un mensaje similar al siguiente.

gpg: assuming signed data in `ARCHIVO.EXT'
gpg: Signature made jue 15 oct 2015 12:40:56 COT using RSA key ID 525E50C5
gpg: Good signature from "Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>"

En caso de que el documento NO corresponda con el expedido por el autor original se obtendrá un mensaje similar al siguiente.

gpg: assuming signed data in `ARCHIVO.EXT'
gpg: Signature made jue 15 oct 2015 12:40:56 COT using RSA key ID 525E50C5
gpg: BAD signature from "Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>"

Recursos

  1. The GNU Privacy Guard
    https://gnupg.org/
  2. GNU Privacy Guard en Wikipedia
    https://en.wikipedia.org/wiki/GNU_Privacy_Guard
  3. Curso sencillo de PGP por Arturo Quirantes Sierra
    http://www.ugr.es/~aquiran/cripto/cursopgp.htm
  4. GPG Tutorial
    https://futureboy.us/pgp.html
  5. GnuPrivacyGuardHowto en Ubuntu Documentation
    https://help.ubuntu.com/community/GnuPrivacyGuardHowto
  6. PGP Tutorial
    http://aperiodic.net/phil/pgp/tutorial.html

Crear contenedores con usuarios sin privilegios utilizando LXC en Ubuntu

Introducción

Los contenedores creados por usuarios sin privilegios son muchos mas seguros en comparación con su contraparte creados por el usuario root ya que su administrador no corresponde directamente con el usuario administrador del huésped sino que sus usuarios son mapeados por unos UID y GID diferentes.  Por ejemplo, el root (0) de un contenedor será mapeado el huésped por un UID como 100000 por lo tanto, en el peor caso en que un atacante lograra salir del contenedor hasta el huésped, lo haría como un usuario sin privilegios.

Esto también trae consigo como efecto colateral negativo que las siguientes operaciones no sean permitidas.

  1. Montar la mayoría de sistemas de archivos.
  2. Crear dispositivos de nodo.
  3. Cualquier operación realizada por un uid/gid que no se encuentre en la lista de mapeo.

Adicionalmente esto produce que las plantillas de las distribuciones no funcionen y sea necesario utilizar la plantilla download que permite descargar imagenes preconstruidas de las distribuciones que funcionan en este tipo de ambiente.

Configuración para permitir contenedores por usuarios sin privilegios

$ mkdir -p ~/.config/lxc
$ echo "lxc.id_map = u 0 100000 65536" > ~/.config/lxc/default.conf
$ echo "lxc.id_map = g 0 100000 65536" >> ~/.config/lxc/default.conf
$ echo "lxc.network.type = veth" >> ~/.config/lxc/default.conf
$ echo "lxc.network.link = lxcbr0" >> ~/.config/lxc/default.conf
$ echo "$USER veth lxcbr0 10" | sudo tee -a /etc/lxc/lxc-usernet

Si se desea puede tomarse al archivo /etc/lxc/default.conf  como plantilla para la preparación del archivo de configuración local del usuario ~/.config/lxc/default.conf.

Los valores de lxc.id_map tanto para el grupo como para el usuario deberán coincidir con los registrados en and /etc/subgid y /etc/subuid respectivamente.  En caso que requiera ajustar estos rangos utilizar el siguiente comando.

$ sudo usermod -v 100000-200000 -w 100000-200000 NOMBRE_USUARIO

Comúnmente es necesario cerrar y volver a abrir la sesión del usuario actual o inclusive, reiniciar el sistema operativo para garantizar que el usuario se encuentre correctamente asignado a sus respectivos cgroups
(esto es especialmente importante si cgmanager no se había instalado antes de la instalación de LXC).

En caso de ser necesario, ajuste el permiso de ejecución en el directorio bajo el cual se almacena la configuración y los sistemas de archivos de los contenedores: ~/.local/share/lxc/.

$ sudo chmod -R o+X ~/.local

Administración de los contenedores

La administración de los contenedores se realiza tal y como se reseña en un artículo anterior, esta vez sin la necesidad del sudo ya que son contenedores creados por usuarios sin privilegios de administración.

A continuación se reseñan los comandos principales.

$ lxc-create -t download -n NOMBRE_CONTENEDOR — -d PLANTILLA -r VERSION -a ARQUITECTURA Crear un nuevo contenedor
$ lxc-start -n NOMBRE_CONTENEDOR -d Iniciar un contenedor
$ lxc-attach -n NOMBRE_CONTENEDOR
Acceder al shell de un contenedor desde el actual
$ lxc-stop -n NOMBRE_CONTENEDOR
Detener a un contenedor
$ lxc-destroy -n NOMBRE_CONTENEDOR
Destruir (remover) un contenedor existente

Recursos

  1. LXC in Ubuntu’s Server Guide
    https://help.ubuntu.com/lts/serverguide/lxc.html
  2. LXC Getting Started in Linux Containers
    https://linuxcontainers.org/lxc/getting-started/

Los primeros 10 minutos con LXC en Ubuntu

Rutas

/var/cache/lxc Imágenes de sistemas operativos descargados a partir de un template
/etc/lxc Configuración general
/var/lib/lxc/ Contenedores creados por root
/var/lib/lxc/NOMBRE_CONTENEDOR/config Configuración específica del contenedor
~/.local/share/lxc Contenedores creados por usuarios sin privilegios

Instalación

Instalación de los paquetes básicos.

$ sudo aptitude install lxc lxc-templates

De acuerdo al sistema operativo (template) que se desee instalar también será necesario uno de los siguientes paqutes.

ArchLinux arch-install-scripts
Debian/Ubuntu debootstrap
CentOS yum

Una vez instalado probar el ambiente disponible.

$ lxc-checkconfig

Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.13.0-37-generic
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Comandos principales

Listar los templates disponibles

$ ls /usr/share/lxc/templates

    lxc-alpine    lxc-archlinux  lxc-centos  lxc-debian    lxc-fedora  lxc-openmandriva  lxc-oracle  lxc-sshd    lxc-ubuntu-cloud
 lxc-altlinux  lxc-busybox    lxc-cirros  lxc-download  lxc-gentoo  lxc-opensuse      lxc-plamo   lxc-ubuntu

Crear un contenedor (usuario con privilegios)

$ sudo lxc-create -n NOMBRE_CONTENEDOR -t NOMBRE_TEMPLATE

Para especificar una versión (release) específico del template que se desea instalar.  Por ejemplo, si se desea elegir ubuntu lucid específicamente se debe ejecutar el siguiente comando.

$ sudo lxc-create -t ubuntu -n NOMBRE_CONTENEDOR -- -r lucid

Si se desea crear un contenedor de 32 bits en una máquina de 64 bits es necesario agregar el parámetro -a de la sigiuente manera.

$ sudo lxc-create -n NOMBRE_CONTENEDOR -t NOMBRE_TEMPLATE -a i386

Información de los contenedores

$ lxc-ls --fancy

Obtener información ampliada de un contenedor específico

$ lxc-info --name NOMBRE_CONTENEDOR

Iniciar un contenedor

$ lxc-start -n NOMBRE_CONTENEDOR -d

Acceder a la consola de un contenedor

$ lxc-console -n NOMBRE_CONTENEDOR

Para salir de la consola es necesario presionar la secuencia de teclas Ctrl+A Q.

Para acceder al shell del contenedor desde el mismo shell actual, ejecutar el siguiente comando.

$ lxc-attach -n NOMBRE_CONTENEDOR

Suspender (congelar) la ejecución de un contenedor

$ lxc-freeze -n NOMBRE_CONTENEDOR

Reanudar (descongelar) la ejecución de un contenedor

$ lxc-unfreeze -n NOMBRE_CONTENEDOR

Finalizar la ejecución de un contenedor

Realizar una finalización segura (apagado).

$ lxc-shutdown -n NOMBRE_CONTENEDOR

Realizar un apagado abrupto (halar del cable).

$ lxc-stop -n NOMBRE_CONTENEDOR

Destruir un contenedor

Esta acción elimina los archivos asociados con el contenedor.

$ lxc-destroy -n NOMBRE_CONTENEDOR

Recursos