# [ssh] Acceso sin password de forma arbitraria entre cientos

## Overpeer

Como reza el titulo ¿como configurar uan red de cientos de equipos para que accedan unos a otros por SSH de forma arbitraria sin tener que usar contraseña para poder automatizar transferencias de archivos?

Opcion 1) Usar expect. Funciona, pero claro, tengo que instalar las TCL/TK ademas de expect en todas las máquinas. Ya que ni los mismisimos rpm de Mandrake (que son lo que llevan estos equipos) funcionan ... tengo que hacerlo a mano y son 12 megas que tengo que pasear e instalar :S :S

Opcion 2) SSH2. Funciona claro, pero tengo que generar cientos de claves... meterlas en sus respectivos equipos ... buffff... da mas trabajo de implantar y mantener que hacer lo de expect.

Opcion 3) psftp para Linux. Funciona pero sale el puto dialogo de qeu si quiero aceptar la clave temporal y tampoco me sirve para automatiza el proceso.

No se me ocurren mas opciones. Solo quiero transferir archivos entre host de forma segura y de forma que pueda automatizar, es decir, componer el comando que quiero lanzar... lanzarlo ... y chinpon  :Very Happy: 

Las maquinas llevan discos clonados, todas el mismo nombre de host, solo varia de unas a otras la direccion IP que se configura en el primer arranque.

¿Alguna idea?¿porque no habra un 'scp user:pass@host'?  :Sad: 

Un saludo.

----------

## alexlm78

no estoy muy seguro de que es lo que deseas hacer, pero has considerado usar un NIS+NFS, si es para compartir archivos con autentificacion de usaurios, ahora bien si o que deseas es solo archivos, porque no solo un NFS, o en ultimo caso un FTP.

Mejor postea que es lo quieres hacer concretamente.

Saluditos.

----------

## Overpeer

Son equipos dispersos conectados mendiante una red wifi Ad-hoc, un programa hecho por mi lanza paquetes en forma de broadcast comunicando que version de unos programas tiene, si alguna IP informa de alguna version superior, procede a la descarga del archivo por scp.

No puede existir un punto central al que conectarse todos, nunca estan ubicados en el mismo sitio,  pero se han de conectar con sus adyacentes.

Creo qeu como esta hecho seria lo ideal, pero claro, el tema de la contraseña o de la clave publica es lo que produce que no sea tan automatico como yo qusiera, busco la mejor manera de automatizar el proceso de descarga de ciertos archivos de un equipo arbitrario.

Un saludo.

----------

## alexlm78

Pieso que seria mas facil de hacerlo por ftp, y la autenticacion es mas facil.

Ahora porque no puede haber un server central??

Es disposicion tuya o por alguna otra razon?

por ahora creo que la opcion de ftp es mas viable, estudia la opcion y me cuentas.

Saluditos.

----------

## Kuan

Para poder indicar en un solo comando el usuario y la contraseña puedes utilizar otro cliente ssh como PuTTY: pscp -pw ...

La idea de no permitir teclear la contraseña en la línea de comandos sin un aviso es evitar que alguna lumbrera pueda conseguir la clave realizando una búsqueda en la terminal (Ctrl-R). No se me ocurren otras ideas.

Y ya puestos a ser vagos, imagino que esa wireless estará "protegida" con wep ¿verdad?  :Rolling Eyes: 

----------

## psm1984

No esta del todo relacionado, pero... ¿conoces dsh? es una shell distribuida, permite ejecutar un comando y que lo haga en varias máquinas. http://howto.ipng.be/Mosix-HOWTO/Mosix-HOWTO/x349.htm

----------

## Overpeer

El planteamiento es inamobible, es una red Ad-hoc con ""seguridad"" WEP  en la que los equipos han de transferirse archivos de forma segura entre ellos.

psftp, es el "putty sftp"  :Very Happy:  , todos los programas de Putty tienen el mismo problema, salta el aviso de que si quiero aceptar la clave  :Razz: 

Alguna idea?

Un saludo.

----------

## Magnum44

Creo que tengo una idea que te puede servir, te paso un enlace a una web donde lo explica todo perfectamente. Muy por encima  te comento que la idea es generar una clave en cada equipo y transferirlas entre ellos dependiendo de quien quiera acceder a quien. Una vez transferidas esas claves, simplemente con hacer ssh equipo ya entraría directo, sin pedir clave alguna, dado que ya tiene la llave generada. No se si lo he explicado bien, así que mejor mira el enlace.

http://laura.celdran.name/

El artículo que has de buscar es:  *Quote:*   

>  Paso a Paso: Como hacer que entre servidores Unix se creen uniones de confianza evitando así el tecleo continuo de claves

 

