Netchecks 是一个云原生工具,用于指定和定期检查网络条件断言。使用 netchecks 主动验证安全控制是否按预期工作,并在配置错误时发出警报。
项目描述
Netchecks
  
Netchecks 是一套用于测试网络条件并断言它们符合预期的工具。
有两个主要组件
- Netchecks Operator - Kubernetes Operator,用于运行网络检查并将结果作为 PolicyReport资源报告。有关详细信息,请参阅operator README,完整文档可在 https://docs.netchecks.io 找到。
- Netcheck CLI 和 Python 库 - 命令行工具,用于运行网络检查并断言它们符合预期。请继续阅读快速入门指南。
Netcheck 命令行工具
netcheck 是一个可配置的命令行应用程序,用于测试网络条件是否符合预期。它可以用于验证 DNS 和 HTTP 连接,并可以配置为断言结果是否符合预期,例如
netcheck http --url=https://github.com/status --validation-rule "data.body.contains('GitHub lives!') && data['status-code'] in [200, 201]"
安装
从 PyPi 安装 Python 包
pip install netcheck
CLI 还可以通过 Docker 运行
docker run -it ghcr.io/hardbyte/netchecks:main
单独的断言
默认情况下,netcheck 将 JSON 结果输出到 stdout,包括响应详情
$ netcheck dns
{
  "spec": {
    "type": "dns",
    "nameserver": null,
    "host": "github.com",
    "timeout": 30.0
  },
  "data": {
    "canonical_name": "github.com.",
    "expiration": 1675825244.2986872,
    "response": "id 6176\nopcode QUERY\nrcode NOERROR\nflags QR RD RA\nedns 0\npayload 65494\n;QUESTION\ngithub.com. IN A\n;ANSWER\ngithub.com. 60 IN A 20.248.137.48\n;AUTHORITY\n;ADDITIONAL",
    "A": [
      "20.248.137.48"
    ],
    "startTimestamp": "2023-02-08T02:59:44.248174",
    "endTimestamp": "2023-02-08T02:59:44.298773"
  },
  "status": "pass"
}
传递 -v 标志以查看日志消息。
可以配置每个检查,例如,您可以指定 dns 检查的 server 和 host,并告诉 netcheck 某个配置是否预期通过或失败
netcheck dns --server 1.1.1.1 --host hardbyte.nz --should-pass
{
  "spec": {
    "type": "dns",
    "nameserver": "1.1.1.1",
    "host": "hardbyte.nz",
    "timeout": 30.0,
    "pattern": "\ndata['response-code'] == 'NOERROR' &&\nsize(data['A']) >= 1 && \n(timestamp(data['endTimestamp']) - timestamp(data['startTimestamp']) < duration('10s'))\n"
  },
  "data": {
    "canonical_name": "hardbyte.nz.",
    "expiration": 1683241225.5542665,
    "response": "id 53196\nopcode QUERY\nrcode NOERROR\nflags QR RD RA\n;QUESTION\nhardbyte.nz. IN A\n;ANSWER\nhardbyte.nz. 3600 IN A 209.58.165.79\n;AUTHORITY\n;ADDITIONAL",
    "A": [
      "209.58.165.79"
    ],
    "response-code": "NOERROR",
    "startTimestamp": "2023-05-04T22:00:24.491750",
    "endTimestamp": "2023-05-04T22:00:25.554344"
  },
  "status": "pass"
}
Netcheck 可以处理预期失败的检查
$ netcheck dns --server=1.1.1.1 --host=made.updomain --should-fail
请注意,如果检查按预期失败,则最终状态将显示为 pass,如果检查意外通过,则显示为 fail!
netcheck 对每种检查类型都内置了默认验证。例如,对于 dns 检查,如果 DNS 响应代码是 NOERROR,至少有一个 A 记录,并且解析器在10秒内响应,则检查通过。还可以添加自定义验证,请参阅下文的 自定义验证 部分。
自定义验证
可以通过命令行上的 validation-rule 选项或配置 JSON 中的测试规范规则来添加自定义验证。
例如,要覆盖 dns 检查的默认验证,检查 A 记录解析到特定的 IP 地址
netcheck dns --host github.com --validation-rule "data['A'].contains('20.248.137.48')"
验证规则是一个 CEL 表达式,它使用检查返回的 data 和作用域中的 spec 对象进行评估。有关 CEL 的介绍,请参阅 https://github.com/google/cel-spec/blob/master/doc/intro.md
HTTP 检查
也有可用的 http 检查
断言 GitHub 的状态页面包含文本 "GitHub lives!",并且响应代码是 200
netcheck http --url=https://github.com/status --validation-rule "data.body.contains('GitHub lives!') && data['status-code'] in [200, 201]"
随请求提供头信息
netcheck http --url https://pie.dev/headers --header "X-Header:special"
验证响应体是有效的 JSON,并且包含一个包含具有 special 值的 X-Header 键的 headers 对象
netcheck http --url https://pie.dev/headers \
  --header "X-Header:special" \
  --validation-rule "parse_json(data.body).headers['X-Header'] == 'special'"
