(注:如若记忆没有出现偏差,本文应是写于2015年,楼主习惯使用LaTeX写笔记,后发现markdown不错,于是稍有修改后发布与此。)
(下文中的所有命令需要以root权限执行)
前言
我们知道,在网络中的很多病毒和木马都是针对Windows系统的,这主要是因为Windows占据了个人电脑操作系统的绝大部分份额(见下图中的数据,Windows操作系统占据了87.66%的 PC 市场,而Linux在PC上只占据了2.08%),通常黑客们从经济上考虑也不会花时间制作针对Linux的病毒或木马,另一方面,由于Linux开源的缘故,漏洞常常容易被发现和修复,因此相对而言,Linux的安全性要好于Windows系统,尤其是处于物理隔离环境中格式如此(Windows系统更可能被局域网的某个用户引入病毒后扩散攻陷)。
image.png但是,这仅仅是通常情况。Linux系统作为服务器系统使用时,不免要开放各种端口,例如FTP服务器一般要开放21端口(可以修改默认配置,重新映射端口,但是一般不会这么做),WEB服务器要开放80或者8080端口,这就给了一些有心之人可能入侵的机会。即使处于物理隔离网络环境下,如果我们不做任何防护,那么木马程序通过局域网中的某台电脑入侵服务器之后,窃取数据并等待机会带离该局域网络仍然是可能的。或者该木马程序不以窃取数据为目的,而是取得root权限之后,对服务器进行破坏,也可能造成不小的损失。因此,我们不能将所有机器的安全绑定到一起,既要整体防范,更要局部细化。
本次的存储服务器、用户机器和网络经过简化后的示意图如下,我们要管理的就是红色虚线所示的网络部分。假定用户的情况和上一篇中表格中列出的一致,并分别假定各用户的IP地址如图中所示,这里增加一个计算集群,因为通常用户需要在计算集群中进行计算,计算完成以后将有用的数据传输到存储服务器中,以便进一步的使用。这里给局域网中的用户开放FTP、SSH服务的端口,给管理员开放所有端口(也可以只开放FTP、SSH端口)。
网络结构示意图.png一、设置防火墙——iptables
iptables的前身叫ipfirewall,当内核发展到2.x系列的时候,软件更名为ipchains,在3.5内核中,改名为iptables。目前,在CentOS 7中,已经默认使用FirewallD取代iptables了。无论是iptables或FirewallD,都需要通过内核的netfilter进行过滤,也就是说firewalld和iptables一样,他们的作用都是用于维护规则。
这里使用脚本对iptables进行配置,并配置systemd服务,使之开机启动并可以使用systemd进行管理。关于systemd的知识再下一篇进行补充。
文件:setFirewallService.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
basepath=/root/FirewallScript # 脚本放置目录
if [ -f "$basepath" ]; then
echo $basepath " 是一个文件,与要创建的文件夹重名"
exit 1
fi
if [ ! -d "$basepath" ]; then
mkdir -p $basepath
fi
cp -p FirewallScript/* $basepath
cat $basepath/Firewall.service.dat > /etc/systemd/system/Firewall.service
systemctl enable Firewall
systemctl start Firewall
设置 iptables规则。
Tips:特别注意这里我们将默认规则设置成了拒绝,因此,清除iptables设置时,需要首先将默认规则恢复成接受,即首先执行
iptables -P INPUT ACCEP
,再执行清除命令iptables -F
。否则会同服务器断开连接,然后就只能屁颠屁颠的跑道机房去操作了。为了保险,建议每次操作前先看看iptables的状态,iptables -L
。
文件:Firewall.sh
#!/bin/bash
# 参数设置
EXTIF="eth0" # 网络接口
export EXTIF
# 1. 清除规则、设定默认政策及开放 lo 与相关的设定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP # 默认规则设为拒绝,清除设置的时候要小心
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
basepath=/root/FirewallScript # 脚本放置目录
# 2. 执行脚本
if [ -f "$basepath/deny.sh" ]; then
/bin/bash $basepath/deny.sh # 阻止某些网络进入
fi
if [ -f "$basepath/allow.sh" ]; then
/bin/bash $basepath/allow.sh # 允许某些网络进入
fi
# 3. 保存
iptables-save
Firewall.sh脚本可以通过systemd进行管理的配置文件。
文件:Firewall.service.dat
[Unit]
Description=myFirewallSet
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash /root/FirewallScript/Firewall.sh
ReStart=/bin/bash /root/FirewallScript/Firewall.sh
[Install]
WantedBy=multi-user.target
设置阻止通过防火墙的 IP。
文件:deny.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
basepath=/root/FirewallScript # 脚本放置目录
ipDeny=$(cat $basepath/ipDeny.dat)
for userIP in $ipDeny
do
iptables -A INPUT -i $EXTIF -s $userIP -j DROP
done
设置允许通过防火墙的 IP。
文件:allow.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
basepath=/root/FirewallScript # 脚本放置目录
# 允许 IP
ipAllow=$(cat $basepath/ipAllow.dat)
for userIP in $ipAllow
do
iptables -A INPUT -i $EXTIF -s $userIP -j ACCEPT
echo $userIP
done
# 限定 IP 使用的服务
ipServiceAllow=$(cat $basepath/ipServiceAllow.dat)
for userIP in $ipServiceAllow
do
# FTP服务使用的端口
iptables -A INPUT -p TCP -i $EXTIF -s $userIP --dport 21 --sport 1024:65534 -j ACCEPT
# SSH服务使用的端口
iptables -A INPUT -p TCP -i $EXTIF -s $userIP --dport 22 --sport 1024:65534 -j ACCEPT
echo $userIP
done
按照网络结构示意图列出的IP地址,ipAllow.dat文件的内容为:
192.168.2.66
ipServiceAllow.dat文件的内容为:
192.168.2.20
192.168.2.21
192.168.2.22
192.168.2.23
192.168.2.88
192.168.2.99
二、防暴力破解——fail2ban
fail2ban 是 Linux 上的一个著名的入侵保护的开源框架,它会监控多个系统的日志文件(例如:/var/log/auth.log或者/var/log/secure)并根据检测到的任何可疑的行为自动触发不同的防御动作,可以用来防范如ssh、ftp等被暴力破解。
Debian 8.x安装fail2ban后,配置文件位置在/etc/fail2ban目录下:
drwxr-xr-x 2 root root 4096 5月 30 21:54 action.d <-- 定义动作
-rw-r--r-- 1 root root 1525 3月 15 2014 fail2ban.conf
drwxr-xr-x 2 root root 4096 3月 19 2014 fail2ban.d
drwxr-xr-x 2 root root 4096 5月 30 21:23 filter.d <-- 定义日志分析策略
-rw-r--r-- 1 root root 13883 5月 30 21:48 jail.conf <-- 设置需要保护的服务
drwxr-xr-x 2 root root 4096 3月 19 2014 jail.d
一般情况下,我们只需要修改 jail.conf 即可,或者在 jail.d 自定义。 jail.conf 文件最开头的
[DEFAULT] 部分是全局设置,可以在局部设置中覆盖全局变量,部分参数的意义见注释部分。
[DEFAULT]
ignoreip = 127.0.0.1/8
ignorecommand =
bantime = 600 #封锁时间,负数表示永久封锁
findtime = 600 #在多长时间以内达到条件则开始执行封锁
maxretry = 3 #如600秒达到3次则执行
backend = auto
usedns = warn
destemail = xxxxx@xxx.com #警报邮件发给该地址
sendername = Fail2Ban
sender = "Fail2Ban 警报"
banaction = iptables-multiport
mta = sendmail #邮件参数,可改为mail等
protocol = tcp
chain = INPUT
action_ = %(banaction)s[略...] #仅封锁
action_mw = %(banaction)s[略...] #封锁+发送邮件
%(mta)s-whois[略...]
action_mwl = %(banaction)s[略...] #封锁+发送邮件(邮件包含日志信息)
%(mta)s-whois-lines[略...]
action = %(action_)s #默认动作
我们可以在局部块中针对某个服务设置参数。
这里用到了ssh和pureFTP服务,可以修改相应块的默认设置,让封锁之后发送警报邮件(1、若内部网络中有邮件服务器可以采用这种方式,在管理员的电脑上[一般是windows]安装邮件客户端接收邮件即可达到监控的目的;2、若内部网络中没有邮件服务器,可以采用执行一个脚本通知管理员,例如:该脚本向特定位置写入某个文件,管理员的电脑上执行一个一直运行的程序实时监控该文件,从而达到目的)。
[ssh]
enabled = true <-- 开启监控
port = ssh
filter = sshd
mta = mail <-- 使用mail命令发送邮件
action = %(action_mwl)s
logpath = /var/log/auth.log <-- 日志位置
maxretry = 6
[pure-ftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = pure-ftpd
mta = mail
action = %(action_mwl)s
logpath = /var/log/syslog
maxretry = 6
三、反端口扫描——PortSentry
在服务器没有使用硬件防火墙的情况下,为了防止有人恶意获取服务器用途等信息,防端口扫描十分必要。 PortSentry 是一款非常容易使用的防恶意扫描工具,它可设置如下几种抵挡方式:
- 路由表:通过设置路由表,将信息流导向虚假位置,从而迷惑对方。
- TCP_wrappers:将对方的IP写入/etc/hosts.deny文件。
- iptables:通过修改iptables,将对方数据包过滤。
- syslog():给出日志消息,返回警告信息。
- 自定义脚本。
其中,路由表和 iptables 是两种较好的方法。
在 Debian 8.x 中,安装 PortSentry 以后其配置文件在/etc/portsentry 目录中,主要的配置文件是portsentry.conf,默认内容如下:
TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,
ADVANCED_PORTS_TCP="1024"
ADVANCED_PORTS_UDP="1024"
ADVANCED_EXCLUDE_TCP="113,139"
ADVANCED_EXCLUDE_UDP="520,138,137,67"
IGNORE_FILE="/etc/portsentry/portsentry.ignore"
HISTORY_FILE="/var/lib/portsentry/portsentry.history"
BLOCKED_FILE="/var/lib/portsentry/portsentry.blocked"
RESOLVE_HOST = "0"
BLOCK_UDP="0" <-- 默认不阻挡UDP扫描,将值改为 1
BLOCK_TCP="0" <-- 默认不阻挡TCP扫描,将值改为 1
KILL_ROUTE="/sbin/route add -host $TARGET$ reject" <-- 利用路由阻挡
#KILL_ROUTE="/sbin/route add $TARGET$ 123.456.789.666" <-- 将数据流导向不存在的主机
KILL_HOSTS_DENY="ALL: $TARGET$ : DENY" <-- 利用TCP_wrappers阻挡
SCAN_TRIGGER="0"
对UDP和TCP,PortSentry分别有三种检测模式:
- portsentry-tcp:TCP基本端口绑定模式;
- portsentry-udp:UDP基本端口绑定模式;
- portsentry-stcp:TCP秘密扫描检测模式;
- portsentry-sudp:UDP秘密扫描检测模式;
- portsentry-atcp:TCP高级秘密扫描检测模式;
- portsentry-audp:UDP高级秘密扫描检测模式。
推荐使用高级秘密扫描检测模式,配置文件是/etc/default/portsentry,修改其默认值然后重启portsentry服务即可。
TCP_MODE="atcp"
UDP_MODE="audp"
四、其他
4.1 进一步设置用户权限
(1)限制普通用户图形界面桌面。修改/etc/pam.d/gdm-password文件,将下面这一行添加到文件结尾即可。
auth required pam_succeed_if.so user != MeiMei quiet_success
(2)限制普通用户使用su和sudo。
文件:suAndsudo.sh
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
#限制使用部分sudo命令
/bin/bash ./backupFile.sh /etc/sudoers
cat sudoers.dat >> /etc/sudoers
#限制使用su
addgroup wheel
usermod -a -G wheel YiSC # 加入wheel组的用户可以使用su命令
/bin/bash ./backupFile.sh /etc/pam.d/su
cat su.dat >> /etc/pam.d/su
其中,sudoers.dat文件内容如下,主要是让团队每个成员都可以远程关闭和重启服务器(因管理员不在岗时,遇到特殊情况可能需要关机)。
%BeyondGroup ALL=/sbin/poweroff,/sbin/reboot
su.dat文件内容为(可以查看Debian 8.x 的/etc/pam.d/su文件,注释部分说明了如何实现某个组的成语可以使用su):
auth required pam_wheel.so
第一个字段auth
表示进行认证。
第二个字段required
表示认证成功得到成功的标志,认证失败得到失败的标志,无论成功或者失败,认证流程会接着走下去,交给后续流程的程序继续处理。
第三个字段是认证的文件。
(3)设置ssh,让管理员账户只能通过密钥登录。
4.2 删除系统自带账户
作为存储服务器,有一些系统账户用不到,可以删除。
#!/bin/bash
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
delUsers="lp sync news uucp games"
delGroups="lp news uucp games dip"
for userName in $delUsers
do
echo "Delete User: " $userName
userdel $userName
done
echo -e "Delete users done.\n"
for groupName in $delGroups
do
echo "Delete Group: " $groupName
groupdel $groupName
done
echo -e "Delete groups done.\n"
4.3 温度监控
CPU等温度监控,安装lm-sensors模块。
- 安装:apt-get install lm-sensors -y
- 探测:sensors-detect
- 查看:sensors
一个输出信息的例子如下(high应该表示该设备温度高于此值就是温度过高,crit应该表示该设备温度高于此值属于温度严重过高。PS:下面的例子第一个设备high比crit高,好奇怪。):
i350bb-pci-0100
Adapter: PCI adapter
loc1: +67.0°C (high = +120°C, criy = +110°C)
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0: +45°C (high = +120℃, crit = +110°C)
Core 0: +45°C (high = +75°C, crit = +85°C)
Core 1: +45°C (high = +75°C, crit = +85°C)
Core 2: +45°C (high = +75°C, crit = +85°C)
Core 3: +45°C (high = +75°C, crit = +85°C)
Core 4: +45°C (high = +75°C, crit = +85°C)
Core 5: +45°C (high = +75°C, crit = +85°C)
我们可以用脚本解析一下,并实现报警。
#!/bin/bash
sensors | grep "high" | sed -n 's|[A-Za-z0-9 :]\{14,16\}+\[0-9]\+.0\).C (high = +\([0-9]\+.0\).C, crit = +\([0-9]\+.0\).C)|\1 \2 \3|p' \
| gawk '{
if ( $1 < $2 )
print $1 " < " $2 ": 温度正常"
else if ( $1 < $2 )
print $1 " < " $2 ": 温度过高"
#执行报警的命令,例如给管理员发邮件等
else
print $1" > "$2 ": 温度严重过高,请关机!"
#执行其他命令,例如关机等
硬盘温度监控,安装hddtemp模块。。
- 安装:apt-get install hddtemp
- 探测:hddtemp /dev/sda /dev/sdb ... ...
4.4 管理好日志
下一部分补充。
4.5 定期做好安全更新
这个很重要,可以及时修复漏洞。
五、总结
总的来说,因为绝大多数病毒、木马都是针对Windows系统,且开发的端口很少,所以内部服务器的防护相对更加容易一些。但是,最重要的是,要靠爱(既然可以发电,为嘛不能... ...(o゚▽゚)o )
网友评论