【发布时间】:2019-03-24 02:47:51
【问题描述】:
我已在约 5GB 的日志文件中收集了身份验证过程。 现在我想更改数据的所有部分,这样可以识别原始数据的来源,因为它将用作机器学习的训练数据(并且可能会发布)。
由于必须保留数据的逻辑,我想用模运算符更改 IP 和 MAC 地址。但我不知道,如何(快速)用python(re?)替换所有这些。
我的第一次尝试是使用 re.search,将找到的 IP 分成 4 个部分进行排序,并使用不同的模运算符更改每个部分。 出现问题的地方: - 它很丑 - 很慢 - 只在第一场比赛中这样做
有人知道解决这个问题的好方法吗?
______编辑_____
示例日志:
RID:“700011”; RL:“1”; RG: "windows,authentication_failures,"; RC:“请求了 Kerberos 身份验证票证:失败。”;用户:“(无用户)”; SRCIP:“无”;主机名:“(boatyMcBoatface)10.19.18.1->WinEvtLog”;位置:“(boatyMcBoatface)10.19.18.1->WinEvtLog”;事件:“[INIT]2018 年 8 月 1 日 01:59:40 WinEvtLog:安全性:AUDIT_FAILURE(4768):Microsoft-Windows-Security-Auditing:(无用户):无域:boatyMcBoatface.haven.ssh:Kerberos 身份验证票证( TGT) 已请求。帐户信息:帐户名称:BackupNow 提供的领域名称:have.ssh 用户 ID:S-1-0-0 服务信息:服务名称:krbtgt/haven.ssh 服务 ID:S-1-0-0网络信息: 客户端地址: ::ffff:10.15.16.166 客户端端口: 53680 附加信息: 票证选项: 0x40810010 结果代码: 0x17 票证加密类型: 0xffffffff 预认证类型: - 证书信息: 证书颁发者名称: 证书序列号:证书指纹:仅当证书用于预认证时才提供证书信息。预认证类型、票证选项、加密类型和结果代码在 RFC 4120 中定义。[END]"; - 'plugin_sid='700011' proto='6' ctx='192222c3-2222-22222222-422222226754' src_host='' dst_host='' src_net='19111112c3-2222-22222222-42222222267354' dst_net=2633354'dst_net bbbe-005022285e074' username='BackupNow' userdata1='1' userdata2='windows,authentication_failures,' userdata3='请求了 Kerberos 身份验证票证:失败。' userdata4='krbtgt/haven.ssh' userdata5='0x17' userdata6='0xffffffff' userdata7='-' userdata9='haven.ssh' device='10.19.18.1'/>ost_dst='boatyMcBoatface' idm_mac_src='12: E4:B1:2B:B3:BB' idm_mac_dst='12:E4:B1:2B:B3:BB' device='10.19.19.23'/>
RID: "700003"; RL:“5”; RG:“窗户”; RC:“Windows 网络登录”;用户:“evservice”; SRCIP:“10.3.3.39”;主机名:“(boatyMcBoatface)10.19.19.23->WinEvtLog”;位置:“(boatyMcBoatface)10.19.19.23->WinEvtLog”;事件:“[INIT]2018 年 8 月 1 日 01:59:37 WinEvtLog:安全:AUDIT_SUCCESS(4624):Microsoft-Windows-Security-Auditing:evservice:SSI-LOG:boatyMcBoatface.haven.ssh:帐户已成功登录。主题:安全 ID:S-1-0-0 帐户名称:- 帐户域:- 登录 ID:0x0 登录类型:3 新登录:安全 ID:S-1-5-21-88886292-694438636-1307214239-9687 帐户名称:myservice 帐户域:MY-LOG 登录 ID:0x226aa299c6 登录 GUID:{0354E718-498F-039C-83C2-725752D013BE} 进程信息:进程 ID:0x0 进程名称:- 网络信息:工作站名称:源网络地址:10.3。 3.39 源端口:61266 详细的身份验证信息:登录过程:Kerberos 身份验证包:Kerberos Transited Services:- 包名称(仅限 NTLM):- 密钥长度:0 此事件在创建登录会话时生成。它在计算机上生成已被访问。[END]"; 'plugin_sid='700003' proto='6' ctx='584a8883-a333-22a6-adde-000000876224' src_host='' dst_host='aaaaaaaa-2ebf-e2ea-eee-e053079999ed' src_net='555555-f226-11e6- bbbb-005056876974' dst_net='666666de-2be4-8242-1d75-45b6aaaaaaaa' username='myservice' userdata1='5' userdata2='windows,' userdata3='Windows 网络登录' userdata4='4624' userdata5='3' userdata6='MY-LOG' userdata7='0x226cb22322' userdata8='-' idm_host_dst='boatyMcBoatface' idm_mac_dst='A1:15:14:AB:1C:1D' device='10.19.19.23'/>
RID:“700014”; RL:“1”; RG: "windows,authentication_failures,"; RC:“Kerberos 用户预认证失败。”;用户:“(无用户)”; SRCIP:“无”;主机名:“(my-dc02)22.22.65.6->WinEvtLog”;位置:“(my-dc02)22.22.65.6->WinEvtLog”;事件:“[INIT]2018 年 8 月 1 日 09:04:50 WinEvtLog:安全:AUDIT_FAILURE(4771):Microsoft-Windows-Security-Auditing:(无用户):无域:my-dc02.my.ssh:Kerberos pre-身份验证失败。帐户信息:安全 ID:S-1-5-21-1993962763-602162358-1801674531-2146 帐户名称:sys-dobackup 服务信息:服务名称:krbtgt/gb 网络信息:客户端地址:::ffff:22.22 .1.1 客户端端口:61391 附加信息:票证选项:0x40810010 失败代码:0x18 预认证类型:2 证书信息:证书颁发者名称:证书序列号:证书指纹:仅当证书用于预认证时才提供证书信息身份验证。预身份验证类型、票证选项和失败代码在 RFC 4120 中定义。如果票证在传输过程中格式错误或损坏且无法解密,则此事件中的许多字段可能不存在。[END]"; ' plugin_sid='700014' proto='6' ctx='aaaaaaa-e2cf-12a9-9c1f-288888a5c27' src_host='aaaaaa3-ff38-22e6-b718-01544442f94' dst_host='55555ec3-ff20-55115-8059-0011111 src_net='a6d1111d-7111-811d-f35-f4ea131269107' dst_net='44449bea-960c-4446-6f444-d4444f159b8' username='sys-dobackup' userdata1='1' userdata2='windows,authentication_Kberos,' userdata3='用户预认证失败。 userdata4='4771' userdata5='2' userdata6='krbtgt/gb' userdata7='0x18' idm_host_src='do-dc01' idm_host_dst='my-dc02' idm_mac_src='11:30:22:37:33:63 ' idm_mac_dst='22:21:56:44:14:21' 设备='22.22.65.6'/>
____EDIT_2___
例子:
_____在____之前
1 date time src_ip=192.168.1.1 dst_ip=192.168.1.2 msg
2 date time src_ip=192.168.1.1 dst_ip=192.168.1.3 msg
3 date time src_ip=192.168.1.9 dst_ip=192.168.1.2 msg
_____在_____之后
1 date time src_ip=1.168.1.2 dst_ip=1.168.1.3 msg
2 date time src_ip=1.168.1.2 dst_ip=1.168.1.4 msg
3 date time src_ip=1.168.1.10 dst_ip=1.168.1.3 msg
我的垃圾代码:
import re
file = "C:\Users\Hank\Desktop\Huge.log"
file2 = "C:\Users\Hank\Desktop\Huge2.log"
searchstring = "some_regex_magic"
with open(file) as f:
for line in f:
result = re.findall(searchstring, line)
if result:
ip = old_ip+anonymize_em_all
#No Idea, how to add them back into the string at the correct postion
#replace them directly maybe, without writing a new file ?
res2 ="+ip+\n"
with open(file2,"a") as myfile:
myfile.write(res2)
myfile.close()
最好的问候
【问题讨论】:
-
如何将 mac 地址映射到 IP 地址?您有可以使用的文件或数据集,还是需要对每个 IP 进行查找?你能分享几行日志文件作为例子吗?
-
re.findall() 将返回字符串中出现的所有正则表达式的列表。它返回一个匹配对象,然后您可以对其进行迭代。我还建议你看一下正则表达式模块pypi.org/project/regex,它比 re 更强大。
-
我不打算将 IP 映射到 MAC 地址,如果我以相同的方式更改所有 MAC 和 IP 地址,则相关性得以保留。编辑:感谢您的帮助 - 我将手动更改几行并发布它们。
-
如果你想用同样的方式改变它们,你为什么不使用IP作为一个字符串,然后对它做一个MD5或SHA256呢?此外,模运算是可逆的,我不会使用它。至于“仅匹配第一个”,您需要发布您的代码以供任何人确定您的问题所在。
-
“匹配第一个”是因为我使用了 re.search - 将 IP 分成 4 个部分并用模数编辑每个部分,将它们重新组合在一起并用旧 IP 替换它们。我可以使用您的方式更改用户名 - 但我认为整个 ip 上的 md5 会改变太多(不会被识别为 IP anmyore)。