1、aide介绍

AIDE(Adevanced Intrusion Detection Environment,高级入侵检测环境)是个入侵检测工具,主要用途是检查文本的完整性。

AIDE能够构造一个指定文档的数据库,他使用aide.conf作为其配置文档。AIDE数据库能够保存文档的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文档大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小连同连接数。AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个文档的校验码或散列号。

常见的入侵检测软件: tripwire–操作比较复杂,aide–用以代替tripwire,比较简单.

2、aide安装 配置使用

#yum rpm二进制安装

yum -y install aide

我的配置文件
mv /etc/aide.conf /etc/aide.conf.bak
vim /etc/aide.conf

# Example configuration file for AIDE.

@@define DBDIR /var/lib/aide #基准数据库目录
@@define LOGDIR /var/log/aide #日志目录

# The location of the database to be read.
database=file:@@{DBDIR}/aide.db.gz #基础数据库文件

# The location of the database to be written.
#database_out=sql:host:port:database:login_name:passwd:table
#database_out=file:aide.db.new
database_out=file:@@{DBDIR}/aide.db.new.gz #更新数据库文件

# Whether to gzip the output to database
gzip_dbout=yes

# Default.
verbose=5

report_url=file:@@{LOGDIR}/aide.log
report_url=stdout
#report_url=stderr
#NOT IMPLEMENTED report_url=mailto:root@foo.com
#NOT IMPLEMENTED report_url=syslog:LOG_AUTH

# These are the default rules.
#
#p:      permissions
#i:      inode:
#n:      number of links
#u:      user
#g:      group
#s:      size
#b:      block count
#m:      mtime
#a:      atime
#c:      ctime
#S:      check for growing size
#acl:           Access Control Lists
#selinux        SELinux security context
#xattrs:        Extended file attributes
#md5:    md5 checksum
#sha1:   sha1 checksum
#sha256:        sha256 checksum
#sha512:        sha512 checksum
#rmd160: rmd160 checksum
#tiger:  tiger checksum

#haval:  haval checksum (MHASH only)
#gost:   gost checksum (MHASH only)
#crc32:  crc32 checksum (MHASH only)
#whirlpool:     whirlpool checksum (MHASH only)

#R:             p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
#L:             p+i+n+u+g+acl+selinux+xattrs
#E:             Empty group
#>:             Growing logfile p+u+g+i+n+S+acl+selinux+xattrs
R = p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
L = p+i+n+u+g+acl+selinux+xattrs
> = p+u+g+i+n+S+acl+selinux+xattrs


# You can create custom rules like this.
# With MHASH...
# ALLXTRAHASHES = sha1+rmd160+sha256+sha512+whirlpool+tiger+haval+gost+crc32
ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
# Everything but access time (Ie. all changes)
EVERYTHING = R+ALLXTRAHASHES

# Sane, with multiple hashes
# NORMAL = R+rmd160+sha256+whirlpool
NORMAL = R+rmd160+sha256

# For directories, don't bother doing hashes
DIR = p+i+n+u+g+acl+selinux+xattrs

# Access control only
PERMS = p+i+u+g+acl+selinux

# Logfile are special, in that they often change
LOG = >

# Just do md5 and sha256 hashes
LSPP = R+sha256

# Some files get updated automatically, so the inode/ctime/mtime change
# but we want to know when the data inside them changes
DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+md5+sha256+rmd160+tiger

# Next decide what directories/files you want in the database.

/boot   NORMAL
/bin    NORMAL
/sbin   NORMAL
/lib    NORMAL
/lib64  NORMAL
/opt    NORMAL
/usr    NORMAL
/root   NORMAL
# These are too volatile
!/usr/src
!/usr/tmp
!/usr/share #通过文件路径前面加感叹号 ! 排除这个路径的监控,请自定义
# Check only permissions, inode, user and group for /etc, but
# cover some important files closely.
/etc    PERMS
!/etc/mtab
# Ignore backup files
!/etc/.*~
/etc/exports  NORMAL
/etc/fstab    NORMAL
/etc/passwd   NORMAL
/etc/group    NORMAL
/etc/gshadow  NORMAL
/etc/shadow   NORMAL
/etc/security/opasswd   NORMAL

