Servidor SSH

De wikijoan
Salta a la navegació Salta a la cerca

Referències

Diferència entre SSL i SSH: (explicar)

Instal.lar i treballar amb un servidor SSH:

Comentar a classe:

Desenvolupament

Els alumnes treballaran contra l'ordinador 192.168.0.10 (però també es poden establir connexions SSH localment i amb els companys). Els alumnes utilitzaran el seu número de classe per connectar-se a l'ordinador 192.168.0.10, on s'han creat els usuaris asi2a01...asi2a35

$ ssh asix2aXX@192.168.0.10
password: asix

El $HOME dels alumnes en la màquina remota és: /var/www/alumnes/asix2aXX

En alguna part de la pràctica els alumnes treballaran contra el seu servidor SSH (en local) o contra el servidor SSH d'un company (el company haurà de crear un usuari/password que haurà de facilitar a l'alumne).

Instal.lació del servidor SSH

A Linux el client ja està instal.lat per defecte. El servidor:

$ sudo apt-get install openssh-server
o bé
$ sudo apt-get install ssh

Per reiniciar, el servidor SSH

$ sudo /etc/init.d/ssh start
* Usage: /etc/init.d/ssh {start|stop|reload|force-reload|restart|try-restart|status}

Serà necessari reiniciar sempre que es canvïin els fitxers de configuració.

Connexió a un servidor remot

Connexió a un servidor SSH de la xarxa de l'institut:

$ ssh asix2aXX@192.168.0.10

La primera vegada que et connectes et demana si vols fer-ho realment:

The authenticity of host '192.168.10.231 (192.168.10.231)' can't be established.
ECDSA key fingerprint is 0c:c1:75:b2:b5:5e:c6:e9:b5:b0:f2:db:4c:49:25:80.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.231' (ECDSA) to the list of known hosts.

Connexió a un servidor SSH remot: (no fer-ho)

$ ssh joan@www.joanillo.org

En aquest últim cas recordar que el router ADSL ha d'estar configurat en les seves taules NAT de manera que les peticions pel port 22 (el port SSH) vagin redirigides a l'ordinador on hi ha el servidor SSH.

Connexió local:

$ ssh localhost
$ exit

En principi SSH serveix per fer sessions en mode consola. Però també es poden executar remotament aplicacions gràfiques. Per fer-ho, t'has d'assegurar que en el fitxer de configuració tinguis l'opció:

$ sudo joe /etc/ssh/sshd_config
...
X11Forwarding yes
...

Ens hem de connectar utilitzant el paràmetre -X, la qual cosa exportarà la configuració de la variable $DISPLAY i així podrem executar aplicacions gràfiques de forma remota:

$ ssh -X usuario_remoto@host_remoto

i ara podem executar una aplicació gràfica (recordar que això sobrecarrega el tràfic de la xarxa):

$ xclock

Tipus d'atac man-in-the-middle

En el fitxer ~/.ssh/known_hosts del servidor SSH es va guardant informació dels ordinadors que s'han connectat:

...
|1|5V+8xmCJpnKq1hVBxNc8PUgOqmo=|4+yyWXR75Vbws8Y41xnLEU9dBqI= ssh-rsa AAAAB3NzaC
|1|Rscr5fNykxKxkfJlGx3o02a7rYE=|7PLhXVMKnhFWZDBkUSghpzAOaMk= ssh-rsa AAAAB3NzaC
...

És per això que la primera vegada que et connectes a un servidor SSH triga més i les posteriors vegades triga menys. Si la parella IP-clau gpg canvia (per exemple, perquè una màquina ha canviat de IP), és possible que l'ordinador no deixi connectar.

Evitar que ens demani el password cada vegada

