freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

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


前言:

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

本文以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进行镜像扫描。希望对大家有所帮助。

# 容器安全 # 容器安全分析 # 容器安全实践分享
本文为 Make1bag 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Make1bag LV.1
这家伙太懒了,还未填写个人描述!
  • 2 文章数
  • 1 关注者
容器安全之NeuVector初体验
2023-05-24
文章目录