/etc/hosts.allow   NORMAL
/etc/hosts.deny    NORMAL

/etc/sudoers NORMAL
/etc/skel NORMAL

/etc/logrotate.d NORMAL

/etc/resolv.conf DATAONLY

/etc/nscd.conf NORMAL
/etc/securetty NORMAL

# Shell/X starting files
/etc/profile NORMAL
/etc/bashrc NORMAL
/etc/bash_completion.d/ NORMAL
/etc/login.defs NORMAL
/etc/zprofile NORMAL
/etc/zshrc NORMAL
/etc/zlogin NORMAL
/etc/zlogout NORMAL
/etc/profile.d/ NORMAL
/etc/X11/ NORMAL

# Pkg manager
/etc/yum.conf NORMAL
/etc/yumex.conf NORMAL
/etc/yumex.profiles.conf NORMAL
/etc/yum/ NORMAL
/etc/yum.repos.d/ NORMAL

/var/log   LOG
/var/run/utmp LOG

# This gets new/removes-old filenames daily
!/var/log/sa
# As we are checking it, we've truncated yesterdays size to zero.
!/var/log/aide.log

# LSPP rules...
# AIDE produces an audit record, so this becomes perpetual motion.
# /var/log/audit/ LSPP
/etc/audit/ LSPP
/etc/libaudit.conf LSPP
/usr/sbin/stunnel LSPP
/var/spool/at LSPP
/etc/at.allow LSPP
/etc/at.deny LSPP
/etc/cron.allow LSPP
/etc/cron.deny LSPP
/etc/cron.d/ LSPP
/etc/cron.daily/ LSPP
/etc/cron.hourly/ LSPP
/etc/cron.monthly/ LSPP
/etc/cron.weekly/ LSPP
/etc/crontab LSPP
/var/spool/cron/root LSPP

/etc/login.defs LSPP
/etc/securetty LSPP
/var/log/faillog LSPP
/var/log/lastlog LSPP

/etc/hosts LSPP
/etc/sysconfig LSPP

/etc/inittab LSPP
/etc/grub/ LSPP
/etc/rc.d LSPP

/etc/ld.so.conf LSPP

/etc/localtime LSPP

/etc/sysctl.conf LSPP

/etc/modprobe.conf LSPP

/etc/pam.d LSPP
/etc/security LSPP
/etc/aliases LSPP
/etc/postfix LSPP

/etc/ssh/sshd_config LSPP
/etc/ssh/ssh_config LSPP

/etc/stunnel LSPP

/etc/vsftpd.ftpusers LSPP
/etc/vsftpd LSPP

/etc/issue LSPP
/etc/issue.net LSPP

/etc/cups LSPP

# With AIDE's default verbosity level of 5, these would give lots of
# warnings upon tree traversal. It might change with future version.
#
#=/lost\+found    DIR
#=/home           DIR

# Ditto /var/log/sa reason...
!/var/log/and-httpd

# Admins dot files constantly change, just check perms
/root/\..* PERMS
#初始化监控数据库(这需要一些时间)
/usr/sbin/aide -c /etc/aide.conf --init
 
#把当前初始化的数据库作为开始的基础数据库
cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
 
#如果是正常的改动 更新改动到基础数据库
aide --update
cd /var/lib/aide/
#覆盖替换旧的数据库
mv aide.db.new.gz aide.db.gz
 
#在终端中查看检测结果
aide --check
 
#检查文件改动 保存到文件
aide --check --report=file:/tmp/aide-report-`date +%Y%m%d`.txt
 
#定时任务执行aide检测报告和自动邮件发送aide检测报告(如果没有mail, yum install mail,还需要有本地邮件服务支持, yum install sendmail;/etc/init.d/sendmail start)
crontab -e
00 02 * * * /usr/sbin/aide -C -V4 | /bin/mail -s "AIDE REPORT $(date +%Y%m%d)"  root@localhost

 

-C参数和 –check是一个意思
-V 报告的详细程度可以通过-V选项来调控,级别为0-255, -V0 最简略,-V255 最详细。
[root@dev ~]# aide –help
Aide 0.14
Usage: aide [options] command
Commands:
  -i, –initInitialize the database
  -C, –checkCheck the database
  -u, –updateCheck and update the database non-interactively
      –compareCompare two databases
