[关闭]
@xushengkai 2023-01-14T07:03:18.000000Z 字数 6454 阅读 342

SSH连接原理及ssh-key

文件服务


概述

什么是ssh

Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置。

SSH的安全机制

SSH之所以能够保证安全,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据。
传统的网络服务程序,如FTP、Pop和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
但并不是说SSH就是绝对安全的,因为它本身提供两种级别的验证方法:
第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人攻击”这种方式的攻击。
第二种级别(基于密钥的安全验证):你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥在本地解密再把它发送给服务器完成登录。与第一种级别相比,第二种级别不仅加密所有传输的数据,也不需要在网络上传送口令,因此安全性更高,可以有效防止中间人攻击。

基于密钥的安全验证

基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(Public key)放在需要访问的目标服务器上,另外,还需要把私有密钥(Private key)放到SSH的客户端或对应的客户端服务器上。
此时,如果要想连接到这个带有公用密钥的SSH服务器,客户端SSH软件或客户端服务器就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密“质询”并把它发送给SSH客户端。
SSH客户端收到“质询”之后就可以用自己的私钥解密,再把它发送给SSH服务器。使用这种方式,需要知道联机用户的密钥文件。与第一种基于口令验证的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了,这时我们也要注意保护我们的密钥文件,特别是私钥文件,一旦被黑客获取,危险就很大了。
基于密钥的安全认证也有windows客户端和linux客户端的区别。这里是linux客户端和linux服务端之间的密钥认证。

基于口令的安全验证:

基于口令的安全验证的方式现在一直在用的,只需要知道服务器的SSH连接账号和口令(当然也要知道对应服务器的IP及开放的SSH端口,默认为22),就可以通过ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。

  1. [root@nfs01 data]# ssh -p 22 root@backup

sshd服务安装的及配置文件

安装sshd服务

  1. yum install -y openssh openssh-server openssh-client

sshd的配置文件

  1. ssh程序的配置文件
  2. [root@192 ~]# ll -d /etc/ssh/ssh_config
  3. -rw-r--r-- 1 root root 2047 4 9 2019 /etc/ssh/ssh_config
  4. sshd进程的配置文件
  5. [root@192 ~]# ll -d /etc/ssh/sshd_config
  6. -rw------- 1 root root 3879 4 9 2019 /etc/ssh/sshd_config

sshd服务的端口

默认监听22端口

  1. [root@192 ~]# ss -anp | grep sshd
  2. LISTEN 0 128 :::22 :::* users:(("sshd",900,4))
  3. LISTEN 0 128 *:22 *:* users:(("sshd",900,3))
  4. ESTAB 0 64 192.168.200.162:22 192.168.200.1:52177 users:(("sshd",957,3))

示例

之前都是密码进行远程连接,还可以实现免密码的远程连接,免密码并不是真的免密码。而是通过一组高度加密的密钥文件来进行远程连接,我们管这类文件,叫做密钥对。
密钥对:分为两个一组,分别是客户端的私钥和服务器端的公钥。
主动发起连接的叫做客户端,需要持有私钥
被动接受连接的服务器端,需要持有公钥
连接方式,永远是私钥主动去找公钥

测试

准备环境

两台虚机,一台客户端:192.168.200.162,一台服务端:192.168.200.128,都安装了sshd服务,并且打开了sshd服务

客户端操作

1.在客户端生成512位加密的密钥对(私钥+公钥)

  1. [root@192 ~]# ssh-keygen
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/root/.ssh/id_rsa):
  4. Enter passphrase (empty for no passphrase):
  5. Enter same passphrase again:
  6. Your identification has been saved in /root/.ssh/id_rsa.
  7. Your public key has been saved in /root/.ssh/id_rsa.pub.
  8. The key fingerprint is:
  9. ed:d5:cc:6e:ef:fe:96:4e:1f:b8:64:81:53:c0:a0:3e root@192.168.200.162
  10. The key's randomart image is:
  11. +--[ RSA 2048]----+
  12. | .o. |
  13. | . .. |
  14. | . . |
  15. | . . o+ |
  16. | ES .o..+ |
  17. | .. ...o |
  18. | . +oo.|
  19. | o.oo+|
  20. | ..=B|
  21. +-----------------+

1.2此时客户端的家目录下有两个隐藏文件,密钥对

  1. [root@192 ~]# ll .ssh/*
  2. 私钥
  3. -rw------- 1 root root 1675 11月 22 13:38 .ssh/id_rsa
  4. 公钥
  5. -rw-r--r-- 1 root root 402 11月 22 13:38 .ssh/id_rsa.pub

2.我要用客户端主动连接对方的服务器端,需要把公钥给服务器端

  1. [root@192 ~]# scp /root/.ssh/id_rsa.pub root@192.168.200.128:/root
  2. root@192.168.200.128's password:
  3. id_rsa.pub 100% 402 0.4KB/s 00:00

服务端操作

1.将复制过来的公钥文件,放到/root目录下的.ssh隐藏目录里。如果这个目录没有,需要创建

  1. [root@192 ~]# mkdir .ssh
  2. [root@192 ~]# mv .ssh/id_rsa.pub .ssh/

1.2手动创建的目录权限为755,改为700

  1. [root@192 ~]# chmod 700 .ssh/
  2. [root@192 ~]# ll -d .ssh/
  3. drwx------. 2 root root 4096 Nov 21 19:23 .ssh/

2.将公钥文件修改名字:authorized_keys,为什么要改为这个名字因为配置文件/etc/ssh/sshd_config里定义了,公钥文件的放置路径。

  1. [root@192 ~]# mv .ssh/id_rsa.pub .ssh/authorized_keys
  2. [root@192 ~]# ls .ssh/
  3. authorized_keys

