x1184的小站
x1184的小站
关于服务器安全的非系统性整理
关于服务器安全的非系统性整理

What is server security?

A Web server that supports any of the major security protocols, like SSL, that encrypt and decrypt messages to protect them against third party tampering. Making purchases from a secure Web server ensures that a user’s payment or personal information can be translated into a secret code that’s difficult to crack. Major security protocols include SSL, SHTTP, PCT, and IPSec. Secure server help business & company conduct secure & private network transactio. Now a days server security is the most important issue. Most of the e-commerce companies try to overcome from that problem.However, the growth of online retailing has expanded requirements for security and measures geared toward preventing malicious attacks.

form Quora

上面是引用的关于服务器安全问题的回答,这里面主要的点有说对于网站来说,要配置好ssl,IPSec之类主流安全协议,并且要有虚拟内网环境进行隔离,并且电子商务经济的发展已经对这个方面的需求是越来越大了。这个回答有点老了,但完全可以作为一个好的引子,这里我也就展开讨论下关于服务器安全方面的一些总结出来小方案。当然目前我的总结比较零散,后期等我的知识体系逐渐完善可能再出后续更新版本的,也欢迎评论区交流讨论和指正。

网络攻击等异常流量

DD和CC

DDoS攻击

DDoS攻击(分布式拒绝服务攻击)指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。DDoS的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。DDoS就是利用更多的傀儡机(肉鸡)来发起进攻,比从前dos更大的规模来进攻受害者。

CC攻击

CC攻击是DDoS攻击的其中一种,是目前应用层攻击的主要手段之一,相比其它的DDoS攻击CC似乎更有技术含量一些。CC攻击借助代理服务器生成指向目标系统的合法请求,实现伪装和DDoS。我们都有这样的体验,访问一个静态页面,即使人多也不需要太长时间,但如果在高峰期访问,访问的人越多,页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。

CC攻击就充分利用了这个特点,模拟多个正常用户不停地访问需要大量数据操作的页面,造成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的请求,网络拥塞,正常访问被中止。这种攻击技术性含量高,见不到真实源IP,见不到特别大的异常流量,但服务器就是无法进行正常连接。

分类

  • syn/fin/ack等tcp协议包
    设置预警阀值和响应阀值,前者开始报警,后者开始处理,根据流量大小和影响程度调整防护策略和防护手段,逐步升级。
  • udp/dns query等udp协议包
    对于大部分游戏业务来说,都是TCP协议的,所以可以根据业务协议制定一份tcp协议白名单,如果遇到大量udp请求,可以不经产品确认或者延迟跟产品确认,直接在系统层面/HPPS或者清洗设备上丢弃udp包。
  • http flood/CC等需要跟数据库交互的攻击 
    这种一般会导致数据库或者webserver负载很高或者连接数过高,在限流或者清洗流量后可能需要重启服务才能释放连接数,因此更倾向在系统资源能够支撑的情况下调大支持的连接数。相对来说,这种攻击防护难度较大,对防护设备性能消耗很大。
  • 其他 
    icmp包可以直接丢弃,先在机房出口以下各个层面做丢弃或者限流策略。现在这种攻击已经很少见,对业务破坏力有限。

溯源

看大佬们的讨论主要是这三个层级,但是查看具体的溯源思路时,发现其实有些更新的技术是可以完全隐藏流量的,这个地方就存在一定的争议了,毕竟攻和防的技术都是在互相更新的。

  1. 攻击流量的来源IP
  2. 攻击流量的发起IP
  3. 攻击流量的发起者

这三层中1是可以获取到数据的但是一般是僵尸网络肉鸡之类,这些数据仅供统计分析和进一步研究方案,如果真要找到2级别的,可能需要运营商级别的spoof检测和netflow日志查看。我们及时溯源可以做流量清洗,也可作为后续写封禁规则的依据。

一般应对方案

监测

手工查看
  • CC类攻击,网站出现service unavailable提示;CPU占用率很高;外部无法打开网站,重启后短期内恢复正常,几分钟后又无法访问,观察到大量的ESTABLISHED连接状态,单个IP高达几十条甚至上百条。
  • SYN类攻击,CPU占用很高;网络连接状态 netstat –na,观察到大量的SYN_RECEIVED的连接状态
  • UDP类攻击,网卡每秒接受大量的数据包,而使用命令netstat –na TCP 查看状态正常
  • TCP洪水攻击,CPU占用很高;netstat –na 观察到大量的ESTABLISHED的连接状态,单个IP高达几十条甚至上百条
网络层监测

