如今很多个人服务器都是云服务器, 比如阿里云, 腾讯云, AWS 等等. 他们也提供了自己的安全策略, 但是免费的功能很有限制. 所以自己动手吧, 丰衣足食:
CentOS 安全
安全 = 最小的权限 + 最少的服务.
新系统会有很多的用户以及用户分组, 建议注释掉(不删除的原因是如果有需要可以重新打开).
特别提醒: 修改任何文件, 请备份, 比如: cp /etc/passwd /etc/passwd.back
用户和用户组
vi /etc/passwd
前面加上#, 注释掉以下用户:
adm lp sync shutdown halt uucp operator games gopher ftp
vi /etc/group
注释掉以下用户组:
adm lp uucp games dip
系统服务
用下面的命令关闭不用的系统服务, 以及取消开机启动,( serviceName 替换为要关闭的服务名称)
service {serviceName} stop chkconfig {serviceName} off
不需要的系统服务有这些:
1 2 3 4 5 6 7 8 9 10 11 |
acpid 电源进阶设定, Laptop 上使用的 autofs 自动挂在档案系统 bluetooth 蓝牙服务 cpuspeed 空竹 cpu 速度的服务, 可以省电 cpus 常用 unix 打印系统, 使之支援印表机 ip6tables 禁止 IPV6 |
(你可以使用 service {serviceName} start chkconfig {serviceName} on 恢复)
用户权限
chmod -R 700 /etc/rc.d/init.d/* 禁止非 root用户使用init.d下面的命令(默认是777权限)
用chattr +i {feilName} 给下面的文件加上不可更改的属性
1 2 3 4 5 6 7 8 9 |
/etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/services |
(可以用 -i 取消锁定的设置, lsattr {fileName} 可以查看文件属性)
文件权限
.bash_history 文件可以记录操作日志, 攻击者往往会删除或者重定向到空文件,用下面的命令可以防止操作:
1 2 3 |
chattr +a .bash_history chattr +i .bash_history |
下面的文件是我们常用的命令, 也是攻击者最爱替换的命令, 防止他们更改,
chmod 700 {fileName} 更改以下文件权限 (括号内是原有的权限):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/usr/bin/vim /bin/netstat /usr/bin/tail /usr/bin/less /usr/bin/head /bin/cat /bin/uname /bin/ping (上面这些文件原有的系统权限是 755) /usr/bin (上面这些文件原有的系统权限是 555) |
最后 chmod 500 /bin/ps 这个文件原有系统权限也是755
禁止危险操作
vi /etc/inittab
注释掉下面这一行, 可以防止 Ctrl + Alt + Del重启
1 |
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now |
禁止升级系统内核
vi /etc/yum.conf
在[main]的最后添加 exclude=kernel*
(使用 yum 升级的时候可以手动加上, 防止升级内核 yum –exclude=kernel* update)
cat /etc/issue 查看系统版本
uname -a 查看内核版本
chkconfig –list yum-updatesd 查看系统状态 (centos 自动更新)
yum-updatesd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
可以用 service yum-updatesd stop 关闭自动升级
chkconfig yum-updatesd off 关闭开机启动
其他
vi /etc/inittab
注释掉不需要的多余的虚拟控制台, 比如
1 |
#6:2345:respawn:/sbin/mingetty tty6 |
vi /etc/profile
找到 HISTSIZE 可以更改 history命令记录数
禁止服务器被 ping:
vi /etc/rc.d/rc.local 在最末尾加上下面这一行即可:
1 |
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all |
( 0 表示允许 1表示禁止)
防火墙iptables 配置
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
在出去的端口上:iptables -A OUTPUT -p icmp –icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT
小扩展:对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
废话不多说, 直接贴上我自己的配置:
vi /etc/sysconfig/iptables
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
*filter #进入全部拒绝 :INPUT DROP [0:0] #网口转发全部拒绝 :FORWARD DROP [0:0] #出去全部允许 :OUTPUT ACCEPT [0:0] #开启ssh进入,22端口 -A INPUT -p tcp --dport 22 -j ACCEPT #开启web服务器进入,80端口,443端口 -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT #开启MongoDB服务器进入,27017端口(允许指定ip,网段访问) -A INPUT -p tcp -s 222.211.94.0/24 --dport 27017 -j ACCEPT #开启Redis服务器进入,6001,6002,6003端口 -A INPUT -m iprange --src-range 222.211.94.210-222.211.94.214 -p tcp --dport 6001 -j ACCEPT -A INPUT -m iprange --src-range 222.211.94.210-222.211.94.214 -p tcp --dport 6002 -j ACCEPT -A INPUT -m iprange --src-range 222.211.94.210-222.211.94.214 -p tcp --dport 6003 -j ACCEPT #开启NodeJS服务器进入,18080端口 -A INPUT -m iprange --src-range 222.211.94.210-222.211.94.214 -p tcp --dport 18080 -j ACCEPT #开启Socket服务器进入,4399端口 -A INPUT -p tcp --dport 4399 -j ACCEPT #DNS服务,53端口 -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT #防止有些不安全的端口,如特洛伊木马 -A OUTPUT -p tcp --sport 31337 -j DROP -A OUTPUT -p tcp --dport 31337 -j DROP -A OUTPUT -p tcp --sport 31335 -j DROP -A OUTPUT -p tcp --dport 31335 -j DROP -A OUTPUT -p tcp --sport 27444 -j DROP -A OUTPUT -p tcp --dport 27444 -j DROP -A OUTPUT -p tcp --sport 27665 -j DROP -A OUTPUT -p tcp --dport 27665 -j DROP -A OUTPUT -p tcp --sport 20034 -j DROP -A OUTPUT -p tcp --dport 20034 -j DROP -A OUTPUT -p tcp --sport 9704 -j DROP -A OUTPUT -p tcp --dport 9704 -j DROP -A OUTPUT -p tcp --sport 2049 -j DROP -A OUTPUT -p tcp --dport 2049 -j DROP #丢弃坏的TCP包 -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP #处理IP碎片数量,防止攻击,允许每秒100个 -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT #设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包 -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT #drop非法连接 -A INPUT -m state --state INVALID -j DROP -A OUTPUT -m state --state INVALID -j DROP -A FORWARD -m state --state INVALID -j DROP #允许已经建立的 和 相关的 连接 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #防止DDOS攻击 -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT #防CC攻击 #单个IP最大并发连接数为30 -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT #单个IP在60秒内允许建立的连接数为60个 -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 60 -j REJECT #允许本机被ping -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT COMMIT |
Fail2ban 配置
fail2ban 是一个监控日志, 并条件过滤后, 对访问 IP 进行限制等操作的工具, 常用来监控 Nginx 日志/ 系统登录日志, 把非法访问的 IP 拉黑
安装
1 |
yum install fail2ban logwatch gadmin -y |
关键文件列表:
/etc/fail2ban/fail2ban.conf 主要配置文件
/etc/fail2ban/jail.conf 阻挡设定文件
/etc/fail2ban/filter.d/ 过滤规则目录
/etc/fail2ban/action.d/ 检查到条件对象后的操作目录
如果没有发现 fail2ban 的安装包, 在/etc/yum.repos.d/CentOS-Base.repo 文件最后加入
1 2 3 4 5 6 7 8 9 10 11 |
[atrpms] name=Red Hat Enterprise Linux $releasever - $basearch - ATrpms baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms gpgcheck=1 enabled=1 |
vi /etc/fail2ban/fail2ban.conf:
1 |
logtarget = SYSLOG -> logtarget = /var/log/fail2ban.log |
vi /etc/fail2ban/jail.conf
更改 ssh 处 email 设置
增加 (注意替换{}内容}):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[nginx-{yourRuleName}] enabled = true port = http,https filter = nginx-{yourRuleName} action = iptables[name=nginx{yourRuleName}, port=http, protocol=tcp] sendmail-whois[name=nginx{yourRuleName}, dest={yourEmail}, sender=fail2ban@example.com] logpath = /var/log/nginx/access.log maxretry = 10 findtime = 60 bantime = 3600 |
vi /etc/fail2ban/filter.d/nginx-{yourRuleName}.conf
写入你想监控的关键 url:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[Definition] failregex = ^<HOST>.*GET {someURL}*$ ^<HOST>.*POST {someURL}.*$ ^<HOST>.*HTTP\/1.1.*405.*$ ^<HOST>.*HTTP\/1.1.*404.*$ #failregex = <HOST> -.*- .*HTTP/1.* .* .*$ ignoreregex = |
最后 service fail2ban restart 就可以了
6666,再也不怕被黑了