(aquesta manera de fer és una mica diferent de la que es comenta en l'enllaç principal).

Hem d'instal.lar la clau pública que genera el client en el servidor. La clau pública es genera en el client, i el servidor l'autentifica (confia en ella)

En l'ordinador local:

local$ ssh-keygen -t dsa
Your identification has been saved in /home/joan/.ssh/id_dsa.
Your public key has been saved in /home/joan/.ssh/id_dsa.pub.
The key fingerprint is:
eb:6d:c5:27:f0:77:31:5b:2c:c4:f5:80:89:82:11:ca joan@ubuntu

Es genera un fitxer per guardar la clau a /home/joan/.ssh/id_dsa.

Quan demana passphrase deixar-ho en blanc (Enter)

copiar ~/.ssh/id_dsa.pub al servidor: (ho podem fer amb scp)

local$ scp ~/.ssh/id_dsa.pub joan@192.168.1.130:/tmp

OK

ara en el servidor SSH, a on volem accedir sense password:

server$ cat /tmp/id_dsa.pub >> ~/.ssh/authorized_keys
server$ chmod 0600 $HOME/.ssh/authorized_keys
server$ rm -f /tmp/id_dsa.pub

Fem la prova en el client:

local$ ssh joan@192.168.1.130

i em deixa entrar sense password.

SSHFS o montar directorio remoto con SSH

En l'ordinador local:

$ sudo apt-get install sshfs
$ sudo usermod -G fuse -a joan -> joan és un usuari local del teu ordinador
$ sudo modprobe fuse
$ mkdir ~/directori_remot
$ sshfs asix2a01@192.168.0.10:/tmp ~/directori_remot

i ara ja el podem utilitzar:

$ ls directori_remot/
arxiu.txt                             orbit-joan          seahorse-bbBLhm
gnome-system-monitor.joan.1999017449  orbit-root

Per desmuntar-lo:

$ fusermount -u ~/directori_remot

script creacio_usuaris.sh

El professor crearà diferents logins del tipus asi2axx i deixarà els alumnes entrar en la seva màquina. Així mateix, els alumnes executaran aquest script i deixaran els seus companys entrar en la màquina pròpia.

NOTA. Passos previs: has de crear la carpeta /var/www/alumnes, i has de crear el grup alumnes:

$ sudo addgroup alumnes

Com s'ha comentat a classe, l'avantatge de què el $HOME estigui a /var/www és que aquest és el directori per defecte de l'Apache, i per tant els alumnes poden fàcilment publicar una pàgina htm. Per exemple, si crees el fitxer prova.htm, aquest estarà accessible a la url:

Per saber quins usuaris estan connectats al servidor per SSH:

$ who
joan     tty7         2013-02-21 14:40
joan     pts/4        2013-02-21 15:54 (:0.0)
joan     pts/5        2013-02-21 18:48 (:0.0)
asi2a01  pts/3        2013-02-21 19:06 (192.168.10.102)
asi2a01  pts/6        2013-02-21 19:11 (192.168.10.236)
asi2a01  pts/7        2013-02-21 19:13 (192.168.10.148)

També podem veure aquesta informació mirant els processos ssh que s'estan executant:

$ sudo ps aux | grep ssh 
root       872  0.0  0.0   6664  2412 ?        Ss   14:40   0:00 /usr/sbin/sshd -D
root      8954  0.0  0.0  10104  3512 ?        Ss   19:11   0:00 sshd: asi2a01 [priv]
asi2a01   9139  0.0  0.0  10104  1628 ?        S    19:11   0:00 sshd: asi2a01@pts/6 
root      9284  0.0  0.0  10104  3496 ?        Ss   19:13   0:00 sshd: asi2a01 [priv]
asi2a01   9467  0.0  0.0  10104  1632 ?        S    19:13   0:00 sshd: asi2a01@pts/7 
root      9660  0.0  0.0  10104  3500 ?        Ss   19:19   0:00 sshd: asi2a01 [priv]
asi2a01   9856  0.0  0.0  10104  1636 ?        S    19:19   0:00 sshd: asi2a01@pts/1 

Si vull matar una sessió puc fer:

$ sudo kill 9139

També podem trobar més informació de qui està connectat amb altres eines com ara whowatch:

Ejecutar comandos en un host remoto

Ahora que ya sabemos como entrar en un ordenador remoto sin el password, por qué no ejecutar comandos remotamente? Se abre un nuevo mundo de posibilidades muy útiles como tareas que se pueden ejecutar de forma automática.

$ ssh usuario_remoto@host_remoto "find /tmp -name *.txt"
$ ssh asi2a01@192.168.7.23 "find ~ -name *.htm"
/var/www/alumnes/asi2a01/index.htm

Este comando buscará los ficheros de texto del directorio temporal que hay en el ordenador remoto. Si bien es un ejemplo poc útil, en la vida de un administrador de sistema hay muchos buenos ejemplos.

Y vamos a dar una nueva vuelta de rosca: si estamos administrando sistemas Unix/Linux es muy posible que necesitemos ejecutar el mismo programa en varios servidores a la vez. Este sencillo script e suna gran ayuda en esos casos:

#!/usr/bin/perl
 
@hosts=(
    "usuario1\@maquina1.guay.es",
    "usuario2\@maquina2.guay.es"
);
 
die "Uso: runonall \'command\'\n" unless $ARGV[0];
 
foreach(@hosts){
  print "$_ -> $ARGV[0]:\n";
  print `ssh $_ $ARGV[0]`;
}

Fixem-nos que aquest script està escrit en Perl. Anem a fer un cas concret, anem a llistar (ls) el contingut del $HOME:

script_perl.pl:

#!/usr/bin/perl
 
@hosts=(
    "asi2a01\@192.168.7.23"
);
 
die "Uso: runonall \'command\'\n" unless $ARGV[0];
 
foreach(@hosts){
  print "$_ -> $ARGV[0]:\n";
  print `ssh $_ $ARGV[0]`;
}

i ara l'executem:

$ perl script_perl.pl 'ls -la'
asi2a01@192.168.7.23 -> ls -la:
asi2a01@192.168.7.23's password: 
total 84
drwxr-xr-x 9 asi2a01 alumnes 4096 feb 21 19:50 .
drwxr-xr-x 4 root    root    4096 feb 21 19:03 ..
-rw------- 1 asi2a01 alumnes  896 feb 21 19:46 .bash_history
-rw-r--r-- 1 asi2a01 alumnes  220 feb 21 19:03 .bash_logout
-rw-r--r-- 1 asi2a01 alumnes 3486 feb 21 19:03 .bashrc
drwx------ 3 asi2a01 alumnes 4096 feb 21 19:06 .cache
drwx------ 3 asi2a01 alumnes 4096 feb 21 19:11 .config
drwx------ 3 asi2a01 alumnes 4096 feb 21 19:06 .dbus

Enviar u obtener archivos y carpetas con scp

En una consola o terminal tecleamos (en aquest cas el destí és el directori local, fixar-se en el punt):

$ scp -r usuario@maquina:/home/carpeta . 

luego ponemos la password del usuario y nos copiará la carpeta "/home/carpeta" remota en el directorio actual "." naturalmente siempre que usuario tenga permisos sobre la carpeta y su cuenta esté entre las de los que pueden hacer ssh. La opción "-r" significa recursivo, es decir, copia la carpeta y todo su contenido, incluidas las subcarpetas y el contenido de éstas. Si no lo ponemos la orden para copiar todos los archivos de una carpeta sería:

$ scp usuario@maquina:/home/carpeta/* .

Si lo que queremos es enviar una carpeta con su contenido, utilizaremos la orden:

$ scp /home/carpeta/* usuario@maquina:/carpeta/

Hacer todo esto en modo gráfico

Restringir el acceso SSH

En el fitxer de configuració, etc/ssh/sshd_config, podem ficar la directiva AllowUsers especificant quins alumnes volem deixar connectar. Per exemple,

AllowUsers asi2a02

Recordar reiniciar el servidor:

# sudo /etc/init.d/ssh restart

i aleshores es podrà connectar asi2a02, però no pas asi2a01. Això ho podem veure en el fitxer de logs, on queda registrar tota l'activitat referent als intentes d'autenticació:

$ joe /var/log/auth.log:
...
sshd[24343]: Failed password for invalid user asi2a01 from 192.168.10.253 port 
sshd[24345]: Accepted password for asi2a02 from 192.168.10.120 port 49927 ssh2 
sshd[24345]: pam_unix(sshd:session): session opened for user asi2a02 by (uid=0)
sshd[24630]: Accepted password for asi2a02 from 192.168.10.236 port 52074 ssh2 
sshd[24630]: pam_unix(sshd:session): session opened for user asi2a02 by (uid=0)
sshd[24343]: Failed password for invalid user asi2a01 from 192.168.10.253 port 
sshd[24343]: Connection closed by 192.168.10.253 [preauth]
sshd[24343]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh 
sshd[24526]: Received disconnect from 192.168.10.120: 11: disconnected by user 
sshd[24345]: pam_unix(sshd:session): session closed for user asi2a02

Enlaces externos

Entrega

Recorda la normativa per entregar les pràctiques al Moodle: ASIX-M11-SAD#Normativa_d.27entrega_de_les_pr.C3.A0ctiques_al_Moodle

Hauràs de fer les diferentes proves que es proposen a cada punt. Entrega un fitxer de text amb les comandes utilitzades, i si ho creus escaient alguna captura de pantalla.


creat per Joan Quintana Compte, desembre 2011