Cómo usar GPG agent

El agente de GPG es una herramienta muy útil para evitar estar metiendo continuamente las contraseñas para desbloquear las claves GPG o en las conexiones SSH. Por desgracia no suele estar habilitado por defecto en la consola, pero vamos a ver como solucionarlo. Esta solución está basada en este comentario.

El kit de la cuestión es que solo puede haber una instancia de gpg-agent por usuario y en cada sesión se tienen que configurar las variables de entorno necesarias. Estas variables las vamos a guardar en el archivo ~/.gpg-agent-info

Primero creamos dos entradas en nuestro crontab que se encargarán de lanzarlo:

$ crontab -e

@reboot         umask 0077; rm -f $HOME/.gpg-agent-info; pgrep -U $LOGNAME gpg-agent >/dev/null 2>&1 || gpg-agent --daemon --enable-ssh-support --write-env-file "${HOME}/.gpg-agent-info" >/dev/null 2>&1
*/5 * * * *     umask 0077; pgrep -U $LOGNAME gpg-agent >/dev/null 2>&1 || gpg-agent --daemon --enable-ssh-support --write-env-file "${HOME}/.gpg-agent-info" >/dev/null 2>&1

Con la primera línea borraremos este archivo al arrancar el sistema y lanzaremos el demonio. Con la segunda línea comprobamos cada 5 minutos que el demonio está corriendo y en caso contrario, lo lanzamos.

Ahora vamos a modificar el archivo ~/.bash_profile para configurar el entorno. Añadimos las siguientes líneas:

# Launch GPG Agent
GPG_TTY="$(tty)"
export GPG_TTY
if [ -n "$(pgrep -U $LOGNAME gpg-agent)" -a -f ${HOME}/.gpg-agent-info ]; then
   . ${HOME}/.gpg-agent-info
   export GPG_AGENT_INFO
   export SSH_AUTH_SOCK
   export SSH_AGENT_PID
   echo "GNU Privacy Guard Agent [ENABLED]"
else
   unset GPG_AGENT_INFO
   unset SSH_AUTH_SOCK
   unset SSH_AGENT_PID
   if [ -f ${HOME}/.gpg-agent-info ]; then
      rm -f ${HOME}/.gpg-agent-info
   fi
fi
Advertisements

Autenticación sin contraseñas en SSH

Todo un clásico, pero extremadamente útil cuando tienes varias máquinas para administrar.

$ ssh-keygen -t rsa -b 4096 -C "your_email@youremail.com" #Genera la clave
$ ssh-copy-id username@remote-host #Copia la clave al servidor remoto

Para los paranoicos es una buena idea tener anotados de antemano los fingerprints de los servidores. De esta forma si intentamos conectar alguna vez desde algún entorno no seguro donde no tengamos cacheada la clave en ~/.ssh/known_hosts podremos estar seguros de que no nos están haciendo un man in the middle.

$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
2048 e7:1c:1b:2f:7b:e5:a2:b8:aa:01:d5:79:07:0f:e2:1a /etc/ssh/ssh_host_rsa_key.pub (RSA)

Crear repositorio de paquetes RPM

Últimamente he estado aprendiendo a crear paquetes RPM y cuando ya tienes hechos unos cuantos es muy útil crearse un repositorio para instalarlos desde ahí. Para una empresa que tiene que gestionar muchas máquinas es una herramienta fundamental para distribuir versiones personalizadas o aplicaciones propias. Hay bastante documentación al respecto, yo he estado leyendo entradas como ésta.

Os cuento como he creado mi repositorio.

Cuento con dos máquinas, el servidor (un VPS en buyvm.net, os lo recomiendo) y mi máquina de trabajo. Los RPM ya los tengo generados, en otra entrada ya explicaré en más detalle como hacerlos.

Primero voy a crear toda la estructura en mi máquina.


$ mkdir -p /home/user/devel/repo #Este será el directorio raiz del repositorio
$ cd /home/user/devel/repo
$ mkdir -p Fedora/15/{i386,x86_64}/{os,debug}
$ mkdir -p Fedora/15/source/SRPMS
$ cp <rpms> <directorio donde les corresponda> #Los binarios en arch/os los src.rpm en source/SRPMS etc.

