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

Los primeros 10 minutos con LXD el hypervisor de contenedores en Ubuntu

Instalación

$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-git-master

$ sudo apt-get update

$ sudo apt-get install lxd

El proceso de instalación incluye la creación del grupo lxd al que deberán pertenecer todos los usuarios que interactúen con los contenedores.  Inicialmente se agregan a este grupo todos los usuarios que pertenecían a admin y sudoers en el momento de la instalación.

Una vez realizada la instalación es necesario cerrar y volver a abrir la sesión de usuario para que la inscripción en el grupo lxd sea tomada en cuenta.  Si se desea obviar esto, ejecute el siguiente comando para incluir al usuario en el grupo mencionado sobre la sesión actual.

$ newgrp lxd

Gestión de imágenes

Agregar el repositorio de linuxcontainers.org.

$ lxc remote add lxc-org images.linuxcontainers.org

$ lxc remote list

+---------+-----------------------------------------+--------+
|  NAME   |                   URL                   | PUBLIC |
+---------+-----------------------------------------+--------+
| local   | unix:///var/lib/lxd/unix.socket         | NO     |
| lxc-org | https://images.linuxcontainers.org:8443 | YES    |
+---------+-----------------------------------------+--------+

Importar imágenes para tenerlas disponibles localmente.

# Ubuntu Cloud
$ lxd-images import ubuntu --alias ubuntu-cloud

# Debian 8 64 bits
$ lxc image copy lxc-org:/debian/jessie/amd64 local: --alias=jessie-amd64

Consultar mas información acerca de las imágenes disponibles en el repositorio de linuxcontainers.org.

Listar las imágenes disponibles en un repositorio remoto

$ lxc image list lxc-org:

+--------------------------------+--------------+--------+-------------------------+---------+-------------------------------+
|             ALIAS              | FINGERPRINT  | PUBLIC |       DESCRIPTION       |  ARCH   |          UPLOAD DATE          |
+--------------------------------+--------------+--------+-------------------------+---------+-------------------------------+
|                                | ee326b31ae93 | yes    | Debian squeeze (amd64)  | x86_64  | Oct 1, 2015 at 6:17pm (COT)   |
|                                | cd3f30323ce2 | yes    | Centos 6 (amd64)        | x86_64  | Oct 1, 2015 at 10:17pm (COT)  |
|                                | b6a940bfe3a4 | yes    | Plamo 5.x (amd64)       | x86_64  | Sep 30, 2015 at 5:23pm (COT)  |
|                                | 5351e4792a81 | yes    | Plamo 5.x (amd64)       | x86_64  | Oct 1, 2015 at 5:24pm (COT)   |
|                                | 02a8d955bc82 | yes    | Plamo 5.x amd64 (mini)  | x86_64  | Sep 30, 2015 at 5:50pm (COT)  |
|                                | 5df2ba98422b | yes    | Plamo 5.x amd64 (mini)  | x86_64  | Oct 1, 2015 at 5:50pm (COT)   |

...

Listar las imágenes disponibles localmente

$ lxc image list

+--------------+--------------+--------+------------------------------------+--------+------------------------------+
|    ALIAS     | FINGERPRINT  | PUBLIC |            DESCRIPTION             |  ARCH  |         UPLOAD DATE          |
+--------------+--------------+--------+------------------------------------+--------+------------------------------+
| jessie-amd64 | 87c085189294 | yes    | Debian jessie (amd64)              | x86_64 | Oct 3, 2015 at 1:40am (COT)  |
| ubuntu-cloud | a1448d43bb7c | no     | Ubuntu 14.04 LTS server (20150930) | x86_64 | Oct 3, 2015 at 12:49am (COT) |
+--------------+--------------+--------+------------------------------------+--------+------------------------------+

Obtener información de una imagen disponible localmente.

$ lxc image info jessie-amd64

Fingerprint: 87c085189294cd6a316dbefe1e235f9b9e69aa1b049df4ddce2202ad0f9c56ab
Size: 1e+02MB
Architecture: x86_64
Public: no
Timestamps:
    Created: 2015/10/02 23:30 UTC
    Uploaded: 2015/10/03 06:40 UTC
    Expires: never
Properties:
    description: Debian jessie (amd64)
Aliases:
    - jessie-amd64

Remover una imagen dispoible localmente.

$ lxc image delete jessie-amd64

