扫描文本文件以查找敏感(或非敏感)数据。
txtferret的Python项目详细描述
txtferret
使用python识别和分类文本文件中的数据。
说明
定义:txtferret
- 像黄鼠狼一样的哺乳动物,以啮齿动物为食…显然还有社保号码, 信用卡号码,或您的文本或gzip文本文件中的任何其他数据。
使用自定义正则表达式和健全性检查(例如:luhn
account number算法)查找
通过命令行在几乎任何大小的文件中存储敏感数据。
为什么使用txtferret?看看这是怎么发生的?下面一节。
目录
- 快速启动
- 配置
- 为什么会这样?
- 开发
快速启动
PYPI
安装它
$ pip3 install txtferret
< > >- 克隆它。
$ git clone git@github.com:krayzpipes/txt-ferret.git $ cd txt-ferret
- 安装环境。
$ python3.7 -m venv venv $ source venv/bin/activate
- 安装它。
(venv) $ python setup.py install
< > > 文件大小示例:
# Decent sized file. $ ls -alh | grep my_test_file.dat -rw-r--r-- 1 mrferret ferrets 19G May 711:15 my_test_file.dat
正在扫描文件。
# Scan the file.# Default behavior is to mask the string that was matched. $ txtferret scan my_test_file.dat 2019:05:20-22:18:01:-0400 Beginning scan for /home/mrferret/Documents/test_file_1.dat 2019:05:20-22:18:18:-0400 PASSED sanity and matched regex - /home/mrferret/Documents/test_file_1.dat - Filter: fake_ccn_account_filter, Line 712567, String: 1001020304050607080942019:05:20-22:19:09:-0400 Finished scan for /home/mrferret/Documents/test_file_1.dat 2019:05:20-22:19:09:-0400 SUMMARY: 2019:05:20-22:19:09:-0400 - Matched regex, failed sanity: 22019:05:20-22:19:09:-0400 - Matched regex, passed sanity: 12019:05:20-22:19:09:-0400 Finished in 78 seconds (~1 minutes).
用分隔符扫描文件。
# Break up each line of a CSV into columns by declaring a comma for a delimiter.# Scan each field in the row and return column numbers as well as line numbers. $ txtferret scan --delimiter , test_file_1.csv 2019:05:20-21:41:57:-0400 Beginning scan for /home/mrferret/Documents/test_file_1.csv 2019:05:20-21:44:34:-0400 PASSED sanity and matched regex - /home/mrferret/Documents/test_file_1.csv - Filter: fake_ccn_account_filter, Line 712567, String: 100102030405060708094, Column: 1712019:05:20-21:49:16:-0400 Finished scan for /home/mrferret/Documents/test_file_1.csv 2019:05:20-21:49:16:-0400 SUMMARY: 2019:05:20-21:49:16:-0400 - Matched regex, failed sanity: 22019:05:20-21:49:16:-0400 - Matched regex, passed sanity: 12019:05:20-21:49:16:-0400 Finished in 439 seconds (~7 minutes).
- 扫描目录中的所有文件。将结果写入文件并
stdout
# Uses multiprocessing to speed up scans of a bulk group of files $ txtferret scan -o bulk_testing.log --bulk ../test_files/ 2019:06:09-15:15:27:-0400 Detected non-text file '/home/mrferret/Documents/test_file_1.dat.gz'... attempting GZIP mode (slower). 2019:06:09-15:15:27:-0400 Detected non-text file '/home/mrferret/Documents/test_file_2.dat.gz'... attempting GZIP mode (slower). 2019:06:09-15:15:27:-0400 Beginning scan for /home/mrferret/Documents/test_file_1.dat.gz 2019:06:09-15:15:27:-0400 Beginning scan for /home/mrferret/Documents/test_file_2.dat.gz 2019:06:09-15:15:27:-0400 Beginning scan for /home/mrferret/Documents/test_file_3.dat 2019:06:09-15:15:27:-0400 PASSED sanity and matched regex - /home/mrferret/Documents/test_file_2.dat.gz - Filter: fake_ccn_account_filter, Line 4, String: 1001020304050607080942019:06:09-15:15:27:-0400 Finished scan for /home/mrferret/Documents/test_file_2.dat.gz 2019:06:09-15:16:04:-0400 PASSED sanity and matched regex - /home/mrferret/Documents/test_file_3.dat - Filter: fake_ccn_account_filter, Line 712567, String: 1001020304050607080942019:06:09-15:16:51:-0400 PASSED sanity and matched regex - /home/mrferret/Documents/test_file_1.dat.gz - Filter: fake_ccn_account_filter, Line 712567, String: 1001020304050607080942019:06:09-15:17:15:-0400 Finished scan for /home/mrferret/Documents/test_file_3.dat 2019:06:09-15:19:24:-0400 Finished scan for /home/mrferret/Documents/test_file_1.dat.gz 2019:06:09-15:19:24:-0400 SUMMARY: 2019:06:09-15:19:24:-0400 - Scanned 3 file(s). 2019:06:09-15:19:24:-0400 - Matched regex, failed sanity: 162019:06:09-15:19:24:-0400 - Matched regex, passed sanity: 32019:06:09-15:19:24:-0400 - Finished in 236 seconds (~3 minutes). 2019:06:09-15:19:24:-0400 FILE SUMMARIES: 2019:06:09-15:19:24:-0400 Matches: 1 passed sanity checks and 2 failed, Time Elapsed: 236 seconds / ~3 minutes - /home/mrferret/Documents/test_file_1.dat.gz 2019:06:09-15:19:24:-0400 Matches: 1 passed sanity checks and 3 failed, Time Elapsed: 0 seconds / ~0 minutes - /home/mrferret/Documents/test_file_2.dat.gz 2019:06:09-15:19:24:-0400 Matches: 1 passed sanity checks and 2 failed, Time Elapsed: 107 seconds / ~1 minutes - /home/mrferret/Documents/test_file_3.dat
- 扫描目录中的所有文件。将结果写入文件并
- cli交换机将始终获胜/优先。
- 用户定义的配置文件总是优于默认配置。
- 如果cli交换机在用户文件配置中未定义任何设置,则 将应用设置。
- 标签:
- 当有问题的筛选器匹配字符串时,这将显示在日志中。
- 图案:
- 将用于查找文件中数据的正则表达式。
- 正则表达式必须与标准库中的python
re
模块兼容。 - 确保正则表达式只包含一个且仅包含一个捕获组。例如,
如果要捕获电话号码:
- 不要这样做:
'(555-(867 555)-5309)
- 这样做:
'(555-(?:867 555)-5309)'
- 前一个示例有两个捕获组,内部和外部。
- 后者有一个捕获组(外部)。内部是一个非捕获
通过使用
启动捕获组定义的组?:
- 不要这样做:
- 注意:如果加载自定义筛选器时遇到问题,请尝试添加 正则表达式的单引号。
- 替换:
- 允许您定义在传递到健全性检查之前从字符串中删除的字符。
- 必须是有效的正则表达式。
- 如果丢失或为空,默认替换为
[\w\u]
- 理智:
- 这是与此筛选器一起使用的算法,用于验证数据的真实性
寻找。例如,16位数字可能只是一个随机数D不是信用卡。放
通过
luhn
算法的数字将验证它们可能是一个帐号,并且 减少误报。 - 只要算法存在,也可以传递表示算法的字符串列表 在图书馆里。如果没有,请添加它并发出拉取请求!
- 这是与此筛选器一起使用的算法,用于验证数据的真实性
寻找。例如,16位数字可能只是一个随机数D不是信用卡。放
通过
- 掩码:
- 索引:
- 这是匹配字符串中掩蔽开始的位置。
- 用于屏蔽匹配字符串的字符串。
值 - 索引:
- 类型:
- 这基本上是对使用此筛选器查找的"类型"数据的描述。
- 批量
- 此设置可通过cli参数
-b
或--bulk
访问。
- 使用这些开关时,请传递要扫描的目录,而不是单个文件名。
- 示例:
$ pip3 install txtferret
2 - 此设置可通过cli参数
- 遮罩
- 如果设置为true,则在输出期间,将使用过滤器中定义的掩码值来屏蔽数据。
- 如果没有为筛选器设置掩码,程序将使用默认掩码值进行掩码。
- 默认设置为"true"。
- cli-可以使用
-m
开关打开屏蔽功能'
$ pip3 install txtferret
3 - 日志级别:
- 这是您要使用的日志级别。
info
将只为 已匹配并通过相关的健全性检查。调试
将记录两个匹配/选中的筛选器 以及匹配但未通过健全性检查的筛选器。 - cli-使用
-l
开关可以更改日志级别:
$ pip3 install txtferret
4 - 这是您要使用的日志级别。
- 总结
- 如果设置为true,脚本将只输出三个数据点的列表:
- 未通过健全性检查的匹配数。
- 通过健全性检查的匹配数。
- 完成文件搜索所需的时间。
- cli-开关将启动摘要。
$ pip3 install txtferret
5 - 如果设置为true,脚本将只输出三个数据点的列表:
- 输出文件
- 将绝对路径添加到要在其中写入结果的文件。
- cli-使用
-o
开关设置输出文件。
$ pip3 install txtferret
6 - 显示匹配项
- 如果设置为"否",则它将在输出中将匹配的字符串全部编校在一起。 请注意,除非是故意的,否则不要通过cli开关覆盖此设置。
- 分隔符
- 定义分隔符。此分隔符将用于将TXT文件中的每一行拆分为 柱。脚本的输出将为您提供regex在其中匹配的列 添加到行号。
- 注意:按列搜索会大大减慢脚本速度,因为您正在应用 表达式指向每一列而不是整行。
- 您可以使用后跟代码的
b
来定义字节码分隔符。例如,b1
将 使用头的开头作为分隔符(\x01以十六进制表示) - cli-使用
-d
开关设置分隔符并扫描每列而不是行。
$ pip3 install txtferret
7 - 忽略列
- 如果未设置分隔符设置或开关,则忽略此设置。
- 添加整数列表,txtferret将跳过这些列。
- 如果配置了ignore_columns:[2,6]并且csv行是
hello,world,how,are,you,doing,today,则
world
和doing
不会被扫描,但会被忽略。 - 这在列数据集中特别有用,当你知道有一个专栏充满了误报。
- 文件编码
- 两种用途:
- 用于将分隔符的值编码为文件的适当编码。
- 用于在应用于健全性检查之前对文件中匹配的数据进行编码。
- 默认值为
'utf-8'
- 两种用途:
- 他们常常依赖于上下文。如果商业解决方案每次都发出警报,那就太吵了 匹配16位字符串,因为并非所有客户都处理信用卡数据。
- 许多供应商没有处理超过1 GB的大文件的廉价方法。更不能应付 大小为许多GB的文件。
- 有些DLP解决方案只会根据前几兆字节对数据文件进行分类。
- 许多dlp解决方案都是黑匣子,无法让你说出他们在寻找什么。 在你的数据中,或者他们如何知道他们在看什么。
- 几乎没有大小限制
- 只要你能将任何大小的文件放在驱动器上,就可以对其运行。
- 是蟒蛇…所以…对大文件没有速度保证,但至少它最终会完成。 我们发现txtferret可以在1到3分钟内扫描我们系统上约20gb的文件。
- 可定制
- 定义自己的正则表达式,并将它们与健全性检查配对。例如,使用
内置的
luhn
算法将筛选出许多信用卡号码的误报。匹配的 信用卡号将首先通过luhn
算法运行。如果不通过,则丢弃。
- 定义自己的正则表达式,并将它们与健全性检查配对。例如,使用
内置的
- 不需要上下文
- 是的,这会对某些文件造成很多误报;但是, 如果您处理的文件不包含"visa"或"cve"等上下文,则需要 从某处开始。
- 有用的输出
- 指示找到字符串的行。
- 如果定义了分隔符,则指示哪一列(例如:CSV文件使用逗号)。
- 您可以选择屏蔽输出数据,以确保不放置敏感数据 输入日志文件或输出到终端。
- 免费
- 无合同
- 每GB扫描的数据不允许有无耻的许可。
- 你可以做出贡献!
- 修复了v0.2.0中引入的允许密钥错误
- 因为tokenize是一个谎言,所以将
tokenize
更改为mask
。是掩蔽。- 用"掩码"开关替换了"无标记化"开关。
- 默认情况下已关闭遮罩。
- 增加了多编码支持的文件编码设置。
- 以字节为单位读取,默认情况下采用
'utf-8'
编码。
- 以字节为单位读取,默认情况下采用
- 修复了读取gzip文件时regex的错误。
- 将
替换选项添加到筛选器中。
- 删除了配置覆盖选项。
- 添加了"忽略"列设置。
- 通过
--bulk
开关添加了批量文件扫描。 - 为批量扫描添加了多处理功能。
- 添加了gzip检测和支持。
回购
运行它
配置
有两种方法可以配置TXT雪貂。您可以通过创建 自定义配置文件(基于默认的yaml文件),或者可以通过 cli开关。
txt ferret附带了一个默认配置,您可以将其转储到任何目录中 你希望并改变它或使用它作为参考。如果你改变文件,你必须 使用适当的cli开关指定它,以便脚本使用它。见 下面的cli部分。
(venv) $ txtferret dump-config /file/to/write/to.yaml
配置文件有两个部分:过滤器
和设置
过滤器
过滤器是带有一些元数据的正则表达式。您可以使用此元数据 对正则表达式匹配项执行健全性检查以筛选出误报。(前)卢恩 信用卡号的算法)。您还可以屏蔽匹配字符串的输出 记录到文件或显示在终端上。
$ pip3 install txtferret0
设置
$ pip3 install txtferret1
为什么会这样?< >
商业数据丢失预防(DLP)产品有一些缺点:
txtferret是在意识到这些限制之后诞生的。它不是完美的,但它是一个伟大的 可与DLP解决方案配对的健全性检查。以下是它设计的一些功能:
释放量
版本0.2.1-2019-08-11
版本0.2.0-2019-08-05
版本0.1.3-2019-08-05
版本0.1.2-2019-08-01
版本0.1.1-2019-07-30
版本0.1.0-2019-07-30
版本0.0.4-2019-06-09
< H4>版本0.0.3-2019-06-01
开发
版本0.1.2-2019-08-01
版本0.1.1-2019-07-30
版本0.1.0-2019-07-30
版本0.0.4-2019-06-09
< H4>版本0.0.3-2019-06-01
开发
关于开发的一些信息。
运行测试
$ pip3 install txtferret8