Linux安全运维之我见

emmm…先给大家分享一下暑假学习linux的时候画的一个思维导图


最近在AWS上花了8块钱买(送)了一年的服务器,布好自己的网站后尝试了一下简单的压力测试,结果瞬间GG。于是翻起了以前的学linux运维时候记得笔记加上自己对安全运维的一些理解,对自己的服务器进行了新一轮的加固,至于具体是怎么做的,还请各位看官听我细细道来。

这里我先说明一下我服务器的环境,用的是AWS的Liunx系统(仿centos)。

删除默认账户

linux默认会启动很多不必要的账户,下面是某次我的服务器上的一些默认用户

账号越多,系统就越容易受到攻击。
所以可以用

1
userdel 用户名

限制su权限

默认情况下,以普通用户登录系统后,执行 su root 命令,然后键入 root 用户的密码,就可以切换成 root 用户。这样做并不安全,所以我们需要配置一下安全策略,使其只针对我们指定的用户才可以切换成root用户

1
vim /etc/pam.d/su


把图中画线部分去掉#后改为

1
auth required pam_wheel.so group=root

这样只有root组的用户才可以切换成root,如下命令更换用户的用户组

1
usermod -a -G groupA user

Iptables

说起linux安全运维,首当其冲的肯定是Iptables的配置,对于常见的DOS攻击,一般是与服务器建立多条半开链接导致堵塞服务器对外通信,严重可导致服务器CPU爆炸而宕机。所以对此我们可以配置单一IP的最大连接数和在一定时间内的最大连接数进行设置,可以有效的防止DOS攻击以及一些扫描器的扫描,比如AWVS,sqlmap,御剑,balabala~

限制IP连接数和连接速率

我们可以限制IP的网络连接数和速度等,限制过快的连接频率,这样不仅可以在一定程度上限制对方的扫描器,还可以防御一些dos攻击。

单个IP的最大连接数为 20

1
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT

单个IP在60秒内只允许最多新建15个连接

1
2
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 15 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT

防止端口复用类的后门或者shell

假设病毒木马程序通过22,80端口向服务器外传送数据,这种方式发向外发的数据不是我们通过访问网页请求而回应的数据包。我们可以禁止这些没有通过请求回应的数据包。

1
2
3
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEP

Apache配置

对于某些dos攻击方式如slowhttptest利用超时时间对你进行攻击的,一般的iptables不能很好的进行防御。所以需要配置apache的超时时间
centos默认配置文件在

1
/usr/share/doc/httpd24-2.4.27/httpd-default.conf

改完需要在etc/httpd/conf/httpd.conf里面配置一下东西

流量check

centos的apache目录在

1
2
/etc/httpd/logs/access_log #访问日志
/etc/httpd/logs/error_log #出错日志

这里只分享几款check工具
LogForensics 腾讯实验室 https://security.tencent.com/index.php/opensource/detail/15
北风飘然@金乌网络安全实验室 http://www.freebuf.com/sectool/126698.html
网络ID为piaox的安全从业人员: http://www.freebuf.com/sectool/110644.html
网络ID:SecSky http://www.freebuf.com/sectool/8982.html
网络ID:鬼魅羊羔http://www.freebuf.com/articles/web/96675.html

定期查杀webshell

这里放个精简版的webshell查杀脚本
http://www.jincon.com/archives/147/

配置crontab,每2个小时查杀一次

1
2
crontab -e
* 2 * * * python scanwebshell.py /var/www/html

关键目录给属性

1
2
3
4
5
6
chattr +i ~/.ssh
chattr +i /var/www/html
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow

配置全局waf

一个waf
http://hackblog.cn/post/75.html

1
find /var/www/html -type f -path "*.php" | xargs sed -i "s/<?php/<?php\nrequire_once('\/tmp\/waf.php');\n/g"

一条命令配置
查找/var/www/html目录下的所有php文件然后添加一个require_once('waf.php')

关闭系统不使用的服务

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
chkconfig cups off #打印机
chkconfig bluetooth off # 蓝牙
chkconfig hidd off # 蓝牙
chkconfig ip6tables off # ipv6
chkconfig ipsec off # vpn
chkconfig auditd off #用户空间监控程序
chkconfig autofs off #光盘软盘硬盘等自动加载服务
chkconfig avahi-daemon off #主要用于Zero Configuration Networking ,一般没什么用建议关闭
chkconfig avahi-dnsconfd off #主要用于Zero Configuration Networking ,同上,建议关闭
chkconfig cpuspeed off #动态调整CPU频率的进程,在服务器系统中这个进程建议关闭
chkconfig isdn off #isdn
chkconfig kudzu off #硬件自动监测服务
chkconfig nfslock off #NFS文档锁定功能。文档共享支持,无需的能够关了
chkconfig nscd off #负责密码和组的查询,在有NIS服务时需要
chkconfig pcscd off #智能卡支持,,如果没有可以关了
chkconfig yum-updatesd off #yum更新
chkconfig acpid off
chkconfig autofs off
chkconfig firstboot off
chkconfig mcstrans off #selinux
chkconfig microcode_ctl off
chkconfig rpcgssd off
chkconfig rpcidmapd off
chkconfig setroubleshoot off
chkconfig xfs off
chkconfig xinetd off
chkconfig messagebus off
chkconfig gpm off #鼠标
chkconfig restorecond off #selinux
chkconfig haldaemon off
chkconfig sysstat off
chkconfig readahead_early off
chkconfig anacron off

#修改ssh服务的端口

1
2
3
4
5
6
7
8
vi /etc/ssh/sshd_config
#修改端口
#Port 22 #关闭22端口
Port 6022 #增加6022端口
#重启sshd服务
service sshd restart
检查一下sshd的监听端口对不对
netstat -lnp|grep ssh

记得最后把iptables的相应端口打开

1
2
iptables -A INPUT -p tcp --dport 6022 -j ACCEPT
iptables -A OUTPUT -p udp --sport 6022 -j ACCEPT

#不允许从不同的控制台进行root登陆
“/etc/securetty”文件允许你定义root用户可以从哪些TTY终端登陆
编辑”/etc/securetty”文件,在不需要登陆的TTY终端前添加“#”标志,来禁止从该TTY终端进行root登陆。一般情况下留2个tty终端就行了。

1
2
3
4
5
6
7
8
9
10
11
12
tty1
tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
#tty9
#tty10
#tty11
#ttyS0

最后也是最要的一条,别懒,坚持每天看一下自己的服务器日志以及history历史命令记录,还有用last或者lastlog命令查看一下历史登录信息,w查看当前所有用户登录信息。一句老话,没有永远安全的系统,一切安全策略只是为了增加攻击者的攻击成本。

笔者能力有限,目前只能想到这些措施,如果各位大佬有好的想法欢迎留言

参考

http://bobao.360.cn/ctf/learning/210.html
http://blog.csdn.net/hanzheng260561728/article/details/51549037