1. Presentación de manejo de llaves SSH y cómo asegurarlas cuando son utilizadas por aplicaciones.
(nivel inicial-intermedio)
1. 01 - Validando destino
2. 02 - Validando orígen
3. 03 - Resumen esquema de seguridad (estándar)
4. 04 - Uso ssh para comandos remotos
5. 05. Automatizar mis procesos y la seguridad
6. 06. Asegurar en destino
7. 07. Resumen esquema de seguridad para aplicaciones
Rodolfo Pilas @pilasguru http://pilas.guru rodolfo@pilas.guru
.
01 - Validando destino
( asignando confianza en mi usuario de origen para conectar en el servidor como el usuario destino )
$ ssh root@104.131.165.19
The authenticity of host '104.131.165.19 (104.131.165.19)' can't be established.
RSA key fingerprint is f7:d1:2c:22:9c:f3:2d:2a:fc:be:9f:ec:2b:2f:e8:cd.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '104.131.165.19' (RSA) to the list of known hosts.
Linux techmeetupUY 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64
root@techmeetupUY:~#
Archivo ~/.ssh/known_hosts contiene la llave publica del servidor destino y verificará el destino cada vez que volvamos a
conectarnos.
Si nos conectamos al mismo destino y no verifica:
$ ssh root@104.131.165.19
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
8e:8b:7e:7b:35:2d:99:92:ce:3c:77:86:33:86:8b:85.
Please contact your system administrator.
Add correct host key in /Users/rodolfo/.ssh/known_hosts to get rid of this
message.
Offending RSA key in /Users/rodolfo/.ssh/known_hosts:1280
RSA host key for 104.131.165.19 has changed and you have requested strict
checking.
Host key verification failed.
Si estamos seguros que el servidor está correcto (sabemos por qué cambiaron las llaves SSH) podemos borrar del
~/.ssh/know_hosts la llave publica “vieja” y volver a conectar para proceder a registrar con YES la nueva clave pública del
servidor.
2. 02 - Validando orígen
Map
( asignando confianza a mi usuario origen para ingresar como el usuario destino en el servidor )
$ ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
EEnntteerr ppaasssspphhrraassee ((eemmppttyy ffoorr nnoo ppaasssspphhrraassee))::
EEnntteerr ssaammee ppaasssspphhrraassee aaggaaiinn::
Your identification has been saved in id_ecdsa.
Your public key has been saved in id_ecdsa.pub.
The key fingerprint is:
e4:5b:0c:c3:51:1d:13:0c:58:b7:f6:e7:80:8e:55:d7 rodolfo@barbie
The key's randomart image is:
+--[ECDSA 256]---+
| .+++=o |
| ... .oo .|
| = o . E|
| o + . + . |
| S o o o .|
| o + + |
| . . . .|
| |
| |
+-----------------+
Llave Privada:
$ ls -l ~/.ssh/id_ecdsa
-rw------- 1 rodolfo staff 396 Jun 9 01:14 /Users/rodolfo/.ssh/id_ecdsa
Llave Pública:
$ ls -l ~/.ssh/id_ecdsa.pub
-rw-r--r-- 1 rodolfo staff 396 Jun 9 01:14 /Users/rodolfo/.ssh/id_ecdsa.pub
Copiar la llave pública al servidor y agregarla en el home de usuario destino ~/.ssh/authorized_keys
$ ssh-copy-id root@104.131.165.19
root@104.131.165.19's password:
Now try logging into the machine, with "ssh 'root@104.131.165.19", and check in:
~/.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
(los servicios en la nube ya hacen esto automáticamente al crear una instancia)
3. 03 - Resumen esquema de seguridad (estándar)
Map
Valido el destino cada conexión
Se cifra el tráfico (RFC-4419)
Mi usuario autentica con el usuario destino mediante mi llave privada
Llave privada con seguridad discreta por permisos archivo ("lo que tengo”)
Llave privada con seguridad alta por passphrase (“lo que se”)
04 - Uso ssh para comandos remotos
Map
Aparte de login en el servidor remoto puedo ejecutar comandos desde mi sesión local:
$ ssh root@104.131.165.19 cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2630L v2 @ 2.40GHz
stepping : 4
microcode : 0x1
cpu MHz : 2399.998
cache size : 15360 KB
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36
clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc up
arch_perfmon rep_good nopl pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic
popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm xsaveopt
vnmi ept fsgsbase smep erms
bogomips : 4799.99
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
$ _
La salida estándar de los comandos ejecutados remotamente es mi STDOUT, los puedo entubar (pipe)
$ ssh root@104.131.165.19 cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Xeon(R) CPU E5-2630L v2 @ 2.40GHz
$_
Por lo tanto puedo empezar a hacer cosas interesantes:
$ ssh root@104.131.165.19 "tar czf - /etc/passwd" | cat > passwd.server19.tgz
tar: Removing leading `/' from member names
$ _
$ tar tzvf passwd.server19.tgz
-rw-r--r-- 0 root root 1027 Nov 15 00:40 etc/passwd
$ _
4. 05. Automatizar mis procesos y la seguridad
Map
Automatizar mis procesos por SSH resulta en un compromiso de seguridad:
Quitar la passphrase -> seguridad 100% sobre archivo de llave privada
06. Asegurar en destino (llaves sin passphrase)
Map
En llavero remoto tengo colección la llaves publicas:
$ cat ~/.ssh/authorized_keys
ecdsa-sha2-nistp256
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDFI8yIG6zkMj4BOO
ecxZYS4p5Mp7Ozjtd1lo8bgAQCEQvGP7d6IPbR6DfrW8tcwCdd1UUYhFhfdFSyLwir8+8E=
rodolfo@origen
Asegurar orígen:
$ cat ~/.ssh/authorized_keys
ffrroomm==220044..2233..1111..1122 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHA
yNTYAAAAIbmlzdHAyNTYAAABBBDFI8yIG6zkMj4BOOecxZYS4p5Mp7Ozjtd1lo8bgAQC
EQvGP7d6IPbR6DfrW8tcwCdd1UUYhFhfdFSyLwir8+8E= rodolfo@origen
Asegurar comando:
$ cat ~/.ssh/authorized_keys
from=204.23.11.12,ccoommmmaanndd==""//bbiinn//ttaarr cczzff -- //eettcc//ppaasswwdd"" ecdsa-sha2-nistp256
AAAAE2VjZHNhLXNoYT
ItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDFI8yIG6zkMj4BOOecxZYS4p5Mp7Ozjtd1lo8bgAQCEQvGP7d6IPbR6Df
rW8tcwCdd1UUYhFhfdFSyLwir8+8E= rodolfo@origen
$ ssh root@104.131.165.19 “ls" | cat > passwd.server19.tgz
tar: Removing leading `/' from member names
$ _
Asegurar del todo:
$ cat ~/.ssh/authorized_keys
ffrroomm==220044..2233..1111..1122,,ccoommmmaanndd==""//bbiinn//ttaarr cczzff -- //eettcc//ppaasswwdd””,,nnoo--ppttyy,,nnoo--aaggeenntt--
ffoorrwwaarrddiinngg,,
nnoo--ppoorrtt--ffoorrwwaarrddiinngg,,nnoo--XX1111--ffoorrwwaarrddiinngg,,nnoo--uusseerr--rrcc ecdsa-sha2-nistp256
AAAAE2VjZHNhL
XNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDFI8yIG6zkMj4BOOecxZYS4p5Mp7Ozjtd1lo8bgAQCEQvGP
7d6IPbR6DfrW8tcwCdd1UUYhFhfdFSyLwir8+8E= rodolfo@origen
5. 07. Resumen esquema de seguridad para aplicaciones
Map
Valido el destino cada conexión
Se cifra el tráfico (RFC-4419)
Mi usuario autentica con el usuario destino mediante mi llave privada
Llave privada con seguridad discreta por permisos archivo ("lo que tengo”)
Llave privada no tiene passphrase
Riesgo de seguridad controlado con:
Llave privada solo aceptada desde servidor origen específico
Llave privada solo permitida para comando específico
Llave privada no valida para login (ni otros usos)
08. Un paso más
Map
cert-authority
man sshd
Security of Automated Access Management Using Secure Shell (SSH)
NISTIR 7966 (Draft) Agosto 2014
National Institute of Standard and Technology (NIST)
Automation - Monitoring - Expiration
.