Miscellaneous:
  -D, –config-checkTest the configuration file
  -v, –versionShow version of AIDE and compilation options
  -h, –helpShow this help message
Options:
  -c [cfgfile]–config=[cfgfile]Get config options from [cfgfile]
  -B “OPTION”–before=”OPTION”Before configuration file is read define OPTION
  -A “OPTION”–after=”OPTION”After configuration file is read define OPTION
  -r [reporter]–report=[reporter]Write report output to [reporter] url
  -V[level]–verbose=[level]Set debug message level to [level]

4、使用中遇到的问题 错误

执行 /usr/sbin/aide -c /etc/aide.conf –init 或者 aide -i 后报错

lgetfilecon_raw failed for /var/log/yum.log:No data available
lgetfilecon_raw failed for /var/log/messages.2:No data available
lgetfilecon_raw failed for /var/log/cron:No data available
lgetfilecon_raw failed for /var/log/messages.3:No data available
lgetfilecon_raw failed for /var/log/messages.1:No data available
lgetfilecon_raw failed for /var/log/sdsvrd.log:No data available
lgetfilecon_raw failed for /var/log/spooler.3:No data available
lgetfilecon_raw failed for /var/log/cron.3:No data available
lgetfilecon_raw failed for /var/log/cron.1:No data available
lgetfilecon_raw failed for /var/log/sdupdate.log:No data available
lgetfilecon_raw failed for /var/log/rsyncd.log:No data available
lgetfilecon_raw failed for /var/log/maillog.3:No data available
lgetfilecon_raw failed for /var/log/rpmpkgs.3:No data available
lgetfilecon_raw failed for /var/log/pm/suspend.log:No data available
lgetfilecon_raw failed for /var/log/prelink/prelink.log:No data available

以下配置项改为如下.

#/etc/aide.conf
ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
EVERYTHING = p+i+n+u+g+s+m+c+acl+xattrs+md5+ALLXTRAHASHES
NORMAL = p+i+n+u+g+s+m+c+acl+xattrs+md5+rmd160+sha256
DIR = p+i+n+u+g+acl+xattrs
PERMS = p+i+u+g+acl
LOG = p+u+g+i+n+S+acl+xattrs
LSPP = p+i+n+u+g+s+m+c+acl+xattrs+md5+sha256
DATAONLY = p+n+u+g+s+acl+xattrs+md5+sha256+rmd160+tiger

参考来源:How to Fix Aide “lgetfilecon_raw failed for / : No data available” errors

5、参考

AIDE –Linux高级入侵检测 http://gupt12.blog.51cto.com/7651206/1263183

#在国内镜像下载二进制包
wget -c  http://www.golangtc.com/static/go/go1.4.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.4.1.linux-amd64.tar.gz

#把golang的bin目录加入全局环境变量
cat >>/etc/profile<<EOF
export PATH=$PATH:/usr/local/go/bin
EOF
#让配置生效
source /etc/profile
#检查下是否成功
go version

#在当前用户目录下新建go目录作为项目目录
mkdir -p $HOME/go
#用cat的方法在尾部增加配置配置golang的 GOROOT GOPATH
cat >>$HOME/.bash_profile<<EOF
export GOROOT=/usr/local/go
export GOPATH=\$HOME/go
export PATH=\$PATH:\$GOROOT/bin
EOF
#让配置生效
source $HOME/.bash_profile

#检查下go的env环境变量
go env

官网的rpm二进制包是不是不够用啊!什么都编译安装是否很蛋疼,我反正是这么觉得的,没必要什么东西非要自己编译安装。

在对版本没有特殊需求,不需要改动源码的情况下,果断的yum的方式安装rpm包吧。

yum 方式安装rpm包 和 用rpm包管理器命令安装rpm包,区别是:yum 方式安装rpm包会解决包依赖关系,而rpm包管理器直接安装rpm包,不会解决包依赖关系。

 

RepoForge 源

 

CentOS7.x安装RepoForge 源

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
yum -y install rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

 

CentOS6.x安装RepoForge 源

