Esto capaz es una boludez, pero buéh...
En uno de mis laburos (ahora tengo 3) tenemos un server que da
DHCP y DNS a una red interna, un Debian Etch con
dnsmasq. El punto es que dnsmasq
concentra muy bien estos dos servicios, haciendo muy simple el
poder resolver nombres de máquinas que tomaron su IP dinámicamente
por DHCP. Esto se logra haciendo que el cliente mande un nombre de
máquina, y según el ip que le asigna agrega una entrada de DNS.
Para el entorno donde estoy trabajando esto viene de pelos.
También toma DNS del /etc/hosts. El problema es que
si en la entrada del 127.0.0.1, además del típico
localhost y/o localhost.localdomain
(puaj) hay otro nombre de máquina, y está primero, antes que
ninguna otra máquina, esa entrada queda en el DNS. Así, si desde
dentro de la red preguntás por el nombre del servidor, el DNS
responde que 127.0.0.1. Parrafraseando a un famoso
personaje de una serie televisiva: “D-oh!”.
El otro día dí una charlita un poquito larga de ssh/scp y screen
en el IATE, el lugar donde
laburo. En la misma hablo de ssh/scp básico, mas cómo
poner claves públicas/privadas y cómo usar el
ssh-agent para administrarlas (algo de lo que ya
hablé en este glob), mas otros temas como el X11 forwarding y
el agent-forwarding. Además hablé de screen, una
herramineta que se complementa muy bien con ssh. Dejo
las filminas acá.
En este post veremos cómo crear pares de claves pública/privada
con passphrases, y cómo usar ssh-agent para no tener
que andar tipeándolas a cada rato.
Lo primero es generar el par. Hay dos tipos de pares de claves,
RSA y DSA. Los pares se guardan en nuestro .ssh/, así
que antes de generar un par nos fijamos qué hay allí:
mdione@cobra:~$ ls -l .ssh/
total 28
-rw-r--r-- 1 mdione mdione 190 2008-02-26 15:29 config
-rw------- 1 mdione mdione 1743 2008-09-19 16:55 id_dsa
-rw-r--r-- 1 mdione mdione 394 2008-09-19 16:55 id_dsa.pub
-rw------- 1 mdione mdione 11598 2008-09-02 10:35 known_hosts
-rw------- 1 mdione mdione 9388 2008-06-05 22:59 known_hosts.old
Hay una par DSA (id_dsa e id_dsa.pub),
así que creamos un par RSA para no pisarlo:
mdione@cobra:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mdione/.ssh/id_rsa):
*** Enter passphrase (empty for no passphrase):
*** Enter same passphrase again:
Your identification has been saved in /home/mdione/.ssh/id_rsa.
Your public key has been saved in /home/mdione/.ssh/id_rsa.pub.
The key fingerprint is:
1c:da:2b:a8:97:72:7e:ab:ff:ea:bb:e8:6b:64:4c:93 mdione@cobra
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . . |
| E + . |
| o .. S |
| +. . |
| o... . |
| ..=... |
| .B**B*. |
+-----------------+
Notar que en *** ssh-keygen pide dos
veces una passphrase. El término passphrase viene
de la época en que las passwords sólo podían ser de un maximo de 8
caracteres. La passphrase puede ser de cualquier longitud; una
longitud buena está en los 15-20 caracteres. Se puede poner una
passphrase nula, pero por motivos de seguridad les sugiero que
no lo hagan. Si aprenden bien a usar
ssh-agent van a tener que tipearla poco.
Ahora copiamos la parte pública al servidor al que queremos entrar:
mdione@cobra:~$ ssh-copy-id -i .ssh/id_rsa.pub beetroot.except.com.ar
*** mdione@beetroot.except.com.ar's password:
Now try logging into the machine, with "ssh 'beetroot.except.com.ar'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Probamos entrar al server para ver que el par ande:
mdione@cobra:~$ ssh beetroot.except.com.ar
*** Enter passphrase for key '/home/mdione/.ssh/id_rsa':
Last login: Fri Sep 19 12:18:16 2008 from ginger.except.com.ar
mdione@beetroot:~$ logout
Connection to beetroot.except.com.ar closed.
Notar que en *** pide la passphrase del par que
acabamos de crear.
Ahora a usar ssh-agent. ssh-agent se
inicia en toda sesión en una distro moderna, podemos verlo dando
vueltas en nuestro background:
mdione@cobra:~$ ps fax | grep ssh-agent
2997 ? Ss 0:00 \_ ssh-agent screen
En este caso lo tengo corriendo antes de un screen,
pero en un desktop podemos ver algo de la pinta
/usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session
x-session-manager.
Una vez que vemos el ssh-agent dando vueltas por
ahí, veamos qué claves tiene:
mdione@cobra:~$ ssh-add -l
The agent has no identities.
Ok, agreguemos identidades al agente:
mdione@cobra:~$ ssh-add /home/mdione/.ssh/id_rsa
*** Enter passphrase for /home/mdione/.ssh/id_rsa:
Identity added: /home/mdione/.ssh/id_rsa (/home/mdione/.ssh/id_rsa)
mdione@cobra:~$ ssh-add -l
2048 1c:da:2b:a8:97:72:7e:ab:ff:ea:bb:e8:6b:64:4c:93 /home/mdione/.ssh/id_rsa (RSA)
En *** ssh-add nos pide la passphrase
de la clave. Ok, probemos entrar al servidor:
mdione@cobra:~$ ssh beetroot.except.com.ar
Last login: Fri Sep 19 20:58:57 2008 from 200.69.231.1
mdione@beetroot:~$
No pidió la passphrase, que es lo que queríamos.
Las passphrases quedan en el ssh-agent por un
período determinado de tiempo. Por defecto duran para siempre, pero
con ssh-add -t <segundos> podemos cambiar eso.
También podemos borrar una identidad con ssh -d <clave
privada> o todas las identidades con ssh-add
-D (que molesta costumbre de estas herramientas que tienen
nombre de creación pero con algunas opciones de destrucción;
ssh-keygen tiene una opción -R que no
sólo borra claves, sino que lo hace sobre el
.ssh/known-hosts, cuando el comando por sí solo actúa
en los pares de claves).
En otro post mostraré cómo sacar identidades de un agent y ponerlo en otro.
En este post veremos cómo crear pares de claves pública/privada
con passphrases, y cómo usar ssh-agent para no tener
que andar tipeándolas a cada rato.
Lo primero es generar el par. Hay dos tipos de pares de claves,
RSA y DSA. Los pares se guardan en nuestro .ssh/, así
que antes de generar un par nos fijamos qué hay allí:
mdione@cobra:~$ ls -l .ssh/
total 28
-rw-r--r-- 1 mdione mdione 190 2008-02-26 15:29 config
-rw------- 1 mdione mdione 1743 2008-09-19 16:55 id_dsa
-rw-r--r-- 1 mdione mdione 394 2008-09-19 16:55 id_dsa.pub
-rw------- 1 mdione mdione 11598 2008-09-02 10:35 known_hosts
-rw------- 1 mdione mdione 9388 2008-06-05 22:59 known_hosts.old
Hay una par DSA (id_dsa e id_dsa.pub),
así que creamos un par RSA para no pisarlo:
mdione@cobra:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mdione/.ssh/id_rsa):
*** Enter passphrase (empty for no passphrase):
*** Enter same passphrase again:
Your identification has been saved in /home/mdione/.ssh/id_rsa.
Your public key has been saved in /home/mdione/.ssh/id_rsa.pub.
The key fingerprint is:
1c:da:2b:a8:97:72:7e:ab:ff:ea:bb:e8:6b:64:4c:93 mdione@cobra
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . . |
| E + . |
| o .. S |
| +. . |
| o... . |
| ..=... |
| .B**B*. |
+-----------------+
Notar que en *** ssh-keygen pide dos
veces una passphrase. El término passphrase viene
de la época en que las passwords sólo podían ser de un maximo de 8
caracteres. La passphrase puede ser de cualquier longitud; una
longitud buena está en los 15-20 caracteres. Se puede poner una
passphrase nula, pero por motivos de seguridad les sugiero que
no lo hagan. Si aprenden bien a usar
ssh-agent van a tener que tipearla poco.
Ahora copiamos la parte pública al servidor al que queremos entrar:
mdione@cobra:~$ ssh-copy-id -i .ssh/id_rsa.pub beetroot.except.com.ar
*** mdione@beetroot.except.com.ar's password:
Now try logging into the machine, with "ssh 'beetroot.except.com.ar'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Probamos entrar al server para ver que el par ande:
mdione@cobra:~$ ssh beetroot.except.com.ar
*** Enter passphrase for key '/home/mdione/.ssh/id_rsa':
Last login: Fri Sep 19 12:18:16 2008 from ginger.except.com.ar
mdione@beetroot:~$ logout
Connection to beetroot.except.com.ar closed.
Notar que en *** pide la passphrase del par que
acabamos de crear.
Ahora a usar ssh-agent. ssh-agent se
inicia en toda sesión en una distro moderna, podemos verlo dando
vueltas en nuestro background:
mdione@cobra:~$ ps fax | grep ssh-agent
2997 ? Ss 0:00 \_ ssh-agent screen
En este caso lo tengo corriendo antes de un screen,
pero en un desktop podemos ver algo de la pinta
/usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session
x-session-manager.
Una vez que vemos el ssh-agent dando vueltas por
ahí, veamos qué claves tiene:
mdione@cobra:~$ ssh-add -l
The agent has no identities.
Ok, agreguemos identidades al agente:
mdione@cobra:~$ ssh-add /home/mdione/.ssh/id_rsa
*** Enter passphrase for /home/mdione/.ssh/id_rsa:
Identity added: /home/mdione/.ssh/id_rsa (/home/mdione/.ssh/id_rsa)
mdione@cobra:~$ ssh-add -l
2048 1c:da:2b:a8:97:72:7e:ab:ff:ea:bb:e8:6b:64:4c:93 /home/mdione/.ssh/id_rsa (RSA)
En *** ssh-add nos pide la passphrase
de la clave. Ok, probemos entrar al servidor:
mdione@cobra:~$ ssh beetroot.except.com.ar
Last login: Fri Sep 19 20:58:57 2008 from 200.69.231.1
mdione@beetroot:~$
No pidió la passphrase, que es lo que queríamos.
Las passphrases quedan en el ssh-agent por un
período determinado de tiempo. Por defecto duran para siempre, pero
con ssh-add -t <segundos> podemos cambiar eso.
También podemos borrar una identidad con ssh -d <clave
privada> o todas las identidades con ssh-add
-D (que molesta costumbre de estas herramientas que tienen
nombre de creación pero con algunas opciones de destrucción;
ssh-keygen tiene una opción -R que no
sólo borra claves, sino que lo hace sobre el
.ssh/known-hosts, cuando el comando por sí solo actúa
en los pares de claves).
En otro post mostraré cómo sacar identidades de un agent y ponerlo en otro.
¿Se acuerdan de
la primera parte? Bueno, venía aplicando esto varias veces
últimamente (nuevamente tracs y nuevamente plugins). Sé que
mi jefe me va a retar, pero la verdad es que lo prefiero así.
Generalizé esa idea y lo hice un script, y para marcar su
diferencia con el easy_install, lo llamé
useful_install:
#! /usr/bin/python
__requires__ = 'setuptools==0.6c3'
import sys
path= sys.argv.pop (1)
sys.path.append (path)
sys.argv= [sys.argv[0], '--install-dir', path, '--site-dirs', path ]+sys.argv[1:]
from pkg_resources import load_entry_point
sys.exit(
load_entry_point('setuptools==0.6c3', 'console_scripts', 'easy_install')()
)
Como verán es idéntico al easy_install, salvo que
el primer parámetro es el directorio donde vamos a instalar las
cosas y que hace la magia necesaria de agregarlo al
sys.path y armar los argumentos para e_i.
Además, le podemos pasar más parámetros a voluntad y pasan derecho
al load_entry_point del e_i. Que lo
disfruten.