新建VPS主机初始安全配置
最近Vultr日本节点从家里联通宽带连过去网络抽风,晚上ping值能有200ms多,比刚开始的时候80ms左右的速度劣化很多。看来这条线路最近又被大批涌入的新用户玩的比较狠。同时也在考察Vultr的老对手linode,开了一个Tokyo2机房的小鸡,经测试高峰期的ping值也差不多200ms左右,和vultr半斤八两的水平。但是初次尝试了linode的后台系统后就发现了其过人之处。跟vultr相比,用户可以对磁盘分区,设置挂载点,可以动态调整分区大小,可以在不同地理位置的机房迁移数据,总体而言灵活度确实强于其他VPS商家。在加上linode稳定运行的口碑,于是乎利用新用户注册送20刀的优惠,开始尝试将小站的服务器往linode Tokyo2机房迁移。
新机建立之后首先需要配置系统环境,作为暴露在公网上的主机,安全性尤为重要。刚开的机器还没用多久,登陆时都提示有多次失败的登陆记录,可见linode的机房已经成为端口扫描的重点照顾对象。
SSH配置
登录机器后第一步加强ssh的安全性,主要考虑下面3点
- 禁止root用户登陆,使用新用户登录
- 修改ssh端口号
- 使用密钥文件登录认证
A . 首先建立一个新用户hai, 并且将其加入wheel用户组,使其能够使用sudo提升用户权限。
1 2 3 |
adduser hai passwd hai usermod -G wheel hai |
B. 然后编辑ssh配置文件位于/etc/ssh/sshd_config,将其中几行修改成下面的样子,这样别人就没有办法使用root用户暴力破解密码,而且必须要求密钥文件登录。关于关闭密码登录的配置说明,这篇文章讲的很详细.
1 2 3 4 5 |
Port 30567 # 定义ssh服务端口 PermitRootLogin no # 禁止root用户通过ssh登录 PermitEmptyPasswords no # 禁止空密码登录 PasswordAuthentication no # 禁止密码登录,换言之就是只能通过密钥登录 ChallengeResponseAuthentication no # 作用同上,这两项必须同时设为no |
C. 假如需要密钥登录的账户是新建立的hai账户,在hai账户的home目录里,建立
.ssh目录(假如不存在的话),将公钥内容写入到
.ssh/authorized_keys文件里。最后从其他地方通过密钥登录ssh测试一下,没问题的话重启sshd服务。
service sshd restart
至此,别人就没有办法通过ssh途径突破主机的安全配置了。
用户/用户组设置
新建了用户以后,通过以下设定,使得只有wheel组的用户能切换到root。
编辑 /etc/pam.d/su文件,取消注释下一行
1 |
auth sufficient pam_wheel.so trust use_uid |
然后在/etc/login.defs下添加一行
1 |
SU_WHEEL_ONLY yes |
现在其他普通用户就无法切换到root用户了。
CentOS7系统默认创建了许多对于web服务器没用的用户和用户组,所以删掉那些多余的。
1 2 3 4 5 6 7 8 9 10 11 |
userdel adm userdel lp userdel sync userdel shutdown userdel halt userdel operator userdel ftp groupdel games groupdel dip groupdel video groupdel audio |
锁定重要文件
给重要的系统文件包含密码,用户等文件加锁,避免root密码被篡改。
1 2 3 4 |
chattr +i /etc/passwd chattr +i /etc/shadow chattr +i /etc/group chattr +i /etc/gshadow |
让系统日志只能增加记录,不能修改其中的记录。如果黑客入侵也无法隐藏行迹。
1 |
chattr +a /var/log/messages |
iptables防火墙设置
CentOS7上预装的是firewalld,但是iptables还是更频繁地出现在各种文章、教程里,很多时候网上找到的防火墙操作都是基于iptables的命令,那么这里采用iptables作为防火墙服务。
首先安装iptables并且开启服务。
1 2 3 |
yum install iptables-service systemctl enable iptables-service systemctl start iptables-service |
在开始修改规则前,先检查现有规则
1 |
iptables -L -n |
这里假定将重新定立防火墙规则,如果有已经定义的规则的话,运行下面的命令清空
1 |
iptables -F; iptables -X; iptables -Z |
由于iptables的规则改变会立即生效,如果用户错误设定了一条规则可能会将自己当前的连接挡在门外,就再也没有办法连上当前的主机了。为了防止这种意外的发生,可以加入一条白名单设定,使白名单指定IP地址总是能够访问当前主机的ssh端口,这样即使发生误操作,也不至于防火墙把自己挡住。用了那么多VPS,总有一台小鸡能为我所用,运行下面的命令将其加入白名单。
1 |
iptables -A INPUT -s <IP address> -p tcp --dport 30567 -j ACCEPT |
下面的规则允许loopback访问,除了lo之外阻止所有对127.0.0.0/8的访问。
1 2 |
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -d 127.0.0.0/8 -j REJECT |
禁止一些常见的网络入侵手段
1 2 3 |
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP |
允许所有已建立的入站连接
1 |
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
打开web的80和443端口, ssh的30567端口和ftp的21端口
1 2 3 4 |
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW --dport 30567 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT |
打开多个连续端口,比如Aria2的bt端口
1 |
iptables -A INPUT -p tcp -m state --state NEW --dport 6881:6999 -j ACCEPT |
允许ping连接
1 |
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT |
最后设置默认规则:除了上述规则以外,阻止所有连接。
1 2 3 |
iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP |
前面所做的配置都是在当前的会话中立即生效,如果想要永久保存规则,在下次启动时还能保存设定,需要运行下面的命令。
1 2 |
service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] |
测试iptables规则生效而且没有阻止正常的网络链接,最后去掉指定IP白名单设定。
通过iptables –line-number得知白名单规则编号是1,所以使用-D参数删除这条规则。
1 2 3 |
iptables -nL --line-number iptables -D INPUT 1 service iptables save |
iptables日志
除非在规则里显式地定义了写入日志,否则默认情况下即使有网络连接被阻止,也看不到日志记录。通过加入下面两条规则,记录所有被阻止的入站和转发连接。
1 2 |
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 4 iptables -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 4 |
默认情况下iptables的日志写入内核日志文件 /var/log/messages里,最好能把这些防火墙活动单独写入另一个日志文件,需要在rsyslog配置文件中加入一行
1 |
echo 'kern.warning /var/log/iptables.log' >> /etc/rsyslog.conf |
然后就可以在日志文件中看到各种频繁的被阻止的网络活动了,linode的机房被好多人盯的啊!
1 2 3 4 5 6 |
Aug 16 11:43:47 li1560-10 kernel: iptables_INPUT_denied: IN=eth0 OUT= MAC=f2:3c:91:d4:5f:78:40:55:39:08:e9:c1:08:00 SRC=117.122.240.201 DST=139.162.80.10 LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=37919 PROTO=TCP SPT=55254 DPT=1433 WINDOW=1024 RES=0x00 SYN URGP=0 Aug 16 11:45:02 li1560-10 kernel: iptables_INPUT_denied: IN=eth0 OUT= MAC=f2:3c:91:d4:5f:78:40:55:39:08:e9:c1:08:00 SRC=42.249.219.3 DST=139.162.80.10 LEN=60 TOS=0x00 PREC=0x00 TTL=53 ID=11808 DF PROTO=TCP SPT=49961 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0 Aug 16 11:45:05 li1560-10 kernel: iptables_INPUT_denied: IN=eth0 OUT= MAC=f2:3c:91:d4:5f:78:40:55:39:08:e9:c1:08:00 SRC=42.249.219.3 DST=139.162.80.10 LEN=60 TOS=0x00 PREC=0x00 TTL=53 ID=11809 DF PROTO=TCP SPT=49961 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0 Aug 16 11:45:11 li1560-10 kernel: iptables_INPUT_denied: IN=eth0 OUT= MAC=f2:3c:91:d4:5f:78:40:55:39:08:e9:c1:08:00 SRC=42.249.219.3 DST=139.162.80.10 LEN=60 TOS=0x00 PREC=0x00 TTL=53 ID=11810 DF PROTO=TCP SPT=49961 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0 Aug 16 11:45:42 li1560-10 kernel: iptables_INPUT_denied: IN=eth0 OUT= MAC=f2:3c:91:d4:5f:78:f8:66:f2:00:08:41:08:00 SRC=211.105.153.10 DST=139.162.80.10 LEN=40 TOS=0x00 PREC=0x00 TTL=243 ID=9339 PROTO=TCP SPT=20831 DPT=23 WINDOW=65535 RES=0x00 SYN URGP=0 Aug 16 11:46:32 li1560-10 kernel: iptables_INPUT_denied: IN=eth0 OUT= MAC=f2:3c:91:d4:5f:78:f8:66:f2:00:08:41:08:00 SRC=14.157.112.16 DST=139.162.80.10 LEN=44 TOS=0x00 PREC=0x00 TTL=244 ID=6440 PROTO=TCP SPT=50549 DPT=1433 WINDOW=1024 RES=0x00 SYN URGP=0 |
最后提供一个完整的iptables规则记录,从此处下载,然后运行下面的命令导入生效
1 2 |
iptables-restore < v4.rules service iptables save |
总结
通过这些设置以后,服务器已经初步具备比较好的安全性,除了暴露出系统必备的服务之外,对恶意入侵者很难有可乘之机。作为一个普通的小站,也没有太大的价值去让入侵者再花更大功夫去寻找其中的漏洞。当然重中之重是不要忘记经常给系统升级,确保已知的漏洞都已经得到修复。
本文出自扉启博客,转载时请注明出处及相应链接。
本文永久链接: https://www.feiqy.com/vps-security-practice/
近期评论