前言:
容器镜像扫描是容器安全的一个重要环节,可以帮助发现和修复镜像中的漏洞和恶意软件,防止这些问题影响到容器的安全性。
本文以harbor镜像仓库为例,讲述如何在push镜像时如何利用开源工具NeuVector进行镜像扫描。
步骤一:利用Harbor项目的Webhooks订阅push事件
Harbor项目的Webhooks是一个通知机制,它允许您将事件通知发送到其他系统或服务。当特定事件发生时(例如推送镜像或删除镜像),Harbor会向Webhooks发送一个HTTP POST请求,其中包含有关事件的详细信息。通过这种方式,您可以将Harbor与其他应用程序、服务或系统集成,以便根据需要自动执行操作,例如触发CI/CD流程、触发镜像安全扫描或发送通知邮件等。Harbor Webhooks支持使用JSON、XML或Form表单格式发送通知。
以下是一个使用 Flask 框架实现的 Python 代码示例,可以用来启动一个 HTTP 服务,监听 Harbor 推送事件。
from flask import Flask, request app = Flask(__name__) @app.route('/harbor-webhook', methods=['POST']) def handle_harbor_webhook(): # 处理 Harbor 推送事件的逻辑 payload = request.json return '', 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
启动脚本,开启监听:
harbor项目配置webhook,设置监听所有事件:
测试push一个镜像到我们harbor项目里:
①登录harbor
②测试从dockerhub拉取一个sagikazarmark/dvwa镜像,在从本地上传到harbor
③创建tag
docker tag sagikazarmark/dvwa sec-harbor.xxx.com/sec_test/test:latest
④推送镜像
docker push sec-harbor.xxx.com/sec_test/test:latest
⑤事件推送成功
步骤二:捕获PUSH事件时,自动使用NeuVector扫描镜像并返回结果
NeuVector扫描器调用方法查看官网链接
https://open-docs.neuvector.com/automation/automation
实现镜像扫描脚本如下:
from flask import Flask, request import json import requests import urllib3 urllib3.disable_warnings() # NeuVector API配置 # NeuVector控制器信息 neuvector_username = "xxxxx" neuvector_password = "xxxxxxx" neuvector_controller_ip = "10.xxx.xxx.144" #注意是控制器端口 非管理节点端口 neuvector_controller_restapi_port = "xxxx" # Harbor API credentials harbor_ip = 'https://sec-harbor.xxx.xxx/' harbor_username = 'xxxxx' harbor_password = 'xxxxx' app = Flask(__name__) @app.route('/harbor-webhook', methods=['POST']) def handle_harbor_webhook(): # 处理 Harbor 推送事件的逻辑 payload = request.json # 获取镜像列表 if(payload['type']=='PUSH_ARTIFACT'): # 登录NeuVector控制器获取Token auth_url = f"https://{neuvector_controller_ip}:{neuvector_controller_restapi_port}/v1/auth" auth_data = { "password": { "username": neuvector_username, "password": neuvector_password } } auth_headers = { "Content-Type": "application/json" } auth_response = requests.post(auth_url, headers=auth_headers, data=json.dumps(auth_data), verify=False) token = auth_response.json()['token']['token'] # 调用NeuVector进行镜像扫描 scan_url = f"https://{neuvector_controller_ip}:{neuvector_controller_restapi_port}/v1/scan/repository" scan_headers = { "Content-Type": "application/json", "X-Auth-Token": token } images = payload['event_data']['resources'] # 对每个镜像执行NeuVector扫描 for image in images: scan_data = { "request": { "registry": harbor_ip, "username": harbor_username, "password": harbor_password, "repository": payload['event_data']['repository']['repo_full_name'], "tag": image['tag'] } } scan_response = requests.post(scan_url, headers=scan_headers, data=json.dumps(scan_data), verify=False) print(f"Scan result for {image['resource_url']}: {scan_response.json()['report']}") return '', 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
启动测试
push镜像
触发扫描并返回扫描报告
总结:本文简单介绍如何监听harbor仓库镜像push事件,并联动开源扫描器NeuVector进行镜像扫描。希望对大家有所帮助。