DDoS 攻击最明显的特征就是流量的大幅度增加,基于流量变化检测 DDoS 也是最常见的方法,与最常见的基于单链路流量检测 DDoS攻击相比,基于全网流量变化检测 DDoS攻击,能有效降低网络流量波动导致的检测误差。也有其他研究人员提出了基于网络全局流量异常特征,即通过对全网或运营商网络中的 OD(origin-destination)对(或流,或者节点)之间的流量进行测量,构建网络流量矩阵,基于链路中攻击流的相关性,将流量矩阵分解为异常流量空间和正常流量空间,利用异常流量的相关特征检测出攻击。

还有针对包的监测,当攻击者发送大量的 SYN 包,并且不对 SYN-FIN 包作回应,以此来消耗攻击目标的内存空间时。可以预见攻击的发生,流入攻击主机的 SYN-FIN 包数和流出的 SYN/ACK-FIN 包数差异较大。我们只需对一个网段流进的SYN-FIN 包和流出的 SYN/ACK-FIN 包数进行统计,能够有效地发现 SYN Flood 攻击主机。

基于源地址数量及分布变化
为了隐藏攻击,DDoS 攻击者可以降低攻击速率,使攻击流量速率接近正常访问速率,以此增加检测难度.但在 DDoS 攻击时,访问 IP 数量大幅度增加是攻击的一个明显特征[20],且此特征无法隐藏.基于这个特征,利用机器学习,结合 Non-Parametric Change Detection Scheme,能够有效地检测 DDoS 攻击,特别是攻击源地址分布均匀的 DDoS 攻击

结合ML的方案
应用层监测

图灵测试能够有效区分攻击者和正常访问者.由于合法用户能够正确地完成测试,而攻击主机不具备完成测试的能力,因而可以准确区分两者。但是图灵测试往往会干扰访问者对服务器的正常访问,这一点需要权衡。

应用层监测

服务器流量防火墙

这里主要指使用高防服务器防住dd的流量,如果有更高级的需求,甚至可以使用硬件防火墙来进行防御。

在选择高防服务器的时候,要先了解防御类型和防御大小。防火墙是介于内部网和外部网之间、专用网和公共网之间的一种保护屏障,防火墙分为两种:一种是软件防火墙、另一种是硬件防火墙。

1、软件防火墙:软件防火墙是寄生于操作平台上的,软件防火墙是通过软件去实现隔离内部网与外部网之间的一种保护屏障。

2、硬件防火墙:硬件防火墙是镶嵌系统内的,硬件防火墙是有软件和硬件结合而生成的,硬件防火墙从性能方面和防御方面都要比软件防火墙要好。

高防服务器定义

CDN托管及人机验证

托管在国内或者国外CDN上,一方面能够增加攻击者找到真实ip的成本,另外一方面也能把部分资源缓存来实现访问。而且CDN是分布式部署至众多边缘缓存节点,能够分担DDOS攻击压力。同时CDN一般也有专门的遭受攻击模式和联动防御方式,都是可以在受到攻击时直接开启的。比如cloudflare的5s验证盾和阿里云CDN的联动方案

过滤规则防护

sysctl
# 对sysctl参数进行修改
$ sudo sysctl -a  | grep ipv4 | grep syn 
# 输出类似下面:
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5 
net.ipv4.tcp_syncookies:是否打开SYN COOKIES的功能,“1”为打开,“2”关闭。
net.ipv4.tcp_max_syn_backlog:SYN队列的长度,加大队列长度可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_synack_retries和net.ipv4.tcp_syn_retries:定义SYN重试次数。
# 把如下加入到/etc/sysctl.conf即可,之后执行“sysctl -p”!
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2 
# 提高TCP连接能力 
net.ipv4.tcp_rmem = 32768
net.ipv4.tcp_wmem = 32768 
net.ipv4.sack=0   
iptables
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
#打开转发
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
#打开 syncookie (轻量级预防 DOS 攻击)
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null
#设置默认 TCP 连接最大时长为 3800 秒(此选项可以大大降低连接数)
sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/n
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
#防止SYN攻击 轻量级预防
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
  • fail2ban 通过分析日志来判断是否使用iptables拦截
  • DDoS Deflate 通过netstat判断ip连接数,并使用iptables屏蔽
Nginx
http { 
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; //触发条件,所有访问ip 限制每秒10个请求 
server {        
        location  ~ \.php$ { 
            limit_req zone=one burst=5 nodelay;   //执行的动作,通过zone名字对应     }
            }
  location /download/ { 
            limit_conn addr 1;    // 限制同一时间内1个连接,超出的连接返回503              
       } 
      } 
  } 

//直接白名单
geo $whiteiplist  {
        default 1;
        10.11.15.161 0;
    }
