ssh
Ssh funciona con parejas de claves pública, privada, para una conexión entre hosts.
tipos de clave: rsa, dsa,...
Al instalarse los paquetes openssh-client, openssh-server
directamente se generan las claves de host.
Nota: En docker no, se tiene que indicar con
ssh-keygen -A
para generar las claves de host.
Claves
Las claves privadas tendrán unos permisos de 0600
mientras que las públicas 0644
-rw------- 1 debian debian 1,8K jun 17 10:11 id_rsa
-rw-r--r-- 1 debian debian 393 jun 17 10:11 id_rsa.pub
-rw------- 1 debian debian 5,2K dic 10 18:09 known_hosts
-rw------- 1 debian debian 5,2K dic 10 18:11 authorized_keys
Host
Las claves de host están en /etc/ssh/
junto a la configuración.
Usuario
Las claves de usuario se encuentran en ~/.ssh/
known_host
: claves publicas de hosts
authoriced_keys
: claves publicas de usuarios
Autenticación
La autentificación la hace en dos pasos, identificar el host y después el usuario.
Host
Host , es el primero en autenticar, al establecer conexión el remoto envía su fingerprint al local y le pregunta si es con el realmente si quiere conectar, si es cierto el remoto envía su clave pública al local.
Ejemplo fingerprint.
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2048 SHA256:rY7+fOVHZ0PAab05HhBwGht0ZdFN60nCucU/xeXT2Mg no comment (RSA)
Una vez aceptada la conexión el host remoto guarda la clave publica en .ssh/know-host
Usuario
Usuario es el segundo en autenticarse, y se puede hacer manualmente, añadiendo la contraseña en cada conexión, o automáticamente, con una clave pública de usuario que se guardare el remoto en .ssh/autorized_keys
ssh-keygen # generar clave
ssh-copy-id local2@172.20.0.3 # enviar al remoto
También se puede copiar la clave pública (cuidado en no reescribirla)
scp .ssh/id_rsa.pub local1@172.20.0.3:.ssh/authorized_keys
Transferencia de archivos
# genera archivo file local del resultado ls -la remoto
ssh local1@172.20.0.3 ls -la > file.txt
# genera todo remotamente
ssh local1@172.20.0.3 "ls -la > file.txt"
# comprimir localmente y guarda en remoto
tar cvf - /boot | ssh local1@172.20.0.3 "cat - > boot.tar"
# sshfs
sshfs local1@172.20.0.3: /tmp/mnt
fusermount -u /tmp/mnt
# desde nautilus
sftp://local1@172.20.0.3/home/local1
Cliente
El cliente ssh tiene 3 propiedades de configuración. Global es la que menos prioridad tiene, si una orden se duplica en la configuración de usuario, se aplicará la del usuario. lo mismo pasa con comand line, esta es la que mas prioridad tiene.
-
comand line
-
user config
~/.ssh/config
-
global
/etc/ssh/ssh_config
Host localhost
VisualHostKey no
Host *
VisualHostKey yes
Host 192.168.80.252
VisualHostKey no
PasswordAuthentication no
Si un host coincide en distintos filtros, se le aplica el que mas se parezca.
Servidor
/etc/ssh/sshd_conf
/var/run/sshd.pid
port 2022
listenAdress <ip por donde entrar>
MaxSessions
MaxAuthTries numero de intentos de poner password -1
UsePam
En el caso en el que coincidan 2 configuraciones de host y user en una conexión, se aplica el primero que encuentra.
# sshd_config
Match Host 172.19.0.1
banner /etc/banner
Match user local2
banner /etc/banner2
ssh local2@172.19.0.2
baner1
Reload servicio
kill -1 <num-servicio>
Restricciones
Existen múltiples mecanismos de restricción para el acceso ssh, algunos de ellos, son globales para los servicios de red y otros específicos de sshd.
Mecanismos de restricción:
- configuración del servidor sshd.
- Configuración de reglas de PAM
- Utilizar TCP Wrappers con los ficheros host.allow y host.deny de la configuración global del sistema.
- Creación de Firewalls con iptables.
Acceder solo desde 1 ip a un usuario.
Esto nos puede servir para configurar remotamente un servidor con la seguridad de que solo se podrá hacer mediante 1 pc remoto o en físico, si combinamos configuración de ssh entrada libre a invitados y restringida a un usuario administrador mediante 1 ip única.
- Modificar el fichero /etc/pam.d/sshd para que nos permita utilizar el fichero de accesos /etc/security/access.conf
/etc/pam.d/sshd
# Comentar la línea (poniendo un # al inicio):
#account required pam_nologin.so
# Descomentar la línea (quitando el # del inicio):
account required pam_access.so
- Modificamos el fichero de accesos /etc/security/access.conf para permitir únicamente acceso al debian desde nuestra IP. Añadimos al final del mismo:
---
+:debian:10.10.10.10
-:debian:ALL
- Donde 10.10.10.10 es nuestra IP, con la que accederemos al servidor SSH
- Donde -:debian:ALL niega a todas las demás ip’s
Servidor sshd
El orden que se aplicaran las opciones en la configuración del archivo sshd_config
es: DenyUsers - AllowUser - DenyGroups - AllowGroup
Estas opciones irán seguidas de una lista de usuarios o grupos separados por un espacio, solo los nombres están permitidos, si el patrón forma user@host
dará coincidencia, en un usuario en determinado host.
AllowUsers pere marta
AllowUsers pere@pc01.edt.org marta jordi@m06.cat
---
DenyUsers jorge debian
Con la siguiente línea conseguimos lo mismo que la anterior pero dirigiéndose al grupo que pertenecen.
---
DenyGroups admin
Con la siguiente línea conseguimos que únicamente se pueda acceder al usuario debian mediante ssh.
---
AllowUsers debian
Con la siguiente línea conseguimos que únicamente se pueda acceder a los usuarios que pertenezcan a admin.
---
AllowGroups admin
Pam
Pam_access
Con el modulo de pam pam_access.so
, se puede restringir el acceso, modificando el archivo access.conf
/etc/pam.d/sshd
#%PAM-1.0
auth substack password-auth
auth include postlogin
account required pam_sepermit.so
account required pam_nologin.so
account required pam_access.so accessfile=/etc/security/access.conf
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
/etc/security/access.conf
# All other users should be denied to get access from all sources.
#- : ALL : ALL
# denegar a local2 el aceso a todo
- : local2 : ALL
Algunos ejemplos de access.conf
# permiso : usuario/s : servicio/s : host
+ : root : crond :0 tty1 tty2 tty3 tty4 tty5 tty6
+ : root : 192.168.200.1 192.168.200.4 192.168.200.9
+ : root : 127.0.0.1
#El usuario root debería tener acceso desde la red 192.168.201. donde el término se evaluará mediante la coincidencia de cadenas. Pero podría ser mejor usar network / netmask en su lugar. El mismo significado de 192.168.201. es 192.168.201.0/24 o 192.168.201.0/255.255.255.0.
+ : root : 192.168.201.
+ : root : foo1.bar.org foo2.bar.org
- : root : ALL
# Los usuarios y los miembros de los administradores de netgroup deben tener acceso a todas las fuentes. Esto solo funcionará si el servicio netgroup está disponible.
+ : @admins foo : ALL
# User john and foo should get access from IPv6 host address.
+ : john foo : 2001:db8:0:101::1
- : ALL : ALL
Pam_listfile
Con el modulo pam_listfile.so
se puede restringir o dar acceso a diferentes usuarios.
pam_listfile.so item=[tty|user|rhost|ruser|group|shell]
sense=[allow|deny] file=/path/filename
onerr=[succeed|fail] [apply=[user|@group]] [quiet]
En el fichero sshd
de pam, especificamos que tipo de datos encontrara en el archivo que le indicaremos en ruta.
item
: que tipo de dato encontrarásense
: que hacer.file
: ruta del archivo.
/etc/pam.d/sshd
#%PAM-1.0
auth substack password-auth
auth include postlogin
account required pam_sepermit.so
account required pam_nologin.so
account required pam_listfile.so item=user sense=allow file=/etc/security/users.conf
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
/etc/security/users.conf
local1
local2
clusterssh
Para intalar/gestionar pc's desde consola
Lo que haces lo transmite a todos a la vez.
Instalar
dnf -y install clusterssh
Comando
cssh
Ejemplos
cssh root a01 a02 a03 a04
cssh root@a[01-35]
Arxiu de configuració d'alies de cluster
Ejemplo crear un grupo:
/etc/clusters
f2a a01 a02 a03 a04
Ejecutar el grupo se ejecutarán todos los hosts indicados en el grupo seleccionada.
sudo cssh -l root "f2a"