创建(非常好的)假ncsa组合日志格式access.log文件,用于测试日志使用系统,如splunk、activemq、amazon mq、rabbitmq、kafka、fluentd、flume、pulsar、nifi……

flan的Python项目详细描述


flan:apache或nginx的假(访问)日志

flan是一个python 3.x实用程序,它创建一个或多个伪apache或nginx access.log文件,其中的伪条目基于您提供的真实access.log文件中的条目。名称本身实际上是伪造的:它可以为任何消耗NCSA组合日志格式的日志生成日志,但是FLNCSACLF看起来像是旺卡品牌鼻腔喷雾剂的名称,而不是适当的苦行僧GITHUB项目缩写,所以


功能亮点

  1. 它速度快,速度增强,如回放能力;
  2. 它是真实的,部分地从您提供的一个或多个示例"模板"日志文件生成数据,并使用有效的IP和用户-代理组合,这是有意义的;
  3. 您可以选择保留会话和会话语义,同时混淆它们的原始源;
  4. 在生成的文件中使用不同的流量分布:在指定的开始日期和结束日期之间使用normal(bell curve)、even(random)等;
  5. 您可以包括或不包括bot流量;
  6. 您只能包含实际出现在您提供的模板日志文件中的bot、在野外出现的bot(按实际出现的比例)、两者,或者根本不包含bot;
  7. 您可以只包括模板文件中的用户代理、通用的用户代理(按它们实际出现的比例),或者两者都包括;
  8. 支持并混淆IPv4和IPv6,使用智能规则保证有效的全局IP,同时维护非全局IP,如环回和专用网络,无需混淆;
  9. 写入文件,或将结果流式传输到stdout;
  10. 可选地gzip任何或所有生成的日志文件。
  11. 以交互方式运行,或作为服务/守护程序运行。

支持的模板日志输入源

  • 标准access.log[.n]格式的未压缩文件
  • 标准access.log[.n][.gz]格式的压缩文件
  • 通过企业api进行splunk(来自可自定义splunk查询的日志格式结果)

支持的输出目标

  • 写入/流到stdout
  • 以标准access.log.n格式写入未压缩文件
  • 以标准access.log.n.gz格式写入gzip文件
  • 通过企业api或通用转发器(文本或json)splunk
  • 卡夫卡(文本、json或avro)
  • activemq artemis、amazon mq、rabbitmq、apollo或任何其他stomp 1.x兼容的排队系统(文本或json)
  • fluentd(json)
  • aws sqs(简单队列服务)

真实世界用例

在真实数据上使用Splunk的ML功能进行测试,以查看找到的真实模式,但在受限制的POC实验室环境中进行测试…

正在将访问日志数据从生产splunk索引复制到非生产安全团队限制索引…

同时确保用户、IP和位置匿名性和会话语义!< /P>


背景

我需要一种方法来测试在以下环境中使用access.log条目的某些系统:

  1. 容量/规模很高(数百万用户/会话);
  2. 出于明显的原因,production access.log受到了限制访问的保护;
  3. 日志很难获取(每次都需要多次批准;周期长;生产环境和开发/测试环境之间没有直接、简单的路径等);
  4. 获取日志后,必须对其进行清理,以(无可争议地)全局IP地址和全局IP地址+HTTP用户代理组合的形式进行PII;
  5. 一些特定的用例需要在测试环境中进行测试:合作伙伴、seo等。与某些ip、cidr和/或用户代理的通信量;
  6. 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16上的某些专用网络访问需要按原样测试,而不需要更改。

以及其他一些注意事项。

我在寻找解决办法,但他们缺乏。90%的人生成随机数据,包括无效的IP地址,或者用户代理与真实的用户代理分布不匹配,这对我的即时需求(欺诈研究)很重要。另外10%的人不能处理我的特殊用例,比如保护合作伙伴/搜索引擎优化机器人和私有网络IP。所以,我创造了法兰。

flan每次运行最多生成1 k个test access.log文件,每个文件最多包含1百万条记录。在我的Mac电脑上,它可以在30秒内通过基本设置在详细模式下生成20万条记录,因此在任何OLEC2或GCE服务器上都非常快,包括免费的层内容。


flan在语义上生成与生产环境类似的日志文件

为了确保假日志在语义上与生产日志一样真实,它从您提供的实际生产系统(以下称为"模板日志")中读取一个或多个"template"access.logs。模板日志包含多少记录并不重要,但是模板日志越长,生成的假日志就越真实。如果未使用-p标志(如下所述)指定会话保留,则可以指定要生成的文件和记录数,并且模板日志可以大于或小于生成的日志文件。如果指定会话保留,则生成的日志文件将包含与模板日志文件中包含的记录总数相同的记录数。

