ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows日志接入GrayLog实战:Winlogbeat配置与踩坑指南

Windows日志接入GrayLog实战:Winlogbeat配置与踩坑指南 做运维的人谁没经历过这种场面Windows业务群里一喊“服务器异常”你登录上去打开事件查看器一页一页翻Application和System日志翻了半天也没看出名堂。真正出了安全问题时Security日志里4625刷了一整屏可你不知道这事从什么时候开始的、是哪台机器、同一时段还有没有别的登录行为。数据都在问题是你没把几十台Windows的日志集中到一起看。这就是我这两年坚持把Windows日志接入GrayLog的原因平时它不吭声真出事的时候能帮你省下好几个小时的排查时间。这篇文章是写给三类朋友的刚接触GrayLog、想快速搭一套验证环境的后端/运维新人已经上了GrayLog但只接了Linux syslog、想把Windows侧补上的工程师以及被安全审计逼到头大、想靠事件日志留痕的运维同学。我不会把原理讲得特别深重点放在两件事上一是Winlogbeat怎么把Windows日志送到GrayLog二是实际配置里有哪些坑、怎么写才能一次到位。项目里用的核心组合就三样GrayLog Winlogbeat Elasticsearch正文里我会把每一步都拆开讲清楚。1. 整体设计思路与采集链路选型1.1 先理清楚GrayLog到底解决了什么问题GrayLog是一个开源集中日志管理平台核心定位是收集、索引、检索、告警。它和ELK、Loki这类方案一样都在解决“日志分散”的问题但GrayLog有一个很现实的优势部署门槛低带Web管理界面输入Input、流Stream、管道Pipeline都可以在页面上配置完成不需要写一堆Logstash filter。Windows日志接入GrayLog的最小链路是这样的Windows 机器 - Winlogbeat - GrayLogBeats Input - Elasticsearch - GrayLog Web 搜索这里Elasticsearch负责存储日志和建倒排索引MongoDB保存GrayLog自身的元数据、用户、输入配置。很多第一次接触GrayLog的人会把这三个组件搞混我用一句话给你理清日志先进GrayLogGrayLog处理完丢给Elasticsearch做索引而MongoDB记录的是“哪个输入、哪个流、哪个用户”这种配置信息不存日志正文。有人会问Windows日志不是用事件查看器直接看就行吗为什么还要绕一大圈单机一两台确实可以但当你手上有几十台Windows或者需要跨机器分析“同一个账号在十分钟内是不是在多台机器上同时登录”这种问题时一台台翻事件查看器根本不现实。日志只有集中到一个地方才能跨服务器、跨时间段做全文检索。另外GrayLog支持Stream和Pipeline可以把安全日志、应用日志自动分流配合告警规则在暴力破解发生时就报警这就是它真正的价值。1.2 为什么选Winlogbeat而不是NXLog或纯GELF推送Windows日志接入方案其实不少主流的就三条路。第一条是NXLog或rsyslog走Syslog协议在Windows上装软件把Windows事件转成Syslog发给GrayLog的Syslog UDP/TCP输入。优点是对GrayLog来说实现最简单缺点是Windows事件转成Syslog后信息会丢得很厉害原始的事件ID、登录类型、进程信息这些字段得通过模板拼接维护成本高。第二条是写个脚本调PowerShell Get-WinEvent把事件转成GELF请求打到GrayLog的GELF输入。这个方法灵活适合采集非标准日志但脚本要处理断点续传、服务自启、数据丢失保障生产环境不太敢依赖。第三条就是本文用的Winlogbeat输出到GrayLog的Beats输入。Winlogbeat是Elastic官方出品的轻量采集器专门吃Windows事件日志通过Windows Event Log API做增量订阅不丢数据自带字段解析把4624、4625这些事件直接变成结构化的JSON。最关键的是GrayLog原生支持Beats输入类型Winlogbeat发过来之后不需要中间再架一台Logstash配置最省事。比来比去Winlogbeat是Windows日志接入GrayLog时性价比最高的选择。它不是没有缺点比如版本升级时配置格式有变化但比起自己写脚本、拼字段这个方案稳太多了。1.3 先确定版本与兼容性别上来就装最新版GrayLog的版本兼容性是个大坑踩过的人都知道。GrayLog 5.x一般对应Elasticsearch 7.10.x、7.16.x或者8.x的特定小版本MongoDB要求4.4或5.0。如果你是想在本机快速验证我的建议是直接用Docker Desktop拉一套graylog/graylog镜像顺便把Elasticsearch和MongoDB用docker-compose带起来Windows上验证逻辑和生产环境完全一致。Winlogbeat这边直接到Elastic官方下载页面找7.17.x稳定版本就行。7.17这个版本生命周期比较长兼容性也广不管GrayLog是4.x还是5.x都能顺利对接。8.x的Winlogbeat不是不能用但我遇到过几次配置格式变化带来的小麻烦如果你不是非要用新特性生产环境求稳优先选7.17。还有一类特殊情况Windows Server 2016这种老系统Winlogbeat 7.17完全支持但如果遇到2008 R2这种更多年前的机器新版Winlogbeat可能装不上或者服务起不来就得退回6.x甚至5.x。这种老机器的接入方案我在后面“踩坑排查”章节专门说。2. Windows端接入实操Winlogbeat安装与配置2.1 下载和安装WinlogbeatWinlogbeat的安装不像普通软件需要跑安装向导它本质是一个绿色软件下载zip包解压出来就能用。官方下载页面选择Windows拿到zip后解压到C:\Program Files\Winlogbeat这种固定目录。注意路径别带中文、别放在桌面否则后续以Windows服务方式运行时比较容易出奇奇怪怪的问题。解压完后目录下有这些关键文件winlogbeat.yml所有采集、输出配置都在这里winlogbeat.exe主程序winlogbeat.template.json上报到Elasticsearch时会用到的索引模板如果直接发GrayLog用不到fields.yml字段说明文档排查字段名时可以翻它装好之后第一步不是直接启动而是先跑一下配置文件检查确保基本语法没问题cd C:\Program Files\Winlogbeat .\winlogbeat.exe test config -c .\winlogbeat.yml这个命令只检查配置语法不检测网络连通性。显示Config OK之后再继续往下面配置输出。2.2 修改winlogbeat.yml采集哪些日志、发到哪里Winlogbeat的配置文件是YAML格式主要改两段winlogbeat.event_logs控制采集什么output控制发到哪。先看采集段。Windows事件日志分为几个独立的日志通道我们日常关心的核心是这三个System系统组件/驱动/服务、Application应用程序、Security安全审计登录、权限、进程创建等。最简配置winlogbeat.event_logs: - name: Application ignore_older: 72h - name: System ignore_older: 72h - name: Security ignore_older: 72hignore_older: 72h的意思是Winlogbeat启动后只处理72小时以内的历史事件更早的忽略掉。这个参数很重要否则你第一次启动时Winlogbeat会尝试把当前日志文件里所有历史事件全部读取一遍到GrayLog日志量大的机器会瞬间把网络和ES打满。输出段有两种写法。一种是直接输出到GrayLog的Beats输入这是我最常用的方式output.logstash: hosts: [192.168.10.20:5044]这里很多人会疑惑为什么输出类型写的是logstash不是graylog因为GrayLog的Beats输入兼容了libbeat的输出协议Winlogbeat把output.logstash这个类型的请求发过去GrayLog能直接解析。这是官方约定不是写错了。如果你在GrayLog侧部署的是GELF输入那就需要改Winlogbeat的GELF输出插件但那个插件是社区提供的还要额外编译生产不推荐直接用Beats输入最省心。最后还有一个很实用的小建议给不同环境的机器打标签方便在GrayLog里过滤。tags: [windows, prod, web-01]这个标签后面做Stream分流、告警规则时候非常有用。2.3 启动Winlogbeat并注册成Windows服务配置改好后先在命令行前台跑一遍确认能看到启动日志也方便我们立刻发现输出不通的问题.\winlogbeat.exe -e -c .\winlogbeat.yml-e参数表示把日志打到标准输出而不是写日志文件。看到类似Event Logs to collect: Application System Security和Starting Winlogbeat之类的输出后按CtrlC停掉然后注册成Windows服务.\winlogbeat.exe install .\winlogbeat.exe start Get-Service winlogbeat服务状态变成Running说明采集端已经起来了。别忘了在Windows防火墙里确认出方向到GrayLog服务器5044端口是通的。注意方向是出方向不是入方向这点经常有人搞反。3. GrayLog侧配置新增Beats输入并验证日志3.1 打开GrayLog Web界面先把输入类型搞清楚GrayLog的日志接入入口在顶部菜单System - Inputs。页面上会有一堆输入类型常见的有Syslog UDP/TCP、GELF UDP/TCP、Beats、CEF、Raw/Plaintext TCP等。对应Winlogbeat我们选的输入类型就是Beats。如果页面上没有任何输入说明这是刚装好的GrayLog没关系我们就是来创建的。在右侧下拉框里选择Beats点击Launch new input。这时会弹出设置框关键参数就这么几个Node选择当前GrayLog节点只有一个节点就默认选上Title随便填建议写成“Windows Winlogbeat Input”Port默认监听5044和Winlogbeat配置里的端口要一致Bind address可以填0.0.0.0表示监听所有网卡也可以填内网IP只让指定网段的机器发送Bind address这里我给个实际建议如果GrayLog服务器有多块网卡比如一块接办公网、一块接机房内网最好只绑定接日志来源的那个网卡的IP不要一上来就0.0.0.0减少暴露面。保存之后页面上就会多出一个正在监听的输入条目状态是绿色Running。到这一步Winlogbeat发来的日志还进不了完整链路因为Elasticsearch的索引和GrayLog的索引集还没有和这个输入关联但实际上Beats输入创建好的那一刻后续的数据就自动走默认索引集了所以这一步不需要手动做额外关联。3.2 在GrayLog里验证日志到底来了没有输入创建好了Winlogbeat也启动了现在最激动也最容易翻车的一步看日志到底有没有到。不要急着去搜索栏敲复杂的查询先在Search页面左侧“时间范围”选最近5分钟然后直接搜索gl2_source_input:输入ID输入ID在哪里看在你的Beats输入条目旁边鼠标悬停会显示一串很长的数字ID复制过来粘贴进去。这个查询的意思是“把来自这个输入的所有日志都列出来”。如果搜出来有数据恭喜链路已经通了。还有一种验证方式Search页面直接搜winlogbeat因为Winlogbeat上报的日志会自动带上agent.type: winlogbeat和agent.name这类字段。两条路都能验证。实际工作中我通常先用gl2_source_input确认这个输入的日志量再用agent.name去定位具体机器。如果搜了5分钟还没有数据先别急着怀疑Winlogbeat我提供一个百试百灵的排查顺序在GrayLog服务器上执行netstat -ano | findstr 5044确认端口在监听用telnet或Test-NetConnection测Winlogbeat机器到GrayLog的5044端口通不通回到Winlogbeat机器跑.\winlogbeat.exe test output -c .\winlogbeat.yml看输出是否报错查看Winlogbeat日志路径默认是C:\ProgramData\winlogbeat\logs\winlogbeat这几个步骤能解决九成以上的“日志不过来”问题。具体每个问题的处理办法我在后面专门开一章说说。3.3 日志字段没解析出来怎么办日志到达GrayLog后你可能会遇到一个常见现象搜索能看到日志但点开消息详情发现所有内容都挤在message字段里一个很长的JSON字符串并没有像预期那样拆出event_id、winlog.provider_name这些字段。这是因为GrayLog的Beats输入默认把Winlogbeat上报的JSON存入message字段但字段是否自动提取取决于GrayLog的message process chain配置和索引模板的映射。实际上Beats输入在GrayLog里默认是有字段处理的我的经验是当你刷新搜索页面、重新执行搜索或者等第一次索引写入完成之后点开消息winlog、event、agent、host等对象字段其实已经拆出来了只是页面默认展示的是message而已。真正遇到字段没有拆分的情况有一个稳妥做法点开消息的JSON树在winlog.event_id、winlog.provider_name上选择“Add to search query”或者直接复制字段名用精确字段名去搜索。如果确认某些字段没有自动映射可以在GrayLog的System - Configurations - Message Processors配置里确认Beats相关的processor有没有启用。小于100个字的处理这里就不多展开了。4. 在GrayLog里高效查Windows日志字段、语法与场景4.1 认识Winlogbeat带过来的关键字段日志接进来只是开始会查才是正事。Winlogbeat的厉害之处在于它把Windows事件日志里那些得靠GUI才能看懂的信息整理成了结构化字段。实际使用中最常打交道的字段就这些字段含义示例值winlog.event_idWindows事件ID4625winlog.provider_name日志来源模块Microsoft-Windows-Security-Auditingwinlog.logon.type登录类型10远程交互winlog.computer_name机器名WEB-01winlog.user.name触发事件的账号administratorwinlog.user.domain账号所在域/机器名WORKGROUPsource.ip登录来源IP192.168.5.88source.port来源端口52931event.outcome结果success/failureagent.nameWinlogbeat所在机器名WEB-01tags自定义标签prod/web-01这里有一个使用上的小技巧Windows事件日志里很多信息在raw message里是一大段文本比如“已为以下帐户执行了登录尝试...”但Winlogbeat整理了结构化字段所以查询时优先用winlog.event_id、winlog.user.name这种字段而不是搜中文关键词。字段搜索速度更快结果也更精确。4.2 安全审计最常用的三类检索我把平时最常用、也最值得收藏的几类搜索写在这里直接放到GrayLog搜索栏就能用。第一类暴力破解排查。搜索所有登录失败事件winlog.event_id:4625 AND event.outcome:failure要看最近一小时失败登录特别多的机器可以在旁边选时间范围然后按winlog.computer_name分组统计。GrayLog的统计功能入口在搜索页面左侧“Fields”点开winlog.computer_name选择“Statistics”就能看到分布。第二类成功登录溯源。搜索成功登录事件winlog.event_id:4624 AND event.outcome:success如果只要远程登录登录类型10并且来源IP来自内网可以加一层过滤winlog.event_id:4624 AND winlog.logon.type:10 AND NOT source.ip:10.0.0.0/8第三类账号权限变更。新用户创建对应4720事件用户加入管理员组对应4732或4672。搜索(winlog.event_id:4720 OR winlog.event_id:4732) AND winlog.user.name:Administrator这类事件在渗透测试里非常典型一旦出现必须人工确认。建议直接做成GrayLog的告警规则搜索条件就是上面这句触发之后发邮件或Webhook告警比事后翻日志强太多。4.3 用Stream分流把Windows日志从一堆Linux日志里摘出来如果你GrayLog里既有Linux syslog又有Windows日志混在一起查询会越来越乱。解决方案是建Stream流。Stream可以理解成一根“管道”让匹配特定条件的日志自动流到单独的区域之后在搜索页面切Stream只看Windows日志干净又高效。创建入口是Streams页面点击Create stream设置规则为agent.type: winlogbeat这条规则能把所有Winlogbeat上报的日志都圈进这个Stream。Stream创建后默认是暂停状态要手动点一下Start stream才会开始接收新日志。同时建议在Stream设置里把“去重模式”关掉因为Windows安全日志里同类事件很多去重反而会影响审计完整度。Stream建好之后告警规则、权限控制都可以绑定在这个Stream上。比如只让安全团队看Security相关Stream其他运维看System和Application这种权限隔离在GrayLog里通过User和Stream的共享配置就能实现。5. 常见问题排查与避坑技巧5.1 日志收不到、字段查不到、时间对不上我给自己团队整理过一个Windows日志接入的排查速查表直接把遇到的高频问题写在表格里放在内部知识库。现在把这部分内容公开出来照着顺序做基本都能解决。现象可能原因排查方法GrayLog完全收不到日志5044端口不通 / Winlogbeat没启动 / Input没监听先测端口连通性再检查服务状态Winlogbeat能启动但一直报错输出配置格式不对 / GrayLog地址写错跑test output看具体报错内容日志来了但时间晚8小时GrayLog用UTC存储页面时区没设对右上角用户菜单设置Time Zone为Asia/Shanghai安全日志没有4624/4625本机审核策略没开启用auditpol命令开启登录成功/失败审核搜索字段调用不出来字段名看错了 / 索引还没刷新点开消息JSON树复制真实字段名内存一直飙升ES堆内存设置不合理 / Java版本不对检查ES的jvm.options堆内存设为系统内存的50%以内时间对不上这个问题特别容易误导人我多说一句Winlogbeat采集到事件日志后时间戳以事件发生时间为准存储为UTC页面展示时按你浏览器/用户设置时区转换。我在GrayLog里第一次搜到Windows登录事件看到时间差了8小时差点以为Winlogbeat解析错了结果只是时区设置没改。5.2 安全日志里只有4624没有4625多半是审核策略没开这是Windows日志接入里最隐蔽、也最容易忽略的坑。Windows的Security日志并不是默认把所有审计事件都记得清清楚楚很多机器默认只记录了一部分成功事件失败的登录尝试根本没进Event LogWinlogbeat再有本事也采不到不存在的数据。Windows的审计策略默认在本地安全策略里配置。路径是secpol.msc- 安全设置 - 本地策略 - 审核策略。至少要保证这两项开启审核登录事件成功、失败都要勾选审核帐户登录事件成功、失败都要勾选用命令打开更快auditpol /set /subcategory:登录 /success:enable /failure:enable auditpol /set /subcategory:帐户登录 /success:enable /failure:enable注意不同版本Windows的本地化名称可能不同在中文系统里“Logon”对应“登录”在英文系统里是“Logon”。有些版本还有“详细跟踪”子类目按需开启。开完之后Security日志里才会持续出现4624、4625这些登录事件。如果你做的是安全审计项目这一步一定要提前和业务侧确认好否则采集小半年数据分析时发现关键事件全是空的只能干瞪眼。5.3 Windows Server 2016等老系统接入的特殊处理现在生产环境里Windows Server 2016依然是不少企业的主力系统。Winlogbeat 7.17在Server 2016上运行没有问题官方支持列表明确包含了这个版本。但有一个细节Server 2016默认的PowerShell版本和.NET Framework版本可能比较老Winlogbeat虽然不依赖PowerShell但如果你同时又在机器上跑了其他脚本可能会因为这些组件影响系统稳定性。我的建议是单独把Winlogbeat装到一台不跑业务脚本的实例上减少干扰。如果遇到比Server 2016更老、比如2008 R2新版Winlogbeat可能直接跑不起来常见报错是缺少某个系统API。这种情况下我的处理方案是回退到Winlogbeat 6.8版本配置语法基本一致还是走Beats输出到GrayLog完全兼容。所以你在老机器上部署先不要盲目拿最新7.17去试先确认系统版本再选对应版本能省很多没必要的折腾。5.4 日志量估算与磁盘索引保留策略日志接进来只是第一步后续磁盘规划不做大概率三个月后GrayLog就被日志撑爆。我提供一个简单粗暴的估算公式单机单天日志量GB 单机单天平均事件数 × 平均单条事件大小KB ÷ 1024以一台日常有人操作的业务服务器为例SystemApplicationSecurity三个通道一天大概产生500MB到1GB的事件主要取决于是不是域控、有没有人频繁登录。假设你有20台Windows单机一天1GB那么一天的增量就是20GB。Elasticsearch的索引存储按下面的规则规划总存储 单天增量 × 保留天数 × 副本数保留30天副本1份那至少得留20GB × 30 × 2 1200GB的存储空间。这是底数实际ES还做倒排索引压缩率一般有50%左右但保险起见按不压缩也没毛病。GrayLog里索引设置的位置在System - Indices Index Sets选择对应的索引集把保留策略改成“删除30天前的索引”再把分片条件设置为“每天轮转一个索引”或“单个索引达到30GB即轮转”。我自己的习惯是小环境每天一个索引一个分片轮转条件设成20-30GB。这样ES查询速度、磁盘清理都容易控制。6. 一些经验心得最后以我自己的实际使用感受收个尾。第一次搭GrayLog接Windows日志我从下午折腾到凌晨问题全出在细节上第一遍Winlogbeat的output.logstash配置写成了output.elasticsearch日志倒是没报异常只是全往ES自己那边送了第二遍好不容易数据到了GrayLog又发现安全日志里4625一片空白一查是审核策略没开。后来我把这两个坑写进团队部署手册里后面同事再接新机器基本半小时内就能看到数据。如果只能给一条建议我会说先花15分钟确认Windows的审核策略开启、时间同步正常再开始折腾采集器。数据源干净了后面做检索、做告警、做报表才不会被虚假的“无数据”坑到。目前这套东西还能往外扩展的地方其实不少。GrayLog的Pipeline可以做字段脱敏把密码相关事件里的敏感内容过滤掉再存储也可以把Security日志里的登录事件做成实时大屏配合告警规则在暴力破解发生时第一时间反馈。日志平台这种东西投入产出比很高但前提是得先让日志真正集中起来。希望这篇实操能帮你少走几条弯路。
返回列表