程序员开发实例大全宝库

网站首页 > 编程文章 正文

8 在Linux 7中配置和保护OpenSSH服务

zazugpt 2024-10-20 16:04:47 编程文章 229 ℃ 0 评论

Linux 7 Basic NO.8

大家好!本节将讲解在Linux 7中如何使用OpenSSH配置远程系统上的安全命令行访问。

如有不足,请指出并指正。 ^-^


什么是OpenSSH Secure Shell (SSH) ?

  • OpenSSH这一术语指系统中使用的Secure Shell软件的软件实施。

  • OpenSSH Secure Shell (ssh)用于在远程系统上安全运行shell。如果您在可提供SSH服务的远程Linux系统中拥有用户账户,则ssh是通常用来远程登录到该系统的命令。ssh命令也可用于在远程系统中运行各种命令。


SSH的全称Secure Shell,是Client/Server模式,默认端口号为22,相比Telnet,更加安全,因为Telnet是明文传输的

SSH其实用于商业,而OpenSSH即为开源的,在Linux中大都存在

SSH客户端语法:

ssh [username@hostname] [-p 端口号] 端口号默认为22,实际使用中为了安全,可以将其更改为其它端口号,如2222

eg:

ssh -X root@desktop0.example.com


当客户端连接服务器时,服务器需要验证客户端的身份,有两种验证方式。

1、基于用户名和密码身份验证

实验环境,两台机器如下,

  • classroom.example.com 充当ssh server

  • desktop0.example.com 充当ssh client

当我们执行如下命令时,可以看到客户端需要与服务器建立连接,此时需要输入yes,客户端将会接受到服务器发送过来的一个密钥,该密钥可用于之后验证客户端与服务器之间的连接,如果输入no,将断开连接

注意:使用“基于用户名和密码身份验证”这种方式验证连接,第一次连接时,因为无法确定所连接的classroom这台服务器就是我们需要的,可能是同名的第三方的机器,所以,第一次需要输入yes,服务器发送密钥给客户端,以便在之后的连接中,可以使用该密钥进行验证。

输入yes后,回车。再次连接时,发现此时不需要再进行密钥的发送和接受,只需要验证密钥,输入密码即可

[root@desktop0 ~]# ssh -X root@classroom.example.com

客户端接收了来自服务端的公钥并保存在本地,在服务端则还有相对应的私钥,这密钥是成对出现的,如果服务端的私钥被修改了,那么,客户端在连接时,将会失败。

基于用户名和密码身份验证原理:

  1. 客户端向服务器发送一个连接的请求

  2. 第一次连接服务器,服务器向客户端发送一个公钥,客户端选择接收,该密钥被保存在用户的家目录下的隐藏文件~/.ssh/known_hosts

  3. 客户端使用服务器传送过来的公钥对用户密码进行加密,并发送给服务器

  4. 服务器接收到客户端发送过来的密码,服务器使用自己的私钥解密,验证密码合法性,于/etc/shadow进行验证

接下来,我们进行一个测试,将服务端的私钥删除,客户端连接会出现什么情况?

如下图,可以看到,客户端已经无法连接到服务端,直接报错,我们把客户端的公钥也情况,还是一样无法连接,此时,只需要将服务端ssh的服务重新启动一下,这时服务端将会自动生成一对密钥(公钥和私钥)

这里可以看到服务端的公钥和私钥,并且还存在两对密钥,主要是其加密方式不一样

此时,因为客户端无法去验证公钥,所以,无法进行连接,即使删除客户端的公钥,也是一样,因为服务端已经不存在密钥,只能重新启动服务端的ssh服务,使其重新生成一对密钥

此时,再进行连接时,相当于第一次连接,需要进行公钥的传送接受。

2、基于密钥的身份验证

在上面的实验中,我们发现这种“基于用户名和密码身份验证”的验证方式不是很方便,因为为交互式的,需要我们进行确认输入密码,接下来,将进行“基于密钥的身份验证”这种验证方式的实验,大家可以体验以下有什么区别

实验环境跟上面的一样

desktop0.example.com(客户端)连接classroom.example.com(服务端)时,不需要输入密码即可登录到服务端

[root@desktop0 ~]# 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:

0e:4a:29:75:0b:40:73:53:08:94:85:bd:9b:42:05:5e root@desktop0.example.com

[root@desktop0 ~]# ssh-copy-id root@classroom.example.com

这条命令,可以将我们刚刚生成的公钥拷贝给服务端,即你想要连接哪台服务器,就将公钥拷贝过去即可

[root@desktop0 ~]# ssh -X root@classroom.example.com

执行完上面的操作后,我们发现再次连接到服务端时,已经不需要密码了,因为服务端有从客户端拷贝过去公钥

基于密钥身份验证原理:

  1. 客户端首先在本地生成一对密钥,然后客户端通过ssh-copy-id把公钥传送给目标服务器

  2. 客户端使用服务器的公钥加密一段数据再使用自己的私钥加密传送给目标服务器(双向验证)

    客户端验证服务器的合法性

    服务器也要验证客户端的合法性

  3. 验证通过客户端和服务器建立连接

当我们在使用自动化的任务时,比如拷贝文件/etc/passwd到服务端classroom的目录/mnt下,根本可以不用输密码,使用脚本直接运行即可

此时,对于客户端来说,私钥就很重要了,如果私钥被他人拷贝到其它电脑,那么也可以不需要任何密码即可连接到相应的服务端,客户端私钥位置如下

接下来,进行私钥加密的实验(主要用在外网进行连接时)

[root@desktop0 ~]# ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

/root/.ssh/id_rsa already exists.

Overwrite (y/n)? y 此时提示私钥已经存在,y确认覆盖

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:

85:bf:5a:a2:45:f9:60:64:0e:0f:ce:34:9d:11:9c:b3 root@desktop0.example.com

此时,因为客户端重新生成了一对密钥,所以,需要重新拷贝公钥到服务端

再次进行连接时,需要输入前面客户端给私钥加密的密码,才可进行连接。

现在问题出现了,私钥是安全了,但是又变成了这种交互式的连接,怎么实现自动化呢?

此时,我们需要在客户端启用ssh-agent,命令如下

[root@desktop0 ~]# ssh-agent bash

[root@desktop0 ~]# ssh-add

现在再进行连接时,就可以不用输入密码了。

通过以上操作,对私钥进行加密,这样他人拿到你的私钥也需要密码才能进行连接


SSH服务端的配置

ssh服务端软件,防火墙默认打开22端口

openssh-server-6.4p1-8.el7.x86_64 服务端软件

openssh-clients-6.4p1-8.el7.x86_64 客户端软件

关于ssh软件,Linux即使是最小化安装,也是默认安装和默认开启的

如下,ssh默认监听的端口为22,监听的地址为任意IP

对于客户端为Linux系统的,直接ssh直接连接即可,如果为Windows系统的,可以安装相应的ssh客户端,如putty,Secure CRT,Xmanager等

ssh服务端软件的配置文件路径如下

/etc/ssh/sshd_config 服务端配置文件

/etc/ssh/ssh_config 客户端配置文件

[root@classroom ~]# vim /etc/ssh/sshd_config

可以使用以上命令进行修改,如修改ssh监听的端口或者地址等

可以通过 man sshd_config查看配置文件的帮助

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表