内容转自 做好VPS的基础安全防护工作

使用linode VPS也有好长一段时间了,爱好linux也有很久好久了,自从2004年自己买了笔记本后就尝试安装各种linux发行版,包括FreeBSD这样的unix鼻祖,不过当时仅仅把爱好停留在装系统上面,并没有对linux网络服务器做深入的研究。

很多朋友认为买了vps把系统安装上去,环境搭建好就万事大吉了,实际上并非如此,网络一直是不安全的,我们只能尽我们最大的努力做好基础的安全防护工作,尽可能的减少被攻击的可能,尽量减少非人为因素宕机的可能。

直到自己真正的使用linux服务器后,才系统的对linux进行了学习,我的知识来源主要是鸟哥的linux私房菜基础版第三版以及鸟哥的linux私房菜服务器第三版。以下是我平时维护自己vps以及帮个别朋友维护linux服务器的一点心得,如何做好VPS的基础安全防护?

在linode新手起步教程里,我们学习了如何安装liunx操作系统,重启linode vps,执行一些基本的系统管理任务。现在我们来进一步做好VPS的安全工作,以防非法入侵。您会学习到如何启动防火墙(iptables),设置SSH安全访问密钥,自动ban某些非法ip(Fail2ban)。当然这都是非常基础的安全防护工作。

添加一个普通用户

参考linux添加用户useradd命令说明,添加一个普通用户。

比如我在root用户登录的情况下,新增一个laoyi用户:

useradd laoyi

passwd laoyi

就算添加好用户laoyi了,将来你ssh登录系统就可以ssh laoyi@106.187.xxx.xxx登录系统。

ssh公钥私钥

客户端生产ssh公钥私钥,配对连接,可参考http://www.linode.im/1573.html,操作成功以后客户端访问服务器端,将不需要输入密码,这样可以减少暴力破解密码工具的可能性。当然您要将您的私钥保护好。

在客户端,执行:ssh-keygen,产生公钥密钥,

将公钥传至服务器端,scp ~/.ssh/id_rsa.pub laoyi@106.187.xx.xx,

在服务器端,

mkdir .ssh

mv id_rsa.pub .ssh/authorized_keys

chown -R laoyi:laoyi .ssh
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

修改ssh配置和端口

禁止root管理员直接登录linux服务器。root帐号就是玉皇大帝,掌管着linux服务器的生杀大权,如果一不小心误操作,那后果是很严重的,建议添加个普通的linux用户帐号,如果需要用root帐号的时候,su或者sudo可以获得root的管理员权限。另外更重要的是,现在总有些无聊的人猜密码,如果你的root密码设置的过于简单,那被他人用软件猜出root密码的概率较高,不幸中弹,基本你的linux服务器就毁了。。

vi /etc/ssh/sshd_config,将端口默认的22改成其他端口;

将密码认证设置成NO:PasswordAuthentication no;

同时将root直接登录系统取消:PermitRootLogin no

重启ssh服务:/etc/init.d/sshd restart

避免root密码被篡改

chattr +i /etc/passwd; chattr +i /etc/shadow,避免root密码被篡改。

让系统日志只能增加数据

chattr +a /var/log/messages,让系统日志只能增加数据,而不能删除也不能修改数据。

md5校验指纹比对

建立脚本做好重要数据的md5校验指纹比对(初期可不考虑)。

设置简易iptables防火墙

开启iptables防火墙进行软防。很多vps厂家为了减少成本,比如linode是裸机,本身是没有任何硬件防护的,此时iptables软防就特别重要,建议把不用的端口服务都禁掉。

看看iptables是否开启,默认防火墙规则都是空的,也就是不管事的。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

需要我们自己建立防火墙规则:

vi /etc/iptables.firewall.rules

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn’t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic – you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state –state NEW –dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit –limit 5/min -j LOG –log-prefix “iptables denied: ” –log-level 7

#  Reject all other inbound – default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

以上防火墙规则只开启了http(80端口),https(443端口),ssh(22端口),根据您的服务器开启服务情况,请自己修改防火墙规则。

让防火墙规则生效:iptables-restore < /etc/iptables.firewall.rules

然后再查看防火墙是否生效:iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  –  anywhere             anywhere
REJECT     all  –  anywhere             127.0.0.0/8         reject-with icmp-port-unreachable
ACCEPT     all  –  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  –  anywhere             anywhere            tcp dpt:www
ACCEPT     tcp  –  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  –  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     icmp –  anywhere             anywhere            icmp echo-request
LOG        all  –  anywhere             anywhere            limit: avg 5/min burst 5 LOG level debug prefix `iptables denied: ‘
REJECT     all  –  anywhere             anywhere            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  –  anywhere             anywhere            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  –  anywhere             anywhere

接下来我们需要设置下只要开机防火墙就开启服务:

cd /usr/local

mkdir virus

vi firewall

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.firewall.rules

chmod +x firewall

vi /etc/rc.d/rc.local

/usr/local/virus/firewall

安装配置Fail2Ban

Fail2Ban可以阻挡字典攻击您的服务器,当Fail2Ban检测到同一个ip企图攻击您的服务器,他将创建临时的防火墙规则来阻挡这些ip地址,Fail2Ban可以监控SSH,HTTP,SMTP等,默认情况下,Fail2Ban只监控SSH。具体安装Fail2Ban,以及配置,将在下篇专门讲解。