基于RSA的非对称加密算法加密SSH远程管理

0x01 前言:

一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更好的办法来保证安全,而且让你可以放心地用 root 账户从远程登录——那就是通过密钥方式登录。

密钥形式登录的原理是:利用密钥生成器制作一对密钥——一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。

下面来讲解如何在 Linux 服务器上制作密钥对,将公钥添加给账户,设置 SSH,最后通过客户端登录。

0x02 制作密钥对

首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	[root@q1jun ~]# 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:A86JqHd+I7WL4MKmSN3+ImhYOSh0C9BmLcQW/v1qZsE root@q1jun
The key's randomart image is:
+---[RSA 3072]----+
| +oo |
|..B . |
|.+.. . |
| o + = o |
|..+.+.= S |
|o.=.. E. . |
|=o+o.o o. |
|=B =ooB. |
|*.. +B=+ |
+----[SHA256]-----+

密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。

现在,在 root 用户的家目录中生成了一个 .ssh 的隐藏目录,内含两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。

0x03 在服务器上安装公钥

将生成的公钥安装到服务器中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#进入安装密钥的目录
[root@q1jun ~]# cd .ssh/
[root@q1jun .ssh]# ll
总用量 12
-rw------- 1 root root 0 11月 21 11:40 authorized_keys
-rw------- 1 root root 2635 1月 24 11:05 id_rsa
-rw-r--r-- 1 root root 564 1月 24 11:05 id_rsa.pub
-rw-r--r-- 1 root root 175 1月 10 22:16 known_hosts
#查看公钥
[root@q1jun .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCscE1/PJL6/vB5+8FD/duxETJgUsirUzJr1n448IrS4tEbRuTgDuNMdPTp3qZ/tIL+c5/1GyOnpeWEvSCbC2hMAAI5FBSfbhxNlF3JkgUJIeE64EaUHmQhuFVNhRLnFySox96RxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxXhlvmhevCmfC2f96G6ZUfcUv8wNudCEKTDIdDrZSOzg9N9l7l/lenRVM878vhEplMdqYEXKZF77UM9B6zBl8dLksBW7+Jt6EwUGN96/7HSpCKHlLIn4sDPVBaFrX+R0XnhCvbLN6yWIxY56khkHHd+M2W1C/8vmG4wZ7/Q95xOhqcOwDRmRoFU= root@q1jun
#安装公钥
[root@q1jun .ssh]# cat id_rsa.pub >> authorized_keys
#为了确保连接成功,请保证以下文件权限正确,在当前文件夹输入以下指令
[root@q1jun .ssh]# chmod 600 authorized_keys
[root@q1jun .ssh]# chmod 700 ~/.ssh/

0x04 设置SSH,打开密钥登入功能

编辑/etc/ssh/sshd_config文件,修改以下设置:

1
2
RSAAuthentication yes
PubkeyAuthentication yes

另外,请留意 root 用户能否通过 SSH 登录:

1
PermitRootLogin yes

当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录:

1
PasswordAuthentication no

重启SSH服务:

1
[root@q1jun ssh]# systemctl restart sshd

0x05 将私钥下载到客户端

这里将介绍四种在服务器与本地之间传输文件的方式,本人倾向于使用前两种即sftpscp,其他两种不做演示。

0x0501 文件传输:sftp

可以通过sftp将服务器的id_rsa私钥下载到本地:

1
2
3
4
5
6
7
8
❯ sftp root@120.27.131.99
root@120.27.131.99's password: #输入服务器密码
Connected to 120.27.131.99.
sftp> get /root/.ssh/id_rsa
Fetching /root/.ssh/id_rsa to id_rsa
/root/.ssh/id_rsa 100% 2635 44.4KB/s 00:00
#退出,或者按CTRL+c(Mac: control+c)
sftp> exit

Secure Ftp 是一个基于SSH安全协议的文件传输管理工具。由于它是基于SSH的,会在传输过程中对用户的密码、数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性。在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作)。Sftp与ftp虽然只有一字之差,但基于的传输协议却是不同的。因此不能用sftp client去连接ftp server 也不能用 ftp client 去连接 sftp server。