要提供多个模板日志文件,请使用通配符;例如,"/var/logs/access.log*"。您的模板日志可能被gzip压缩;如果它们有一个".gz"扩展名,flan将在读取它们时解压缩它们。您可以在通配符规范中混合使用非压缩文件和gzip文件。

您可以指定要生成的access.log文件的数量,以及每个文件的条目。访问日志是使用标准后缀access.log、access.log.1、access.log.2等创建的。

您可以为生成的日志项指定开始和结束日期时间a,这些日志项可以(但不必)匹配模板日志中的日期。但是,不能保证会生成与开始日期和结束日期完全匹配的条目。它们只是保证在您选定的日期之间。

模板日志中的IP地址


全局地址被混淆。IPv4的最后三位(/24)或六位(/16)或IPv6的最后四位(/116)是随机的。这提供了最小的IP混淆,同时最大限度地保留了IP地址中其他有趣的属性,如用户的地理位置、商业与住宅等。

非全局IP(私有、环回等)保持原样。所有生成的IP都保证有效:例如,192.168.0.0是一个网络标识符,从不分配给接口,169.254.0.0/16链接局部变量不可路由,因此它不会使用任何这些值。

m参数允许您使用一对多或一对一映射来混淆IP。一对多将混淆相同的IP到结果日志文件中的一个或多个随机IP。一对一将确保IP"X"在任何给定运行期间每次都被模糊到相同的IP"Y"。运行之间不保留一对一映射。

用户代理

对模板日志中的所有用户代理进行基本的bot或not检查。所有被标识为bot的用户代理都会被提取出来,并有选择地按原样重播到生成的假日志中,其中包含它们的真实原始IP。

真正的设备代理是从最顶级的真实世界用户代理列表中生成的,按出现频率加权,并与模板日志中的浏览器、操作系统和桌面/移动可能性的分布相匹配。如果您的模板日志只包含mobile safari uas,那么您将在生成的日志中看到的只是mobile safari uas。如果你有70%的移动浏览器和30%的桌面所有其他在你的模板日志,你会得到的。

你可以控制你得到的机器人和非机器人无人机的比例(目前,这是硬编码到我使用的,21.9%的机器人和78.1%的其他东西,但这很容易改变)。您可以选择包含在提供的user-agents.json文件中的常见bot列表中的bot,也可以选择仅包含模板文件中的bot,或者选择不包含bot。-u和-b命令行参数控制出现的机器人程序。有关详细信息,请参见命令行参数说明。


IP/用户代理示例

  1. 一个IP为123.4.5.6的模板日志条目chromebook mac ua被扩展到一个或多个生成的条目,ip s的范围为123.4.5.0/24(bc it's global)+chromebook mac ua

  2. 一个带有IP 10.1.2.3、Linux、curl UA的模板日志条目被扩展到一个或多个具有IP 10.1.2.3(BC它是私有的)的生成条目+相同的Linux curl UA

  3. googlebot保持googlebot:相同的ua,ips


时间分布

您可以指定要在日志中显示的总时间分布,其中之一:

normal
指定应生成条目的正态分布,以开始和结束日期时间之间的中点时间为中心。这是默认设置,因为大多数现实世界的Web访问遵循自然的唤醒/睡眠周期。

偶数指定使用随机(偶数)分布。如果您是一家国际公司,并且没有一个时区唤醒/睡眠周期控制您的网站/应用程序的使用模式,则您可能希望使用此功能。


它生成多少条记录?

如果不是连续流式传输(未指定-c)
如果要将输出写入文件:
< Buff行情>

生成的条目总数等于-n参数值乘以-r参数值,在-s和-e参数开始和结束日期时间之间指定的时间范围内分布在选定的分布中。

或者如果要将输出流传输到stdout、kafka、splunk或其他流目标:
< Buff行情>

生成的条目总数等于-r参数值,在-s和-e参数开始和结束日期时间之间指定的时间范围内分布在选定的分布中。

如果您是连续流媒体(指定了-c)
< Buff行情>

忽略-e end datetime,flan流记录,直到达到settings.r_max(100000000),或者您按ctrl-c或关闭服务,或者直到它达到unix maxdate,或者您耗尽内存或其他东西,然后它出错:-)。指定--减慢速度。

注意:从v0.0.31开始,会话保留(-p)不再将生成的记录数限制为模板日志的大小。


