openssh网络安全分析

openssh网络安全分析,第1张

SSH协议出现之前,在网络设备管理上广泛应用的一种方式是Telnet。Telnet协议的优势在于通过它可以远程地登录到网络设备上,对网络设备进行配置,为网络管理员异地管理网络设备提供了极大的方便。但是,Telnet协议存在三个致命的弱点:

A、明文传输:数据传输采用明文方式,传输的数据没有任何机密性可言。

B、认证机制脆弱。用户的认证信息在网络上以明文方式传输,很容易被窃听; Telnet 只支持传统的密码认证方式,很容易被攻击。

C、“伪服务器欺骗”:客户端无法真正识别服务器的身份,攻击者很容易进行“伪服务器欺骗”。SSH协议正是为了克服Telnet协议存在的问题而诞生的。

D、数据传输过程被篡改,无法保证传输过程数据完整性

ssh如果解决上述几个安全问题?我们一个个来分析

通过 在 通信双方建立“加密通道”,保证传输的数据不被窃听。并且需要有合适的手段保证通信双方秘钥的安全

所谓加密通道,是指发送方在发送数据前,使用加密密钥对数据进行加密,然后将

数据发送给对方;接收方接收到数据后,利用解密密钥从密文中获取明文。

加解密算法分为两类:  对称密钥算法:数据加密和解密时使用相同的密钥和相同的算法。  非对称密钥算法:数据加密和解密时使用不同的密钥,一个是公开的公钥,

一个是由用户秘密保存的私钥。

由于非对称密钥算法比较耗时,一般多用于数字签名以及身份认证。SSH加密通道

上的数据加解密使用对称密钥算法,目前主要支持的算法有DES、3DES、AES

等,这些算法都可以有效地防止交互数据被窃听,而且由于采用了初始化向量保

护,可以防止类似于密码流复用等密码分析工具的攻击。

对称密钥算法要求解密密钥和加密密钥完全一致,才能顺利从密文中解密得到明

文。因此,要建立加密通道,必须先在通信双方部署一致的加解密密钥。部署加解

密密钥的方式有多种:手工配置和第三方机构分配等。手工配置的方式扩展性差,

只适合一些小型的本地网络;使用第三方机构分配密钥的方式,需要额外的第三方

服务器,而且密钥在网络中传输容易被窃听。

SSH协议使用一种安全的方式在通信双方部署密钥:密钥交换算法。利用密钥交换

算法可以在通信双方动态地产生密钥,这个密钥只能被通信的双方获得,任何第三

者都无法窃听,这就在源头上保证了加解密使用密钥的安全性,很好地解决了密钥

分发问题。

支持的数据加密算法有:

3des-cbc

aes128-cbc

aes192-cbc

aes256-cbc

aes128-ctr

aes192-ctr

aes256-ctr

aes128-gcm@opensshcom

aes256-gcm@opensshcom

chacha20-poly1305@opensshcom

默认使用的算法:

chacha20-poly1305@opensshcom,

aes128-ctr,aes192-ctr,aes256-ctr,

aes128-gcm@opensshcom,aes256-gcm@opensshcom

可以通过关键字 “ Ciphers”指定使用的算法,多个算法间,需要使用逗号相隔

有三种方式指定算法

方式一:Ciphers 关键字后接算法名称,比如:Ciphers aes256-ctr,aes192-ctr表示只使用

aes256-ctr,aes192-ctr两种算法

方式二:Ciphers 关键字后接算法名称,并且算法名称前带上“+”,表示在默认算法基础上,新增“+”后的算法

方式三:Ciphers 关键字后接算法名称,并且算法名称前带上“-”,表示在默认算法基础上,裁剪“-”后的算法

支持的密钥交换算法有:

curve25519-sha256

curve25519-sha256@libsshorg

diffie-hellman-group1-sha1

diffie-hellman-group14-sha1

diffie-hellman-group-exchange-sha1

diffie-hellman-group-exchange-sha256

ecdh-sha2-nistp256

ecdh-sha2-nistp384

ecdh-sha2-nistp521

默认使用的密钥交换算法有:

curve25519-sha256,curve25519-sha256@libsshorg,

ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,

diffie-hellman-group-exchange-sha256,

diffie-hellman-group14-sha1

可以通过关键字 “

KexAlgorithms ”指定使用的算法,多个算法间,需要使用 逗号相隔

有三种方式指定算法

方式一:KexAlgorithms关键字后接算法名称,比如:KexAlgorithms

diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1

表示只使用diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1

两种算法

