Cvechecker

来自 Alpine Linux
此材料正在制作中...

在此通知移除之前,请勿遵循此处的说明。
(最后编辑:Sertonix,于 2023 年 11 月 17 日。)

cvechecker 是一个有用的工具,可以帮助比较您的发行版中安装的软件包与通用漏洞披露 (CVE)。它不是一个万无一失的方法,您很可能会遇到许多误报(漏洞已通过修订版本修复,但该工具无法检测到修订版本本身),但它仍然胜过没有。其想法是自动化安全检查。但是,显然,这不应该(也绝不能)是检查安全的唯一方法。通过适当的报告机制,当发布可能与您的系统匹配的新 CVE 时,您会立即收到警告。然后,您可以采取适当的步骤(确认报告、验证事件、修复软件包或标记为误报)。以下是步骤

  • 拉取最新的 CVE 条目以及软件/版本检测规则(仅限管理任务)
  • 生成要扫描的文件列表
  • 收集已安装的软件/版本信息
  • 输出可能影响您系统的 CVE 条目
  • 生成报告,告知您有关 CVE 条目的信息

安装

cvechecker 在 edge main 仓库中可用。如果您正在运行 Alpine 的稳定版本,您可以按以下方式从 edge 添加软件包

apk install cvechecker

使用 sqlite 进行配置

CVEChecker 的安装脚本会创建一个用户和一个组,都名为 “cvechecker”,以便拥有一个具有最低权限的用户来运行 cvechecker。在此文件夹中,cvechecker 将根据 cvechecker.conf 创建数据库(我们使用 sqlite3)。但也支持 mysql。如果您想与运行 Alpine 的多个路由器/服务器共享一个 DB,这将非常有用)

在使用 cvechecker 之前,您应该配置 cvechecker 以使用 sqlite,然后使用 cve 条目填充 DB。根据我们的设置,/etc/cvechecker.conf 看起来像

    # Generic settings
    # 
    dbtype = "sqlite"; 
    #dbtype="mysql";
    cvecache = "/var/cvechecker/cache";
    datadir = "/usr/share/cvechecker";
    stringcmd = "/usr/bin/strings -n 3 '@file@'";
    version_url = "https://raw.github.com/sjvermeu/cvechecker/master/versions.dat";
    #userkey = "servertag";
    #
    # For Sqlite3
    #
    sqlite3: {
      localdb = "/var/cvechecker/local";
      globaldb = "/var/cvechecker/global.db";
    };
    # 
    # For MySQL
    # 
    mysql: {
      dbname = "cvechecker";
      dbuser = "cvechecker";
      dbpass = "cvecheckpass";
      dbhost = "$IPADDRESS_OF_MYSQL_SERVER";
    };


现在,您可以使用以下命令初始化 DB

cvechecker -i

DB 已准备就绪。现在,我们应该配置 cvechecker 以使用 mysql,然后使用 cve 条目填充 DB。

使用 MySQL 进行配置

MySQL 是 cvechecker 能够使用的另一个后端。如果您在网络中安装了多个 cvechecker,这将非常有用。这样,您就只有一个需要更新的 CVE “存储库”。

apk add mysql mysql-client rc-service mysql setup rc-service mysql start && rc-update add mysql default /usr/bin/mysqladmin -u root password 'new-password'

为 cvechecker 创建一个数据库用户

mysql -u root -p mysql>CREATE DATABASE cvechecker; mysql>CREATE USER 'cvechecker'@'%' IDENTIFIED BY 'cvecheckpass'; mysql>GRANT ALL ON cvechecker.* TO 'cvechecker'@'localhost'; mysql>GRANT ALL ON cvechecker.* TO 'cvechecker'@'%'; mysql>FLUSH PRIVILEGES;

我设置了 %,因为 DB 和用户应该允许来自其他主机的访问。您可以限制此设置,仅允许您的域。

您有两种在 DB 中创建表的方法

通过 .sql 脚本

以 cvechecker 身份登录 mysql

mysql -D cvechecker -u cvechecker -p mysql>source /usr/share/cvechecker/mysql_cvechecker.sql;

DB 已准备就绪。现在,我们应该配置 cvechecker 以使用 mysql,然后使用 cve 条目填充 DB。

通过 cvechecker

在您配置 DB 后,您可以使用以下命令创建表

cvechecker -i

但是为了使其工作,您必须在 cvechecker.conf 中配置 DB 设置。根据我们的设置,/etc/cvechecker.conf 看起来像

    # Generic settings
    # 
    #dbtype = "sqlite"; 
    dbtype="mysql";
    cvecache = "/var/cvechecker/cache";
    datadir = "/usr/share/cvechecker";
    stringcmd = "/usr/bin/strings -n 3 '@file@'";
    version_url = "https://raw.github.com/sjvermeu/cvechecker/master/versions.dat";
    #userkey = "servertag";
    #
    # For Sqlite3
    #
    sqlite3: {
      localdb = "/var/cvechecker/local";
      globaldb = "/var/cvechecker/global.db";
    };
    # 
    # For MySQL
    # 
    mysql: {
      dbname = "cvechecker";
      dbuser = "cvechecker";
      dbpass = "cvecheckpass";
      dbhost = "$IPADDRESS_OF_MYSQL_SERVER";
    };