Sincronizar la versión de las imágenes locales con la disponible en los repositorios.

$ lxd-images sync

Es posible agregar la opción --sync durante la importación de la imagen para mantenerla actualizada automáticamente.

Gestión de contenedores

Crear un nuevo contenedor a partir de una imagen disponible localmente.

$ lxc launch ubuntu-cloud myContainer

Si la imagen solicitada, ubuntu-cloud en este caso, no se encuentra disponible localmente, esta es importada automáticamente y puesta en el caché por 10 días.

Listar los contenedores disponibles y su estado.

$ lxc list

Iniciar un contenedor explícito.

$ lxc start myContainer

Consultar el registro (log) de un contenedor explícito.

$ lxc info --show-log myContainer

Detener a un contenedor explícito.

$ lxc stop myContainer

Destruir (remover) a un contenedor explícito.

$ lxc delete myContainer

Interacción con el contenedor

Ejecutar un comando en un contenedor específico.

$ lxc exec myContainer -- COMANDO

Acceder al shell del contenedor.

$ lxc exec myContainer -- /bin/bash

Transferir un archivo hacia el contenedor.

$ lxc file push ARCHIVO myContainer/ruta/de/destino

Transferir un archivo desde el contenedor.

$ lxc file pull myContainer/ruta/de/origen .

Recursos

  1. What’s LXD?
    https://linuxcontainers.org/lxd/introduction/
  2. LXD – The Linux container hypervisor
    http://www.ubuntu.com/cloud/tools/lxd
  3. Getting started with LXD – the container lightervisor
    https://insights.ubuntu.com/2015/04/28/getting-started-with-lxd-the-container-lightervisor/
  4. Installing LXD and the command line tool
    https://insights.ubuntu.com/2015/03/20/installing-lxd-and-the-command-line-tool/
  5. Infographic: LXD Machine containers from Ubuntu
    https://insights.ubuntu.com/2015/09/23/infographic-lxd-machine-containers-from-ubuntu/
  6. Repositorio de LXD en GitHub
    https://github.com/lxc/lxd

Problemas reconociendo el touchpad de un Asus X455L en Linux Ubuntu 15.04

Aclaración de versiones

Este procedimiento sólo es necesario con versiones del Kernel inferiores a la 4.2 ya que a partir de esta versión (utilizada por Wily y Trusty de Ubuntu), los touchpads Focaltech se encuentran soportados de manera nativa.

Introducción

Una vez instalado Linux Ubuntu 15.04 en el portátil Asus X455L se evidencia que el touchpad no se encuentra funcionando correctamente.  Los gestos como el scroll vertical y horizontal no funcionan y el área de los botones también es sensible al movimiento haciendo muy difícil hacer clic sobre una ubicación precisa.

Al parecer este touchpad de FocalTech requiere de unos controladores específicos que aún no se encuentran incluidos en el kernel convencional.

$ xinput list

⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ PS/2 FocalTech FocalTech Touchpad in mouse emulation mode    id=13    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Video Bus                                   id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ USB2.0 VGA UVC WebCam                       id=10    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                            id=11    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=12    [slave  keyboard (3)]

La solución a este problema consiste en instalar estos controladores que han sido preparados por miembros de la comunidad (no directamente Asus).

Solución

Agregar el repositorio e instalar el paquete requerido.

$ sudo add-apt-repository ppa:hanipouspilot/focaltech-dkms

$ sudo apt-get update

$ sudo apt-get install focaltech-dkms

Reiniciar psmouse de la siguiente manera o reiniciar el sistema operativo completo.

$ sudo modprobe -r psmouse

$ sudo modprobe psmouse

Verificación

Una vez instalado correctamente el módulo con los controladores y reiniciado el sistema se obtiene este nuevo resultado con xinput.

$ xinput list

⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ PS/2 FocalTech FocalTech Touchpad           id=13    [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Video Bus                                   id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ USB2.0 VGA UVC WebCam                       id=10    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                            id=11    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=12    [slave  keyboard (3)]

Recursos

  1. Repositorio de Ubuntu para el paquete focaltech-dkms.
    https://launchpad.net/~hanipouspilot/+archive/ubuntu/focaltech-dkms
  2. Repositorio de GitHub para el paquete psmouse-focaltech-dkms.
    https://github.com/markmandel/psmouse-focaltech-dkms