取自己对应的版本,我这里是centos6.x x64

yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

试试安装一个比自带的top好用的 htop “任务管理器”。

yum -y install htop

 

EPEL 源

CentOS7.x安装EPEL 源

64位系统

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-6.noarch.rpm
yum -y install epel-release-7-6.noarch.rpm
yum makecache
yum repolist
yum --enablerepo=epel info htop

 

CentOS6.x安装EPEL 源

32位系统

yum -y install https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

64位系统

yum -y install https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

CentOS5.x安装EPEL 源

32位系统

yum -y install https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

64位系统

yum -y install https://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

 

 

我们知道apache php mod的方式可以很方便的配置 open_basedir 限制各个站点的目录访问权限。

nginx + php-fpm fastcgi的方式需要这样做。

首先php的版本必须大于等于php5.3.3。

总限制 通过php-fpm.conf限制

在php-fpm.conf配置文件当中可以增加如下参数

env[TMP] = /tmp/
env[TMPDIR] = /tmp/
env[TEMP] = /tmp/
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f webmaster@qq.com
php_admin_value[open_basedir] = /home/wwwroot/:/tmp/:/var/tmp:/proc/
php_admin_value[session.save_path] = /tmp/
php_admin_value[upload_tmp_dir] = /tmp/
slowlog = /usr/local/php/var/log/$pool.log
request_slowlog_timeout = 3s

可以配置env,php_admin_value。

那么配置

php_admin_value[open_basedir] = /home/wwwroot/:/tmp/:/var/tmp:/proc/

就可以把整个php脚本的访问目录控制住了。

如果方法1 方法2 方法3未配置的情况下,那么open_basedir的值就为本设置的值,如果方法1 方法2 方法3设置了,那么就是新设置的值。

另外的我这里打开了php慢执行。

slowlog 写保存路径,request_slowlog_timeout写时间。

更多的请看php官网手册 http://www.php.net/manual/en/install.fpm.configuration.php

 

方法1 在nginx 配置 fastcgi_param参数

在nginx的 php配置中 或者 在  包含的 include fastcgi.conf 文件中加入:

fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

$document_root php文档根目录,就是 nginx 配置项 root 配置的网站目录。

/tmp/目录需要有权限,默认放seesion的位置,以及unixsock。

/proc/ 可以让php查看系统负载信息。

本方法加的各个vhost 虚拟主机,都可以完美使用。都限制到自己的网站目录下。

非常推荐使用, 总限制 + 方法1 这样的组合配置方式!!!!!

方法2 在php.ini 中配置

在php.ini的末尾加入:

[HOST=www.iamle.com]
open_basedir=/home/wwwroot/www.iamle.com:/tmp/:/proc/
[PATH=/home/wwwroot/www.iamle.com]
open_basedir=/home/wwwroot/www.iamle.com:/tmp/:/proc/

本方法的弊端,如果有泛域名解析,比如 *.iale.com 。这个就不好控制。

 

方法3  网站根目录下增加 .user.ini  文件。

在php.ini中找到user_ini.filename 、 user_ini.cache_ttl 去掉前面的分号。

; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
user_ini.filename = ".user.ini"

; To disable this feature set this option to empty value
;user_ini.filename =

; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes)
user_ini.cache_ttl = 300

 

在网站根目录下创建.user.ini 加入:

open_basedir=/home/wwwroot/www.iamle.com:/tmp/:/proc/

这种方式不需要重启nginx或php-fpm服务。

特别注意,需要取消掉.user.ini文件的写权限,这个文件只让最高权限的管理员设置为只读。

方法1设置后,.user.ini的设置就不起作用了。
关于.user.ini文件的详细说明:
http://php.net/manual/zh/configuration.file.per-user.php

BTSync 简介

BitTorrent Sync 是p2p方式的文件同步软件。
特点:无需服务端,全平台支持

Windwos平台的安装设置

下载:http://download-lb.utorrent.com/endpoint/btsync/os/windows/track/stable

运行BTSync.exe

“测试同步”这个文件夹的密匙为 AA7PQ3XCEA7AFEAGRPU6V7EY7PN4WYYDR

Mac OS X平台的安装设置