map $whiteiplist  $limit {
        1 $binary_remote_addr;
        0 "";
    }

SLB方案

如果不方便换源站IP或已经换过IP了,建议在后端ECS前加挂一台SLB(负载均衡),添加后架构为:客户端–>高防–>SLB–>ECS,需要在高防上填写SLB的地址作为回源地址。

这样即使攻击直接打源站,使得源站IP被黑洞,通过高防去访问服务器依然不受影响。因为SLB到源站的访问(这部分流量走内网,源站进黑洞无影响)还是正常的,高防也还是可以通过SLB去请求源站。

补图

https://shop.io.mi-img.com/app/shop/img?id=shop_ad9837f2d07162bcb694163e35c7d3d4.jpeg
攻击网络带宽资源
https://shop.io.mi-img.com/app/shop/img?id=shop_bad7b820db478116982c05463ea8aa47.jpeg
攻击系统资源
https://shop.io.mi-img.com/app/shop/img?id=shop_5d421ba4543537d4f9e5db69b4b346b4.jpeg
攻击应用资源

常见排查

登录信息防护

sshd配置

fail2ban&iptables

堡垒机方案

源站IP泄露

  • 服务器中有木马、后门之类的安全隐患,如果没有安全技术人员可以排查,可以选择专业云服务商提供的安全服务。
  • 有一些其他的源站服务没有走高防,比如邮件服务器的mx记录、bbs记录等除了web以外的记录,请仔细检查DNS解析的全部内容,确保没有记录解析到源站IP。
  • 网站源码信息泄露,如phpinfo()中可能包含的IP地址等。
  • 某些恶意扫描(可通过在源站上只允许高防回源IP来防护)。

web防扫

第三方软件防护

漏洞本地检测

关于工具看这篇就好了很全的,之后有空出些教程。

安全问题托管面板

托管给宝塔之类web面板,之后关闭ssh登录,同时配合小程序绑定服务器监控信息,这种完全托管给第三方面板的做好,也能确保有一定的安全性,好处就是非常的方便了也不影响各类服务,坏处就是自定义差,很依赖第三方。

日志收集和webhook推送

windows下事件查看器(有时从控制面板进入)-window日志-安全-关键字”审核失败”

linux有专门的日志工具,一般是在整个企业安全平台系统中,我这边只说下个人用服务器至少应该知道几条基础命令,可以自行创好alias经常查看下。

# 查看历史登录,记录历史命令,历史登录失败的记录。
last
lastlog
history
lastb
#查看登录和sftp失败记录,同时可以看到具体ip。
#Redhat
grep "Failed password for" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
grep "Failed password for"  /var/log/auth | awk '{print $11}' | sort | uniq -c | sort -nr | more
#Debian
grep "Failed password for" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
#查看登录失败
lastb | awk '{print $3}' | sort | uniq -c | sort -nr | more
grep "Accepted password" /var/log/sftp.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

#直接修改对应的文件,分别对应sshd日志,lastb,last,lastlog命令
/var/log/secure
/var/log/btmp
/var/log/wtmp
/var/log/lastlog

不过这些都只是文件而已,假使被非法入侵成功了,那这些看着只会帮助入侵者更加不易被察觉。那如何才能知道是否被非法入侵成功呢,好像在Linux下还真没比较好的方式去直接判断(对于绝大多数人来说,判断了也是白判断)。所以想要真正解决这个问题还是最好在关键的行为上进行审计,详细的可以参考最后部分的完整方案。

我这边还是说个对个人用户来说很简单的,就拿登录ssh这个操作来说,登录时可以判断ip是否在白名单(如果自己工作场所ip会变动记得配置好ddns)内,若不在则配合企业微信、钉钉之类的webhook,或者微信环境下的Server酱,常用的场景好像就是这些,把登录信息推送到自己通讯设备上。

DevSecOps的趋势引用

概念

腾讯方案

Google基础架构安全设计

阿里云数据安全解决方案

HIDS设计

制作云主机安全平台参考

引用

DDOS溯源
DDOS攻击与防御分类
常见DDOS攻击与监测
转-源ip被发现
linux下手写防d配置

赞赏
欢迎留言交流讨论,留言必回。

admin

文章作者

一个平凡的追梦人

发表评论

textsms
account_circle
email

x1184的小站

关于服务器安全的非系统性整理
这里我也就展开讨论下关于服务器安全方面的一些总结出来小方案。当然目前我的总结比较零散,后期等我的知识体系逐渐完善可能再出后续更新版本的,也欢迎评论区交流讨论和指正。
扫描二维码继续阅读
2020-06-11