我监控我的公共IP在家庭助理的声誉

我花了很多时间监控,保护和理解家庭网络上发生的事情。 在互联网盒子,无意中暴露的设备以及互联网的永久扫描之间,我曾经想过一件简单的事情: 我的公共IP在互联网上被称为『嘈杂』还是可疑?

也就是说,恶意工具使用我的网络(pc、NAS、路由器、HA…)?

我就是这么认识的 Greynoise 的, 这是一项非常有趣的服务,可以了解IP地址是否是互联网『噪音』的一部分,即是否在扫描,投票或恶意流量活动中观察到它。

Greynoise正确地描述了它的方法,以限定互联网的背景噪声,并将观察到的IP上下文化。

和我一样,经过几次测试后,我想: 好,直接在家庭助理中拥有这个仍然很方便。

最初,我以为我会用一个经典的HTTP请求做一些非常简单的事情。 在纸上,这似乎微不足道。 在实践中,最明显的方法并不像我所希望的那样对我有效。 所以我改变了我的方法,最后切换到命令行传感器。 在这篇文章中,我一步一步地告诉你,因为我实际上是在家里设置的,用Lovelace卡进行最后的展示。

我 的 目标

我的目标很简单: 在 Home Assistant 中集成一个能够查询 GreyNoise 的传感器,以查找我的公共 IP 的状态,然后在清晰可读的仪表板中显示结果。

我们的想法不是将家庭助理变成一个先进的网络安全中心,而是添加一个小的上下文指标。

快速浏览一下是让我知道我的IP是否被视为良性的,未知的,或者可能与更可疑的活动有关。

Greynoise通过其公共验证端点精确地列出了此类信息。

我也想要一个初学者可以理解的东西: 传感器,一些有用的属性,和漂亮的卡片,使所有这些可读,而不必打开终端,显然不需要订阅任何东西,也没有注册我。

什么是GreyNoise?

当你第一次发现GreyNoise时,你可能会想知道它到底是为了什么。

在一个非常简单的版本中,GreyNoise不断观察互联网的背景噪音: 自动扫描,IP地址调查,重复登录尝试,所有这些行为不一定是肉眼可见的,但在全球网络中永久存在。

Greynoise将其服务作为区分实质性活动和真正重要流量的一种手段。

Greynoise的兴趣在于它使IP地址上下文化成为可能。 基本上,可以知道这个IP是否参与这种互联网噪音,是否被认为是合法的,或者他们的系统是否根本不知道。 他们的公共验证服务以JSON的形式返回此上下文。

当我明白这一点时,我发现这个想法对房子来说是非常好的。 我们经常有一个互联网盒子,有时是端口重定向,VPN,远程访问设备,我们并不总是知道我们的IP是如何从外部『查看』的。

没有一个完整的安全工具,GreyNoise给出了一个有趣的线索。

免费工具 GreyNoise

我喜欢的是,你已经可以免费测试东西了,而不需要马上进入复杂的集成。

第一个实用工具是他们的在线验证页面。 该页面被打开,它直接指示GreyNoise如何查看用于导航的公共IP。

做第一次快速测试是非常方便的,无需安装任何东西。

另一个非常有趣的一点是,有一个简单的API来查询。 这正是我想在家庭助理中使用的API。 在命令行,这相当于发出如下请求:

Curl-s-H "接受: 申请/JSON" https://check.labs.greynoise.io/api/v1/check

就我而言,答案看起来像这样:

"IP": "82.65.xxx.xxx","状态": "Not_found","分类": 空,"noise": False,"common _business _services": False, "trust _level" : null, "error" : "IP 找不到" }

这种格式很好地对应了GreyNoise公共服务的记录操作,特别是返回IP,状态,分类,指标。 噪音 噪音, 指标 common_business_services, 信心水平和可能的错误信息。

简单地说: 我的IP不为GreyNoise所知,在这种情况下,这相当令人放心。

我的第一次尝试在家庭助理

通常情况下,我从在我看来最『干净』的解决方案开始: 在 Home Assistant 中使用 REST 传感器。

