在centos建立你自己的Passive DNS收集系统
目录
一 :名词解释
二:安装前的环境搭建
三:安装Bro
四:安装配置mysql
五: 运行Bro
一.名词解释
什么是被动DNS(Passive DNS)?
根据isc.org的描述,被动DNS最初于2004年由Florian Weimer发明,旨在对抗恶意软件。根据其定义,递归域名服务器会响应其接收到的来自其它域名服务器的请求信息,然后对响应信息进行记录并将日志数据复制到中央数据库当中。
从实践的角度出发,收集与分析被动DNS(Passive DNS)数据能够帮助我们识别恶意站点并对抗钓鱼及恶意软件。这到底意味着什么呢?实际上,这就是一个存储了大量DNS解析数据的历史数据库。这意味着你可以查询到某一域名曾经解析过的IP地址。即使这一域名已经从域名服务器中移除了,你也可以查询到相关的信息。
当接收到查询请求时,域名服务器会首先检查自身缓存以及权威数据以获取请求所需的内容。如果解析内容尚不存在,则会进一步查询root域名服务器作为参考直到找出能够提供相关查询结果的验证域名服务器,最后查询其中的验证域名服务器来进行结果检索。值得注意的是,大部分的被动DNS数据会在“高于”检索域名服务器的位置被立即捕获。
这也就意味着,被动DNS数据大多由来自互联网上验证域名服务器的参考与查询结果构成(当然,其中也包含部分错误信息)。这部分数据拥有时间戳,经过重复数据删除与压缩,而后被复制到中央数据库内以备归档与分析。需要注意的是,整个流程捕捉到的是服务器到服务器之间的通信内容,而非来自存根解析器并指向递归域名服务器的查询内容。
我们为什么要使用被动DNS?
当我们需要进行事件响应调查时,你就会发现被动DNS是非常有用的。
各类企业都会采用不同的数据库来容纳被动DNS“传感器”所发来的上传数据。目前人气最高且最为知名的当数Farsight Security公司所打造的被动DNS数据库——DNSDB。在这一DNSDB中包含有多年以来由全世界范围内所有传感器收集而来的数据。对被动DNS数据库进行查询能够提供大量极具实用价值的信息。举例来说,大家可以通过查询被动DNS数据库来查找与某一网站相关联的DNS查询记录,或者自某一时间开始该网站曾经使用过哪些域名服务器,又或者另有哪些其它区域在使用同一套域名服务器。更进一步来讲,大家也可以选择某个已知的恶意IP地址,并查询各被动DNS传感器最近映射至该IP地址的全部相关域名服务器。
被动DNS::客户端-不同的服务器
被动DNS::客户端可以支持不同的被动DNS服务器:
l BFK.de
l Mnemonic
l PassiveDNS.cn
l CIRCL
l VirusTotal
l PassiveTotal
l DNSDB
二.安装前的环境搭建
依赖关系
1.在开始之前,Bro需要安装以下库和工具:
Libpcap (http://www.tcpdump.org)
OpenSSL libraries (http://www.openssl.org)
BIND8 library
Libz
Bash (for BroControl)
Python 2.7 or greater (for BroControl)
2.从源代码构建Bro,需要以下额外的依赖关系:
CMake 2.8 or greater (http://www.cmake.org)
Make
C/C++ compiler with C++11 support (GCC 4.8+ or Clang 3.3+)
SWIG (http://www.swig.org)
Bison (GNU Parser Generator)
Flex (Fast Lexical Analyzer)
Libpcap headers (http://www.tcpdump.org)
OpenSSL headers (http://www.openssl.org)
zlib headers
Python
3.要安装所需的依赖项,可以使用:
RPM/RedHat-based Linux: sudo yum install cmake make gcc gcc-c++ flex bison libpcap-devel openssl-devel python-devel swig zlib-devel (#管理员模式下安装下列软件,安装时保证网络的稳定。)
4.可选依赖关系
如果在构建时找到它们,Bro可以使用一些可选的库和工具:
C ++ Actor Framework(CAF)版本0.14(http://actor-framework.org)
LibGeoIP(用于地理位置分配IP地址)
sendmail(启用Bro和BroControl发送邮件)
curl(由实现活动HTTP的Bro脚本使用)
gperftools(tcmalloc用于提高内存和CPU使用率)
jemalloc(http://www.canonware.com/jemalloc/)
PF_RING(仅限Linux,请参阅群集配置)
ipsumdump(用于trace-summary;http://www.cs.ucla.edu/~kohler/ipsumdump)
三.安装Bro
1.具体命令如下:
> yum update && apt-get upgrade
> yum install cmake make gcc g++ flex bison libpcap-dev/ (因为前面已经将环境搭建好了,所以这里可以自己运行)
/libgeoip-dev libssl-dev python-dev zlib1g-dev
/libmagic-dev swig2.0
> wget https://www.bro.org/downloads/release/bro-2.4.1.tar.gz (#从 xxx网站下载安装包)
> tar -xvzf bro-2.4.1.tar.gz (#解压压缩包)
> cd bro-2.4.1 (#进入目录)
> ./configure --prefix=/nsm/bro (#configure,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure –prefix=/nsm/bro意思是将该软件安装在 /nsm/bro 下面,执行文件就会安装在/nsm/bro/bin(而不是默认的 /usr/local/bin),资源文件就会安装在/nsm/bro/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 –sys-config= 参数进行设定。有一些软件还可以加上 –with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。)
> make (#make,这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。)
> make install (#make insatll,这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。)
> export PATH=/nsm/bro/bin:$PATH
2.现在我们可以开始运行Bro了:
>broctl
[BroControl]install
[BroControl]start
[BroControl]status
四.安装配置mysql
1、配置YUM源
在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/
# 下载mysql源安装包shell> wgethttp://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm# 安装mysql源shell> yum localinstall mysql57-community-release-el7-8.noarch.rpm
检查mysql源是否安装成功
shell> yum repolist enabled| grep "mysql.*-community.*"
看到上图所示表示安装成功
shell>yum install mysql-community-server
shell> systemctl start mysqld
4、开机启动
shell> systemctl enable mysqldshell> systemctl daemon-reload
mysql安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改:
shell> grep'temporary password'/var/log/mysqld.log
shell>mysql-uroot-pmysql>ALTER USER'root'@'localhost'IDENTIFIEDBY'MyNewPass4!';
或者
mysql>setpasswordfor'root'@'localhost'=password('MyNewPass4!');
注意:mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements错误,如下图所示:
通过msyql环境变量可以查看密码策略的相关信息:
mysql> show variableslike'%password%';
validate_password_policy:密码策略,默认为MEDIUM策略 validate_password_dictionary_file:密码策略文件,策略为STRONG才需要 validate_password_length:密码最少长度 validate_password_mixed_case_count:大小写字符长度,至少1个 validate_password_number_count :数字至少1个 validate_password_special_char_count:特殊字符至少1个上述参数是默认策略MEDIUM的密码检查规则。
共有以下几种密码策略:
策略检查规则
0 or LOWLength
1 or MEDIUMLength; numeric, lowercase/uppercase, and special characters
2 or STRONGLength; numeric, lowercase/uppercase, and special characters; dictionary file
MySQL官网密码策略详细说明:http://dev.mysql.com/doc/refman/5.7/en/validate-password-options-variables.html#sysvar_validate_password_policy
在/etc/my.cnf文件添加validate_password_policy配置,指定密码策略
# 选择0(LOW),1(MEDIUM),2(STRONG)其中一种,选择2需要提供密码字典文件validate_password_policy=0
如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:
validate_password =off
重新启动mysql服务使配置生效:
systemctl restart mysqld
默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接,或者添加一个允许远程连接的帐户,为了安全起见,我添加一个新的帐户:
mysql>GRANTALLPRIVILEGESON*.*TO'用户名'@'%'IDENTIFIEDBY'密码'WITHGRANT OPTION;
修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示:
[mysqld]character_set_server=utf8init_connect='SET NAMES utf8'
重新启动mysql服务,查看数据库默认编码如下所示:
默认配置文件路径:配置文件:/etc/my.cnf 日志文件:/var/log//var/log/mysqld.log 服务启动脚本:/usr/lib/systemd/system/mysqld.service socket文件:/var/run/mysqld/mysqld.pid
8.接下来,我们创建一个数据库使用:
> mysql -u root -p
mysql> CREATE DATABASE pdns;
五: 运行Bro
我们还需要安装其他的一些第三方库,首先我们需要安装‘pip’
> wget https://bootstrap.pypa.io/get-pip.py
> python get-pip.py
接下来我们安装,Bottle库,像下面这样:
> pip install bottle
并且用apt安装SQLAlchemy:
> sudo yum install python-sqlalchemy
我们可以让bro-pdns启动了…首先,我们用git下载bro-pnd,没有的话可以yum安装:
yum-getinstall git
>git clonehttps://github.com/JustinAzoff/bro-pdns.git
接下来,把bro-pdns文件夹移动到’/nsm/bro/share/bro/site’路径下,然后打开’/nsm/bro/share/bro/site’路径下的’local.bro’文件,添加下面这句内容:
@load./bro_pdns
redef PDNS::uri ="mysql://root:password@localhost/pdns";
其中password要改成数据库的密码。然后,我们需要运行`broctl deploy`重启整个系统,并且把新的脚本导入到Bro 。设置下HTTP API,这样的话,你就可以直接调用API来获取domain和IP
BRO_PDNS_DB=mysql://root:pass@localhost/pdns/nsm/share/bro/
site/bro-pdns/bro_pdns.py serve
好了,配置好后,我们就可以正式开始使用它了。你想查询一个站点的信息,你可以向api传递你要查询的域名,就能查到结果了:
> curl http://localhost:8081/dns/www.youtube.com
很显然,用任何你想要查询的IP或者域名替换掉www.youtube.com,就可以了