http://www.bittorrent.com/sync 下载btsync mac osx端

 

 Linux 平台的安装设置

centos为例

Tutorial – How to set up BitTorrent Sync on a Linux server to create a Dropbox-like syncing solution

Centos Init.d And Install Script

 

 

去年在《凌云》杂志上写过一篇关于DDoS攻防的文章,在线版本可以到官方网站http://storage.aliyun.com/aliyun_portal_storage/lingyun/lingyun-journal-2.pdf查看。当时因为篇幅的原因有些细节没有展开,加上时间过去了大半年,出现了许多新的流行的攻击方式,所以决定写一篇补遗。

一、DRDoS攻击

DRDoS(分布式反射攻击)最早在2004年左右就出现了,安全焦点上还有一份国外的代码,可以在http://www.xfocus.net/tools/200406/717.html下载查看。当时的DRDoS攻击不具备放大流量的能力,某种意义上说类似拿冲锋枪打墙,依靠反射回来的弹壳伤人,攻击力不升反降,因而并没有流行开来。

但是从2013年开始,DRDoS已经是互联网上最流行、最吸引眼球的DDoS攻击手段了,因为它附加流量放大属性,通过史无前例的海量流量击败了如日中天的云安全公司CloudFlare,引得大小黑客纷纷仿效。

DRDoS攻击的原理是黑客伪造成受害者的IP地址,向互联网上大量开放特定服务的主机发起请求,接收到请求的那些主机根据源IP地址将响应数据包返回给受害者。整个过程中,大量的无辜主机完全不知情,成为黑客攻击的帮凶。一般来说,黑客会使用响应包远大于请求包的服务来利用,这样才可以以较小的流量换取交大的流量去攻击,几十倍的放大攻击。能利用来做放大反射攻击的服务,常见的有DNS服务、NTP服务、SNMP服务、Chargen服务等等,甚至某些online游戏服务器也被利用来参与攻击。

1.1. 基于UDP的反射攻击

CloudFlare在2013年遭受的300Gbps的攻击属于DNS反射攻击,当时导致他们全网故障。在2014年2月,它们遭受了前所未见的400Gbps的攻击,黑客使用了NTP服务进行放大。

互联网上有非常多的时间服务器,通过NTP协议提供对时服务。但是它缺乏身份认证手段,可以被任意使用。更重要的是,NTP协议有一个指令monlist可以列举出最近同步过时间的600个主机列表,如下图:

1

攻击者发出的Monlist指令只有1个数据包,耗费几十个字节,而返回包多达几十个,耗费2000-3000字节甚至更大,达到约50倍的放大。越是繁忙的NTP服务器,这个放大倍数越大。

攻击者只需要100Mbps的请求流量,可以换来5Gbps的攻击流量,效率非常高。其它的DNS放大、SNMP放大、Chargen放大与NTP放大原理一致,只是使用的协议有区别,不一一描述。

1.2. 基于TCP的反射攻击

反射攻击利用的协议,一般同时具有3种特征:容易伪造源IP地址、无身份认证、响应包远大于请求包。因此,基于UDP的DNS协议、NTP协议、Chargen协议、SNMP协议成为首选。那么,是不是只有基于UDP的上层协议才能够用来做放大反射攻击,需要完成三次握手才能开始业务会话的基于TCP的上层协议就无法利用了?其实不是。

Chargen是一个常见的测试网络连通性服务,同时工作在UDP协议和TCP协议上。对于它监听的TCP端口,只要有客户端连上,就会源源不断的向客户端返回随机字符串,永不停止。可以想象,如果这个东西可以利用起来做攻击,无穷倍数的放大,是何等厉害。但是很遗憾,TCP不能伪造源IP地址,除非攻击者能够让攻击目标主动连接到Chargen的TCP端口去。

这种事情,恰好是代理协议做的事情!如果攻击目标是HTTP Proxy或者Socks5 Proxy,攻击者只需要连接上目标的代理端口,然后去访问Chargen服务并保持TCP连接不断掉就行了。以HTTP代理为例,直接连接target的3128端口,然后发出类似http://chargen_server.com:19这样的请求即可,socks5代理类似。