方式二:KexAlgorithms关键字后接算法名称,并且算法名称前带上“+”,表示在默认算法基础上,新增“+”后的算法

方式三:KexAlgorithms关键字后接算法名称,并且算法名称前带上“-”,表示在默认算法基础上,裁剪“-”后的算法

传统的方式,采用的是密码认证模式:用户在ssh客户端输入账号、密码,openssh完成对登录用户进行密码认证。用户的身份信息等关键数据都保存在认证服务器上

由于密码认证方式的认证强度较弱,SSH协议引入了公钥认证方式。目前,openssh

可以利用RSA和DSA两种非对称密钥算法实现公钥认证。

公钥认证的过程分为两个部分::

(1)  公钥验证:客户端首先将自己本地密钥对的公钥部分,按照字符串格式发送

到服务器。服务器使用本地保存的客户端公钥,与报文中携带的客户端公钥

进行比较,验证客户端持有公钥的正确性。

(2)  数字签名验证:如果公钥验证成功,客户端继续使用自己本地密钥对的私钥

部分,对特定报文进行摘要运算,将所得的结果(即数字签名)发送给服务

器,向服务器证明自己的身份;服务器使用预先配置的该用户的公钥,对客

户端发送过来的数字签名进行验证。

公钥验证和数字签名验证中任何一个验证失败,都会导致本次公钥认证失败。

AuthenticationMethods

PubkeyAuthentication:是否使用公钥认证,默认为yes

UsePAM:该关键字只有在移植版中支持,PAM为“可插拔认证模块”,用于

PubkeyAcceptedKeyTypes:公钥认证算法

ecdsa-sha2-nistp256-cert-v01@opensshcom, ecdsa-sha2-nistp384-cert-v01@opensshcom, ecdsa-sha2-nistp521-cert-v01@opensshcom, ssh-ed25519-cert-v01@opensshcom, ssh-rsa-cert-v01@opensshcom, ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, ssh-ed25519,ssh-rsa
公钥认证配置方法:

1 首先,在客户端生成一个对钥:

# ssh-keygen -t rsa

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_rsapub

The key fingerprint is:

fa:49:6c:0a:90:0e:0f:57:2e:21:79:f6:65:7f:8d:42

这里我们用的是rsa算法,我们也可以使用dsa算法:

ssh-keygen -t dsa

从上面可以看到,提示输入私钥的保护密码,我们也可以不选,直接ENTER就行了!

现在密钥已经生成:

id_rsa(私钥) id_rsapub(公钥)

如果是dsa算法生成的话:

id_dsa id_dsapub

2 我们将公钥传到服务器的ssh目录下

scp id_rsapub user@hostname:/home/user/ssh/authorized_keys

3 将/etc/ssh/sshd_config

中的rsa认证功能打开(去掉注释)

RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile ssh/authorized_keys

然后重新启动sshd就行了

如果是dsa算法的话同理

疑问:公钥认证,是否使用了PAM?还是openssh自己搞的?

可插拔认证模块的介绍:

>

从客户端来看,SSH提供两种级别的安全验证。

对于第二种级别,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有用户的私人密匙)。但是整个登录的过程可能需要10秒。

将本地用户生成的公钥推送至远程服务器后,远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。
这里不使用ssh-copy-id命令,改用下面的命令,来解释公钥的保存过程:

输入命令 ssh user@host ,然后根据提示输入远程服务器的登录密码

也可在配置文件/etc/ssh/ssh_config 中设置user和host(ip), 来简化命令, 配置如下:

配置后, 登录请求时只需输入如下命令:

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。
公钥登录原理 :就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果解密验证成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

执行上述命令首先会让你输入生成密钥的文件名: myPemKey (自定义),之后一路回车。

配置后,登录远程服务器时只需输入一下命令,便可直接登录成功:

修改后重启ssh服务

则远程连接时指定端口

(1) 通过iptables设置ssh端口的白名单,如下设置只允许19216810/24网段的客户机可以远程连接本机

(2) 通过/etc/hostsallow里面进行限制(如下),/etc/hostsdeny文件不要任何内容编辑,保持默认!

例如:

修改远程服务器ssh服务配置文件/etc/ssh/sshd_config

修改远程服务器配置文件/etc/ssh/sshd_config, 如下:

如果本机系统有些账号没有设置密码,而ssh配置文件里又没做限制,那么远程通过这个空密码账号就可以登陆了,这是及其不安全的,所以一定要禁止空密码登陆。
修改远程服务器配置文件/etc/ssh/sshd_config,如下:

参考:

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

SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文主要介绍OpenSSH免费开源实现在Ubuntu中的应用,如果要在Windows中使用SSH,需要使用另一个软件PuTTY。

