SSH登录方式的防护
# 20.SSH登录方式的防护
介绍下我们如何从密码暴力破解中保护我们的服务器。
# 默认登录方式
如果你使用默认的ssh登录方式,非常容易被攻击的。笔者每次登录云服务器的时候,它会提示我上次登录失败的时间,和登录失败的次数:
Last failed login: Mon Mar 6 20:13:48 CST 2023 from 182.246.58.5 on ssh:notty
There were 15474 failed login attempts since the last successful login.
2
可以看看有多少次登录失败。。。一万五千次!为什么这么多次呢?因为有攻击者尝试登录你的服务器,不管是出于搞破坏还是其他的目的,但它不知道密码,只能一个个试
登录后,也可以使用lastb命令来查看尝试登录但失败的用户信息
lastb -n 4
tahiry ssh:notty 143.198.85.60 Mon Mar 6 21:33 - 21:33 (00:00)
tahiry ssh:notty 143.198.85.60 Mon Mar 6 21:33 - 21:33 (00:00)
kajal ssh:notty 143.198.85.60 Mon Mar 6 21:32 - 21:32 (00:00)
kajal ssh:notty 143.198.85.60 Mon Mar 6 21:32 - 21:32 (00:00)
2
3
4
5
由于实在太多了...... 为此我只打印出了前面4个
大部分云服务器默认使用 root、22端口号、密码进行登录,这样很容易通过暴力破解密码。所以我们有必要修改下默认的登录方式:
- 修改ssh默认端口
- 不使用root用户登录
- 使用密钥登录
- ……
本次的实验环境是Centos7
# 修改SSH默认端口
首先修改SSH的配置文件:
vim /etc/ssh/sshd_config
在文件最后(不一定要在最后加,自己喜欢在哪加都行)增加两行配置:
port 22
port 12345
2
这两行就是配置我们可以用22和12345端口来进行SSH的登录。挑选端口时最好挑10000~65535之间的端口号,10000以下容易被系统或一些特殊软件占用,或是以后新安装的应用可能占用该端口,所以10000以下的端口号都不要使用。
重启SSH服务(不同版本的服务器可能重启的方式不同):
systemctl restart sshd.service
然后就可以使用新端口连接了,例如我用Xshell:
或者用命令行登录
ssh root@你的IP地址 -p 12345
注:此时 22 和 23456 两个端口都可以成功登录ssh,确认新端口可登录后,建议注释掉22端口,这样就不能用默认的22端口登录了。最后,别忘了修改配置文件后,使其生效
特别注意:
- 如果你使用了云服务器,记得修改后记得配置云服务器的安全组,增加你的端口。
- 如果你使用了iptables和Firewalld,也要放开这个端口。
- 之所以添加了22端口,是担心读者配置错了,导致22端口都登录不了;此时就只能去云服务器控制台里登录了,比较麻烦。
# 禁用root用户登录
一般来说,我们都不会轻易使用root用户,因为root用户的权限太大了。在笔者所在的公司里,都是一个应用一个用户的,例如Nginx服务就有一个web用户,MySQL服务就有一个MySQL的用户。
当然,我们自己的服务器可以不用那么多用户,但还是不建议有root用户可以直接登录的情况。
# 添加用户
增加一个PeterJXL的用户
$ useradd PeterJXL
$ passwd PeterJXL
Changing password for user PeterJXL.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
2
3
4
5
6
命令useradd PeterJXL,增加了普通用户名 PeterJXL(可以修改为你自己喜欢的登录用户名)
命令 passwd PeterJXL,为用户名 test 设置登录的密码
然后我们就可以用这个用户进行的登录了。
例如命令行:
ssh PeterJXL@你的IP -p 23456
# 添加到sudoers
普通用户 test 切换到 root 超级用户,默认是不允许的:
$ sudo -s
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for PeterJXL:
PeterJXL is not in the sudoers file. This incident will be reported.
2
3
4
5
6
7
8
9
10
11
最后一行告诉我们,该用户不在sudoers的文件里。我们需要添加该用户为管理员。
修改文件权限,拥有编辑文件写的权限
chmod u+w /etc/sudoers
编辑文件 /etc/sudoers
vim /etc/sudoers
在root ALL=(ALL) ALL 下添加一行 PeterJXL ALL=(ALL) NOPASSWD:ALL
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
PeterJXL ALL=(ALL) NOPASSWD:ALL # PeterJXL为你自己的用户名
2
3
改回sudoers文件的原权限
chmod u-w /etc/sudoers
# 自动切换为root
为了方便,我们设置该用户登录后自动切换为root用户。
修改当前用户目录下的 .bash_profile 文件
vim ~/.bash_profile
在该配置文件中添加一行:
sudo su root
修改后的文件:
$ cat /home/PeterJXL/.bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
sudo su root
2
3
4
5
6
7
8
9
10
11
12
13
然后我们再以PeterJXL的用户登录,就可以看到自动切换为了root用户了。
# 禁用root用户登录
现在我们可以开始禁用root用户登录了。
修改配置文件
vim /etc/ssh/sshd_config
在文件最后添加一行:该配置是指不允许Root用户登录。
PermitRootLogin no
重启ssh服务:
systemctl restart sshd.service
验证 root 能否登录
ssh root@你的IP -p 23456
root@120.27.217.147's password:
Permission denied, please try again.
2
3
可以看到确实禁用了。
# 密钥登录
除了密码登录外,我们还可以使用密钥来进行身份认证与登录。
# 切换回普通用户
我们需要用到普通用户,但由于我们刚刚设置了自动切换为root用户,因此得切换回普通用户。
输入exit 或者按快捷键ctrl + D即可切换回来
$ exit
$ who
PeterJXL pts/0 2023-03-07 07:29 (116.21.29.96)
2
3
# 安装openssl
先确认有没安装openssl:输入openssl version
$ openssl version
OpenSSL 1.1.0f 25 May 2017
2
如果有输出openssl的版本,则说明安装了。
如果没有,则说明没安装,需要安装:(不同服务器的安装命令可能不同)
yum install openssl -y
# 生成密钥
我们进入home目录并生成密钥:
cd ~
ssh-keygen
2
根据提示,输入生成rsa的密码(使用密钥文件时需输入的密钥,增强安全性)
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/PeterJXL/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): # 设置密钥文件的密码
Enter same passphrase again: # 重复一次设置密钥文件的密码
Your identification has been saved in /home/PeterJXL/.ssh/id_rsa.
Your public key has been saved in /home/PeterJXL/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:h9inbBVu0V+fBlx88+VJ6zC+U0y1mW6dz+wOiBWoYTs PeterJXL@mail.peterjxl.com
The key's randomart image is:
+---[RSA 2048]----+
| .. |
| o. .++|
| o + oo..&|
| + * o =.O=|
| . E * o Oo+|
| . B o o.B.|
| + . . =o.|
| . o .+|
| .oo|
+----[SHA256]-----+
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
生成后的密钥在当前用户的home目录下的 .ssh目录里(是一个隐藏文件夹,可以用ls -a查看)
# 配置公钥
我们接下来就是授权
cd ~/.ssh/
cp id_rsa.pub authorized_keys
2
修改密钥文件的权限,免得被其他用户查看和修改
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
2
# 配置公钥登录
修改配置文件
sudo vim /etc/ssh/sshd_config
在文件最后一行添加
PasswordAuthentication yes
重启以使配置文件生效
sudo systemctl restart sshd
至此,服务器上的配置就完成了。
下载私钥文件到本地:
$ sz ~/.ssh/id_rsa
登录的时候指定密钥文件,例如我用的Xshell:
选择用Public Key登录,然后选择密钥文件,并输入密码(就是我们刚刚生成rsa密钥文件时输入的密码)
其他SSH连接工具同理,这里就不演示了。
# Windows下命令行登录
如果你用Windows下的命令行登录,可能会遇到这样的问题:
$ ssh PeterJXL@你的IP -p 23456 -i id_rsa
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "id_rsa": bad permissions
2
3
4
5
6
7
8
注意第6行,告诉我们你的文件不能被其他人访问到。也就是说中这个文件是可以被其他人看到的,不安全,所以不允许用来登录。解决办法:修改文件属性。
在文件上右键(或者按住Alt 双击文件),打开文件属性,然后:
- 进入安全页
- 可以看到,许多主体拥有这个文件的权限,如SYSTEM、Administrators。我们要把这些主体从权限目录中删掉
- 我们点击高级
我们禁用继承,选择从此对象中删除所有已继承的权限。
这时权限目录应该变空了。选择添加,点击选择主体,输入用户名(就是你登录时的用户名,可以从C:\Users目录下查看)。输入完后可以选择检查名称,查看输入的是否正确
然后就可以登录了。
ssh PeterJXL@你的IP -p 23456 -i id_rsa
Enter passphrase for key 'id_rsa':
Last login: Tue Mar 7 07:59:25 2023 from 116.21.29.96
Welcome to Alibaba Cloud Elastic Compute Service !
2
3
4
5
登录过程中提示我们输入密钥文件的密钥,即刚刚我们生成密钥时输入的密码,成功登录。
# Linux下命令行登录
如果你在Linux下登录其他远程服务器,也出现了这个问题的话:
It is required that your private key files are NOT accessible by others.
修改权限就可以:
chmod 600 id_rsa
# 取消私钥密码
若不想使用rsa密钥文件时输入密码,可以取消私钥密码。
openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_nopassword
然后,通过无密码的私钥文件登录
ssh -i id_rsa_nopassword PeterJXL@你的IP -p 23456 # 不需要输入私钥的密码
此时,加密的私钥文件+密码,和无密码的私钥文件,都可以用来登录服务器。
# 禁用密码登录
如果你只想用密钥登录,可以取消密码登录。
修改配置文件
sudo vim /etc/ssh/sshd_config
找到关键字"PasswordAuthentication",修改PasswordAuthentication yes
为 PasswordAuthentication no
这里特别要注意:即使注释掉了此行,默认还是允许密码登录的。
若要禁用密码登录则一定要明确显式的修改成PasswordAuthentication no,没有其它方法,切记!
最后别忘了重启
systemctl restart sshd
# 多个服务器共享密钥
当你有多台Linux服务器, 懒得一个个生成密钥的时候,就可以多个服务器共享一个密钥:
- 在一台服务器上生成密钥,然后将公钥拷贝到其他Linux服务器上(路径为~/.ssh/ )
- 将公钥内容输出到 ~/.ssh/authorized_keys
# 带密码登录
在使用ssh登录远程服务器的时候,在执行完ssh user@ip后,要输入登录密码,有没有一种在ssh的参数中直接加入密码的方法呢?目前是没有的,因为命令会被存储在历史记录中(可以用history来查看输入过的命令),或者通过其他方式查看。
ssh命令的完整格式如下:
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-E log_file] [-e escape_char]
[-F configfile] [-I pkcs11] [-i identity_file] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] [user@]hostname [command]
2
3
4
5
6
如果你实在想要用密码去交互,也是可以的。考虑这样的场景:几个人维护几十台服务器,如果每个服务器都要升级某个工具,此时我们可以通过脚本来进行批量操作(通过命令登录服务器后执行升级命令),因此出现了几个工具实现这样的事情,例如sshpass和expect。
这不是本文的重点,因此不过多介绍,感兴趣的同学请自行搜索相关文档
# 总结
本文介绍了如下措施,提高服务器安全性:
- 修改SSH默认端口
- 禁用root用户登录
- 使用密钥登录,禁用密码登录
以上方式中,强烈1和2都实施,至于第三种则按需选择使用。如果使用密码登录,定期修改密码也是很重要的。
如果你选择了密码登录,那么即使换了端口,还是有被暴力破解的风险,指不定啥时候某个密码比较弱的用户就被攻陷了,此时我们可以使用第三方软件,当检测到暴力破解的时候,就封禁掉对方的IP,我们在下一节介绍。
# 参考
Linux lastb命令 | 菜鸟教程 (opens new window)
Linux修改默认端口、增加普通用户、使用密钥等安全登录SSH - 米扑博客 (opens new window)