从资源角度看,这要花多少钱?

内存是flan使用的主要资源。内存消耗主要受两个因素影响:

  1. 使用的模板日志文件的大小,特别是其中唯一的用户代理字符串的数目,以及;

  2. 需要在内存中缓存整个时间分布周期,以便在运行时"保持分布的形状"。-s和-e之间的秒数决定了此操作使用了多少内存。

一个500k的记录模板日志文件,其-n 10-r 100000在我的mac上使用的内存不足1gb。你的结果可能不同。使用flan的--profile开关查看内存消耗。

磁盘使用(如果使用的是文件模式)高度依赖于用户代理和请求路径的长度。对于我的测试文件,使用-n 10-r 1000000,我可以为每个文件获得大约250MB的存储空间,总共有2.5GB的磁盘空间。

CPU周期主要由我添加的隐藏比特币矿工占用(只是开玩笑…flan不是特别占用cpu的)。

总体P>运行时取决于开始日期和结束日期之间的时间范围、模板日志的大小以及生成的记录总数。较大的模板日志可以创建更精确的输出数据,但解析时间较长,尤其是遍历和模糊所有用户代理,因为它们是非常自由的形式,通常是很长的字符串。使用重播模式可最小化模板日志分析时间。安静模式也会减少运行时间。

我目前不支持跨时间分布时段边界保存会话。这意味着我必须同时缓存多个时间分布周期,这只会消耗内存。因此,例如,从午夜开始到结束日期之间的3天范围,使用正态分布和会话保留,创建了一个"3驼峰"模式,鞍在午夜,峰值在中午,会话保留在每天/驼峰内,但不跨越天/驼峰。

说明

flan是在python 3.7上开发和测试的(截至2019年7月)。它还没有在其他版本上测试过。

依赖关系

< Buff行情>

努比
python dateutil
吡喃<Br/> 服务
ua解析器
用户代理
BOTO(如果使用AWS集成)
合流卡夫卡(如果使用卡夫卡集成)
fluent记录器(如果使用fluentd集成)
splunk sdk(如果使用splunk集成)
stomp.py(如果使用stomp mq集成)

安装

来自PIP

PIP安装法兰

来源于
  1. 下载并将所有*.py文件、*requirements.txt文件和(可选)user-agents.json解压到您选择的安装目录。如果不运行单元测试,则不需要tests文件夹或其内容。这个练习留给读者。

  2. (可选)设置python 3.7virtualenv并激活它。这个练习留给读者。

  3. 安装依赖项要求。您可以选择首先注释掉不需要的任何集成依赖项:

    pip install-r requirements.txt

  4. 运行setup.py:

    python setup.py安装

    选项:如果您(可能)希望以后卸载,请改为使用此命令记录安装过程中在本地创建的文件:

    python setup.py install--记录flanstalledfiles.txt

  5. 运行:

    flan[arguments]template.log outputdir

卸载

xargs rm-rf<;flanstalledfiles.txt

更新

卸载,然后使用上面列出的相同安装说明重新安装。


语法和参数

交互模式(使用命令行参数)

文件输出:

flan -n <number of files to write> -r <number of records per file> [arguments] templatelogspec outputdir

流输出:

flan -c [-o outputtarget] [--pace] [arguments] templatelogspec
服务/后台程序模式(使用flan.config.yaml)
flan [ start | stop | status ]
通过参数和配置控制法兰

对于服务模式,请使用flan.config.yaml而不是命令行参数。每个条目将一对一映射到下面的一个参数。quiet(-q)、stats(-stats)、profile(-profile)和overwrite(-w)在服务模式下设置为固定默认值,如果在flan.config.yaml中设置,则忽略这些值。在交互模式下忽略flan.config.yaml。

<表><广告>命令行参数 定义 默认值 < /广告><正文>-a如果指定,请在模板日志中的任何(即第一个)不可解析条目上停止。跳过所有不可分析的条目-b,
——botfilteriff-u设置为"all"或"bots",定义哪些bot出现在生成的日志文件中,其中之一:



all=使用模板日志和user-agents.json文件中的bots。已查看-c连续流模式。如果启用,则忽略-e设置,并连续传输条目,直到达到settings.r_max。-必须指定o。不可用于文件输出。无连续流媒体-d,
—— 定义时间戳在结果条目的期间("形状")的分布。其中之一:

normal=对时间维度使用以开始和结束日期时间中间为中心的正态分布;