原则上,这是合乎逻辑的。 我有一个HTTP URL返回JSON,所以我认为REST传感器可以做得很好。 Home Assistant REST 文档允许精确地定义一个 HTTP 资源,用 JSON 读取 JSON。 值_template 并检索字段作为属性 json_ 属性.

我想我会直接检索状态和属性,如IP,分类或信任级别。

除了在我的情况下,这种方法没有正常工作。 传感器仍然处于无法使用的状态。 而不是浪费时间在一个没有给我的安装一个稳定的结果的方法上,我决定切换到另一个解决方案。

老实说,这就是家庭自动化中经常发生的情况: 我们带着一个想法离开,然后根据现实进行调整。

为什么我离开命令行

我终于选择了依靠命令行传感器。 它不一定是纸上最『优雅』的方法,但在我看来,它更可靠。

原则很简单: Home Assistant 执行命令 卷曲 卷 式, 检索 JSON 响应,然后提取主状态和几个属性。 整合 整合 _line 命令 Home Assistant 支持 shell 命令,a 值_template JSON属性。

换句话说,我从一个已经在终端工作的测试开始,然后我简单地将其转换为家庭助理。

对于初学者来说,这通常是一个很好的策略: 当某些东西已经手工工作时,更容易弄清楚家庭助理中发生了什么。

主页 助理 ⚙ configuration in Home Assistant

在我的档案里 配置.yaml, 首先,我首先为我的命令行传感器添加了一个专用文件:

Command_line : 包含命令 _line.yaml

然后,在 command_line.yaml, 我添加了这个传感器:

传感器: 姓名: "Greynoise IP Check" 唯一 _id: Greynoise _ip _check 图标: MDI:shield-search 命令: "Curl-s-H" 接受: application/json" https://check.labs.greynoise.io/api/v1/check' command_timeout: 20 scan_interval : 100800 value_template: "{value _json['status']}}" json _ 属性: IP - 分类 - 噪声 - common_business_services - trust_level - 错误

我将非常简单地详细介绍一下:

  • 指挥 部 : 这是由Home Assistant执行的命令。
  • _timeout 命令 : 在放弃之前,我允许长达20秒。
  • 扫描 _ interval : 这是执行的频率,在几秒钟内。 在这里,我选择了100800秒,所以每28小时。
  • 值_template : 这恢复了传感器的主要值,这里是场 地位 状况 JSON。
  • json_ 属性 : 这允许将其他有用的字段存储为传感器属性。

为什么是28小时? 仅仅因为我不需要每小时采访GreyNoise。 我想避免24小时,因为很多传感器都在24上,所以今天将是28小时。 这不是我不断变化的东西,所以我更喜欢间隔执行。

《What the Sensor Gets Me Back》

一旦传感器运行,我恢复一个主状态和几个属性。

主要状态是字段 地位 状况. 例如,在家里,我得到 Not_found 的. 正是这个值成为家庭助理中的传感器状态。 公共端点 GreyNoise 在其 JSON 响应中返回此状态域。

接下来,我有几个有用的属性:

  • IP 的 IP : 检测到的公共 IP 地址。
  • 分类 分类 : 分类,如果有的话。
  • 噪音 噪音 : 表示 IP 是否被视为互联网噪声的一部分。
  • common_business_services : 表示 IP 是否与已知的企业服务相关联。
  • _ 级 信任 : 可用时增加一个指标。
  • 错误 @ info : 信息信息,例如"ip not found"。

我 的 Lovelace Cards

一旦传感器被创建,我特别希望在仪表板上有一个漂亮的显示。 所以我做了一个小的专用页面,上面有几张卡片来测试渲染。

我用的是蘑菇,按钮卡和Markdown卡。 这让我比较了更"清醒"的风格,更"视觉"的风格,以及更"信息化"的风格。

地图 蘑菇

我制作的第一张卡片是基于实际传感器的蘑菇卡:

类型 : custom:mushroom-template-card 实体: Sensor.greynoise_ip_check 主条目: > {% 设置 c = state_attr(entity, 'classification') %} {% 如果 c =='恶意' %Greynoise: 恶意活动 {% Elif c ==『可疑』 %Greynoise: 可疑活动 {% Elif c == 良性 %Greynoise: 合法服务 {% Elif在['not _found', 'unknown', 'unavailable']中声明(entity)in ['not _found', 'unknown', 'unavailable'] %Greynoise: 无已知活动 {% 其他 其它 %Greynoise: {{State(entity)} { 国家(entity)} {% Endif 的 %} 次要: > {% ip = state_attr(entity, 'ip')或 'IP unknown' %} {% 设置 classif = state_attr(entity, 'classification')或 'none' %} {% 设置噪声 = state_attr(entity, 'noise') %} {% 设置 cbs = state_attr(entity, 'common_business_services') %IP: {{{ IP }} • 分类: {classif } • 噪声: {{噪声}} • 已知服务: {{CBS }} 图标: > {% 设置 c = state_attr(entity, 'classification') %} {% 如果 c =='恶意' %MDI:shield-alert {% Elif c ==『可疑』 %MDI:shield-search {% Elif c == 良性 %MDI:shield-check {% 其他 其它 %MDI:shield-check-outline {% Endif 的 %icon_color : > {% 设置 c = state_attr(entity, 'classification') %} {% 如果 c =='恶意' %红色 {% Elif c ==『可疑』 %橙色 {% Elif c == 良性 %} Teal {% 其他 其它 %绿色 {% Endif 的 %多行 _ 次要 : true fill_container : 真正的tap_action : 行动: 更多 信息

我真的很喜欢这张卡片,因为它很容易阅读。 乍一看,我看到了一个清晰的信息,一个合适的图标和一致的颜色。

假卡

为了在视觉上比较状态,我还创建了一些纯粹虚构的地图。 这使得可以在不等待它们实际发生的情况下看到不同的案例会是什么样子。

类型 : 垂直堆栈卡: 类型: 自定义:mushroom-template-card : Fictif - 主要为次要: Pi: 45.67.89.10 噪声 噪声: True" 图标: MDI:shield-alert icon_color: 红色多行 _ 次级: True - 类型 : 自定义:mushroom-template-card : Fictif - 良性次要: Pi: 1.1.1.1 • 良性 • 噪声: false" 图标 : MDI:shield-check icon_color : Teal multiline _secondary : True - 类型 : 自定义:mushroom-template-card : Fictif - 未找到次要的: Pi: 82.65.100.200 • Not_found •噪声: false" 图标 : MDI:shield-check-outline icon_color: 绿色多线 _ 中学: 真实 的

这很愚蠢,但当你构建一个接口时非常有用: 你可以在拥有真实案例之前选择这种风格。

按钮卡

然后我想要一些更直观的东西,几乎像一张警示卡。 我用了Button Card。

类型 : custom:button-card 实体: Sensor.greynoise_ip_check 名称: | [[const c = entity?.attributes.classification; 如果(c === '恶意')返回 'GreyNoise - 恶意活动'; 如果(c ==="可疑")返回"GreyNoise -可疑活动"; 如果(c === 'benign')返回 'GreyNoise - 合法服务'; 返回"GreyNoise - 没有已知活动"; ]] 图标: | [[const c = entity?.attributes.classification; 如果(c === 'malicious')返回 'mdi:shield-alert'; 如果(c ==='suspicious')返回 'mdi:shield-search'; 如果(c === 'benign')返回 'mdi:shield-check'; 返回 'mdi:shield-check-outline'; ]]] show _state : 真实 state_display : | [[[[返回实体?.state θ'unknown'; ]] 标签: | [[[ const ip = entity?.attributes .ip 'IP unknown'; const c = entity?.attributes? || 分类 'none'; Const noise = 实体?.attributes?.noise; const cbs = entity?.attributes?.common _business _services; 返回 'IP ${IP} $噪音: ${noise} • 常见业务: ${CBS}; ]]] show_label : 真正的tap_action : 行动: 更多信息样式: 卡 : 填充 : 18px - border-radius: 20px - 颜色: 白色 - 背景: | [[const c = entity?.attributes.classification; 如果(c === 'malicious')返回 'linear-gradient(135deg, #b71c1c 0%, #E53935 100%) 如果(c ==='suspicious')返回 'linear-gradient(135deg, #ef6c00 0%, #FFA726 100%) if(c === 'benign')返回 'linear-gradient(135deg, #00695c 0%, #26a69a100%) 返回线性梯度(135deg, #2e7d32 0%, #66bb6a 100%) ] 网格: 网格模板区域: "I n\"\"i s\"\"l l\" - grid-template-columns: 60px 1fr - 网格模板行: min-content min-content min-content 图标: 宽度: 42px - 颜色: 白色名字: 自我证明: Start - font-size : 18px - 字体重量: 700个州: 自我证明: Start - font-size : 15px - 字体重量: 500 标签: 自我证明: 中心 - text-align : 中心 - 宽度 : 100% 字体大小: 13px - 不透明性: 0.92

这张卡非常好,特别是当你想要一些更引人注目的东西时。 我也调整了底线,使其以中心,这确实改善了渲染。

Markdown 地图 摘要

最后,我添加了一张Markdown卡,以清晰的方式显示所有信息:

类型 : Markdown 内容: >- {% 设置 e = 'sensor.greynoise _ip _check' %} ## 完整的GreyNoise报告 - **Status**: {{State(e)}} - **IP**: {{ state_attr(e, 'ip')或 'unknown'} - **分类**: {{ state_attr(e, 'classification')或'none'}} - **互联网噪音**: {state_attr(e, 'noise')} - **Known 服务**: { state_attr(e, 'common_business_services')} - ** 信任级别**: {{ state_attr(e, 'trust _level')或 '-}} - **信息消息**: {{ state_attr(e, 'error')或 'none' } } --- - - ** 请求的最后一次执行**: {{{ relative _time(states[e].last _updated)} - **上次执行的horodatage**: {{ as_local(states[e].last _updated).strftime(')%d/%m/%Y 位 %H:%M:%S')}

我喜欢这张卡,因为它非常清晰,特别是对于诊断。

此外,我添加了自上次更新以来所经过的时间的概念,这对于知道请求何时实际执行是有用的。

物业 物业 last_updated 以及 Last_changed 的 在Home Assistant模板引擎中非常适合这种类型的使用。

我从这次整合中学到了什么

这个小项目让我想起了一件重要的事情: 在家庭自动化中,最重要的不是理论上最优雅的方法,而是真正可靠地在家里工作的方法。

起初,我想去REST。 最后,是命令行传感器,让我能够实现稳定,可读和易于维护的结果。 坦率地说,对于国内使用,这正是我所寻找的。

我也意识到,这种整合具有真正的教学价值。 您将学习如何检索JSON,创建家庭助理传感器,利用属性,格式化仪表板,并将原始信息转换为可视觉和可理解的内容。

最后,我在仪表板的一个小角落里使用了蘑菇卡,一目了然,我会看看图标是否变成红色。

如果心脏告诉我,我可以在任何短信或视觉通知的触发器中添加传感器.greynoise_ip_check的状态变化。

《 ✅ 结论

在GreyNoise中,我在Home Assistant中添加了一小块网络上下文,我觉得非常有趣。 它不是一个奇迹工具,也不是一个完整的SDI,但它是一个很好的指标,表明我的公共IP是如何从外部感知的。

我首先测试了在线验证页面,然后在终端中进行了API查询,然后尝试了Home Assistant的集成。 由于REST传感器在我的情况下没有结论性,我离开了。 _line 命令, 最终,正是这种方法完成了这项工作。 描述的方法与 Home Assistant 的 REST 和 command_line 集成的文档功能一致。

最后,我得到了一个简单的传感器,一些有用的属性,最重要的是,阅读愉快的Lovelace卡。 对我来说,这正是我喜欢的那种融合: 起初是一个有点技术性的主题,但转化为具体,视觉和日常可访问的东西。

走得更远: