安全编排自动化与响应(SOAR)平台如Palo Alto XSOAR年费 $100,000+,Splunk SOAR $50,000+。Shuffle SOAR 是完全免费的开源替代方案,支持可视化工作流编排、自动化响应、与200+安全工具集成。
为什么选Shuffle
| 功能 | Palo Alto XSOAR | Splunk SOAR | Shuffle SOAR |
|---|---|---|---|
| 工作流编排 | 可视化 | 可视化 | 可视化 |
| 集成数量 | 500+ | 300+ | 200+ |
| 自动化响应 | 完整 | 完整 | 完整 |
| 告警管理 | 完整 | 完整 | 完整 |
| API支持 | 完整 | 完整 | 完整 |
| 自定义App | 支持 | 支持 | 支持 |
| 价格 | $100K+/年 | $50K+/年 | 免费 |
Shuffle基于Python开发,使用Docker部署,支持Webhook触发、定时任务、手动触发三种工作流启动方式。
安装部署
# 一键Docker部署
git clone https://github.com/Shuffle/Shuffle.git
cd Shuffle
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 访问 http://localhost:3001
# 首次访问注册管理员账号
自定义部署配置
# docker-compose.yml 关键配置
version: '3'
services:
frontend:
image: ghcr.io/shuffle/shuffle-frontend:latest
ports:
- "3001:80"
environment:
- BACKEND_HOSTNAME=shuffle-backend
depends_on:
- backend
backend:
image: ghcr.io/shuffle/shuffle-backend:latest
ports:
- "5001:5001"
environment:
- DATASTORE_EMULATOR_HOST=shuffle-database:8000
- SHUFFLE_APP_DOWNLOAD_LOCATION=https://github.com/shuffle/shuffle-apps
depends_on:
- database
database:
image: frikky/opensearch:latest
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- plugins.security.disabled=true
orborus:
image: ghcr.io/shuffle/shuffle-orborus:latest
environment:
- SHUFFLE_APP_SDK_VERSION=latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
核心概念
Workflow(工作流)
工作流由多个Action节点组成,支持条件分支、循环、并行执行。
Action(动作)
每个Action代表一个操作:调用API、执行命令、发送邮件等。
Trigger(触发器)
- Webhook:接收外部事件触发
- Schedule:定时触发
- Email:邮件触发
- Subflow:被其他工作流调用
App(应用)
预构建的安全工具集成,如VirusTotal、Shodan、Wazuh等。
实战工作流
工作流1:自动告警分类与响应
[Webhook接收告警] → [解析告警内容] → [查询威胁情报] → {判断严重程度}
├─ 高危 → [自动封禁IP] → [发送企业微信告警]
├─ 中危 → [创建工单] → [发送邮件通知]
└─ 低危 → [记录日志]
Webhook触发配置
# 发送告警到Shuffle Webhook
import requests
import json
alert_data = {
"source": "suricata",
"alert_type": "ids",
"severity": "high",
"src_ip": "203.0.113.50",
"dst_ip": "10.0.1.100",
"signature": "ET MALWARE Cobalt Strike Beacon",
"timestamp": "2024-01-15T10:30:00Z"
}
response = requests.post(
"http://localhost:3001/api/v1/hooks/webhook/HOOK_ID",
headers={"Content-Type": "application/json"},
data=json.dumps(alert_data)
)
print(response.json())
自动封禁IP的Action
# Shuffle中执行的Python脚本
# Action: Block IP via iptables
import subprocess
def block_ip(ip):
# 封禁IP
subprocess.run(["iptables", "-A", "INPUT", "-s", ip, "-j", "DROP"])
# 记录封禁日志
with open("/var/log/blocked_ips.log", "a") as f:
f.write(f"{datetime.now()}: Blocked {ip}\n")
return f"Successfully blocked {ip}"
# 从workflow参数获取IP
ip = workflow["src_ip"]
result = block_ip(ip)
print(result)
工作流2:钓鱼邮件自动分析
[邮件触发] → [提取附件] → [VirusTotal扫描] → [沙箱分析]
├─ 恶意 → [隔离邮件] → [封禁发件人域名] → [告警]
└─ 正常 → [标记安全]
工作流3:漏洞自动验证
[Nuclei扫描结果Webhook] → [解析漏洞] → [查询资产CMDB]
→ [Shodan验证暴露] → [创建Jira工单] → [通知负责人]
自定义App开发
# shuffle_app.py - 自定义Wazuh App
import requests
class WazuhApp:
def __init__(self, base_url, username, password):
self.base_url = base_url
self.token = self._authenticate(username, password)
def _authenticate(self, username, password):
response = requests.post(
f"{self.base_url}/security/user/authenticate",
auth=(username, password),
verify=False
)
return response.json()["data"]["token"]
def get_alerts(self, limit=100):
headers = {"Authorization": f"Bearer {self.token}"}
response = requests.get(
f"{self.base_url}/alerts",
headers=headers,
params={"limit": limit, "sort": "-timestamp"}
)
return response.json()["data"]["affected_items"]
def get_agents(self):
headers = {"Authorization": f"Bearer {self.token}"}
response = requests.get(
f"{self.base_url}/agents",
headers=headers
)
return response.json()["data"]["affected_items"]
# 在Shuffle中调用
wazuh = WazuhApp("https://wazuh-server:55000", "admin", "admin")
alerts = wazuh.get_alerts(limit=10)
API集成示例
与Wazuh集成
# Shuffle Action: 获取Wazuh最新告警
import requests
WAZUH_URL = "https://wazuh-server:55000"
TOKEN = "your_wazuh_token"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
# 获取高危告警
response = requests.get(
f"{WAZUH_URL}/alerts",
headers=headers,
params={
"level": "12",
"limit": 50,
"sort": "-timestamp"
},
verify=False
)
alerts = response.json()["data"]["affected_items"]
for alert in alerts:
print(f"[{alert['rule']['level']}] {alert['rule']['description']} - {alert['data']['srcip']}")
与OpenVAS集成
# Shuffle Action: 启动OpenVAS扫描
import socket
def send_gmp_command(command):
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/run/gvmd/gvmd.sock")
sock.send(command.encode())
response = sock.recv(65536).decode()
sock.close()
return response
# 创建扫描任务
task_xml = """<create_task>
<name>Auto Scan</name>
<target id="target-uuid"/>
</create_task>"""
result = send_gmp_command(task_xml)
对比表
| 功能 | XSOAR | Splunk SOAR | Shuffle |
|---|---|---|---|
| 工作流编辑器 | 可视化 | 可视化 | 可视化 |
| 预置集成 | 500+ | 300+ | 200+ |
| 自定义App | Python | Python | Python |
| 告警管理 | 完整 | 完整 | 完整 |
| 事件管理 | 完整 | 完整 | 完整 |
| 报告生成 | 支持 | 支持 | 支持 |
| 多租户 | 支持 | 支持 | 基础 |
| 价格 | $100K+ | $50K+ | 免费 |
Shuffle的优势在于其开源社区活跃,每周都有新App加入。对于中小安全团队,Shuffle + Wazuh + OpenVAS 的组合可以构建完整的安全运营中心,成本为零。
评论