建立连接:sftp user@host

从本地上传文件:put localpath

下载文件:get remotepath

与远程相对应的本地操作,只需要在命令前加上”l” 即可,方便好记。

例如:lcd lpwd lmkdir

0x0502 文件传输:scp

个人还是比较喜欢使用scp来远程传输文件的,通过scp将服务器的id_rsa私钥下载到本地:

1
2
3
❯ scp root@120.27.131.99:/root/.ssh/id_rsa ~/
root@120.27.131.99's password:#输入服务器密码
id_rsa 100% 2635 74.4KB/s 00:00

SCP :secure copy (remote file copy program) 也是一个基于SSH安全协议的文件传输命令。与sftp不同的是,它只提供主机间的文件传输功能,没有文件管理的功能。

复制local_file 到远程目录remote_folder

scp local_file remote_user@host:remote_folder

复制local_folder 到远程remote_folder(需要加参数 -r 递归)

scp –r local_folder remote_user@host:remote_folder

以上命令反过来写就是远程复制到本地

0x0503 文件传输:sz/rz

sz/rz 是基于ZModem传输协议的命令。对传输的数据会进行核查,并且有很好的传输性能。使用起来更是非常方便,但前提是window端需要有能够支持ZModem的telnet或者SSH客户端,例如secureCRT。

首先需要在secureCRT中可以配置相关的本地下载和上传目录,然后用rz、sz命令即可方便的传输文件数据。

下载数据到本地下载目录:sz filename1 filename2 …

上传数据到远程:执行rz –be 命令,客户端会弹出上传窗口,用户自行选择(可多选)要上传的文件即可。

0x0504 文件传输:rcp

rcp不是一种安全的的传输文件的方式,rcp通过rsh(rsh见下面)来执行远程命令,要使用rcp必须经过一些配置,现在rcp已经被scp取代了,常用scp来进行文件传输。要使用rcp,需要具备以下条件:

(1)如果系统中有/etc/hosts 文件,应确保该文件包含要与之进行通信的远程主机信息:internet_address official_name alias。例如:1.186.10.*** blade1.ibm.com.cnblade

(2).rhosts 文件:.rhosts 文件位于远程系统的根目录下,其中包含本地系统的名称和本地登录名。例如,远程系统的 .rhosts 文件中的项可能是:blade1 root;其中,blade1 是本地系统的名称,root 是本地登录名。这样,blade1 上的 root 即可在包含 .rhosts 文件的远程系统中来回复制文件。

配置过程:

(1) 在双方root用户根目录下建立.rhosts文件,并将双方的hostname加进去.在此之前应在双方的 /etc/hosts文件中加入对方的IP和hostname

(2) 把rsh服务启动起来,redhat默认是不启动的。方法:用执行ntsysv命令,在rsh选项前用空格键选中,确定退出。然后执行:service xinetd restart即可。

(3) 到/etc/pam.d/目录下,把rsh文件中的auth required /lib/security/pam_securetty.so一行用“#”注释掉即可。(只有注释掉这一行,才能用root用户登录)

命令使用:

rcp [options] [[user@]host1:]file1 ...[[user@]host2:]file2

options: 

-r 递归地把源目录中的所有内容拷贝到目的目录中。

-p 试图保留源文件的修改时间和模式,忽略umask。

0x06 通过RSA私钥登入SSH

在此之前确认已经从远程服务器中下载了id_rsa私钥到本地电脑中

我的id_rsa存放的目录为/Users/q1jun/id_rsa (~/id_ras)

通过ssh-i参数指定私钥存放的位置,具体命令如下:

image-20220124115749185

如果设置了密钥锁码,中间还要输入第一步时设置的密钥锁码。

如果是Windows系统:

推荐使用xshell登录,学生版本可以免费使用,登录方式可以采用用户名和密码,以及Public Key等多种形式。

(这里就不演示了,傻瓜操作)