Y hechándole un vistazo por encima creo a esa web creo que tambien hay algo para windows con putty: http://www.pasky.org/index.php/2005/02/02/42-autenticacion-automatica-ssh-con-putty-y-claves-publicaprivada

Espero que esto te sirva   :Cool: 

----------

## Overpeer

"... la idea es generar una clave en cada equipo y transferirlas entre ellos dependiendo de quien quiera acceder a quien."

¿Y como las transfiero de forma segura sin que pida contraseña?  :Very Happy: 

El link del Blog de Laura explica como hacer uso de SSHv2 sin contraseñas, pero para que por ejemplo, 300 equipos se conectasen entre si habria que repartir sus claves publicas por cada uno del resto de equipos, y si se metia un equipo nuevo en la red habria que meterle otras 300 claves a el,  y otra mas a l resto de equipos.

¿Sera dificil modificar el codigo fuente de scp para que asuma una contraseña? xD

¿No existe ninguna utilidad alternativa donde pueda usar la sintaxis 'scp login:pass@host/ruta/file' ? Lo unico que falla ahi es que scp no admite la pass.

Un saludo.

----------

## Overpeer

 *psm1984 wrote:*   

> No esta del todo relacionado, pero... ¿conoces dsh? es una shell distribuida, permite ejecutar un comando y que lo haga en varias máquinas. http://howto.ipng.be/Mosix-HOWTO/Mosix-HOWTO/x349.htm

 

No te habia visto xD A ver cuando volvemos a las andadas con el ET  :Wink: 

Es interesante, pero no me sirve para este caso concreto por que en la red Ad-hoc no existe ningun sistema de enrrutamiento entre nodos, por lo que desde un equipo no puedo llegar a todos.

Un saludo.

----------

## Kuan

 *Overpeer wrote:*   

> psftp, es el "putty sftp"  , todos los programas de Putty tienen el mismo problema, salta el aviso de que si quiero aceptar la clave 

 

Disculpa, no lo había visto  :Razz: 

El problema de la clave RSA lo puedes arreglar deshabilitando temporalmente la variable StrictHostKey en /etc/ssh_config. Así se añadirán de forma automática las claves en $HOME/.ssh/known_hosts. Una vez tengas reconocidos todos los equipos se vuelve a activar y listo. Creo que esto es a lo que te referías:

```
RSA key fingerprint is xx:xxxx:

Are you sure you want to continue connecting (yes/no)?
```

Para automatizar todo sin contraseñas el modo por lotes te puede servir (opción -B) y estos scripts: Uploadkeys, Pussh. Y si necesitas ejecutar comandos en paralelo en varias máquinas es posible también con tentakel.

(¿No te has pasado un poquito con las dobles comillas en wep?  :Laughing:  , mejor no dramaticemos...)

----------

## M.A.

Es una situación un poco rara.

Primero, cualquier cosa que hagas tendrás que instalarla en todas las máquinas, no? Luego tendrás que entrar al menos una vez en todas ellas usando password...

Por otra parte, el expect no es tan pesado de instalar... ¿Qué tiene de malo instalar tcl? El rpm del tcl no creo que tenga pegas...

Una cosa que no entiendo: ¿por qué tienen todas las máquinas el mismo nombre de host?

Por último, lo mejor es usar ssh2. ¿Por qué no usas la misma clave para todos los equipos? Así, cuando agreges uno nuevo, sólo tienes que cargarle la clave  en .ssh/id_dsa e id_dsa.pub (o bien id_rsa).

----------

## M.A.

Ah por cierto, acabo de recordar que hace unos meses modifiqué el código del ssh para que asumiese el scp siempre una contraseña.

La verdad es que no es muy seguro porque la cadena de texto aparece en algún lugar del binario compilado, pero si guardas el binario en la carpeta del usuario con permisos sólo para él... Lo utilicé para ciertas tareas programadas, aunque después instalé expect y lo dejé de utilizar.

Si te interesa puedo buscar, lo tendré por ahí... De todas maneras no me costó más de 20 minutos, el código es bastante legible.

De todas formas sigo pensando que la mejor solución en tu caso es lo de las claves SSH2 que te comentaba en mi anterior post.

----------

## Overpeer

 *M.A. wrote:*   

> 
> 
> Por otra parte, el expect no es tan pesado de instalar... ¿Qué tiene de malo instalar tcl? El rpm del tcl no creo que tenga pegas...
> 
> 

 

Tiene pegas, creeme xD

