前言

SSH(Secure Shell) 是一种加密的网络协议。当你想安全的远程连接到主机,通常情况下都会使用到SSH。

因为是通过网络连接,所以就会绕不开安全性的问题,目前最常用最基础的登录方式为帐号密码登录及账号密钥登录。

在公网的环境下,账号密码登录的方式,在默认状态下,实在谈不上什么安全性,可以说可全裸状态没有什么区别。默认状态下通过IP+22端口连接,使用root用户+密码,你看,端口和用户名都是已知的。如果保持这种状态,黑客扫描到你,到破解你的root密码也只是时间问题。

所以如果是租用VPS的小伙伴,一定要进行基础的SSH安全优化,不然等于给别人租了台肉鸡……

关于SSH的一些基础设置请移步:https://www.gaoqichen.com/linux/sshd_config.html

什么是密钥什么是公钥

用更傻瓜的描述就是:公钥就是锁,挂在服务器门口,任何人都可以尝试打开这把锁;而私钥就是钥匙,理论上只有这把钥匙可以打开那把锁。

至于各种锁的结构和复杂程度不同,对应着各种密钥对的加密方式。

本文介绍以及用到的是一种叫做RSA的加密方式(其实应该叫RSA算法)。

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

用人话解释一下这个算法就是:RSA密钥很安全!

虽然下面的例子中我都是用root演示的,主要是因为是虚拟机比较方便。

如果大家应用在vps或者生产环境,建议还是使用一个单独的用来ssh连接的用户。

该用户不具备任何权限,登录后su -切换root或切换相应有权限的用户使用。

这样可以在sshd_config配置文件中关闭root登录,更加保证生产环境的安全。

生成密钥对

下面简单介绍下生成密钥对的两种方法:

通过Xshell生成密钥对

打开Xshell,菜单栏点开工具,选择新建用户密钥生成向导

密钥类型选择RSA,密钥长度随意,推荐2048

密钥生成界面直接下一步

密钥信息,名称随意,此处密码为该密钥对的密码,算是第二层保险,使用私钥匹配公钥时需输入该密码验证

公钥格式选择SSH2 - OpenSSH,保存为文件

私钥需要在用户密钥管理者中保存,菜单栏点开工具选择用户密钥管理者

弹出窗口选中私钥,点击导出

通过服务器计算密钥对

直接见代码:

[root@KsC7 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
# 输入密钥对存放路径,默认即可
Created directory '/root/.ssh'.
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:eXv3j8IsGLElLlLqtMpsMZqCSCRQhT81AoELKF9IP1k root@KsC7
The key's randomart image is:
+---[RSA 2048]----+
|.+=*. E          |
|* o.ooo          |
|+o o+o .         |
|o.. o.. o..      |
|o    + .S=.      |
| .o + . +. .     |
|+o = o . o.o. .  |
|*o. o   . ..+. o |
|..+.       . .. +|
+----[SHA256]-----+

密钥对的存放位置是放在用户家目录下的,所以绝对地址为~/.ssh/

注:.ssh目录为隐藏目录,使用ls -la ~查看。

生成的id_rsa.pub为公钥id_rsa为私钥

可以通过cat查看文件内容,私钥有注释(RSA PRIVATE KEY)且文件更大。

公钥(仅展示用):

[root@KsC7 .ssh]# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDu4hTjgzSGqVgTVr7PH+TU2NC6YPhsbgCMmrhaEgzTI6GGrCYmgAGerEtGzRKTz6IWUMtEV1ruHTrX00pga9RtJja45haI5DfmrCDgunzS6cGgks2UT4d1y5t1nZmQLit9EY5npekh2y9f1obDRkflP1+pvtwvvvaOv4ocOVwRka646P2cUzQOF9rBFIloQ2WErmTpV3D483oi9wtFv6eGe8JX8Vw91u8753yzygDSMk43TD+a95dRWXgh4/IChhwfHQMUW0THUBNNQVWNzScfQr9U5OnAPxQuQLyyxMY+Q4IHSD5pAo65jrFJpqARuRMj5z0xnh0diW+SKmbw8RoV root@KsC7

PS:公钥最后一个字段可以理解为注释,可以通过创建时使用使用-C参数自定义(大写C),默认为用户@主机名,没啥用,可以删除。

私钥(仅展示用):

[root@KsC7 .ssh]# cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA7uIU44M0hqlYE1a+zx/k1NjQumD4bG4AjJq4WhIM0yOhhqwm
JoABnqxLRs0Sk8+iFlDLRFda7h0619NKYGvUbSY2uOYWiOQ35qwg4Lp80unBoJLN
lE+HdcubdZ2ZkC4rfRGOZ6XpIdsvX9aGw0ZH5T9fqb7cL772jr+KHDlcEZGuuOj9
nFM0DhfawRSJaENlhK5k6Vdw+PN6IvcLRb+nhnvCV/FcPdbvO+d8s8oA0jJON0w/
mveXUVl4IePyAoYcHx0DFFtEx1ATTUFVjc0nH0K/VOTpwD8ULkC8ssTGPkOCB0g+
aQKOuY6xSaagEbkTI+c9MZ4dHYlvkipm8PEaFQIDAQABAoIBAQDqBylpvuedqZf0
0j360wcvEv5iKZAXQildllJXQ2m3DCg5tLtnam6r0aWpxkyV7IuiCyMoX+BgeNhm
CsTJ87nX+OERgbDACb1OSoGnSGvzgTjFpCytSMCvwXoa3vxLyT+ntqRpnJvqJD6k
SJocAuV6jPyeYrJ6QD5ymOmoPvWY6tjO0pE8iNdRdxgWShlJi02O84ACZEU6tVWu
KWKFjlPXLO1ocVUq4tD/UjWeVA2MP09Dsc24cAV8YRvtQmnjaIC5nOXu7sIMvYE2
bQe/KEPX5oFzzJemJyZrixfbTtQ5Ko25plJ5Wf5xC3JYLI2EwcdYB60KtXkv0A9p
NvTdgSbBAoGBAPmGnCwD3/FTwa0qR29pxLAc31+VIZk/nmmWOrVO/f4eTxRZyV7F
6utfkUhyYxTV6Rio4HY9bZveQPjcV3x6wNOdfNbePfjrNZcVlALLkaSWJljXi2wt
qsQ7ktTiif25kE7RlrdAMgv7QKzRyzdhe1WoyXFyRSMTUC1CgNvG8ZnxAoGBAPUU
x/fREY3gwH7Nqy8ScNIYucsADgUOCehng8AUiabNH8VK7WY7ZFJ69bajwqL0R7pX
zcBKHDnhSMwWkNgu3agYf/pGqJ9DPCI1xzUqLfD9N7cnb8Pvq4L+Yj8LXIl69MMx
FYPkJgiaOo/tUDEtULseBL1nYyL3utvn9gKmxz5lAoGAHpHUPjw3SlyFhM6CM+8U
TrMq1o3xsNGveaYTCTVlPqW98HNTjU3YCwAJT4PcCahvRzshTLsX25muAg8UlMaB
KyvHKJfPpdhDF4BoQrNn428VwZqelSE/I41c3sHmP/Rk7pMU0NyHhRpCASouqFlD
/+mOzFxAhhyOnQzhtos3/DECgYEA54dnVmWLWOZ/1AtGciTQspqrQuzdUccucwD/
xYFhfVQBdKhRWCg5oXYKFS3l3X47GP6EIOmieseqtyuGUMUNoBTtKiqAeFzTPVpi
xIYBes4tSXkXLBqKhCj/9aEtHbAr9Q60zbHGgI/7TScbgCnYP72fKrO2Qz2XqNId
ZenbBsUCgYAuJHnU4qteomZ1A6ri6cr+yMgftvni/HDO2dmkQAZfUsY5bXQojTVQ
5Fkmpafsj9TKQCUg6m1oY1ldDw7yYq8xpYfcPrTZMOllR2WYf1opGf5s7MtHTZqz
WXiaBHd4AmWrXFKMI8H2zATbDbSmGXHtKzXD8UEwNFlKh4CSYyhMOw==
-----END RSA PRIVATE KEY-----

配置密钥对

有了密钥对,接下来就是把私钥自己保存好,公钥放到服务器上。

公钥

公钥需要放在服务器上,可以拷贝到服务器上,也可以在服务器上新建文件然后把内容写进去。

拷贝

PS:如果是在服务器直接生成的密钥对,可以直接跳转到6

1.先检查是否安装了lrzsz

[root@KsC7 ~]# rpm -qa | grep lrzsz
lrzsz-0.12.20-36.el7.x86_64

2.如果没有结果就是没有安装,输入下面命令安装

[root@KsC7 ~]# yum install lrzsz -y

3.创建~/.ssh/

[root@KsC7 ~]# mkdir ~/.ssh -p -m 700

-m参数为目录权限

4.检查是否创建成功,是否权限正确(.ssh目录需要700权限)

[root@KsC7 ~]# ls -la
......
drwx------.  2 root root   38 May 29 14:59 .ssh
......

PS:如果要设置其他非root用户密钥登录,这里的属主和属组根据实际情况变化

5.上传公钥

[root@KsC7 ~]# cd ~/.ssh
[root@KsC7 .ssh]# rz

输入rz后,弹出对话框,在电脑中选中你的公钥,上传

切记,如果看到有Upload file as ASCII的选项不要勾选!

6.修改公钥名称及权限(authorized_keys文件需要600权限)

[root@KsC7 .ssh]# mv id_rsa.pub authorized_keys
# id_rsa.pub 为刚刚上传的公钥名称,请按自己情况修改
[root@KsC7 .ssh]# chmod 600 authorized_keys 
[root@KsC7 .ssh]# ls -la
......
-rw-------. 1 root root  391 May 28 15:12 authorized_keys
......

PS:如果要设置其他非root用户密钥登录,这里的属主和属组根据实际情况变化

新建

PS:其实这种方法只有当服务器不方便安装lrzsz的情况使用,这里也只是介绍一下思路,其实不是很常用到……

1.创建~/.ssh/

[root@KsC7 ~]# mkdir ~/.ssh -p -m 700

-m参数为目录权限

2.检查是否创建成功,是否权限正确(.ssh目录需要700权限)

[root@KsC7 ~]# ls -la
......
drwx------.  2 root root   38 May 29 14:59 .ssh
......

PS:如果要设置其他非root用户密钥登录,这里的属主和属组根据实际情况变化

3.新建文件,按a进入编辑模式,粘贴,esc退出编辑模式,:wq保存退出。

PS:复制的内容(即公钥)可以生成时直接复制,或用编辑器打开公钥复制。

[root@KsC7 ~]# vi ~/.ssh/authorized_keys

4.修改公钥权限(authorized_keys文件需要600权限)

[root@KsC7 ~]# chmod 600 ~/.ssh/authorized_keys 
[root@KsC7 .ssh]# ls -la ~/.ssh/
......
-rw-------. 1 root root  391 May 28 15:12 authorized_keys
......

PS:如果要设置其他非root用户密钥登录,这里的属主和属组根据实际情况变化

私钥

私钥就相对比较简单了,只需要下载保存好就可以了。(客户端通过Xshell生成密钥对的可以跳过这段内容)

如果私钥是服务器生成的,按照公钥里介绍的方法安装lrzsz,使用下属命令下载到SSH软件设置的下载目录中

[root@KsC7 ~]# sz ~/.ssh/id_rsa

如果不方便安装lrzsz的话,可以像公钥一样,新建一个文件将内容复制进去

将服务器的私钥输出出来

[root@KsC7 ~]# cat ~/.ssh/id_rsa

复制,在客户端使用编辑器新建一个文件,起名随意,但是不要带后缀(如.txt)

一定要修改换行符,改为Linux/Unix

我常用的Sublime Text 3和Notepad++修改位置如图,其他编辑器类似

密钥连接

Putty

putty因为有自己的私钥格式,所以需要转化一下,嗯相对麻烦一些

首先在putty根目录打开puttygen.exe

菜单栏点开Conversions选择Import key

如果有密码这里会要求输入密码

导入后选择Save private key,保存私钥

打开putty.exe,左侧Category依次点开:Connection->SSH->Auth,点右侧Browse选择私钥

连接后入下图,会要求输入密钥密码

Xshell

在会话属性中,进入连接->用户身份验证

方法选择Public,浏览选择私钥,并输入密码

如果不是用Xshell生成的密钥,可以在弹出窗口选择导入,选择本地私钥文件

SecureCRT

CRT连接属性,进入Connection->SSH2

选中PublicKey(CRT支持多选,即先尝试密码后尝试密钥登录,右侧的箭头可以调整尝试的先后顺序),点击Properties配置密钥

同样选择私钥路径即可,大同小异

FinalShell

FinalShell最简单,配置一目了然

最后

关于sshd_config

  • 上面提到,生产环境尽量使用非root用户连接ssh,并禁止配置文件中的root登录,更加安全
  • 如果连接不上,请自行检查配置文件中PubkeyAuthentication字段是否为yes
  • 配置中RSAAuthentication字段已在CentOS 7.4及以后版本舍弃,无需在意
  • 修改后请使用systemctl restart sshd命令,重启ssh连接使之生效
  • 在验证修改后的配置文件可以正常连接ssh后再断开当前连接

关于密钥对

  • 强烈建议使用非root用户登录管理生产系统
  • 为了使用及管理方便,可以配置一对密钥对,所有vps使用相同的密钥管理,不需要每台主机单独配置,不同主机配置不同密钥对并不能有效提高安全性。
  • 为不同操作人员配置不同的登录用户及密钥对,可有效提高安全性(当然更可靠的还是跳板机及堡垒机)
  • 尽量将公钥和私钥分开保存,并改名,保存路径及文件名尽量不要带pub、rsa、ssh、authorized、public等关键字。

关于客户端软件

  • putty 不推荐,麻烦,而且简陋
  • Xshell 推荐,可以生成密钥,而且有自己的密钥管理,只需要导入一次,所有机器随时选
  • CRT 中规中矩,不能保存密钥密码,但是可以同时支持密钥和密码,不用切换,貌似如果不同连接配置不同密钥需要来回修改路径
  • FinalShell 软件其实相当棒,界面简洁干净,功能强大,最大亮点就是下面的文件管理,但如果SSH登录的用户不是root的话,文件管理功能就不能实现了,根据个人情况吧……

如果哪位朋友知道如何设置可以让FinalShell支持非root用户登录且正常使用文件管理功能的,望赐教,感谢!

Thanks for watching!

Last modification:February 20th, 2022 at 07:28 am
If you think my article is useful to you, please feel free to appreciate