注意: 运行 cvechecker -i(初始化数据库)会删除 DB 中的所有条目。


使用 CVEChecker

在创建数据库后,您必须从互联网上拉取必要的数据

pullcves pull

根据手册,“这将花费很长时间,请耐心等待(将超过 50 万个 CVE 条目加载到数据库中是一项耗时的活动 - 但只需一次)。未来的拉取不会花费这么多时间,因为它们不会重新下载所有往年的 CVE 条目(除非您要求这样做)。”

(如果您位于代理服务器后面,您应该从环境变量或使用 wget.rc 设置它)

将此任务添加到 crontab 中可能很有用,也许每天一次。成为 cvecheker 用户并运行 “crontab -e”。插入以下内容以每天凌晨 5:00 运行 pullcves

*       5       *       *       *       /usr/bin/pullcves pull

现在,创建一个可执行文件列表以及 /proc/version,并允许 cvechecker 验证您的 Linux 内核和已安装软件是否存在内核相关的 CVE 条目。

find / -type f -perm -o+x > /tmp/cvecheck.tmp cat /proc/version >> /tmp/cvecheck.tmp

现在,在 /tmp/cvecheck.tmp 中,您将拥有系统所有二进制文件及其版本。使用以下命令检查是否存在 cve

cvechecker -b /tmp/cvecheck.tmp

如果需要,您可以创建包含条目的报告(如果找到它们)

cvechecker -r

简单的脚本,可帮助自动执行此操作。复制并粘贴它,将其另存为 run_cvecheck.sh 并授予其执行权限。

    #!/bin/sh
    tempfile=/tmp/cvecheck.tmp
    EMAILADMIN=<%EMAIL ADDRESS USED FOR THIS TASK%>
    find / -type f -perm -o+x > $tempfile
    cat /proc/version >> $tempfile
    cvechecker -b $tempfile > /dev/null 2>&1 	# Run cvechecker against the software list
    cvechecker -r > $tempfile > /dev/null 2>&1	# Create a report 
    if [ -s "$tempfile" ] ; then			# If exists and non-zero, send it via email	
     mail $EMAILADMIN -s "CVE Checker" < $tempfile	
    fi ;
    rm $tempfile
注意: 如果您想发送电子邮件,则必须添加 mailx 并配置 smtp 服务器(例如 ssmtp)。但这方面的信息超出了本文档的目的。

为了通过电子邮件发送最后几行,您应该配置一个 smtp 服务器。ssmtp 是广泛使用的。将此脚本作为 cronjob 运行可能是一个好主意。

所以,您可以像对 pullcves 所做的那样:成为 cvecheker 用户并运行 “crontab -e”。

*       6       *       *       *       /var/cvechecker/run_cvecheck.sh

创建报告

CVEChecker 以 CSV 格式生成报告。从这个 CSV 生成 html 可能会很好。

这是一个示例脚本,它使用 csv2xml 和 cvereport.xsl(cvechecker 附带的两个脚本),允许从 csv 开始生成 html 文件。


    #!/bin/sh
    tempfile=/tmp/cvecheck.tmp
    EMAILADMIN=root@localhost
    WEBDIR=/var/www/localhost/htdocs/cvechecker/
    CONFFILE=/etc/cvechecker.conf
    DATADIR=$(awk -F'=' '/^datadir/ {print $2}' ${CONFFILE} | awk -F'"' '{print $2}');
    find / -type f -perm -o+x > $tempfile
    cat /proc/version >> $tempfile
    cvechecker -b $tempfile > /dev/null 2>&1        # Run cvechecker against the software list
    if [ -s "$tempfile" ] ; then                    # If exists and non-zero, send it via email     
        mail $EMAILADMIN -s "CVE Checker" < $tempfile
    fi ;
    # Create Report. 
    # FYI: acknowledgements.xml is an hard-coded file name.
    cvechecker -rC > $WEBDIR/report.csv
    awk -F, -f ${DATADIR}/csv2xml.awk $WEBDIR/report.csv > ${DATADIR}/acknowledgements.xml
    xsltproc ${DATADIR}/cvereport.xsl $DATADIR/acknowledgements.xml > ${WEBDIR}/report.html
    printf "done\n".

注意:生成的 html 非常难看,因为 cvereport.xsl 硬编码了 css 文件,该文件存储在 /usr/share/cvechecker 目录中。文件名为 report.css。您可以将 report.css 文件复制到 $WEBDIR 中,以便获得更美观的 html 文件。