vps安全设置

前几天 vps 上放的网站突然打不开了,提示数据库错误,登录 vps 上一查,结果发现数据库居然被清空了,只留下一个 waring 的数据库和 readme 的表,表里面留下了黑客的比特币账号、交易网址,说我的数据被他备份了,要勒索我0.2个比特币才还给我数据。😓,我会相信?(其实主要是没钱)之前写了一个备份脚本,结果只备份了10天的,然而刚好国庆放假没看网站,10天早就过期了。猜想应该是密码被暴力破解了,或者数据库账号配暴力破解,查看尝试暴力破解机器密码的人:

1
sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

果然满满的一大屏。回来重新设置了一下,下面总结一下基本的安全配置。

root账号

申请了 vps 后,一般平台会给一个 root 账号和密码,使用 ssh 登录服务器默认是22端口,最好修改掉默认端口,然后禁止 root 用户登录,修改修改/etc/ssh/sshd_config文件:

1
2
3
vi /etc/ssh/sshd_config
ort 3434 #一个别人猜不到的端口号
PermitRootLogin no

以后操作最好使用一个普通用户,所以我们来创建一个普通用户并赋予 sudo 权限,

1
2
3
4
5
6
7
8
9
10
11
12
useradd -m username // 创建用户
// -m可以为用户创建相应的帐号和用户目录/home/username
passwd username // 设置密码
groupadd admin // 创建用户组
usermod -G admin username // 设置组
// 添加sudu权限
visudo // 调出了nano编辑器,ctrl + X 退出,确认保存文件,回车
// 添加用户
我们可以看到admin组默认已经用了root权限
// %admin ALL=(ALL) ALL
如果是某个用户
// username ALL=(ALL) ALL

其实不建议直接修改 /etc/sudoers ,而是通过在 /etc/sudoers.d/ 文件夹中新增文件来完成配置,文件名无所谓。

登录

如果一直使用用户名密码,即使改了端口号,其实还是可以使用 nmap 这类的工具嗅探端口,然后暴力破解用户名密码,所以最好直接不允许使用用户名密码登录,

1
2
3
4
5
6
7
8
# vi /etc/ssh/sshd_config
RSAAuthentication yes #RSA认证
PubkeyAuthentication yes #开启公钥验证
AuthorizedKeysFile .ssh/authorized_keys #验证文件路径
PasswordAuthentication no #禁止密码认证
PermitEmptyPasswords no #禁止空密码
# 最后保存,重启
# /etc/init.d/sshd restart

使用RSA登录的步骤在之前的博客已经说过,VPS新手指南,这里不再重复。

安装denyhosts

denyhostsPython 语言写的一个程序,它会分析 sshd 的日志文件,当发现重复的失败登录时就会记录 IP/etc/hosts.deny 文件,从而达到自动屏 IP 的功能:

1
2
apt-get install denyhosts
// 如需修改配置,可以在 /etc/denyhosts.conf 这里修改。

UFW防火墙

ufw是一个主机端的iptables类防火墙配置工具

1
2
3
4
5
6
7
8
sudo apt-get install ufw
// 启用
sudo ufw enable
sudo ufw default deny
// 开启了防火墙并随系统启动同时关闭所有外部对本机的访问(本机访问外部正常)
// 开放一些需要外部访问的服务或者端口
sudo ufw allow nginx
sudo ufw allow 443

mysql

安装完 MySQL 后执行 mysql_secure_installation,运行 mysql_secure_installation 会执行几个设置:

  1. root 用户设置密码
  2. 删除匿名账号
  3. 取消 root 用户远程登录
  4. 删除 test 库和对 test 库的访问权限
  5. 刷新授权表使修改生效

一路选择 yes 就行了,平时使用的时候注意不要用 root 用户,用一个普通用户,只赋予特定几个数据库的操作权限,数据库登录不允许远程登录,修改默认端口号,做好这些,基本就不会再被黑了。

备份数据库:vim mysql_backup.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
#mysql 备份30天脚本
#备份目录
backupDir=/home/wulv/backup/mysql
#mysqlDump
mysqldump="$(which mysqldump)"
#ip
host=localhost
#用户名
username=root
password=123456
#今天日期
today=`date +%Y%m%d`
#十天前的日期
timeTenDayAgo=`date -d -30day +%Y%m%d`
#要备份的数据库数组
databases=(shadowsocks)
# echo $databaseCount
for database in ${databases[@]}
do
echo 'start backup '$database
$mysqldump -h$host -u$username -p$password $database | gzip > $backupDir/$database-$today.sql.gz
echo 'success backup '$database'to'$backupDir/$database-$today.sql.gz
if [ ! -f "$backupDir/$database-$timeTenDayAgo.sql.gz" ]; then
echo 'no 30 days ago backup file'
else
rm -f $backupDir/$database-$timeTenDayAgo.sql.gz
echo 'delete 30 days ago backup '$backupDir/$database-$timeTenDayAgo.sql.gz
fi
done

添加定时任务:

1
2
3
crontab -e
// 输入一下,每天晚上23点50分开始自动执行备份脚本
50 23 * * * /home/wulv/backup/mysql_backup.sh >/dev/null 2>&1

坚持原创技术分享,您的支持将鼓励我继续创作!