#csaf #sbom #walker #data #openpgp #validation #document

walker-common

SBOM 和 CSAF Walker 的常用功能

42 个版本

0.8.11 2024 年 7 月 29 日
0.8.3 2024 年 6 月 24 日
0.6.0-alpha.82024 年 2 月 23 日
0.5.4 2023 年 10 月 27 日

#2#walker

Download history 886/week @ 2024-04-22 202/week @ 2024-04-29 14/week @ 2024-05-06 691/week @ 2024-05-13 253/week @ 2024-05-20 240/week @ 2024-05-27 454/week @ 2024-06-03 95/week @ 2024-06-10 345/week @ 2024-06-17 361/week @ 2024-06-24 284/week @ 2024-07-01 423/week @ 2024-07-08 483/week @ 2024-07-15 97/week @ 2024-07-22 615/week @ 2024-07-29 188/week @ 2024-08-05

1,404 每月下载量
用于 5 crates

Apache-2.0 和可能 LGPL-2.0-or-later

80KB
2K SLoC

CSAF Walker

crates.io docs.rs GitHub release (latest SemVer) CI

"遍历"来自远程服务器的 CSAF 数据,允许用户处理这些数据。

此外,此存储库还包括用于处理 SBOM 数据的工具。大多数选项对 SBOM 和 CSAF 都有效。

从命令行

有一个命令行工具,可以直接使用。

安装

从 GitHub 发布页面下载可运行的二进制文件:https://github.com/ctron/csaf-walker/releases

您也可以使用 cargo binstall 安装此类二进制文件

cargo binstall csaf-cli
cargo binstall sbom-cli

或者自己编译,使用纯 cargo install

cargo install csaf-cli
cargo install sbom-cli

使用方法

您可以通过提供 CSAF 信任提供者的域名来下载所有文档

mkdir out
csaf sync -3 -v -d out/ redhat.com

还可以只下载文件,跳过验证步骤(稍后可以使用已下载的副本进行验证)

mkdir out
csaf download -3 -v -d out/ redhat.com

[!注意] 在数据使用 GPG v3 签名的情况下,可以使用 -3 标志,该标志认为这仍然有效。

另一种选择是使用 --policy-date 参数,并手动提供策略日期。另请参阅: https://docs.sequoia-pgp.org/sequoia_openpgp/policy/struct.StandardPolicy.html

差异同步

默认情况下,HTTP服务器报告的时间戳将应用于下载的文件。当重新运行时,将使用changes.csv文件作为源来发现文件何时被更改。如果一个文件已经存在并且changes.csv文件中有更新的修改时间戳,则将再次下载。否则,将跳过。

使用--since选项,可以提供一个起始时间戳,这将跳过所有在此时间戳之前报告的更改,并强制在时间戳之后的所有更改(独立于本地文件时间戳)重新同步。

使用--since-file选项,可以通过最初从文件加载“since”值,并在运行成功结束时将其存储到文件中来自动化“since”值。

如果同时提供了--since--since-file,则首先使用“since file”,如果文件不存在,则“since”值将作为后备。

发送数据

除了存储之外,还可以将数据发送到远程实例(使用Vexination或Bombastic API)。

csaf send -3 redhat.com https://127.0.0.1:8083

当然,也可以使用文件系统作为源

csaf send -3 file:out/ https://127.0.0.1:8083

作为库

使用crate csaf-walker,这也可以用作库

use anyhow::Result;
use url::Url;
use csaf_walker::source::HttpSource;
use csaf_walker::walker::Walker;
use csaf_walker::retrieve::RetrievingVisitor;
use csaf_walker::validation::{ValidatedAdvisory, ValidationError, ValidationVisitor};
use walker_common::fetcher::Fetcher;

async fn walk() -> Result<()> {
    let fetcher = Fetcher::new(Default::default()).await?;
    let metadata = MetadataRetriever::new("redhat.com");
    let source = HttpSource::new(metadata, fetcher, Default::default());

    Walker::new(source.clone())
        .walk(RetrievingVisitor::new(
            source.clone(),
            ValidationVisitor::new(
                move |advisory: Result<ValidatedAdvisory, ValidationError>| async move {
                    log::info!("Found advisory: {advisory:?}");
                    Ok::<_, anyhow::Error>(())
                },
            )
        ))
        .await?;

    Ok(())
}

依赖项

~23–41MB
~738K SLoC