SSH之所以能够保证安全,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据。

传统的网络服务程序,如FTP、Pop和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。

但并不是说SSH就是绝对安全的,因为它本身提供两种级别的验证方法:

第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人攻击”这种方式的攻击。

第二种级别(基于密钥的安全验证):你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥在本地解密再把它发送给服务器完成登录。与第一种级别相比,第二种级别不仅加密所有传输的数据,也不需要在网络上传送口令,因此安全性更高,可以有效防止中间人攻击。

SSH分为客户端 openssh-client 和服务器 openssh-server,可以利用以下命令确认电脑上是否安装了客户端和服务器。

如果只是想远程登陆别的机器只需要安装客户端(Ubuntu默认安装了客户端),如果要开放本机的SSH服务就需要安装服务器。

首先确认ssh-server是否已经启动了

如图,sshd 表示ssh-server已经启动了。如果没有启动,可以使用如下命令启动:

停止和重启ssh服务的命令如下:

接下来就可以进行使用客户机远程登录服务器了~

口令登录非常简单,只需要一条命令,命令格式为: ssh 客户端用户名@服务器ip地址 eg:

如果需要 调用图形界面程序 可以使用 -X 选项

如果客户机的用户名和服务器的 用户名相同 ,登录时 可以省略 用户名。

还要说明的是,SSH服务的 默认端口是22 ,也就是说,如果你不设置端口的话登录请求会自动送到远程主机的22端口。我们可以使用 -p 选项来修改端口号,比如连接到服务器的1234端口:

客户机必须要知道服务器的 ip地址 。可以在服务器端电脑上利用 ifconfig 命令查看该机的ip地址:

如果是第一次登录远程主机,系统会给出下面提示:

意思是,该远程主机的真实性无法确定,其公钥指纹为 SHA256:s8pZiuKQr7k7f+57j22lk/IdWC8143VQKR+EabeP5,确定想要继续连接吗?

输入yes 即可。这时系统会提示远程主机被添加到已知主机列表。

然后会要求我们输入 远程主机的密码 ,输入的密码正确就可以成功登录了。命令提示符会修改为远程主机的提示符,现在开始,终端中输入的命令都将在服务器中执行。

我们可以通过 Ctrl+D 或者 exit 命令 退出远程登录

每次登录远程主机都需要输入密码是很不方便的,如果想要省去这一步骤,可以利用密钥对进行连接,还可以提高安全性。

1、在本机生成密钥对

使用ssh-keygen命令生成密钥对:

ssh-keygen -t rsa #-t表示类型选项,这里采用rsa加密算法
然后根据提示一步步的按enter键即可(其中有一个提示是要求设置私钥口令passphrase,不设置则为空,这里看心情吧,如果不放心私钥的安全可以设置一下),执行结束以后会在 /home/当前用户 目录下生成一个 ssh 文件夹,其中包含私钥文件 id_rsa 和公钥文件 id_rsapub。

2、将公钥复制到远程主机中

使用ssh-copy-id命令将公钥复制到远程主机。ssh-copy-id会将公钥写到远程主机的 ~/ ssh/authorized_key 文件中

ssh-copy-id ldz@19216801
经过以上两个步骤,以后再登录这个远程主机就不用再输入密码了。

1)已获取登录实例的管理员帐号及密码(或密钥)。
2)云服务器实例已开通22号端口。

—使用密码登录

Host Name(or IP address) :服务器的IP地址;
Port :服务器的端口,必须设置为22;
Connect type :选择 “SSH”;
Saved Sessions :填写会话名称,例如 test。 配置 “Host Name” 后,再配置 “Saved Sessions” 并保存,则后续使用时您可直接双击 “Saved Sessions” 下保存的会话名称即可登录服务器;

登录完成后,命令提示符左侧将显示当前登录云服务器的信息。

—使用密钥登录

Ps: 当不存在私钥文件时,可以选择Conversions > Import key 导入公钥(pem)文件来生成私钥文件(ppk)

Host Name (IP address) :服务器的IP;
Port :服务器的端口,必须填 22;
Connect type :选择 “SSH”;
Saved Sessions :填写会话名称,例如 test。 配置 “Host Name” 后,再配置 “Saved Sessions” 并保存,则后续使用时您可直接双击 “Saved Sessions” 下保存的会话名称即可登录服务器;

登录完成后,命令提示符左侧将显示当前登录服务器的信息。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/12743634.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-27
下一篇2025-08-27

发表评论

登录后才能评论

评论列表(0条)

    保存