Ahora vamos a generar una clave GPG para firmar los RPM y la información del repositorio.

$ gpg --gen-key #Creamos una clave RSA de 4096 bits (recomendado), le damos el nombre del repositorio.
$ gpg --export <nombre de la clave> > /home/user/devel/repo/RPM-GPG-KEY-myrepo #Exportamos la clave pública al repositorio


Añado las siguientes líneas a ~/.rpmmacros

%_signature gpg
%_gpg_name <nombre de la clave del repositorio>

Y firmo los paquetes con la clave:

$ find /home/user/devel/repo -type f -name "*.rpm" | xargs rpm --resign

Ahora solo nos queda crear la información del repositorio, para esto usaremos la herramienta createrepo. He creado el siguiente script en bash para automatizar el proceso:

#!/bin/bash
repodir="/home/user/devel/repo/Fedora/15"
archs="i386/os i386/debug x86_64/os x86_64/debug source/SRPMS"

# Actualizo la informacion del repositorio
for arch in $archs
do
   pushd ${repodir}/${arch} >/dev/null 2>&1
   createrepo -v .
   popd >/dev/null 2>&1
done

# Firmo el repositorio
files=$(find $repodir -name repomd.xml)
for file in $files
do
   echo "Firmo el archivo: $file"
   if [ -f ${file}.asc ]; then
      rm -f ${file}.asc
      gpg --armor --detach-sign --default-key "<nombre de la clave del repositorio>" $file
   fi
done

Ya tenemos el repositorio creado en nuestra máquina. Ahora vamos a replicarlo al servidor web, para ello crearemos la carpeta que alojará la web y lo sincronizaremos con rsync. Podemos crear un tarea cron que se ejecute cada hora para tenerlo siempre sincronizado o lanzarlo manualmente.


rsync -avz --rsh=ssh --delete /home/user/devel/repo/ user@server.example.com:/var/www/vhosts/rpm.server.example.com/repo/

Por último creamos el fichero myrepo.repo que describe nuestro repositorio y lo copiamos en /etc/yum.repos.d

[myrepo]
name=My repository
baseurl=http://server.example.com/repo/Fedora/15/$basearch/os
enabled=1
gpgcheck=1
gpgkey=http://server.example.com/repo/RPM-GPG-KEY-myrepo.asc

[myrepo-debuginfo]
name=My repository - Debug
baseurl=http://server.example.com/repo/Fedora/15/$basearch/debug
enabled=0
gpgcheck=1
gpgkey=http://server.example.com/repo/RPM-GPG-KEY-myrepo.asc

[myrepo-source]
name=My repository - Source
baseurl=http://server.example.com/repo/Fedora/15/source/SRPMS
enabled=0
gpgcheck=1
gpgkey=http://server.example.com/repo/RPM-GPG-KEY-myrepo.asc

Habilitar la autenticación contra Active Directory en CentOS 5

Las siguientes instrucciones son para habilitar el login de usuarios de Active Directory en CentOS 5 x86_64.

Lo primero que necesitamos es instalar en el controlador de dominio (en mi caso Windows 2008 R2) el servicio de “Microsoft Identity Management for UNIX” y crear un dominio NIS.

He creado en AD un grupo global ad_unix_users para que sea el grupo principal de los usuarios en Linux, para esto en las propiedades del grupo, vamos a la pestaña UNIX attributes y lo asignamos al dominio NIS. Le tendría que dar automáticamente un GID.

En los usuarios que queramos que puedan loguearse vamos de nuevo a la pestaña UNIX attributes y los añadimos al dominio NIS. Ponemos nuestra shell preferida, directorio home, y el grupo principal que hemos creado antes. Voy a suponer que todos los usuarios están dentro de la OU: “ou=Users,dc=example,dc=com”.

Hace falta crear también un usuario para la conexión LDAP. En este ejemplo se llama unixauth, ponerle una contraseña compleja.

Hay ciertos puntos que hay que revisar:

  • El DNS tiene que estar bien configurado: tiene que funcionar bien la resolucion del nombre de host y la resolución inversa y la máquina Linux tiene que resolver usando los DNS de Windows.
  • Me he encontrado un conflicto en CentOS 5 de 64 bits por culpa del paquete pam_krb5.i386 que no debería estar instalado. Incluyo un comando para quitar todos los paquetes de 32 bits
  • Hace falta el certificado de la CA del dominio, podemos obtenerlo accediendo a la máquina donde esten instalados los servicios de certificados en la URL adcs.example.com/certsrv/


