美文网首页Linux修行之路
物理隔离环境搭建存储服务器——第二篇:内部网络的安全与防护

物理隔离环境搭建存储服务器——第二篇:内部网络的安全与防护

作者: 忆霜晨 | 来源:发表于2018-03-09 20:16 被阅读0次
(注:如若记忆没有出现偏差,本文应是写于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 )


相关文章

网友评论

    本文标题:物理隔离环境搭建存储服务器——第二篇:内部网络的安全与防护

    本文链接:https://www.haomeiwen.com/subject/etskfftx.html