场景

涉及多人操控同一数据库,且数据库数据热更新,表结构有修改可能的开发场景。

团队相关成员分别自建本地不合时宜(数据更新,表更新同步繁琐),故一个公开的云数据库成为需求。

风险

裸露的3306端口数据库+弱密码成为众矢之的。

下面就是赤裸裸的勒索

All your data is backed up. 
You must pay 0.0126 BTC to bc1q7r3d6xrq05zeu20ldylphzw6cj03ztlpxg82s 
In 48 hours, your data will be publicly disclosed and deleted. 
(more information: go to https://is.gd/yotqu) 
After payment send mail to us: mailto:dzen+2p6on@onionmail.org and 
we will provide a link for you to download your data.
Your DATAID is: 2P6ON

防卫

单独设置公网数据库账号,最小权限化,修改数据库默认端口、限制ip访问、限制密码试错频率。

给予用户web_user访问数据库mydb的权限

-- 创建外网用户
CREATE USER 'web_user'@'%' IDENTIFIED BY '密码';

-- 禁止 root 远程(核心安全)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1');

FLUSH PRIVILEGES;

安全模式(不能建表)

GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'web_user'@'%';

开发模式(能建表、最常用)

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP ON mydb.* TO 'web_user'@'%';

限制密码试错频率

ALTER USER 'web_user'@'%'
FAILED_LOGIN_ATTEMPTS 3   -- 连续错3次
PASSWORD_LOCK_TIME 120;    -- 锁定120分钟

封ip(1天)

cat > /etc/fail2ban/jail.d/mysql-docker.conf << EOF
[mysql-docker]
enabled = true
port = 3308
filter = mysqld-auth
logpath = /var/lib/docker/volumes/*/_data/*.log
maxretry = 3
bantime = 86400 
findtime = 60
EOF
systemctl restart fail2ban
systemctl enable fail2ban

结论

由于需要公网访问,私有vpn方案并关闭数据库公网端口的方案并无采用。目前方案,能在一定程度上防止暴力数据库入侵。