solo confío en localhost

index | OSiUX | blog | docs | charlas | rss

┏━┓┏━┓╻  ┏━┓   ┏━╸┏━┓┏┓╻┏━╸╻┏━┓
┗━┓┃ ┃┃  ┃ ┃   ┃  ┃ ┃┃┗┫┣╸ ┃┃ ┃
┗━┛┗━┛┗━╸┗━┛   ┗━╸┗━┛╹ ╹╹  ╹┗━┛

┏━╸┏┓╻   ╻  ┏━┓┏━╸┏━┓╻  ╻ ╻┏━┓┏━┓╺┳╸
┣╸ ┃┗┫   ┃  ┃ ┃┃  ┣━┫┃  ┣━┫┃ ┃┗━┓ ┃
┗━╸╹ ╹   ┗━╸┗━┛┗━╸╹ ╹┗━╸╹ ╹┗━┛┗━┛ ╹
  • usando SSH podemos tener acceso remoto seguro
  • con tuneles saltear Firewalls
  • podemos usarlo para armar una VPN
  • cifrar conexiones a bases de datos

Soy "OSiRiS" también conocido por "OSiUX"

  • trabajo en gcoop Cooperativa de Software Libre
  • pueden ver el corto Códigos Cooperativos

    http://gcoop.coop/codigos-cooperativos

  • programo en PHP y en BASH
  • últimamente hago mucho de SysAdmin
  • hago casi todo desde consola
  • no podría vivir sin SSH
  • soy desconfiado (me dicen paranoico)

Compartiendo la Sesion

En lugar de Slides estáticos, pueden conectarse a mi notebook y ver de cerca cómo me equivoco al tipear :)

Qué es SSH?

Si pensás que estas en la charla equivocada porque no sabés para qué es SSH y ya lo repetí muchas veces…acá una pista

  • para parecer un hacker de película
  • acceder remotamente a compus, routers, smartphones, etc

Por qué usar SSH?

  • funciona con angosto de banda
  • automatizar tareas
  • acceder a muchos servidores
  • todo el tráfico viaja cifrado
  • saltear firewalls

Túneles SSH

Para qué sirven los túneles SSH?

si tu ISP bloquea el puerto 25, usa el 2525 :)

ssh -fN -L 2525:localhost:25 gin &

verificar tunel:

nc -vz localhost 2525 2>&1
nc: connect to localhost port 2525 (tcp) failed: Connection refused
Connection to localhost 2525 port [tcp/*] succeeded!

Tunel Reverso

  • obtener acceso SSH salteando un firewall

    ssh -fN -R 2020:localhost:22 stout &
    
  • test

    ssh stout -- nc -vz localhost 2020 2>&1
    

Proxy SOCKS

iniciar proxy

ssh -fN -D 9090 gin &

navegar sin proxy

curl pub.osiux.com/ip/index.php
186.18.228.139

navegar con proxy (no usamos nuestra IP)

curl --socks5 localhost:9090 pub.osiux.com/ip/index.php
198.23.230.106
dig +short -x 198.23.230.106

Proxy SOCKS chat

configurar proxy en cuentas:

grep -C1 localhost ~/.purple/accounts.xml | sort -u
--
			<host>localhost</host>
			<port>9129</port>
			<type>socks5</type>

configurar proxy en ~/.ssh/config

grep -B3 9129 ~/.ssh/config
Host gin
     Hostname 198.23.230.106
     User osiris
     DynamicForward :9129

verificar conexión

netstat -puntoa | grep 198.23.230.106 | sed 's/ \+/ /g'
tcp 0 0 192.168.10.78:39987 198.23.230.106:80 TIME_WAIT - timewait (31,42/0/0)
tcp 0 0 192.168.10.78:51382 198.23.230.106:22 ESTABLISHED 22264/ssh keepalive (5206,76/0/0)
tcp 0 0 192.168.10.78:51386 198.23.230.106:22 ESTABLISHED 22680/ssh keepalive (5239,53/0/0)
tcp 0 0 192.168.10.78:51526 198.23.230.106:22 TIME_WAIT - timewait (22,20/0/0)
tcp 0 0 192.168.10.78:39981 198.23.230.106:80 TIME_WAIT - timewait (15,40/0/0)
tcp 0 0 192.168.10.78:39986 198.23.230.106:80 TIME_WAIT - timewait (31,08/0/0)
tcp 0 0 192.168.10.78:51400 198.23.230.106:22 ESTABLISHED 23598/ssh keepalive (5305,07/0/0)
tcp 0 0 192.168.10.78:39992 198.23.230.106:80 TIME_WAIT - timewait (37,82/0/0)
tcp 0 0 192.168.10.78:39993 198.23.230.106:80 TIME_WAIT - timewait (43,34/0/0)
tcp 0 0 192.168.10.78:44947 198.23.230.106:22 ESTABLISHED 11037/ssh keepalive (1110,76/0/0)
tcp 0 0 192.168.10.78:39998 198.23.230.106:80 TIME_WAIT - timewait (59,12/0/0)
tcp 0 0 192.168.10.78:51393 198.23.230.106:22 ESTABLISHED 22774/ssh keepalive (5272,30/0/0)
tcp 0 0 192.168.10.78:51336 198.23.230.106:22 ESTABLISHED 19072/ssh keepalive (4125,42/0/0)
tcp 0 0 192.168.10.78:51527 198.23.230.106:22 TIME_WAIT - timewait (24,52/0/0)

NO Passwords

Generar llave

ssh-keygen -t rsa -b 4096 -P secreto -f ~/.ssh/seguro

AgentForwarding

ssh-add ~/.ssh/id_rsa
ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-X37X39FCSJIy/agent.23779; export SSH_AUTH_SOCK;
SSH_AGENT_PID=23780; export SSH_AGENT_PID;
echo Agent pid 23780;
eval `ssh-agent`

listar llaves en agente

ssh-add -l | awk '{print $2}'
8f:6b:e1:7e:6a:94:8f:61:a4:db:2a:8a:e8:43:f3:12
9a:48:3f:9b:73:06:c4:b3:4a:c5:f5:98:8b:e4:96:78
60:e6:e4:f2:ae:b6:f7:3a:58:ca:e9:58:a5:06:d2:42
e6:bd:6d:f7:e1:d7:85:3a:26:38:8d:b7:f7:c6:6b:7d
19:50:2e:0d:cf:15:8d:a5:19:c6:64:d5:66:1d:a2:c2
bf:3f:3d:a8:07:3a:cb:f4:77:f5:98:57:63:37:2a:2e

keychain

if [ -e /usr/bin/keychain ]
then
   eval `keychain -q --eval --agents ssh id_rsa`
   eval `keychain -q --eval --agents ssh db_rsa`
   eval `keychain -q --eval --agents ssh web_rsa`
fi

Man In The Middle

Es posible que alguien se haga pasar por nuestro servidor, por ello es necesario saber y verificar nuestro fingerprint, y confiar sólo en los fingerprint que conocemos!

ssh -o StrictHostKeyChecking=yes

Obtener fingerprint del servidor

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub | tr " " "\n"
2048
d5:ed:33:b9:d4:58:4a:6b:a1:f3:e5:c0:3c:1b:cd:8c
/etc/ssh/ssh_host_rsa_key.pub
(RSA)

Verificar fingerprint al conectarse

ssh-keygen -l -f ~/.ssh/known_hosts | awk '{print $2}' | sort -u | head
00:63:26:79:f7:1e:e9:b6:49:57:6d:19:52:1c:24:5e
02:8e:b2:5a:20:39:b7:30:fa:be:5f:7c:7e:50:cd:60
04:51:50:b2:cc:e6:58:ca:1e:c6:19:8b:56:be:82:84
08:db:1d:d2:9f:9a:4f:e8:b2:cc:88:89:01:fb:b5:67
09:57:ff:45:38:0d:7e:4c:3c:32:bf:84:bd:54:1d:69
0c:6a:c5:13:ea:8d:eb:1a:df:4e:a7:0e:8e:43:4f:f8
0f:1f:49:c6:9c:fc:33:f9:a8:43:03:78:7d:20:04:63
10:94:7a:92:5e:8a:4e:4f:c4:bd:c9:e9:38:24:6d:a0
11:7d:86:9b:1b:64:f3:14:ba:c7:9c:11:cf:39:b1:49
16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48

fingerprint de nuestra llave local

ssh-keygen -l -f ~/.ssh/id_rsa.pub | tr " " "\n"
2048
8f:6b:e1:7e:6a:94:8f:61:a4:db:2a:8a:e8:43:f3:12
/home/osiris/.ssh/id_rsa.pub
(RSA)

verificando nuestro fingerprint

ssh -vvv gin uptime 2>&1 | grep pubkey | tr ' ' '\n'
debug3:
send_pubkey_test
debug3:
sign_and_send_pubkey:
RSA
8f:6b:e1:7e:6a:94:8f:61:a4:db:2a:8a:e8:43:f3:12

fingerprint de la llave permitida en el host remoto

ssh gin -- ssh-keygen -l -f ~/.ssh/authorized_keys
2048 8f:6b:e1:7e:6a:94:8f:61:a4:db:2a:8a:e8:43:f3:12   (RSA)

SSH Config I

definir un host indicando hostname y port

grep -A2 "Host gin$" ~/.ssh/config
Host gin
     Hostname 198.23.230.106
     User osiris

SSH Config II

head -8 ~/.ssh/config
Host *
     ProtocolKeepAlives 30
     ControlMaster auto
     ControlPath ~/.ssh/.master-%r@%h:%p
     Compression yes
     Protocol 2
     CompressionLevel 7
     Cipher blowfish-cbc

SSH Config III

head -16 ~/.ssh/config | tail -8
ServerAliveCountMax 3
ServerAliveInterval 600
StrictHostKeyChecking yes
VisualHostKey yes
NoHostAuthenticationForLocalhost yes
LogLevel FATAL
UseRoaming no
AddressFamily inet

Multi SSH Config, porqué?

  • crear "N" alias para cada host
  • compartir acceso a servidores por un equipo
  • versionar cambios en repositorio git
  • definir túneles complejos (muchos saltos)
  • unificar llaves SSH por rol/equipo
  • mejorar la seguridad, forwardAgent no, 1 sola llave
  • generar alias /etc/ansible/hosts
  • generar alias y grupos de parallel-ssh
  • graficar acceso a hosts :)

Multi SSH Config en 3 pasos

Obtener repositorio:

git clone https://github.com:osiris/multi-ssh-config.git

Configurar los hosts:

cd ~/.ssh/config.d
find -type f | wc -l
grep -hr LocalForward * | wc -l
grep -hr RemoteForward * | wc -l
grep -hr Port * | sort -u | wc -l
grep -hr User * | sort -u | wc -l
grep -hr IdentityFile * | sort -u | wc -l
1219
305
31
127
40
31

Generar ~/.ssh/config

⌂ sshconfig

Config Directory: /home/osiris/.ssh/config.d
Backup /home/osiris/.ssh/config to /home/osiris/.ssh/bak/config.1461392552
Add default to /home/osiris/.ssh/config
Host agente ...
Host atusud ...
Host formulariosatusu ...
Host fundaciond ...
Host srcc1001lx ...
...

compartir es bueno CC-BY-SA

usted es libre de:

  • compartir, copiar, distribuir, ejecutar
  • comunicar públicamente la obra
  • hacer obras derivadas
  • hacer un uso comercial de esta obra

gracias!

Fecha: 2016-04-23

Autor: Osiris Alejandro Gómez

Emacs 24.4.1 (Org mode 8.3.2)

Validate