# yum list installed | egrep ".i686|.i386" | awk {'print $1'} | xargs yum remove -y
# cp <Windows CA>.crt /etc/openldap/cacerts/
# yum install -y openldap-clients.x86_64 pam_krb5.x86_64 authconfig.x86_64 nss_ldap.x86_64
# authconfig --enableldap --enableldaptls --ldapserver adds01.example.com,adds02.example.com --ldapbasedn "ou=Users,dc=example,dc=com" --enablekrb5 --krb5realm EXAMPLE.COM --enablekrb5kdcdns --disablekrb5realmdns --enablemkhomedir --enablelocauthorize --update

– Editar /etc/ldap.conf y añadir:

binddn unixauth
bindpw <unixauth password>
nss_map_objectclass posixAccount user
nss_map_objectclass shadowAccount user
nss_map_attribute uid sAMAccountName
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute shadowLastChange pwdLastSet
nss_map_objectclass posixGroup group
nss_map_attribute uniqueMember member
pam_login_attribute sAMAccountName
pam_filter objectclass=User
pam_password ad

Espero que os sirva.

Errores al instalar SQL Server 2008

Acabo de instalar un cluster de SQL Server 2008 y me ha sorprendido encontrarme varios fallos en el instalador que te impiden completar la instalación de forma gráfica. Os los detallo:

  • En el primer nodo, cuando se definen los grupos a los que pertenecen las cuentas de servicio, seleccionaba el grupo previamente creado en Active Directory y me daba un error de “must provide AGTDOMAIN group”. Después de volverme loco descubrí que si en vez de darle al botón de Examinar escribía el nombre del grupo a mano, lo aceptaba.
  • En el segundo nodo, al aceptar el código de licencia, me daba continuamente un error de “the current SKU is invalid”. En este caso lo solucioné lanzando la instalación desde línea de comandos:
    setup.exe /q /ACTION=AddNode /INSTANCENAME="MSSQLSERVER"
    /SQLSVCACCOUNT="" /SQLSVCPASSWORD=""
    /AGTSVCACCOUNT="", /AGTSVCPASSWORD=""
    /ASSVCACCOUNT="" /ASSVCPASSWORD=”” /INDICATEPROGRESS

    Más información en esta web

Copiar archivos en windows

Cuando queremos copiar un árbol de directorios en windows y queremos conservar los permisos, propietario, hora de acceso, etc. la función copy normal se nos queda totalmente coja. Necesitamos recurrir a herramientas más avanzadas como RoboCopy.

RoboCopy se encuentra dentro del paquete Resource Kit Tool de windows, donde hay un montón de herramientas útiles.
La documentación se encuentra en un archivo .doc en el directorio de instalación, echadle un ojo porque tiene multitud de opciones.

La línea que os pongo a continuación es la que uso yo y copia todo el árbol de directorios, con todos los atributos de los ficheros y los permisos:

robocopy.exe C:dir_origen D:dir_destino /COPYALL /SEC /ZB /E /R:0 /W:0 /LOG:ficherolog.txt /NFL /NDL

Instalar Google Earth 5.0 en Linux

Recienteme he instalado la versión 5 de Google Earth en Ubuntu intrepid 8.10 AMD64. Como me ha dado algunos problemas os detallo lo que hice:

Una vez descargado, le damos permisos de ejecución:

$ chmod +x GoogleEarthLinux.bin
$ ./GoogleEarthLinux.bin

Hacemos la instalación en modo gráfico, todo bien hasta que lo ejecutamos:

$ ./googleearth-bin: relocation error: /usr/lib/i686/cmov/libssl.so.0.9.8: symbol BIO_test_flags, version OPENSSL_0.9.8 not defined in file libcrypto.so.0.9.8 with link time reference

He visto varias soluciones, por ejemplo haciendo un enlace simbólico a la librería del sistema. Lo que yo he hecho ha sido renombrar la librería que trae Google Earth para que vaya a buscarla al sistema:

$ mv libcrypto.so.0.9.8 libcrypto.so.0.9.8-backup