hyperscan在IDS和IPS产品中的应用 – 作者:stan1y

hypercan简介

hyperscan是基于intel的高速正则表达式匹配引擎,这个基于状态机(Automata)的引擎经过了多年开发经过不断优化与完善,效率非常之高,虽然没有pcre等对正则语法支持全面,但非常适用于网络设备。用户可以在网络设备数据面(Data Plane)使用hyperscan进行规则匹配,实现高性能DPI/lPS/IDS等应用

开源代码:https://github.com/01org/hyperscan

环境要求

GCC, v4.8.1 or higher

Clang, v3.4 or higher (with libstdc++ or libc++)

Intel C++ Compiler v15 or higher

依赖的库

Dependency

Version

Notes

CMake

>=2.8.11

Ragel

6.9

Python

2.7

Boost

>=1.57

Boost headers required

Pcap

>=0.8

Optional: needed for example code only

gcc 版本必须大于v4.8.1

下载 wget ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.bz2下载源码包

# tar -jxvf gcc-4.8.2.tar.bz

# cd gcc-4.8.2.tar.bz2

# ./contrib/download_prerequisites     执行中会下载3个包,mpfr、gmp、mpc,

编译安装gmp

# cd gmp &&  mkdir build &&  cd build/

#  ../configure –prefix=/usr/local/gcc/gmp-4.3.2  &&  make && make install

编译安装mpfr

#  cd ../../mpfr && mkdir build && cd build/

# ../configure –prefix=/usr/local/gcc/mpfr-2.4.2 –with-gmp=/usr/local/gcc/gmp-4.3.2 && make&&make install

编译安装mpc

# cd ../../mpc && mkdir build && cd build

# ../configure –prefix=/usr/local/gcc/mpc-0.8.1 –with-mpfr=/usr/local/gcc/mpfr-2.4.2 –with-gmp=/usr/local/gcc/gmp-4.3.2 && make && make install

添加共享库路径

# vim /etc/ls.do.conf    加入如下内容

/usr/local/gcc/gmp-4.3.2/lib

/usr/local/gcc/mpfr-2.4.2/lib

/usr/local/gcc/mpc-0.8.1/lib

保存退出,执行ldconfig

编译gcc

# cd ../../

# mkdir build

# cd build

# ../configure –prefix=/usr/local/gcc –enable-threads=posix –disable-checking –enable-languages=c,c++ –disable-multilib

# make && make install

# yum remove gcc gcc-c++ && updatedb 卸载旧版本

# 链接到新版本

# cd /usr/bin && ln -s /usr/local/gcc/bin/gcc gcc  && ln -s /usr/local/gcc/bin/g++ g++

Cmake安装

可以查看是否安装cmake

# rpm -qa | grep cmake

cmake-2.8.12.2-4.el6.x86_64

ragel安装

下载并安装ragel

#tar zxvf ragel-6.9.tar.gz && cd ragel-6.9  &&  ./configure &&  make && make install

python版本升级(编译boost的时候需要2.7版本的python)

升级python至2.7

# wget http://www.python.org/ftp/python/2.7.3/Python-2.7.2.tgz

# mkdir /usr/local/python-2.7.2,之后编译安装,指定prefix为新建目录。

# ./configure –prefix=/usr/local/python-2.7.2

# make && make install

# mv /usr/bin/python /usr/bin/python_old

# ln -s /usr/local/python-2.7.2/bin/python2.7 /usr/bin/python

# python -V    验证版本是否正确2.7.2

pcap安装

查看系统是否安装pcap

# rpm -qa | grep pcap

libpcap-1.0.0-6.20091201git117cb5.el6.x86_64

boost安装

下载安装包

# tar -xvf  boost_1_60_0.tar && cd boost_1_60_0

#  ./bootstrap.sh    ## 生成了bjam 和b2 安装工具

#  ./b2

#  ./b2 install

hyperscan安装

# wget https://codeload.github.com/01org/hyperscan/tar.gz/v4.3.0

# tar xvzf v4.3.0  && cd hyperscan-4.3.0/ && mkdir hs_build  &&cd hs_build

# cmake ../../hyperscan-4.3.0

#  cmake –build .

#  make install

hyperscan验证

# ./bin/unit-hyperscan   验证hyperscan,提示libstdc版本问题。

#  ./bin/unit-hyperscan: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15′ not found (required by ./bin/unit-hyperscan)

