Linux-VPS安全配置 / 防护措施

文章引用至SEOIMO

博主以为,VPS的安全防护绝对是运行网站的重中之重。防护措施做不好,轻者给后期运行带来无穷无尽的烦恼,重者造成网站瘫痪甚至数据清空,那就真的欲哭无泪了。

好在Linux本身已经足够安全稳定,只要你不泄露关键的登录信息(比如SSH端口和ROOT密码等),通常不会产生重大事故。但即便如此,我们还是应该未雨绸缪,提前做好VPS的安全防护措施。

那么,VPS安全配置究竟该如何做呢?

在这里,博主结合自己建站经验,介绍一下Linux-VPS安防措施里最有效的三个方面:修改SSH端口、阻止SSH暴力破解和防御DDOS攻击。

修改SSH端口(强烈推荐)

首先,编辑配置文件:

# vi /etc/ssh/sshd_config

找到 #Port 22 这行(默认端口22),把前面的 # 去掉,然后再添加一个新的端口(不超过65535),比如 Port 56789:

更改ssh端口

保存,重启SSH即可:

# service sshd restart

接下来,在防火墙 /etc/sysconfig/iptables 里开启此端口:

# iptables -A INPUT -p tcp -m tcp --dport 56789 -j ACCEPT

保存并重启防火墙:

# service iptables save
# service iptables restart

或者,也可以编辑 /etc/sysconfig/iptables 文件,复制端口 22 的规则,粘贴在其下另起一行。

按 :wq 保存退出后,重启防火墙。

查看防火墙状态,看看端口是否开启成功:

# service iptables status

现在,使用新的端口连接SSH。

若成功登录,则再次编辑 /etc/ssh/sshd_config,将里面的 Port 22 前加 # 保存后,重启SSH即可。

CentOS7防火墙中开启相关端口:

CentOS7.X中默认的防火墙 firewalld 而非CentOS6.X中的 iptables 。如果你也像博主一样感觉用着很不爽,需要换回 iptables 的,可以参考如下设置。

1、关闭firewall并禁止开启启动:

# service firewalld stop
# systemctl disable firewalld.service

2、安装iptables:

# yum -y install iptables-services

3、修改iptables配置:

# vi /etc/sysconfig/iptables

粘贴如下内容(可按需要自行增删;如已更改SSH端口,下面的22端口那行可以删除):

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 56789 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j DROP
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 11211 -j DROP
-A INPUT -p udp -m udp --dport 11211 -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

按 :wq 保存退出后,重启iptables,并设置为开机启动:

# service iptables restart
# systemctl enable iptables.service

搬瓦工VPS生成的SSH端口是随机的(非默认端口22),因此,可无需再次修改。

阻止SSH暴力破解(可选)

设置高强度密码 + 更改默认SSH的22端口后,已经可以阻止绝大多数的SSH非法请求了。因此,安装DenyHosts这步可以省略。
如果遇到程序自动扫描SSH端口并进行暴力破解,那么仅仅修改端口的话,可能还是不够的。因此,我们需要安装DenyHosts进行自动拦截。

首先,下载 DenyHosts 并解压到 root 目录:

# cd ~
# wget http://soft.vpser.net/security/denyhosts/DenyHosts-2.6.tar.gz
# tar -zxvf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6

接下来,进行安装和配置:

# python setup.py install
# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# cp daemon-control-dist daemon-control

然后,设置开机启动:

# chown root daemon-control
# chmod 700 daemon-control
# ./daemon-control start
# echo "/usr/share/denyhosts/daemon-control start" >> /etc/rc.local

至此,DenyHosts就算安装完成了。通常,DenyHosts默认的阻拦配置就可以。当然,你也可以自行设置:

# vi /usr/share/denyhosts/denyhosts.cfg

自行设置如下几个主要的参数:

PURGE_DENY = 5d
DENY_THRESHOLD_INVALID = 5
DENY_THRESHOLD_VALID = 5
DENY_THRESHOLD_ROOT = 5
HOSTNAME_LOOKUP = NO

最后,重启一下DenyHosts即可:

# /usr/share/denyhosts/daemon-control restart

倘若自己的IP(如何查看)被误封,可在 /etc/hosts.deny 中删除对应的IP后重启DenyHosts即可。

卸载DenyHosts

卸载DenyHosts比较麻烦,官方貌似没有提供具体卸载方法。

不过,我们可以通过 停用 + 禁止开机启动 来将其关闭。

停用DenyHosts:

# /usr/share/denyhosts/daemon-control stop

禁止开机启动,编辑 /etc/rc.local :

# vi /etc/rc.local

将 /usr/share/denyhosts/daemon-control start 这行删除,保存退出。

如此,就实现了停用DenyHosts的目的。

防御DDOS攻击(可选)

也许是设置的问题,也许是DDoS-Deflate确实有问题,经过长时间的运行,发现效果并不是很好。无奈,博主自己写了一个简单的防DD/CC的脚本,效果还不错。因此,安装DDoS-Deflate这步也可以省略。
这里主要用到一款优秀的免费软件DDoS-Deflate:http://deflate.medialayer.com/

首先,下载DDoS Deflate并安装:

# cd ~
# wget http://www.inetbase.com/scripts/ddos/install.sh
# chmod 0700 install.sh
# ./install.sh

按 Q 键退出,然后编辑配置文件:

# vi /usr/local/ddos/ddos.conf

推荐做如下更改,其余默认即可:

NO_OF_CONNECTIONS = 100
APF_BAN = 0
BAN_PERIOD = 36000

保存后退出。

MySQL数据库优化

众所周知,LAMP是比较依赖数据库的。尤其是搭建的WordPress博客没进行HTML静态缓存的情况下,对数据库的依赖更加严重。

在我看来,对MySQL数据库的优化是特别重要也是特别困难的一项工作。不仅仅是因为MySQL设置里参数众多,让人看着头疼迷糊,更是因为这些参数没有一个固定的最优组合。参数设置的激进,浪费VPS资源,设置的保守,又可能限制程序的正常运行。

那么,究竟该怎么设置才合理呢?

根据博主的经验,对MySQL众多参数中最重要的以下几点进行合理的优化后,基本可以保证中小流量(比如<5000IP/天)博客的正常访问。

为确保安全,首先备份一下 /etc/my.cnf :

# cp /etc/my.cnf /etc/my.cnf.old

接下来,修改 /etc/my.cnf 中的以下参数:

# vi /etc/my.cnf
query_cache_size = 16M
max_connections = 100

修改后,保存退出。重启一下MySQL数据库即可:

# /etc/init.d/mysql restart
0

Comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注