使用Chargen攻击代理服务器效果虽好,但是毕竟应用范围比较狭窄,一般的攻击目标都是网站。黑客的创意在这儿展露无遗,他们也有各种新奇的手法,比如利用Google的某些服务或者Wordpress之类的博客来做DDoS攻击。

Google有一个叫做FeedFetcher的爬虫,为Google Feed API提供后端支持,会定期抓取RSS以及其它各种数据,如他们的电子表格服务spreadsheet中的链接。当电子表格服务中存在内容=image(“http://example.com/image.jpg”)时,Google就会“派出”FeedFetcher爬虫去抓取这个图片并保存到缓存中以将其显示出来。

恶意攻击者会找一个较大的文件,给文件名附加上随机参数,使FeedFetcher多次抓取这个文件。也就是说,如果一个网站有一个10MB的文件,将以下列表输入到Google spreadsheet中,那么Google的爬虫就会抓取该文件1000次,使网站产生大量出站流量。

=image(“http://targetname/file.pdf?r=0″)

=image(“http://targetname/file.pdf?r=1″)

=image(“http://targetname/file.pdf?r=2″)

=image(“http://targetname/file.pdf?r=3″)

=image(“http://targetname/file.pdf?r=1000″)

如果是带宽比较小的站点,面对这种攻击时会非常痛苦。拦截会影响SEO效果,不拦截则需要付出更多的带宽租赁费用。

基于类似的原理,Wordpress博客的pingback功能也可以用来做反射攻击。PingBack是用来通知blog系统有文章被引用的一种手段。向

http://www.anywordpresssite.com/xmlrpc.php

提交POST请求, 数据格式如下:

<methodCall><methodName>pingback.ping</methodName><params><param><value><string>http://victim.com/post.php?id=1</string></value></param><param><value><string>http://www.anywordpresssite.com/pst?id=111</string></value></param></params></methodCall>, 则服务器www.anywordpresssite.com会向http://victim.com/post.php?id=1发起GET请求。如果攻击者同时向大量的开启了pingback的blog系统提交请求,则有大量的GET请求涌向攻击目标,更多的更多细节可以参见http://drops.wooyun.org/news/1062

但是就我看来,pingback这样的反射攻击意义不大,因为流量和请求次数都没有被放大,如果单纯是为了隐藏自己,可以选择通过proxy的方式发起攻击。更好的做法应该是向某个开启了pingback的blog a发送大量的POST包(这里的POST包通过代理发起),让它去ping大量的blog,然后大量的http response会同攻击者发起的POST包一起淹没blog a,这才是优雅的反射放大攻击——付出的代价是这种攻击方式仅对有pingback功能的系统起作用。

1.3. DrDoS的防御

TCP的反射攻击有可能发生,但是危害程度远不如UDP,而且发起难度较大,需要很多诡异的条件配合。因此,防御上无需做过多考虑,将目光主要集中到基于UDP的反射放大攻击。

首先,我们需要足够大的带宽,没有带宽一切都枉然。一般的,带宽可以通过CDN的方式提供,将业务分散到不同地区的不同机房。

其次,从DRDos的本质知道,这种反射攻击数据包的源端口一定是固定的,NTP放大攻击源端口一定是UDP 123端口,DNS放大攻击源端口一定是UDP 53端口。这其实是一个很好的特征,也是攻击者不愿意却不得不留下的特征——有得到就有代价。在带宽足够的情况下,可以在网络边界部署ACL策略,禁止外网进来的源端口是UDP 123的报文,禁止外网进来的源端口是UDP 161的报文,禁止外网进来的源端口是UDP 19的报文,诸如此类。源端口是UDP 53的也可以过滤?也可以的,至少大部分IP地址可以无需请求外部的DNS服务。

这里涉及到一条防御准则,可以三层过滤的不要在四层做,可以在四层做的过滤不要到七层做。越往上,解析开销越大。

二、高级SYN Flood攻防

1.4. SYN Cookie、SYN Proxy

最常见的SYN Flood防御手段是SYN Cookie和SYN Proxy,它们原理简单,而且效果也非常好。

在正常情况下,服务器端接收到客户端发送的SYN包,会分配一个连接请求块(即request_sock结构)用于保存连接信息,然后发送SYN+ACK包给客户端,并将连接请求块添加到半连接队列中,没收到最后一个ACK的话就轮询重发SYN+ACK包。

对于启用了SYN Cookie的服务器,不会这样处理,它不维持任何连接信息, 而是将源IP、目的IP、源端口、目的端口、SYN序列号等信息进行hash运算,生成一个数字称之为cookie。服务端将这个cookie作为SYN+ACK包的ACK确认号发送给客户端,然后对这个IP发过来的后续ACK包的确认号进行验算,与Cookie吻合的说明是正确的报文,正常建立连接,而攻击的报文直接没有了任何后续动作,也没有额外开销。

SYN Proxy则是管家式的防御,它站在攻击者和目标服务器之间,伪装成目标服务器对所有的SYN报文进行应答,包括攻击者在内。当三次握手正确的建立起来后,就伪装成客户端IP地址与后端的目标服务器建立三次握手,然后转发数据,需要注意的是,TCP三次握手在这里变成了6次握手,而且两个握手内的ACK号肯定不一致,需要做一个修正。

SYN Cookie可以和SYN Proxy无缝集成,协同工作,提供更好的防御服务,基本上100%无误杀。那么使用这种防御手段,付出的代价是什么?

我们可以看到,SYN Cookie和SYN Proxy对每一个SYN包都会进行答复,如果攻击者发送1Gbps的报文过来,防御方会发送1Gbps的报文回去。10Gbps就10Gbps,100Gbps就100Gbps。问题是,企业网络禁得起这种折腾么?基本上,攻击流量达到一定程度,网络不攻自溃。

1.5. 随机丢包

对于过大的反弹流量的问题,安全厂商想出了许多新的办法,那就是在答复之前做一些测试,能轻易过滤的流量就不反弹了。最主要的是随机丢包策略,直接粗暴的丢弃SYN包,按照TCP协议正常的用户会在3秒内重发这个SYN包,攻击流量的源IP是伪造的,因此直接被丢弃了没有任何后续。

这个方案看起来对SYN Cookie之类技术是一个很好的补充,但是也有一些问题。首先,正常用户的体验受到影响,访问业务的速度变慢了。其次是某些高级攻击者可以利用这个手段,绕过防御,简单的说,同样的SYN包发两次有可能被判定为正常访问。一旦被防御设备加入白名单,后续的报文就直接漏过了。

1.6. 反向探测

除了SYN Cookie、Proxy技术之外,还有一种反向探测的技术,也是颇为流行。防御设备接收到SYN包时,回复一个ACK确认号错误的SYN+ACK报文。按照协议,客户端会发一个RST报文过来重置连接。攻击者一般是伪造源IP地址,没有人会帮他做这个应答,SYN包被直接过滤掉。

这个方案,在实际环境中会遇到一些问题。某些防火墙设备,包括iptables,会过滤掉ACK号错误的SYN+ACK包,导致正常用户的RST包发不过来而导致被误杀。因此,考虑到稳定可靠,防御设备回复的SYN+ACK包的ACK确认号需要满足某些特征,比如小于或者等于SYN确认号。

对于攻击者而言,他们可以通过tcp ping的方式扫描到真实存活的主机列表,然后使用这些IP地址作为源IP地址发起攻击,可以有效绕过这种防御手段。虽然一般的攻击是要伪造不存在的源IP以达到更好的效果,但是这里则要反其道而行之。

三、总结

总之,DDoS的防御和攻击都是一件非常精巧的事情。要优雅的攻击,优雅的防御。各种手法有符合常规的,也有要违背常规的。运用之妙,存乎一心。

四、后记

NTP攻击的图片来自网络,更多细节可以参见:

http://www.prolexic.com/kcresources/white-paper/white-paper-snmp-ntp-chargen-reflection-attacks-drdos/An_Analysis_of_DrDoS_SNMP-NTP-CHARGEN_Reflection_Attacks_White_Paper_A4_042913.pdf

基于Google的攻击来自freebuf,参见:

http://www.freebuf.com/articles/web/28273.html

原文来自阿里云产品博客

http://blog.aliyun.com/250