avatar

5.SSH服务

SSH服务

第1章 什么是ssh

`SSH 为 Secure Shell 的缩写,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全性。
SSH提供了口令和密钥两种用户验证方式,这两者都是通过密文传输数据的。

SSH与Telnet的区别:

SSH: 系统默认配置 22 默认可以使用root用户进行登录 数据信息进行加密
telnet:网络设备默认开启 23 默认只能使用普通用户进行登录 数据信息显示明文

SSH的作用

1)对用户身份信息进行认证

2)利用公钥和私钥对数据信息进行加密处理

第2章 ssh服务登录验证

2.1. ssh服务登录验证方式:

  • 用户/口令
  • 基于密钥对

2.2 基于用户和口令登录验证

  • 1、客户端发起ssh请求,服务器会把自己的公钥发送给用户
  • 2、用户会根据服务器发来的公钥对密码进行加密
  • 3、加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

2.3 基于密钥的登录方式

基于密钥的登录方式

  • 1、首先在客户端生成一对密钥(ssh-keygen)
  • 2、并将客户端的公钥ssh-copy-id 拷贝到服务端
  • 3、当客户端再次发送一个连接请求,包括ip、用户名
  • 4、服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:acdf
  • 5、服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
  • 6、得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
  • 7、服务端接收到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

原理总结:

1
2
3
4
5
6
7
8
01. 客户端 - 服务端   请求建立ssh远程连接 
02. 服务端 - 客户端 请求确认公钥信息
03. 客户端 - 服务端 确认接收公钥信息,保存~/.ssh/authorized_keys 文件中
04. 服务端 - 客户端 询问用户密码信息
05. 客户端 - 服务端 用户密码信息
06. 服务端 - 客户端 确认密码信息正确 远程连接建立
01 之后:不用反复确认公钥信息
06 之后:所有传输的数据信息会进行加密处理

第3章 基于密钥方式实现远程连接步骤

3.1 管理端服务器

3.1.1创建密钥对信息

第一种方式:默认参数,一路回车

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@ssh-61 ~/.ssh]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:x+Xoxb/z59g68vS2DwPieixVCC01yXc83aJ6p/pYR+Y root@ssh-61
The key's randomart image is:
+---[RSA 2048]----+
| +o. . ..|
| o +.. = o|
| o o.o o |
| ..=o |
| S =o= o |
| +oo.*. |
| oo..oE |
| ..oooooBo|
| .ooo.o=OX|
+----[SHA256]-----+

第二种方式:指定加密算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@ssh-61 ~]# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
SHA256:fW5GHPjirQZoiZhX1tXwnvwWxdjRWgFnsAiLTsyo1Is root@ssh-61
The key's randomart image is:
+---[DSA 1024]----+
| ..o oo=o|
| . + . +oo +++|
| . o * o..o..o+|
| . o * .. = o.. |
| E = +S o O . |
| o o + .. * . . |
| . . .. = o |
| .+ . |
| .. |
+----[SHA256]-----+

3.1.2 分发公钥

第一种方式:默认参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ssh-61 ~]# ssh-copy-id 172.16.1.41
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.16.1.41 (172.16.1.41)' can't be established.
ECDSA key fingerprint is SHA256:wpba7z96j3rm+efG7Ior294sbdQ/qlFFdt+/WNuH3N0.
ECDSA key fingerprint is MD5:66:39:31:20:fc:85:40:2d:d2:83:9c:eb:0b:ca:d2:5b.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.16.1.41's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh '172.16.1.41'"
and check to make sure that only the key(s) you wanted were added.

第二种方式:指定传输的公钥

1
[root@ssh-61 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.41

3.1.3 测试远程连接

1
2
3
4
5
6
[root@ssh-61 ~]# ssh 172.16.1.41
Last login: Mon Jul 22 23:35:45 2019 from 10.0.1.1
[root@backup ~]# logout
Connection to 172.16.1.41 closed.
[root@ssh-61 ~]# ssh 172.16.1.41 hostname
backup

3.2 被管理服务器

1
2
3
[root@backup ~/.ssh]# ll
total 4
-rw------- 1 root root 601 Jul 22 23:33 authorized_keys

第4章 免交互分发密钥

当被管理服务器有多台时,如何批量进行分发密钥

如何解决面交互问题:

1)首次连接提示yes/no

解决方法:

1
[root@ssh-61 ~]# ssh-copy-id 10.0.1.31 -o StrictHostKeyChecking=no

2)首次连接需要输入密码确认

1
2
[root@ssh-61 ~]# yum -y install sshpass  #安装sshpass服务
[root@ssh-61 ~]# sshpass -p123456 ssh-copy-id -i .ssh/id_dsa.pub 172.16.1.31 -o StrictHostKeyChecking=no

3)写成脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
for ip in {31,41}
do
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.$ip -o StrictHostKeyChecking=no &>/dev/null
if [ $? -eq 0 ]
then
echo "===============pub_key fenfa ok with 172.16.1.$ip========================="
ssh 172.16.1.${ip} hostname
echo ""
else
echo "===============pub_key fenfa failed with 172.16.1.$ip========================="
echo ""
fi
done

第5章 ssh安全优化

5.1 windows:

1)xshell生成密钥对

2)将xshell公钥上传到管理机ssh-61

1
2
3
4
5
1.使用rz命令上传公钥文件到管理机ssh-61
2.[root@ssh-61 ~/.ssh]# mv id_dsa_1024.pub authorized_keys
3.[root@ssh-61 ~/.ssh]# chmod 600 authorized_keys #更改公钥权限
4.[root@ssh-61 ~/.ssh]# ll
-rw------- 1 root root 588 Jul 22 16:14 authorized_keys

xshell测试

5.2 管理机

1)更改ssh默认端口号

1
2
# vim /etc/ssh/sshd_config 
Port 9999

2)关闭用户名密码登陆方式

1
2
# vim /etc/ssh/sshd_config 
PasswordAuthentication no

3)开启通过密钥对方式连接

5.3 被管理机

1)更改ssh默认端口号

2)关闭用户名密码登录方式

3)开启通过密钥对方式连接

4)指定监听内网地址

更改ssh相关配置:

1
2
3
4
5
# vim /etc/ssh/sshd_config 
17 Port 9999
19 ListenAddress 172.16.1.41
65 PasswordAuthentication no
[root@ssh-61 ~]# systemctl restart sshd

管理机ssh登录被管理机

1
[root@ssh-61 ~]# ssh 172.16.1.41 -p9999

第6章 作业

一个脚本完成以下所有任务:

  • 1.管理机自动创建密钥对
  • 2.管理机自动将公钥发送到被管理机
  • 3.修改被管理机的SSH连接端口为9999
  • 4.修改被管理机的SSH监听地址为172.16.1.X
  • 5.修改被管理机不允许使用账号密码方式登陆,只允许使用密钥方式连接
  • 6.修改完之后验证是否生效,验证方法为使用9999端口连接被管理机并打印出主机 信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
if [ -f /root/.ssh/id_dsa ];then
echo "密钥已存在,将发送现有文件"
else
ssh-keygen -t dsa -P "" -f /root/.ssh/id_dsa && echo "密钥生成成功"
fi
for ip in {31,41}
do
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.${ip} -o StrictHostKeyChecking=no > /dev/null 2>&1
if [ $?==0 ];then
echo "172.16.1.${ip} key sent successful"
ssh 172.16.1.${ip} "cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak"
ssh 172.16.1.${ip} "sed -i 's/#Port 22/Port 9999/g' /etc/ssh/sshd_config && echo 'port ok'"
ssh 172.16.1.${ip} "sed -i 's/#ListenAddress 0.0.0.0/ListenAddress 172.16.1.${ip}/g' /etc/ssh/sshd_config && echo 'ListenAddress ok'"
ssh 172.16.1.${ip} "sed -i 's#^PasswordAuthentication yes#PasswordAuthentication no#g' /etc/ssh/sshd_config && echo 'Password ok'"
ssh 172.16.1.${ip} "systemctl restart sshd"
sleep 3
echo "------------------"
echo "172.16.1.${ip} hostname is :$(ssh -p 9999 172.16.1.${ip} hostname)"
echo "------------------"
else
echo "172.16.1.${ip} key sent faild"
fi
done
文章作者: Wu Fei
文章链接: http://linuxwf.com/2020/04/13/5-SSH%E6%9C%8D%E5%8A%A1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WF's Blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论