Resumen de problemas de confianza mutua en Linux

01. Introducción al principio de confianza mutua

¿Qué es SSH?

En pocas palabras, SSH es un protocolo de red que se utiliza para el inicio de sesión cifrado entre computadoras. Por ejemplo, un usuario usa el protocolo SSH para iniciar sesión en otra computadora remota desde una computadora local.

En los primeros días, las comunicaciones por Internet eran todas comunicaciones de texto sin formato. Una vez interceptadas, el contenido quedaba expuesto. En 1995, el académico finlandés Tatu Ylonen diseñó el protocolo SSH para cifrar toda la información de inicio de sesión y convertirse en una solución básica para la seguridad de Internet. Se ha promovido rápidamente en todo el mundo y ahora se ha convertido en la configuración estándar de los sistemas Linux.

Uso básico de SSH

El puerto predeterminado de SSH es 22, lo que significa que su solicitud de inicio de sesión se enviará al puerto 22 del host remoto. Utilice el parámetro p para modificar este puerto.

ssh -p 2222 user@hostname
或
ssh -p 2222 user@ip
# 先扩展变量$1,再执行远程命令
ssh user@123.456.789.0 "cd testdir;./test.sh \"$1\""

[Otro uso]
http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html

Hombre en el medio ataque

La razón por la que SSH puede garantizar la seguridad es que utiliza cifrado de clave pública.

  • El host remoto recibe la solicitud de inicio de sesión del usuario y envía su clave pública al usuario.
  • El usuario utiliza esta clave pública para cifrar la contraseña de inicio de sesión y devolverla.
  • El host remoto utiliza su propia clave privada para descifrar la contraseña de inicio de sesión. Si la contraseña es correcta, permitirá al usuario iniciar sesión.

El proceso en sí es seguro, pero existe un riesgo en la implementación: si alguien intercepta la solicitud de inicio de sesión, se hace pasar por el host remoto y envía la clave pública falsificada al usuario, es difícil para el usuario distinguir la autenticidad. Porque a diferencia del protocolo https, las claves públicas del protocolo SSH no están notarizadas por una autoridad de certificación (CA), es decir, todas son emitidas por sí mismas.

Es concebible que si se inserta un atacante entre el usuario y el host remoto (por ejemplo, en un área wifi pública), se utilice una clave pública falsificada para obtener la contraseña de inicio de sesión del usuario. Luego use esta contraseña para iniciar sesión en el host remoto, luego el mecanismo de seguridad SSH desaparecerá.

Contraseña de acceso

Si está iniciando sesión en el anfitrión de la otra parte por primera vez, aparecerá el siguiente mensaje:

  $ ssh user@host
 The authenticity of host 'host (12.18.429.21)' can't be established.
 RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
 Are you sure you want to continue connecting (yes/no)?

El significado de este pasaje es que no se puede confirmar la autenticidad del host, solo se conoce su huella digital de clave pública ¿Quieres continuar la conexión?

La llamada "huella dactilar de clave pública" se refiere a la gran longitud de la clave pública (aquí se usa el algoritmo RSA, hasta 1024 bits), que es difícil de comparar, por lo que se realiza un cálculo MD5 para convertirlo en un Huella digital de 128 bits. En el ejemplo anterior, es 98: 2e: d7: e0: de: 9f: ac: 67: 28: c2: 42: 2d: 37: 16: 58: 4d, y es mucho más fácil de comparar.

Una pregunta natural es, ¿cómo sabe el usuario cuál debería ser la huella digital de clave pública del host remoto? La respuesta es que no hay una buena manera, el host remoto debe publicar la huella digital de la clave pública en su sitio web para que el usuario pueda verificarla por sí mismo.

Se supone que después de la medición del riesgo, el usuario decide aceptar la clave pública de este host remoto.

 Are you sure you want to continue connecting (yes/no)? yes

Aparecerá un mensaje que indica que el host ha sido aprobado.

 Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.

Luego, se le pedirá una contraseña.

 Password: (enter password)

Si la contraseña es correcta, puede iniciar sesión.

Cuando se acepta la clave pública del host remoto, se guardará en el archivo $ HOME / .ssh / known_hosts. La próxima vez que se conecte a este host, el sistema reconocerá que su clave pública se ha guardado localmente, omitirá la parte de advertencia y solicitará directamente la contraseña.