random=使用随机("喷枪爆炸")分布。正常-e,
-end指定要用于生成的日志项的结束日期时间。所有日志项在此日期或之前都有时间戳。明天午夜本地/服务器时间-f,
-ipfilter如果提供,这应该用引号指定一个或多个可选IP和/或CIDR范围,模板日志文件中的所有条目都必须匹配才能用于生成输出日志。将只使用包含与其中一个或多个IP匹配的IP的行。在此处用逗号分隔一个或多个IP或CIDR;例如,'--ipfilter"123.4.5.6145.0.0.0/162001:db8:)/48"。在生成输出日志时,使用所有符合条件的模板日志行及其IP。-g,
-gzipgzip支持。它与传递的-n值一起使用,指定开始对生成的日志文件执行gzip操作的文件索引号。它必须介于0和提供的-n值之间。例如,"-n 5-g 3"生成名为"access.log"、"access.log.1"、"access.log.2.gz"、"access.log.3.gz"和"access.log.4.gz"的日志文件:总共5个文件,其中最后3个是gzip文件。0;不发生gzipping。-h在命令行中打印这些选项。-i
-inputsource输入源,其中之一:


file s=load template log(s)from one or more files as controlled by the flan.files.yaml config file's"import"section;


splunk=load template logs from the ncsa combined log format entries from the splunk server and index specified在flan.splunk.yaml文件的"导入"部分。文件-inputformat模板日志文件中每一行的格式(有效的NCSA组合日志格式字符串)。'$remote_addr-$remote_user[$time_local]"$request"$status$body_bytes_sent"$http_referer""$http_user_agent"-j连续流周期。如果使用连续流(-c),则以秒为单位定义单个时间分布周期的长度(1d=正好是24小时;不考虑闰分钟或闰日)。如果使用正态分布,则分布会如此长,且峰值位于正态分布的中间。86400秒(1天)-k如果指定,请在每个生成的日志条目行的开头和结尾添加单引号。不要添加引号。-l,
——linedelimiter要附加到所有生成的日志项的行分隔符,其中之一:

[n one,no,false,n,f];
[comma,c];
[tab,t];
cr;
lf;
crlf。CRLF-m,
-ipmapping定义如何混淆IP,其中之一:

otm24=将一个IPv4映射到最多255个IPv4/24地址,或将一个IPv6映射到最多约65K个IPv6/116地址(会话销毁);


oto24=将一个IPv4/IPv6地址映射到同一/24或/116块中的一个IPv4/IPv6地址(session preserving);

oto16=将一个IPv4/IPv6地址映射到同一/16或/116块(会话保留)内的一个IPv4/IPv6地址;

off=不混淆IP(会话保留)。