# 解决方法

# find / -name libstdc++.so.6

/usr/local/gcc/lib64/libstdc++.so.6

/usr/lib64/libstdc++.so.6

# cd /usr/lib64/ && mv libstdc++.so.6 libstdc++.so.6_bak

# cp /usr/local/gcc/lib64/libstdc++.so.6.0.18 /usr/lib64

# ln libstdc++.so.6.0.18 libstdc++.so.6

#运行测试程序./bin/unit-hyperscan  OK出现下面的提示

1607307003_5fcd8efbdd192d03e3fd1.png!small

hyperscan设计目标

高性能,包括正常应用场景和边界条件下

较小的database(正则表达式编译后形成的数据)

运行于流模式时,较小的流状态数据(stream state) 。这种模式下每条流都要维护自己的流状态。

另外,还有一些设计要求或限制:

运行库必须以C实现,因为一些数据面环境不支持C++

不可以在运行时任意请求内存,用到的内存仅包 括database、匹配临时数据(scratch)和流状态(在流模式下)。

database必须是平面化(flat)的内存布局,以便可以序列化/反序列化,或者可以内存中的一处移动到另一处(这意味着内部不能含有指针)

重要概念

编译:就是将多个正则表达式编译为hyperscan database,调用编译接口时可以传入一些flags和mode等参数,控制匹配行为和运行模式,主要API:

hs_compile()

hs_compile_multi()

hs_compile_ext_multi()

匹配:就是基于编译好的database,对数据进行匹配,并得到匹配结果。

hyperscan在进行匹配时需要有一个临时数据(scratch),这块数据需要在数据面运行前就分配(不在运行时分配和释放,保证性能),且需要保 证同一时刻仅有一个匹配过程在使用同一块临时数据。

如果使用流模式,还需要预先为每个流分配流状态数据。

运行模式主要有3个:BLOCK、STREAM和VECTORED。

BLOCK模式就是对多个数据块分别进行匹配;

STREAM模式 将特定的一组数据库视为一个STREAM,为每一个STREAM维护状态信息,它可以跨数据块进行匹配;

VECTORED模式可以一次匹配多个数据块。使 用不同模式参数编译的database在匹配时不能混用。

匹配的API主要有

hs_scan()

hs_scan_vector()

hs_scan_stream()

1607307045_5fcd8f257526696b12c79.png!small

配置文件

后台配置文件hyperscan.conf 举例:

-desc this is a config file of pcre rule

-name pcre_rule

-offset 1

-depth 10

-min_payload 100

-relation 1

-action 13

-pattern ^01aa*

参数说明

desc

合法字符串

正则防护规则的描述

name

合法字符串

正则防护规则的名称

offset

整型

匹配报文payload的偏移(tcp头以后的偏移)

depth

整型

正则匹配的长度,即从offset处开始匹配的长度

min_payload

整型

最小的payload长度

relation

整型

防护组的ID??

pattern

合法正则表达式字符串

正则表达式,注意每一个防护组最多配置5个正则规则

action

整型

匹配了正则需要执行的动作:

SC_FW_DROP,SC_FW_ACCEPT,ACL_DROP_ADDBLACK,ACL_DROP_SENDRST

1607307122_5fcd8f725566be58f3297.png!small

IPS/IDS防护引擎中的应用

正则扫描范围

TCP报文基于tcp头之后的特定偏移开始扫描正则匹配

基于防护组配置正则规则

每个防护组单独编译数据库

支持基于字符串和十六进制字节流2种匹配方式

匹配的要素

offset

depth

pattern

min_payload

action

性能相关

按照官方给出的测试实例pcapscan

测试例子:

报文2,261,924个报文,配置正则规则10000条

Streaming mode:

database compiled in 0.170277 seconds.

Total matches: 0

Match rate:    0.0000 matches/kilobyte

Throughput (with stream overhead): 674.86 megabits/sec

Throughput (no stream overhead):   674.89 megabits/sec

Block mode:

database compiled in 0.588633 seconds.

Total matches: 0

Match rate:    0.0000 matches/kilobyte

Throughput:    1074.08 megabits/sec

1607307163_5fcd8f9b218d5e6a6b332.png!small1607307189_5fcd8fb53706a79676d0b.png!small

来源:freebuf.com 2020-12-07 10:08:19 by: stan1y

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论