No encuentro la forma de afinar el sistema de paqueteria de Mandrake 10.0, es una pasada. Si no peta uno ... peta el otro para que al final, se instalen las tcl/tk y no fucionen. Con lo que me queda la opcion de compilar las fuentes o usar el instalador de 12 Megas que hay en la web del proyecto... estos ordenadores, estan en vehiculos y solo estan juntos por las noches ... no me apetece ir a compilar las TCL/TK en cada bicho xD

 *M.A. wrote:*   

> 
> 
> Una cosa que no entiendo: ¿por qué tienen todas las máquinas el mismo nombre de host?
> 
> 

 

Porque el disco original tieen ese nombre, llevan discos clonados  :Smile: 

 *M.A. wrote:*   

> 
> 
> Por último, lo mejor es usar ssh2. ¿Por qué no usas la misma clave para todos los equipos? Así, cuando agreges uno nuevo, sólo tienes que cargarle la clave  en .ssh/id_dsa e id_dsa.pub (o bien id_rsa).

 

[/quote]

Porque el fingerprint indica que es una maquina distinta y sigue pidiendo password :S

 *M.A. wrote:*   

> 
> 
> Ah por cierto, acabo de recordar que hace unos meses modifiqué el código del ssh para que asumiese el scp siempre una contraseña. 
> 
> 

 

Mas sencillo imposible, justo lo que necesito  :Very Happy:  Me puedes enviar el fuente o decirme en que parte del fuente se cambia? Gracias.

Un saludo.

----------

## M.A.

 *Quote:*   

> Porque el fingerprint indica que es una maquina distinta y sigue pidiendo password :S 

 

Para eso lo que tienes que hacer es copiar la carpeta /etc/ssh en todas las máquinas, así el fingerprint será el mismo.

Aunque sigo pensando que la mejor solución es el intercambio de claves con SSH2, te adjunto el parche con las modificaciones para la versión openssh-3.8.1p1 :

