一、问题
最近趁着有活动优惠购买了一台腾讯云服务器(CentOS 7 系统
),在使用过程中发现总是有一些人在尝试登录我的服务器,几天时间没打理就有几万个尝试登录(如图),虽然我的服务器没有什么有价值的东西,但是天天被人搞,这怎么能忍,必须得做些防范措施。
我们做以下几个操作来防范:
- 第一、取消密码登录,使用密钥对登录
- 第二、修改ssh远程登录的端口
- 第三、定时扫描登录失败的IP,失败了一定的次数就把这个IP屏蔽拉黑
二、使用密钥对登录
2.1、生成密钥对
注意:此操作是在本地机器操作,并非云服务器
Windows生成SSH证书可以使用Git Bash
、Cygwin
等工具来生成SSH密钥对。
Git Bash
下载地址: https://gitforwindows.org/
以下是使用Git Bash
生成 SSH证书
的步骤:
- 打开
Git Bash
(可以在Git for Windows安装目录下的“Git Bash Here”菜单中找到) - 在Git Bash中输入以下命令:
git bash -c 'ssh-keygen -t rsa'
,生成SSH密钥对
这将生成一对公钥和私钥,默认情况下保存在 C:\Users\你的用户名\.ssh\id_rsa
和C:\Users\你的用户名\.ssh\id_rsa.pub
文件中(注意:要改为你的windows用户名)。
私钥文件(id_rsa
)需要妥善保管,不要泄露给他人。公钥文件(id_rsa.pub
)可以用于配置免密码登录。
2.2、将公钥复制到远程服务器
这里要注意一个点,如果要用A用户登录云服务器,那么就要把公钥复制到云服务器A用户的家目录
中,如果要用B用户登录云服务器,那么就要把公钥复制到云服务器B用户的家目录
中,依此类推。
举个例子:
要以root
用户登录,那么就要把公钥文件(id_rsa.pub
)复制到/root/.ssh
目录下
要以jack
用户登录,那么就要把公钥文件(id_rsa.pub
)复制到/home/jack/.ssh
目录下
方式一:手动复制
第一步:以root
用户为例,使用sftp
或scp
等工具把公钥文件(id_rsa.pub
)上传到云服务器的/root/.ssh
目录下
第二步:在/root/.ssh
目录中创建一个文件authorized_keys
$ touch authorized_keys
第三步:把公钥文件(id_rsa.pub
)的内容写入到 文件authorized_keys
中
$ cat id_rsa.pub >> authorized_keys
第四步:修改文件authorized_keys
的权限
$ chmod 600 authorized_keys
方式二:命令复制
可以借助GitBash
使用 ssh-copy-id
命令来完成此操作:
$ ssh-copy-id user@remote_host
命令说明:
user
:云服务器上的用户名。remote_host
:云服务器的IP地址或域名。
此命令会提示您输入远程服务器用户的密码,并将公钥自动复制到远程服务器的~/.ssh/authorized_keys
文件中。
2.3、修改SSH配置,禁用密码登录,使用密钥对登录
修改SSH配置文件
$ sudo vim /etc/ssh/sshd_config
设置使用密钥对登录,设置PubkeyAuthentication yes
禁用密码登录,设置PasswordAuthentication no
重启SSH服务
$ sudo systemctl restart sshd
使用ssh工具(xshell,final shell,putty等等)进行测试成功与否
到此,云服务器只能使用密钥对进行登录
三、改SSH端口
3.1、修改SSH服务的配置文件
修改SSH配置文件
$ sudo vim /etc/ssh/sshd_config
在 #Port 22
下新增一行 Port 新端口号。例如 Port 23456
,如下图所示:
保存内容并退出
3.2 配置防火墙端口放行
CentOS 7 以前版本
的 Linux 云服务器默认使用 iptables
服务作为防火墙。
CentOS 7 及以后版本
的 Linux 云服务器默认使用 Firewalld
服务作为防火墙。
CentOS 6 配置 iptables 防火墙
放行新端口号为23456,则执行如下命令
$ sudo iptables -A INPUT -p tcp --dport 23456 -j ACCEPT
重启防火墙
$ sudo service iptables restart
CentOS 7 配置 Firewalld 防火墙
如果防火墙没有启动,则先启动
$ sudo systemctl start firewalld
放行新端口号为23456,则执行如下命令
$ sudo firewall-cmd --add-port=23456/tcp --permanent
设置防火墙服务开机自启
$ sudo systemctl enable firewalld
重启防火墙服务
$ sudo systemctl restart firewalld
3.3 腾讯云控制台配置防火墙端口
进入腾讯云控制台,选择你要操作的服务器
选择防火墙,删除默认配置的22端口规则
点击添加规则,增加一条新的规则,配置放行的端口
最后重启云服务器。以后ssh登录云服务器只能用新的端口了,22端口已经不能用了。
备注:虽然上面的操作是基于腾讯云进行操作,但是理论上所有的云服务器的操作都 是大同小异的,无论是阿里云,百度云,金山云等等,如果有不懂操作,查一下相应平台的文档。
四、屏蔽IP
4.1、屏蔽IP的基本原理
centos7用的是 firewall
添加单个黑名单只需要把ip添加到 /etc/hosts.deny
,格式: sshd:$IP:deny
打开配置文件
vim /etc/hosts.deny
添加你要禁止的ip就可以了
sshd:192.168.1.123:deny
如果要以白名单的方式,那么设置配置文件 /etc/hosts.allow
,格式如下:
sshd:1.1.1.1:allow
sshd:2.2.2.2:allow
4.2、编写脚本,定时屏蔽IP
多次失败登录即封掉IP,防止暴力破解的脚本,超过20次的就加到黑名单
1、编辑脚本
$ vim /usr/local/bin/secure_ssh.sh
脚本内容:
#! /bin/bash
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /usr/local/bin/black.txt
for i in `cat /usr/local/bin/black.txt`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
if [ $NUM -gt 20 ];then
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ];then
echo "sshd:$IP:deny" >> /etc/hosts.deny
fi
fi
done
2、创建记录登录失败次数的文件
$ touch /usr/local/bin/black.txt
3、添加定时 10分钟执行一次
输入命令
$ crontab -e
在最后添加一行,然后保存退出(和vim
的操作一样)
*/10 * * * * root sh /usr/local/bin/secure_ssh.sh
重新启动crond服务
$ systemctl restart crond
设置开机自启动crond服务
$ systemctl enable crond
以上的操作完毕后,系统会每10分钟进行一次扫描,并将登录失败超过指定次数的IP给屏蔽。
五、总结
我们进行了三步操作,
第一步,关闭密码远程登录,使用密钥对登录,防止通过撞库的方式攻击
第二步,修改了默认的ssh登录端口,减少一些默认的攻击
第三步,通过IP拉黑,屏蔽某些IP的访问
经过以上三步操作,基本上可以将一些尝试登录你服务器的骚扰处理掉,经过我几天的测试,确实是没有了,整个世界都清静了。这些操作对于服务器来说,也只是一些初级入门的操作,对于商用的服务器要加强防护,还得找专业的运维人员,专业的人干专业的事。