freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

容器安全之镜像扫描实践
2023-05-10 12:31:10
所属地 广东省


前言:

容器镜像扫描是容器安全的一个重要环节,可以帮助发现和修复镜像中的漏洞和恶意软件,防止这些问题影响到容器的安全性。

本文以harbor镜像仓库为例,讲述如何在push镜像时如何利用开源工具NeuVector进行镜像扫描。

步骤一:利用Harbor项目的Webhooks订阅push事件

Harbor项目的Webhooks是一个通知机制,它允许您将事件通知发送到其他系统或服务。当特定事件发生时(例如推送镜像或删除镜像),Harbor会向Webhooks发送一个HTTP POST请求,其中包含有关事件的详细信息。通过这种方式,您可以将Harbor与其他应用程序、服务或系统集成,以便根据需要自动执行操作,例如触发CI/CD流程、触发镜像安全扫描或发送通知邮件等。Harbor Webhooks支持使用JSON、XML或Form表单格式发送通知。

1683689987_645b1203c5310225577d9.png!small?1683689988143

以下是一个使用 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)

启动脚本,开启监听:

1683690012_645b121cc60dee434c22f.png!small?1683690013116

harbor项目配置webhook,设置监听所有事件:

1683690040_645b12388668fe7881d51.png!small?1683690040790

测试push一个镜像到我们harbor项目里:

①登录harbor

1683690063_645b124f610917e44fdb7.png!small?1683690063758

②测试从dockerhub拉取一个sagikazarmark/dvwa镜像,在从本地上传到harbor

1683690078_645b125e430c15e8968d2.png!small?1683690078732

③创建tag

docker tag sagikazarmark/dvwa sec-harbor.xxx.com/sec_test/test:latest

1683690683_645b14bbdbe26ee1d6a2b.png!small?1683690684126

④推送镜像

docker push sec-harbor.xxx.com/sec_test/test:latest

1683690694_645b14c6c9d121874d195.png!small?1683690695352

⑤事件推送成功

1683690715_645b14db4c96267a93695.png!small?1683690715993

1683690740_645b14f426e20bd9e0633.png!small?1683690740922

步骤二:捕获PUSH事件时,自动使用NeuVector扫描镜像并返回结果

NeuVector扫描器调用方法查看官网链接

https://open-docs.neuvector.com/automation/automation

1683690754_645b1502e35f5a4d7fcdf.png!small?1683690755325

实现镜像扫描脚本如下:

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)

启动测试

1683690773_645b1515d1aa46c249c13.png!small?1683690774195

push镜像

1683690786_645b1522f23834d9b83bf.png!small?1683690787371

触发扫描并返回扫描报告

1683690803_645b1533964f01b3a4a0e.png!small?1683690804028

总结:本文简单介绍如何监听harbor仓库镜像push事件,并联动开源扫描器NeuVector进行镜像扫描。希望对大家有所帮助。

# 容器安全 # 容器安全分析 # 容器安全实践分享
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录