### SecurityBulletinMonitor

监控 AWS Security Bulletin RSS，提取关键信息并通过飞书群告警，同时提供一个基于 API Gateway 的查询接口。

![Architecture](./docs/architecture1.png)

---

### 目录结构

- `api-section/`: 提供查询接口的 Lambda（API Gateway 触发）。
  - `parsing/`: RSS 解析与字段抽取逻辑（支持提取 Bulletin ID、发布时间、影响版本、CVE 等）。
  - `lambdasub/`: 处理 API 请求（校验鉴权、控制返回条数）。
  - `cmds/`: Lambda 入口（`main.go`）。
- `lark-section/`: 向飞书群发送安全公告告警的 Lambda。
  - `sendlark/`: 飞书鉴权与消息发送逻辑。
  - `lambdasub/`: 触发入口（按需调用 `sendlark`）。
  - `cmds/`: Lambda 入口（`main.go`）。

---

### 工作原理（基于代码）

- RSS 源：`https://aws.amazon.com/security/security-bulletins/rss/feed/`
- 解析：`api-section/parsing/parsing_bulletin.go`
  - 支持按时间排序、限制数量、解析 HTML 描述块为结构化字段。
  - 提取 `AWS-xxxx` Bulletin ID、CVE/GHSA、Affected versions、Resolution、Description 等。
- API 查询：`api-section/lambdasub/service_response.go`
  - 通过请求头 `Auth` 校验（对比环境变量 `AUTHSTR`）。
  - 通过请求头 `Vulnum` 控制返回条数（默认为 1）。
  - 成功返回纯文本汇总，失败返回 `error:Invalid authentication token`。
- 飞书告警：`lark-section/sendlark/larkalarm.go`
  - 使用应用 `app_id/app_secret` 获取 `app_access_token`，向指定群 `chat_id` 发送卡片消息。
---

### 快速开始（本地构建 Lambda）

1) 构建 Linux 可执行（适用于 Lambda）：

```bash
cd api-section
GOOS=linux GOARCH=amd64 go build -o bootstrap ./cmds
zip function.zip bootstrap

cd ../lark-section
GOOS=linux GOARCH=amd64 go build -o bootstrap ./cmds
zip function.zip bootstrap
```

2) 在 AWS Lambda 控制台创建函数（或使用 IaC）：

- 运行时：`provided.al2`（使用自带的 `bootstrap` 可执行文件）。
- 上传对应的 `function.zip`。
- 为 `api-section` 函数配置环境变量：
  - `AUTHSTR`: 自定义鉴权字符串。
- 为 `lark-section` 函数配置环境变量（建议）：
  - `FS_APP_ID`, `FS_APP_SECRET`, `LARK_CHAT_ID`（并在代码中读取）。

3) 为查询函数配置 API Gateway（HTTP API）：

- 集成目标：`api-section` Lambda。
- 任何需要访问的路由都可映射到该函数。

---

### 使用示例（API 查询）

请求头说明：

- `Auth`: 与 Lambda 环境变量 `AUTHSTR` 相同的字符串。
- `Vulnum`: 返回的公告条数（整数，默认 1）。

示例（PowerShell）：

```powershell
$url = "https://<your_api_id>.execute-api.<region>.amazonaws.com/"  # API Gateway 地址
curl -H "Auth: <your_authstr>" -H "Vulnum: 3" $url
```

响应为纯文本，包含标题、BulletinID、发布时间、影响版本、CVE、链接等。

---

### 飞书告警 Lambda

- 入口：`lark-section/cmds/main.go`，核心逻辑在 `sendlark/larkalarm.go`。
- 消息模板为交互卡片，可根据需要自定义。
- 典型用法：在定时/订阅触发器中获取 RSS 最新条目，然后调用 `Send_alarm_to_lark(chat_id, content)` 发送。

---

### 安全与配置建议

- 将飞书 `app_id/app_secret`、群 `chat_id`、以及 API 鉴权串 `AUTHSTR` 存放在 Secrets Manager 或 SSM Parameter Store。
- 为 Lambda 绑定最小权限 IAM 角色，仅允许访问必要的 Secret 与网络资源。
- 结合 CloudWatch Events/ EventBridge 定时触发实现自动监控与群通知。

---