Cada usuario de SSH tiene su propio archivo known_hosts Además, el sistema también tiene un archivo de este tipo, normalmente / etc / ssh / ssh_known_hosts , que guarda las claves públicas de los hosts remotos en los que confían todos los usuarios.

Inicio de sesión con clave pública
Utilice una contraseña para iniciar sesión. Debe ingresar la contraseña cada vez, lo cual es muy problemático. Afortunadamente, SSH también proporciona un inicio de sesión de clave pública, lo que ahorra el paso de ingresar una contraseña.

El principio del llamado "inicio de sesión de clave pública" es muy simple, es decir, el usuario almacena su clave pública en el host remoto. Al iniciar sesión, el host remoto enviará una cadena aleatoria al usuario, que se devolverá después de que el usuario la encripte con su clave privada. El host remoto utiliza la clave pública almacenada de antemano para descifrarla. Si tiene éxito, demuestra que el usuario es creíble y permite directamente el shell de inicio de sesión sin necesidad de una contraseña.

Este método requiere que los usuarios proporcionen su propia clave pública. Si no hay uno listo para usar, puede usar ssh-keygen directamente para generar uno:

 $ ssh-keygen

Después de ejecutar el comando anterior, aparecerá una serie de indicaciones y podrá presionar Enter hasta el final. Una de las preguntas es si establecer una frase de contraseña para la clave privada. Si le preocupa la seguridad de la clave privada, puede establecer una aquí.

Una vez finalizada la operación, se generarán dos nuevos archivos en el directorio $ HOME / .ssh /: id_rsa.pub e id_rsa . La primera es su clave pública y la última es su clave privada.

Luego ingrese el siguiente comando para transferir la clave pública al host host remoto:

 $ ssh-copy-id user@host

Bueno, dado que vuelve a iniciar sesión, no es necesario que ingrese una contraseña.

Si aún no funciona, abra el archivo / etc / ssh / sshd_config del host remoto y verifique si el comentario "#" al frente de las siguientes líneas está eliminado.

 RSAAuthentication yes
 PubkeyAuthentication yes
 AuthorizedKeysFile .ssh/authorized_keys

Luego, reinicie el servicio ssh del host remoto

 service ssh restart

Autenticar el archivo autorizado_keys

El host remoto guarda la clave pública del usuario en el archivo $ HOME / .ssh / allowed_keys en el directorio de inicio del usuario después de iniciar sesión. La clave pública es solo una cadena, simplemente agréguela al final del archivo autorizado_keys.

En lugar de usar el comando ssh-copy-id anterior, use el siguiente comando para explicar el proceso de guardado de la clave pública:

$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

Este comando consta de varias declaraciones, desglosadas una por una:

  • "$ ssh user @ host" significa iniciar sesión en el host remoto;
  • El mkdir .ssh && cat >> .ssh / allowed_keys entre comillas simples indica el comando ejecutado en el shell remoto después de iniciar sesión;
  • La función de "$ mkdir -p .ssh" es crear uno si el directorio .ssh en el directorio de inicio del usuario no existe;
  • 'cat >> .ssh / authorized_keys' <~ / .ssh / id_rsa.pub es redirigir el archivo de clave pública local ~ / .ssh / id_rsa.pub al final del archivo remoto autorizado_keys.

Después de escribir el archivo autorizado_keys, la configuración de inicio de sesión de clave pública está completa.

02. Establecer confianza mutua entre dos máquinas

Generalmente, cuando usa el comando ssh para acceder a otra máquina, o usa el comando scp para copiar datos y archivos de otra máquina, debe ingresar la contraseña de la cuenta correspondiente. Para establecer una relación de confianza entre dos máquinas, puede omitir el proceso de ingresar una contraseña.

Una operación de la máquina

Compruebe si hay archivos id_rsa e id_rsa.pub en la carpeta user.ssh actual

ls ~/.ssh

Si no ha generado estos dos archivos antes, debe ejecutar:

ssh-keygen -t rsa

Ver contenido id_rsa.pub

cat ~/.ssh/id_rsa.pub

B Operación de la máquina

Agregue la clave pública id_rsa.pub al archivo autorizado_keys de otra máquina

