美文网首页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