3.在客户端上进行登录服务端

  1. [root@192 ~]# ssh root@192.168.200.128
  2. Last login: Tue Nov 22 10:18:43 2022 from 192.168.200.162
  3. [root@192 ~]# hostname -I
  4. 192.168.200.128

总结:这是设置root用户的免密登录,普通用户的免密登录将公钥文件拷贝到普通用户的家目录下,同样操作即可。
你想要和对方服务器的哪个用户进行密钥对认证,那么你就要把公钥拷到对方该用户的家目录下的.ssh目录里的authorized_keys文件里.

部署ssh密钥的批量分发

工作中,我们一般会登录到一台服务器上,通过这台服务器链接其他服务器。
那么,我们会需要和远方的多台服务器进行密钥对方式的免密码连接。
因此,我们需要进行密钥对的批量分发。
那么如何批量分发呢?我们需要考虑以下几个问题
脚本里是不能出现交互情况的,否则脚本会卡住,那么
(1)yes or no 如何自动过去?
(2)对方的密码如何自动过去?

开始部署

1.开始安装sshpass免交互工具并进行SSH-key的批量分发
下载epel源并更新yum仓库

  1. [root@192 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-archive-6.repo
  2. [root@192 yum.repos.d]# yum makecache

2.安装sshpass工具

  1. [root@192 ~]# yum -y install sshpass

3.创建密钥对文件,免交互创建密钥对

  1. [root@192 ~]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
  2. Generating public/private dsa key pair.
  3. Your identification has been saved in /root/.ssh/id_dsa.
  4. Your public key has been saved in /root/.ssh/id_dsa.pub.
  5. The key fingerprint is:
  6. 53:a2:66:0b:df:41:a0:53:8a:78:73:a1:f0:be:32:f6 root@192.168.200.128
  7. The key's randomart image is:
  8. +--[ DSA 1024]----+
  9. |. . o |
  10. | + o = . |
  11. |. * = o . |
  12. | o o . o o |
  13. | . . + S |
  14. | . = o o |
  15. |o.. o . |
  16. |.o. |
  17. | E |
  18. +-----------------+
  19. 参数解释:
  20. ssh-keygen:生成密钥对命令
  21. -t:指定密钥对的密码加密类型(rsa,dsa两种)
  22. -f:指定密钥对文件的生成路径包含文件名
  23. -P(大写):指定密钥对的密码,不写就是空

4.免交户方式分发公钥

  1. [root@192 ~]# sshpass -p "666666" ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no root@192.168.200.162"
  2. Warning: Permanently added '192.168.200.162' (RSA) to the list of known hosts.
  3. Nasty PTR record "192.168.200.162" is set up for 192.168.200.162, ignoring
  4. Now try logging into the machine, with "ssh '-o StrictHostKeyChecking=no root@192.168.200.162'", and check in:
  5. .ssh/authorized_keys
  6. to make sure we haven't added extra keys that you weren't expecting.
  7. 参数解释:
  8. sshpass:专为ssh连接服务的免交户工具
  9. -p :指定登录的密码
  10. ssh-copy-id:自动分发公钥的工具
  11. -i:指定公钥路径
  12. -o StrictHostKeyChecking=no :不进行对方主机信息的写入(第一次ssh连接会在know_hosts文件里记录)

5.测试ssh密钥认证情况,进行登录

  1. [root@192 ~]# ssh root@192.168.200.162
  2. Nasty PTR record "192.168.200.162" is set up for 192.168.200.162, ignoring
  3. Last login: Wed Nov 23 11:02:40 2022 from 192.168.200.1
  4. 中午好,主人我是你的小妲己

6.设置ssh登录免交互式

  1. [root@localhost .ssh]# vim /etc/ssh/ssh_config
  2. 35 StrictHostKeyChecking ask no #将此行取消注释,后面写上no
  3. #重启sshd服务
  4. [root@localhost .ssh]# systemctl restart sshd

编写ssh密钥对免交户批量分发脚本

  1. #!/bin/bash
  2. #2022-13-14
  3. #kz
  4. #SSH密钥批量分发
  5. User=root
  6. passWord=##Linux登录密码
  7. function YumBuild(){
  8. echo "正在安装epel源yum仓库,请稍后..."
  9. cd /etc/yum.repos.d/ &&\
  10. [ -d bak ] || mkdir bak
  11. [ `find ./*.* -type f | wc -l` -gt 0 ] && find ./*.* -type f | xargs -i mv {} bak/
  12. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo &>/dev/null
  13. yum -y clean all &>/dev/null
  14. yum makecache &>/dev/null
  15. }
  16. echo "正在进行网络连接测试,请稍后..."
  17. ping www.baidu.com -c2 >/dev/null ||(echo "无法连同外网,本脚本运行环境必须和外网相连!" && exit)
  18. [ $# -eq 0 ] && echo "没有参数!格式为:sh $0 参数1...n" && exit
  19. rpm -q sshpass &>/dev/null || yum -y install sshpass &>/dev/null
  20. if [ $? -gt 0 ];then
  21. YumBuild
  22. yum -y install sshpass &>/dev/null || (echo "sshpass build error!" && exit)
  23. fi
  24. [ -d ~/.ssh ] || mkdir ~/.ssh;chmod 700 ~/.ssh
  25. echo "正在创建密钥对...."
  26. rm -rf ~/.ssh/id_dsa ~/.ssh/id_dsa.pub
  27. ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" &>/dev/null
  28. for ip in $*
  29. do
  30. ping $ip -c1 &>/dev/null
  31. if [ $? -gt 0 ];then
  32. echo "$ip无法ping通请检查网络"
  33. continue
  34. fi
  35. sshpass -p "$passWord" ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no ${User}@$ip" &>/dev/null
  36. echo "$ip 密钥分发成功"
  37. done
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注