```

diff -Naur openssh-3.8.1p1/readconf.c openssh-3.8.1p1_pass/readconf.c

--- openssh-3.8.1p1/readconf.c  2004-03-08 13:12:36.000000000 +0100

+++ openssh-3.8.1p1_pass/readconf.c     2006-01-30 20:38:11.000000000 +0100

@@ -93,7 +93,7 @@

        oPasswordAuthentication, oRSAAuthentication,

        oChallengeResponseAuthentication, oXAuthLocation,

        oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,

-       oUser, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,

+       oUser, oPassword, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,

        oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,

        oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,

        oCompressionLevel, oTCPKeepAlive, oNumberOfPasswordPrompts,

@@ -160,6 +160,7 @@

        { "localforward", oLocalForward },

        { "user", oUser },

        { "host", oHost },

+       { "password", oPassword },

        { "escapechar", oEscapeChar },

        { "globalknownhostsfile", oGlobalKnownHostsFile },

        { "userknownhostsfile", oUserKnownHostsFile },          /* obsolete */

@@ -860,6 +861,7 @@

        options->host_key_alias = NULL;

        options->proxy_command = NULL;

        options->user = NULL;

+       options->password = NULL;

        options->escape_char = -1;

        options->system_hostfile = NULL;

        options->user_hostfile = NULL;

diff -Naur openssh-3.8.1p1/readconf.h openssh-3.8.1p1_pass/readconf.h

--- openssh-3.8.1p1/readconf.h  2004-03-08 13:12:36.000000000 +0100

+++ openssh-3.8.1p1_pass/readconf.h     2006-01-30 20:38:11.000000000 +0100

@@ -73,6 +73,7 @@

        char   *host_key_alias; /* hostname alias for .ssh/known_hosts */

        char   *proxy_command;  /* Proxy command for connecting the host. */

        char   *user;           /* User to log in as. */

+       char   *password;       /* Password to log in. */

        int     escape_char;    /* Escape character; -2 = none */

        char   *system_hostfile;/* Path for /etc/ssh/ssh_known_hosts. */

diff -Naur openssh-3.8.1p1/scp.c openssh-3.8.1p1_pass/scp.c

--- openssh-3.8.1p1/scp.c       2003-11-24 03:09:28.000000000 +0100

+++ openssh-3.8.1p1_pass/scp.c  2006-01-30 20:38:11.000000000 +0100

@@ -231,7 +231,7 @@

        addargs(&args, "-oClearAllForwardings yes");

        fflag = tflag = 0;

-       while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q1246S:o:F:")) != -1)

+       while ((ch = getopt(argc, argv, "dfl:w:prtvBCc:i:P:q1246S:o:F:")) != -1)

                switch (ch) {

                /* User-visible flags. */

                case '1':

@@ -245,8 +245,9 @@

                case 'c':

                case 'i':

                case 'F':

+               case 'w':

                        addargs(&args, "-%c%s", ch, optarg);

-                       break;

+                       break;

                case 'P':

                        addargs(&args, "-p%s", optarg);

                        break;

diff -Naur openssh-3.8.1p1/ssh.c openssh-3.8.1p1_pass/ssh.c

--- openssh-3.8.1p1/ssh.c       2004-03-21 23:36:01.000000000 +0100

+++ openssh-3.8.1p1_pass/ssh.c  2006-01-30 20:38:11.000000000 +0100

@@ -228,7 +228,7 @@

 again:

        while ((opt = getopt(ac, av,

-           "1246ab:c:e:fgi:kl:m:no:p:qstvxACD:F:I:L:NPR:TVXY")) != -1) {

+           "1246ab:c:e:fgi:kl:m:no:p:qstvw:xACD:F:I:L:NPR:TVXY")) != -1) {

                switch (opt) {

                case '1':

                        options.protocol = SSH_PROTO_1;

@@ -374,6 +374,12 @@

                case 'l':

                        options.user = optarg;

                        break;

+               case 'w':

+                       options.password = optarg;

+                       options.password_authentication = 1;

+                       options.preferred_authentications = xstrdup("password");

+               /*      options.kbd_interactive_authentication = 0; */

+                       break;

                case 'L':

                case 'R':

diff -Naur openssh-3.8.1p1/sshconnect1.c openssh-3.8.1p1_pass/sshconnect1.c

--- openssh-3.8.1p1/sshconnect1.c       2003-09-02 14:51:17.000000000 +0200

+++ openssh-3.8.1p1_pass/sshconnect1.c  2006-01-30 20:38:11.000000000 +0100

@@ -443,7 +443,12 @@

        for (i = 0; i < options.number_of_password_prompts; i++) {

                if (i != 0)

                        error("Permission denied, please try again.");

-               password = read_passphrase(prompt, 0);

+               if ( options.password == NULL)

+                       password = read_passphrase(prompt, 0);

+               else {

+                       password = xstrdup(options.password);

+                       memset(options.password, 'x', sizeof options.password);

+               }

                packet_start(SSH_CMSG_AUTH_PASSWORD);

                ssh_put_password(password);

                memset(password, 0, strlen(password));

diff -Naur openssh-3.8.1p1/sshconnect2.c openssh-3.8.1p1_pass/sshconnect2.c

--- openssh-3.8.1p1/sshconnect2.c       2004-03-08 13:12:36.000000000 +0100

+++ openssh-3.8.1p1_pass/sshconnect2.c  2006-01-30 20:38:11.000000000 +0100

@@ -729,10 +729,16 @@

        if (attempt != 1)

                error("Permission denied, please try again.");

-

-       snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",

-           authctxt->server_user, authctxt->host);

-       password = read_passphrase(prompt, 0);

+

+       if ( options.password == NULL ) {

+               snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",

+                   authctxt->server_user, authctxt->host);

+               password = read_passphrase(prompt, 0);

+       } else {

+           password = xstrdup(options.password);

+           memset(options.password,'x',sizeof options.password);

+       }

+

        packet_start(SSH2_MSG_USERAUTH_REQUEST);

        packet_put_cstring(authctxt->server_user);

        packet_put_cstring(authctxt->service);

```

Simplemente entra en la carpeta donde hayas descomprimido las fuentes y pones:

```
patch -p1 < fichero_con_el_parche
```

El uso es sencillo, por ejemplo para entrar en un servidor por ssh:

```
ssh servidor -l usuario -w password
```

Para copiar un fichero por scp:

```
scp -w password ficherolocal usuario@servidor:ficheroremoto
```

No cambié sftp porque no lo necesitaba. Es un pelín cutre, pero funciona.

NOTA IMPORTANTE DE SEGURIDAD: No me preocupé en modificar la línea de ejecución del proceso. Esto quiere decir que si alguien ejecuta un "ps aux" por ejemplo, podría ver el password si en ese momento está el scp o el ssh activo.

----------

## M.A.

Por cierto, acabo de darme cuenta que dije que el password se guardaba en el binario compilado. Esto es cierto porque viendo el código que tenía, no lo dejé tal cual está en el parche, en la línea que pone:

```
options.password = optarg;
```

en vez de eso pones

```
options.password = xstrdup("tupassword");
```

Entonces, da igual lo que pongas en la línea de comandos (tienes que poner algo, eso sí), que el ssh usará el que has puesto hard-coded.

Tampoco es muy seguro así, pero te evitas que con un simple ps aux te capturen el password.

----------

