本文提到的功能,以及更多功能,都可以通过SOCFortress平台实现。让SOCFortress帮助你和你的团队确保基础设施的安全。
网址是:https://www.socfortress.co/
如有任何問題,請聯繫我們: https://www.socfortress.co/contact_form.html
在网络安全领域,SBOM(软件物料清单,Software Bill of Materials 的简称)是一个关键文档,列出了构建软件应用程序所使用的组件,包括库、框架、依赖项等。
这就像软件的“成分列表”,列出了构成该软件的开源和闭源组件。利用它,组织可以更好地理解、管理和保护其应用程序的安全。
(请参阅前文这里)
可以参考:https://github.com/anchore/syft
Syft 是一个由 Anchore 开发的开放源代码工具,旨在为容器镜像和文件系统生成软件物料清单(SBOM),。它通过识别依赖项、库和其他第三方组件来帮助组织了解其软件的构成部分,这对于安全性和合规性来说是至关重要的。
通过为您的容器映像或软件构建生成 SBOM,Syft 帮助团队识别正在使用的第三方组件,并结合使用 Grype 漏洞扫描,帮助识别这些组件中的已知漏洞。
Syft 生成的 SBOMs 帮助组织遵守行业标准和监管要求(例如,美国的网络安全行政命令,该命令要求为政府使用的软件生成 SBOM 信息)。
许多组织对开源软件许可协议感到担心。Syft 的 SBOM 包含识别软件包的许可证信息,这有助于更轻松地管理许可风险并确保符合许可政策,使许可证管理过程更加简化。
随着供应链攻击变得越来越常见,了解软件内部的细节至关重要。Syft 帮助开发人员、安全团队和运营团队清楚地了解所使用的组件及其相关风险,从而提升整体的安全态势。
Syft 可以轻松集成到 CI/CD 流水线中,帮助团队在软件开发的各个阶段生成软件物料清单,从而执行安全检查并确保软件在部署前的完整性。
Syft可以通过APIs和自定义工作流来扩展其功能,使其成为一个灵活的自动安全工具。
SBOM 提供了关于软件组件的详细元数据,包括软件包清单、版本、许可证以及潜在的安全漏洞(在配合漏洞扫描工具使用时)。
可以参考: https://github.com/anchore/grype
Grype 是一个开源的 漏洞扫描工具,用于扫描容器图像和文件系统中的漏洞等。它帮助开发人员和安全专家识别软件供应链中的已知漏洞。由 Anchore 开发的 Grype 通过将图像或文件系统中的软件包与美国国家漏洞数据库(NVD)、GitHub 咨询信息等数据库中的已知漏洞进行比对来查找漏洞。
Grype 帮助开发人员和安全团队在开发周期早期识别漏洞,保护容器化应用程序免受已知漏洞攻击。
通过其 CI/CD 集成,Grype 使漏洞扫描成为软件开发过程中的自动化环节,从而使软件开发过程中的安全保持持续。
作为 Anchore 开源项目的一员,Grype 不断 更新最新的漏洞数据和特性。它拥有一个活跃的社区,在云原生领域中,它被信赖为漏洞管理工具。
使用Python Flask,我们可以快速搭建一个web服务器,并创建一个表单来输入我们想要生成相关Docker镜像的SBOM和漏洞报告的名称。
以下是一些步骤:
安装Syft程序。
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin # 此命令用于从GitHub下载并安装Syft工具到指定路径 /usr/local/bin
安装一下 Grype。
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin # 使用curl从GitHub下载安装脚本,然后通过shell执行该脚本来安装grype到/usr/local/bin目录。
安装 Flask:
命令是 pip install Flask
,这会安装 Flask 框架。
创建一个 python 文件 "app.py"。
from flask import Flask, render_template, request, send_file import os import subprocess app = Flask(__name__) # 确保输出文件的目录存在 OUTPUT_DIR = "reports" if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) # 定义Syft和Grype可用的格式 SYFT_FORMATS = [ "syft-json", "cyclonedx-xml", "cyclonedx-xml@1.5", "cyclonedx-json", "cyclonedx-json@1.5", "spdx-json", "spdx-json@2.2" ] GRYPE_FORMATS = [ "cyclonedx", "cyclonedx-json", "json", "sarif" ] @app.route('/') def index(): return render_template('index.html', syft_formats=SYFT_FORMATS, grype_formats=GRYPE_FORMATS) @app.route('/generate', methods=['POST']) def generate_reports(): image_id = request.form['image_id'] syft_format = request.form['syft_format'] grype_format = request.form['grype_format'] if not image_id: return "Error: Docker image ID is required.", 400 # 生成Syft和Grype输出文件路径 syft_output_file = os.path.join(OUTPUT_DIR, f"{image_id.replace(':', '_')}_syft_report.{syft_format.split('-')[-1]}") grype_output_file = os.path.join(OUTPUT_DIR, f"{image_id.replace(':', '_')}_grype_report.{grype_format.split('-')[-1]}") try: # 运行Syft命令 syft_command = f"syft {image_id} -o {syft_format} > {syft_output_file}" subprocess.run(syft_command, shell=True, check=True) # 运行Grype命令 grype_command = f"grype {image_id} -o {grype_format} > {grype_output_file}" subprocess.run(grype_command, shell=True, check=True) except subprocess.CalledProcessError as e: return f"生成报告时出错:{e}", 500 # 提供Syft和Grype报告文件的下载链接 return f""" 报告生成成功:<br> <a href='/download/{os.path.basename(syft_output_file)}'>下载Syft报告文件</a><br> <a href='/download/{os.path.basename(grype_output_file)}'>下载Grype报告文件</a> """ @app.route('/download/<filename>') def download_file(filename): filepath = os.path.join(OUTPUT_DIR, filename) if os.path.exists(filepath): return send_file(filepath, as_attachment=True) else: return "文件未找到,请检查文件名是否正确", 404 if __name__ == '__main__': app.run(debug=True)
HTML模板:
从 flask 导入 Flask, render_template, request, send_file 作为 send_file 导入 os 导入 subprocess app = Flask(__name__) # 确保用于存储输出文件的目录存在 OUTPUT_DIR = "reports" 如果 not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) # 定义 Syft 和 Grype 的可用格式 SYFT_FORMATS = [ "syft-json", "cyclonedx-xml", "cyclonedx-xml@1.5", "cyclonedx-json", "cyclonedx-json@1.5", "spdx-json", "spdx-json@2.2" ] GRYPE_FORMATS = [ "cyclonedx", "cyclonedx-json", "json", "sarif" ] @app.route('/') def index(): 渲染并返回 render_template('index.html', syft_formats=SYFT_FORMATS, grype_formats=GRYPE_FORMATS) @app.route('/generate', methods=['POST']) def generate_reports(): image_id = request.form['image_id'] syft_format = request.form['syft_format'] grype_format = request.form['grype_format'] 如果 not image_id: 返回 "错误: Docker image ID 是必需的.", 400 # 生成 Syft 和 Grype 输出的文件路径 syft_output_file = os.path.join(OUTPUT_DIR, f"{image_id.replace(':', '_')}_syft_report.{syft_format.split('-')[-1]}") grype_output_file = os.path.join(OUTPUT_DIR, f"{image_id.replace(':', '_')}_grype_report.{grype_format.split('-')[-1]}") 尝试: # 运行 Syft 命令 syft_command = f"syft {image_id} -o {syft_format} > {syft_output_file}" subprocess.run(syft_command, shell=True, check=True) # 运行 Grype 命令 grype_command = f"grype {image_id} -o {grype_format} > {grype_output_file}" subprocess.run(grype_command, shell=True, check=True) 除了 subprocess.CalledProcessError 作为 e: 返回 f"生成报告时出错: {e}", 500 # 提供两个报告的下载链接 返回 f""" 报告生成成功!<br> <a href='/download/{os.path.basename(syft_output_file)}'>下载 Syft 报告</a><br> <a href='/download/{os.path.basename(grype_output_file)}'>下载 Grype 报告</a> """ @app.route('/download/<filename>') def download_file(filename): filepath = os.path.join(OUTPUT_DIR, filename) 如果 os.path.exists(filepath): 返回 send_file(filepath, 作为附件=True) 否则: 返回 "文件未找到!", 404 如果 __name__ 等于 '__main__': app.run(debug=True)
打开应用。
我们可以在网页表单中选择输出格式,如上图所示。
Syft 格式规范:
格赖普格式说明:
提交后即可下载报告:
Grype报告中的漏洞:
本文中讨论的功能,以及其他众多功能,均可通过SOCFortress平台使用。让SOCFortress帮助您和您的团队保障基础设施的安全。
网址:https://www.socfortress.co./
想联系我们?点击这里:https://www.socfortress.co/contact_form.html