如果指定了-p,"oto24"。如果未指定-p,"otm24"。-meta替换旧的--stats参数。收集并发出(最后)元数据,以及生成的所有日志项的每小时累计计数。使用此选项可标识日志文件的源,并验证所选分发版的分布。不会发出meta。-n,
——numfiles要生成的access.log文件总数。最小值=1,最大值=1000。示例:'-n 4'在输出目录中创建access.log、access.log.1、access.log.2和access.log.3。-nouatag如果指定,则从生成的日志文件的用户代理值中排除"flan/<;version>;"(https://bret.guru/flan" rel="nofollow">https://bret.guru/flan)。将flan ua标记附加到所有生成的ua。-o流模式输出目标。如果指定,则忽略输出目录和-n标志值,并将所有输出流传送到指定目标。其中之一:

fluentd=流到fluentd远程,如flan.fluentd.yaml配置文件的"导出"部分中定义的




stdout=流到stdout没有流输出。输出将写入提供的输出目录中的文件。-outputformat生成的日志中单个发出条目的格式。有效的NCSA组合日志格式字符串,或两个特殊值之一:

json=以json格式发送条目;

'$remote_addr-$remote_user[$time_local]"$request"$status$body_bytes_sent"$http_referer""$http_user_agent"-p会话保存。如果指定,则通过在生成的日志中维护模板日志中请求路径的时间索引顺序,并为模板日志中找到的每个IP保留相同的UA POST IP模糊处理来保留会话。-m ipmapping设置必须设置为"onetoone"或"none"。没有会话保存。请求路径在生成的时间分布中随机分配,破坏会话。速度踱步。如果指定,则在生成日志项时将生成的日志记录中的时间戳与当前时钟时间同步,以便以明显的"实时"方式发出日志项。日志时间戳中的每一秒对应于实时排放时间的一秒。默认设置为无速度调整;尽可能快地发出条目。-q巴什式的标准输出。普鲁斯特喜欢标准输出。-r,
-records每个生成的日志文件要写入的条目数。最小值=1,最大值=100米。如果指定了-c,则为100000000如果未指定-c,则为
10000 -s,
——start指定要用于生成的日志项的开始日期时间。所有日志项在或AFTE上都有时间戳r此日期。今天午夜本地/服务器时间-t,
-timeformat要在生成的日志文件中使用的时间戳格式,不包括时区(请参见-z参数),采用python strftime格式(请参见http://strftime.org/" rel="nofollow">http://strftime.org/)。'%-d/%b/%y:%h:%m:%s'-u,
-uafilter定义将出现在生成的日志文件中的用户代理类型,其中之一:



所有-v打印版本号并立即退出。-w如果指定,则覆盖已存在的任何生成的日志文件。这张支票是在写任何东西之前开的。如果已经存在错误,则返回错误,保留所有错误不变。-x,
——regex自定义正则表达式匹配。指定要用作模板日志中条目的逐行筛选的自定义正则表达式。日志生成中只包括与正则表达式匹配的行;不匹配的行将被排除。模板日志文件中所有符合条件的行都用于生成日志。—年重播日志记录。如果指定,则启用重播日志。重播日志记录在第一次执行时解析模板日志文件,并将解析的结果存储在与flan.py位于同一目录的二进制"flan.replay"文件中。在随后的执行中,flan将加载已经解析的重播日志,而不是重新解析模板日志文件,从而在重复使用相同的大型模板日志时节省大量时间。一旦创建,重播日志就不会被覆盖或删除;如果需要,请先手动删除它,以便在下次flan运行时重新创建它。如果存在重播日志但未指定-y,则将忽略重播日志(既不读取也不覆盖)。不要使用重播日志;每次都分析模板日志,并忽略任何现有的重播日志。-z,
——timezonehhmm格式的时区偏移量,用于附加到生成的日志文件中的时间戳,或传递""以指定无时区。您当前的本地/服务器时区。

在哪里可以使用access.log文件进行测试?

测试日志文件位于"测试"文件夹中。

这是另一个资源:

https://gist.github.com/rm hull/bd60aed44024e9986e3c

或者,只需谷歌"example access.log files"。


未来的增强功能

当然:

  1. 集成:各种aws服务,google云发布/订阅,redis发布/订阅,apache flume,apache pulsar,apache nifi…如果您想要集成、询问或提交PR。

可能:

  1. 能够指定特定cidr、asnum块、ip范围等的生成。这有特定的用例;

  2. 能够将自定义数据注入到用户代理字段中,或以特定方式(将用户代理映射到另一个用户代理)更改用户代理以进行下游标记/检测;

  3. 支持特定用例的其他时间分布。示例:模拟不太可能的事件/ddos的重尾poisson分布、模拟api/restful活动的离散/退化分布等。有关注意事项,请参见:
    https://en.wikipedia.org/wiki/web_traffic
    https://www.nngroup.com/articles/traffic log-patterns
    https://en.wikipedia.org/wiki/traffic_generation_model
    https://en.wikipedia.org/wiki/list\u of\u probability\u发行版


引文

crawler-user-agents.json版权所有(c)2019 martin monperrus
https://github.com/monperrus/crawler-user-agents/blob/master/crawler-user-agents.json


免责声明

本软件中包含的材料按"原样"提供给您,无任何形式的明示、暗示或其他保证,包括但不限于任何特定用途的适用性保证。您对本软件的全部或部分使用表明您同意,对于任何形式的直接、特殊、附带、间接或后果性损害,或任何损害,包括但不限于利润损失、使用损失、节省或收入损失,我不对您或任何其他人负责。,或第三方的索赔,无论我是否已被告知此类损失的可能性,无论是由何种原因造成的,以及根据任何责任理论,由本软件的拥有、使用或性能引起的或与之相关的。

欢迎光临!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java编译器不保留泛型方法注释?   从文件自定义jcomponents保存和加载java   java数组将Null作为值忽略   MySQL和Java应用程序之间的重音问题   java PDF Box创建零字节PDF   json在java中修改JSONObject,获取ConcurrentModificationException异常   java Android Maven无法解析配置的依赖项   java spring框架类读取器异常   java Grails Spock从未声明的HrowableException服务引发异常   安卓中的java改型在json中使用对象而不是数组   java无法在Raspberry Pi(Arch Linux)上获取网络摄像头图像   java使用Thinten、LocalDate获取月份的第一天和最后一天   java ArrayList向第三层添加元素