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.