Cada línea del fichero SSH1 authorized_keys
(habitualmente en ~/.ssh/authorized_keys
)
contiene una clave pública. Tiene el siguiente formato:
Cada entrada va en una sóla línea. Los campos se separan por comas.
Las líneas en blanco y las que empiezan por #
se ignoran.
from="pattern-list"
El servidor sshd
puede limitar que máquinas pueden conectarse a la máquina usando wrappers TCP, pero
no a nivel de usuario. Utilizando esta opción es posible limitar las conexiones para una identidad a un conjunto especifico
de máquinas. Los hosts se separan por comas y pueden contener comodines como *
y ?
. Se pueden
rechazar hosts específicos prefijándolos con !
. Por ejemplo:
from="!enemy.my_isp.net,*.my_isp.net,home.example.com"
command="command"
environment="NAME=value"
Se usa si se quiere tener un entorno específico cuando se usa esta clave. Por ejemplo
podemos poner un $PATH
restrictivo para que no pueda ejecutar ciertos comandos,
cambiar $HOME
, etc.
Si se tiene varias personas accediendo via diferentes identidades a la misma cuenta -
usando tal vez un comando forzado - puede
ser útil establecer la variable $LOGNAME
de manera que identifique quién se conecta.
nopty
user@machine.domain.es
en el ejemplo que sigue)
Sigue un ejemplo. Primero generemos una pareja especial para esto:
$ ssh-keygen -tdsa -C 'limited command to millo' -P '' -f ~/.ssh/limited_command $ ssh-copy-id -i ~/.ssh/limited_command.pub milloAhora podemos entrar a la máquina usando esa pareja con:
$ ssh -i ~/.ssh/limited_command millo Last login: Mon Apr 20 09:05:11 2009 from 192.168.100.242 millo:~$ vi ~/.ssh/authorized_keys millo:~$Editamos el fichero
~/.ssh/authorized_keys
y añadimos la opción comando
17 # Prueba de comando limitado 18 command="ls" ssh-dss AAAAB3NzaC1kc3...= limited command to millo
La presencia de la opción command
permite dar acceso a nuestra cuenta a usuarios
restringiendo el uso de los comandos que pueden utilizar.
tonga:~/.ssh$ ssh -i ~/.ssh/limited_command millo ADVENS_OF_SHERLOCK.html cshrc Imágenes LSimple-Scope asignas Desktop LEyapp machines.sample autosave doc Llhp Makefile.PL bidirwithnamedpipes.pl Documentos LPLdoc Música bin exrc LPLsrc myprofile cat help LPL-Tutu Net-ParSCP.tar.gz Connection to millo closed.
Es posible obtener los argumentos escritos en la línea de comandos de la llamada
al cliente
consultando la variable de entorno SSH_ORIGINAL_COMMAND
.
Existen otras variables de entorno que están definidas cuando
se ejecuta una conexión (véase la sección ENVIRONMENT
en la
página del manual de ssh)
Para ilustrar el punto usaremos el siguiente programa
como comando forzado:
$ cat -n get_ssh_env 1 #!/usr/bin/perl -w 2 use strict; 3 4 my @keys = qw{ 5 SSH_ORIGINAL_COMMAND 6 SSH_CONNECTION 7 SSH_AUTH_SOCK 8 SSH_TTY 9 DISPLAY 10 HOME 11 LOGNAME 12 MAIL PATH TZ USER 13 }; 14 my ($args, $con, $sock, $tty, 15 $display, $home, $logname, $mail, $path, $tz, $user 16 ) = map { $ENV{$_} || '' } @keys; 17 18 print << "INFO"; 19 args=<$args> 20 con=<$con> 21 sock=<$sock> 22 tty=<$tty> 23 display=<$display> 24 home=<$home> 25 logname=<$logname> 26 mail=<$mail> 27 path=<$path> 28 tz=<$tz> 29 user=<$user> 30 INFOCuando se fuerza en
authorized_keys
y se ejecuta la conexión
se obtiene:
casiano@tonga:~$ ssh -i ~/.ssh/show_arguments millo chum cham chim args=<chum cham chim> con=<XXX.XXX.XXX.XXX 55286 XXX.XXX.XXX.XXX 22> sock=<> tty=<> display=<localhost:11.0> home=</home/casiano> logname=<casiano> mail=</var/mail/casiano> path=</usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/soft/perl5lib/bin:/home/casiano/bin> tz=<> user=<casiano>
Si el administrador tiene configurada la opción PermitUserEnvironment
de sshd_config
a yes
(el valor por defecto es no
), ssh
leerá el fichero ~/.ssh/environment
(si existe)
añadiendo al entorno líneas con el formato VARNAME=value
.
pp2@europa:~/src/perl/perltesting$ cat -n safe.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use Safe; 4 use Data::Dumper; 5 6 my $compartment = new Safe; 7 8 $compartment->permit(qw(time :browse)); 9 10 my $unsafe_code = <>; 11 my $result = $compartment->reval($unsafe_code); 12 13 if (defined($result)) { 14 if (ref($result)) { 15 $Data::Dumper::Varname = 'RESULT'; 16 $Data::Dumper::Indent = 1; 17 print Dumper($result); 18 } 19 else { 20 print $result."\n"; 21 } 22 } 23 else { 24 print "Illegal code\n"; 25 }
pp2@europa:~/src/perl/perltesting$ ./safe.pl [1..5] $RESULT1 = [ 1, 2, 3, 4, 5 ]; pp2@europa:~/src/perl/perltesting$ ./safe.pl system('rm -fR') Illegal code
Establezca un comando forzado para una clave dada de manera que la conexión con la máquina remota permita la ejecución del comandos perl 'seguro' (usando Safe) especificado por el usuario en la línea de comandos.
ssh
con una segunda máquina remota:
casiano@tonga:~/.ssh$ ssh -i ~/.ssh/sshhophop millo Last login: Mon Apr 20 11:35:38 2009 from millo casiano@cc116:~$
Cuando se usa un comando forzado es conveniente
from="pattern-list"
para limitar las máquinas desde
las que se puede realizar la conexión
environment="NAME=value"
para limitar el $PATH
(lo mas restrictivo posible) y cambiar $HOME
.
Esto sólo es posible si la opción PermitUserEnvironment no ha sido desactivada
por el administrador.
Si no es así, cámbielos en el código del propio comando.
comando usuario
.
command="/bin/ps -ef",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB...= Test key