vim authorized_keys

De esta manera, se establece un método de inicio de sesión de clave pública de A a B, es decir, inicio de sesión sin contraseña . De la misma manera, establezca el método de inicio de sesión de clave pública de B a A.

Tenga en cuenta que debido a que sshd tiene requisitos de permisos estrictos, si aún necesita ingresar una contraseña, puede ir al host B para ver los permisos de la carpeta .ssh y el archivo autorizado_keys. Los permisos de la carpeta .ssh deben ser 755, y los permisos del archivo allowed_keys deben ser 600, que se pueden cambiar usando el comando chmod:

chmod 755 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

03. Establecimiento de confianza mutua entre agrupaciones

La confianza mutua se puede establecer manualmente, pero demasiadas máquinas son problemáticas. Es mucho más conveniente pasar scripts. Los principios de los scripts son los siguientes:

  • El primer paso es generar claves en cada host;
  • El segundo paso es copiar la clave pública en cada host a las claves_autorizadas del host que ejecuta el comando;
  • El tercer paso es distribuir claves_autorizadas a otros hosts;
  • El cuarto paso es modificar el permiso de acceso de authorized_keys a 600.
  • Verificación de confianza mutua (sin operación de verificación de confianza mutua en el script)
#!/bin/sh

## 1 delete .ssh directory
UserName="mongodb"
rm -rf ~/.ssh
ssh-keygen -t rsa
ssh-keygen -t dsa

startnode=7
endnode=7

for ((i=${
    
    startnode}; i<=${
    
    endnode}; i++));
do
        ssh  $UserName@node$i 'rm -rf ~/.ssh; ssh-keygen -t rsa -f ~/.ssh/id_rsa -P "";exit '     
        ssh $UserName Node$i 'rm -rf ~/.ssh;ssh-keygen -t rsa -f ~/.ssh/id_rsa -P "";exit'
done;

# 2 copy public keys to one file
#ssh $UserName@node1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
for ((i=${
    
    startnode}; i<=${
    
    endnode}; i++));
do
        ssh $UserName@node$i cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys    
        ssh $UserName@node$i cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
done;

# 3 Dispath authorized_keys to other machines and change file property
chmod 600 ~/.ssh/authorized_keys
for ((i=${
    
    startnode};i<=${
    
    endnode};i++));
do
        scp ~/.ssh/authorized_keys $UserName@node$i:~/.ssh/
        ssh $UserName@node$i 'chmod 600 ~/.ssh/authorized_keys'
done;

Descripción del parámetro de script:

  • UserName corresponde al nombre de host;
  • ssh-keygen -t rsa y ssh-keygen -t dsa generan dos claves de cifrado, por supuesto, solo puede usar una de ellas;
  • startnode y endnode indican el rango de IP del nodo, como desde 192.168.2.150 a 192.168.2.159, startnode = 1, endnode = 9, solo necesita ejecutar el script en el host 192.168.2.150;
  • ssh username @ hostname cmd Inicie sesión en el host remoto y ejecute los comandos cmd. Si es necesario ejecutar varios comandos, deben escribirse como 'cmd; cmd; cmd'
  • La función actual de este script aún es relativamente débil. Por ejemplo, el rango de IP debe ser continuo y el prefijo del nombre de host debe ser el mismo, pero para construir un clúster pequeño, configurar la confianza mutua entre hosts es básicamente suficiente.

04. Otras cuestiones

El servidor maestro definido y 192.168.50.131 son lo mismo, pero los efectos de los dos métodos son diferentes.

 ssh-copy-id -i id_rsa.pub root@192.168.50.131
 ssh-copy-id -i id_rsa.pub root@masterserver

Si la clave pública se transmite a través de IP, solo se puede acceder a ella a través de IP, y el acceso a través del nombre de host requiere una contraseña. El segundo método no es necesario.

Al observar el archivo know_hosts, encontramos que el segundo método tiene más nombres de host al frente que el primer método. Después de la prueba, si agrega manualmente el nombre de host al archivo know_hosts del primer método, el efecto es el mismo que el del segundo método.

Supongo que te gusta

Origin blog.csdn.net/qq_42226855/article/details/112691157
Recomendado
Clasificación