确保 POST 请求失败
$ netcheck http --method=post --url=https://s3.ap-southeast-2.amazonaws.com --should-fail
通过文件配置
运行 netcheck 的主要方式是传递一系列断言。可以提供一个包含要检查的断言列表的 JSON 文件
{
  "assertions": [
    {
      "name":  "deny-cloudflare-dns", 
      "rules": [
        {"type": "dns", "server":  "1.1.1.1", "host": "github.com"}
      ]
    }
  ]
}
然后调用 run 命令
$ netcheck run --config tests/testdata/dns-config.json
输出应该是包含每个断言结果的有效的 JSON
可以在配置文件中指定多个断言和多个规则,可以为每个规则提供配置,例如头信息和自定义验证
{
  "assertions": [
    {"name":  "get-with-header", "rules": [
      {"type": "http", "url": "https://pie.dev/headers", "headers": {"X-Test-Header":  "value"}},
      {"type": "http", "url": "https://pie.dev/headers", "headers": {"X-Header": "secret"}, "validation": "parse_json(data.body).headers['X-Header'] == 'secret'" }
    ]}
  ]
}
外部数据
最后,可以引用外部上下文来注入数据。以下示例是有效的配置文件,虽然有些牵强
{
  "assertions": [
    {
      "name": "example-assertion",
      "rules": [
        {
          "type": "http",
          "url": "{{customdata.url}}",
          "headers": {"{{customdata.header}}": "{{ b64decode(token) }}"},
          "validation": "parse_json(data.body).headers['X-Header'] == 'secret'"
        }
      ]
    }
  ],
  "contexts": [
    {"name": "customdata", "type": "inline", "data": {"url": "https://pie.dev/headers", "header": "X-Header"}},
    {"name": "token", "type": "inline", "data": "c2VjcmV0=="},
    {"name": "selfref", "type": "file", "path": "example-config.json"}
  ]
}
在上面的示例中,customdata 和 token 上下文被注入到规则中。使用 customdata.url 作为请求的 URL,使用 customdata.header 作为头信息的名称。将 token 进行 base64 解码并用作头信息的值。未使用 selfref 上下文,但它显示了如何加载外部 JSON 文件,该文件被 Kubernetes 操作符广泛用于注入数据。
开发
在 pyproject.toml 中更新版本,推送到 main 并在 GitHub 上创建一个版本。Pypi 发布将由 GitHub actions 执行。
使用 Poetry 安装开发依赖项
poetry install --with dev
手动发布
要手动发布,请使用 Poetry
poetry version patch
poetry build
poetry publish
测试
使用 Pytest 进行测试。
poetry run pytest
          项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分发
构建版本
netcheck-0.5.3.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 657793036acbcd321607e5f5713bfe3dcbff862cd0c5be27b34c48c795848596 | |
| MD5 | 2196b575b230a43c3449abbe1ca8c1bd | |
| BLAKE2b-256 | 5a859f7cfede36cf0c1208b90a001123df0c4d7a5d40d34d9170cfb0b7d949e2 | 
netcheck-0.5.3-py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 504b1ec7cccb3f075154aec7cc38e38d82f8964749ba92e8f3eed419d139f211 | |
| MD5 | 0b622cee9d4f3e6a6f4398e08fa40f77 | |
| BLAKE2b-256 | 2d8638068a19dd593da0e7a39c7931e0d7a22fcfccf8ed6a580abc624093f202 |