审计日志
审计日志记录 Semaphore 中的重要操作:谁登录了,谁修改了用户或角色,谁创建了 API 令牌。每个事件都会显示操作者、时间、来源地址以及操作是否成功。你可以用它来了解安装中发生了什么,也可以把事件发送到 SIEM,与其他日志放在一起。
所有版本都提供审计日志。筛选、导出为文件以及将事件发送到 SIEM 需要 Semaphore Pro。
记录的内容
目前 Semaphore 记录登录、账户、项目和任务活动:
- 登录、失败的登录尝试、注销和第二因素验证;
- 被拒绝的 API 令牌、被拒绝的请求和被阻止的跨站请求;
- 用户、密码、双因素认证、外部身份和 API 令牌的更改;
- 项目成员、角色和模板权限的更改;
- 项目、清单、代码仓库、模板、计划任务、集成、主机配置、环境、凭据和机密存储的更改,以及项目备份的导出和还原;
- 系统设置的更改和 Pro 许可证的激活;
- 任务启动及其触发方式(API、计划任务、集成、自动运行、工作流)、审批、停止、完成以及已删除的任务历史;
- 运行器的更改、注册(包括被拒绝的注册令牌)、取消注册,以及状态无效的运行器报告;
- 将审计日志导出为文件;
- 每次服务器启动。
完整列表请参阅 审计事件。
密码、令牌、机密值和任务输出永远不会出现在审计事件中。API 令牌以指纹而不是其值显示。登录失败时会保留输入的登录名,因此其中可能包含电子邮件地址。
在任务的完成事件中,metadata.result 显示 Semaphore 给任务的状态,metadata.end_reason 说明 Semaphore 结束任务的原因:运行时间过长为 timeout,其运行器不再响应为 runner_lost。任务参数、变量、运行器标签和令牌不会被记录。
在 HA 集群滚动升级期间,在已升级的节点上启动、在尚未升级的节点上结束的任务没有完成事件。
代码仓库 URL、主机配置 URL 和集成别名同样不会被记录。
有时 Semaphore 已保存或删除某个对象,但同一请求的后续部分失败。此时界面或 API 会显示错误,但对象实际上已创建或已删除。这类事件记为成功,并带有 metadata.partial=true,reason 说明哪部分未完成:
secret_failed:环境已保存或删除,但其部分机密未能保存或移除;inventory_failed:模板已创建,但其 Terraform 工作区清单未创建;restore_failed:项目已从备份还原,但其部分对象未还原;setup_failed:项目已创建,但未完全设置,例如其创建者未被添加为所有者。
启用审计日志
审计日志默认关闭。要启用它,请设置 audit.enabled,并在 audit.instance_id 中为你的安 装命名:
{
"audit": {
"enabled": true,
"instance_id": "prod-eu"
}
}
或者使用环境变量:
SEMAPHORE_AUDIT_ENABLED=true
SEMAPHORE_AUDIT_INSTANCE_ID=prod-eu
实例 ID 为 1 到 255 个不含空格的字符。它会添加到每个事件中,这样当多个安装向同一位置发送事件时,你也能区分它们。
重启 Semaphore。记录从重启后开始,之前的操作不会补录。所有选项请参阅 配置选项。
在代理后记录客户端地址
如果 Semaphore 运行在反向代理之后,事件中显示的是代理的地址而不是用户的地址。要记录真实的客户端地址,请在 audit.trusted_proxy_cidrs 中列出代理所在的网络:
{
"audit": {
"enabled": true,
"instance_id": "prod-eu",
"trusted_proxy_cidrs": ["10.0.0.0/8"]
}
}
或者使用环境变量:
SEMAPHORE_AUDIT_TRUSTED_PROXY_CIDRS='["10.0.0.0/8"]'
这样 Semaphore 会从 X-Forwarded-For 或 X-Real-IP 获取客户端地址,但仅限来自这些网络的请求。如果请求经过多个代理,请把它们全部列出。不要列出用户连接所在的网络:这些网络中的任何人都可以在这些请求头中填入任意地址。
存储
事件存储在 Semaphore 数据库中,因此常规的数据库备份会包含它们。默认情况下,Semaphore 会保留所有事件。若要删除旧事件,请以天为单位设置保留期限:
{
"audit": {
"retention_days": 365
}
}
也可 以使用环境变量:SEMAPHORE_AUDIT_RETENTION_DAYS=365。
Semaphore 每小时删除一次较旧的事件,并记录一条 audit.retention/delete 事件,其中包含已删除事件的数量。如果你将事件导出到 SIEM,请选择比你希望扛过的最长 SIEM 中断时间更长的期限:早于该期限的事件即使尚未发送也会被删除。
保留期清理也会在 Semaphore 启动时运行。在 HA 部署中,所有节点请使用相同的 retention_days。
审计日志从不妨碍用户的操作。如果某个事件无法保存,Semaphore 会在服务器日志中写入错误,操作照常继续。
导出到 SIEM Pro
Semaphore Pro 可以通过 TLS 将审计事件发送到 Syslog 接收器,例如 rsyslog 或 Vector,也可以发送到任何支持 Splunk HTTP Event Collector (HEC) 协议的接收器,例如 Splunk、Vector、Fluent Bit、OpenTelemetry Collector 或 Cribl。你可以分别设置一个 Syslog 目标和一个 HEC 目标,也可以同时设置两个。
你需要准备:
- 接收器的主机名和端口;
- 此目标的名称,例如
security-syslog; - 接收器的 CA 证书(如果 Semaphore 主机尚未信任它)。
在 config.json 中添加 audit.syslog:
{
"audit": {
"enabled": true,
"instance_id": "prod-eu",
"syslog": {
"id": "security-syslog",
"address": "siem.example.com:6514",
"ca_file": "/etc/semaphore/siem-ca.pem",
"server_name": "siem.example.com",
"timeout": "10s"
}
}
}
或者使用环境变量:
SEMAPHORE_AUDIT_SYSLOG_ID=security-syslog
SEMAPHORE_AUDIT_SYSLOG_ADDRESS=siem.example.com:6514
SEMAPHORE_AUDIT_SYSLOG_CA_FILE=/etc/semaphore/siem-ca.pem
SEMAPHORE_AUDIT_SYSLOG_SERVER_NAME=siem.example.com
SEMAPHORE_AUDIT_SYSLOG_TIMEOUT=10s
id 和 address 为必填项。Semaphore 会记住已经向每个目标发送了哪些事件,因此更改地址或证书时请保持相同的 id。新的 id 会从新事件开始发送。
Semaphore 始终验证接收器的证书,并使用 TLS 1.2 或更高版本。ca_file 将你的 CA 添加到受信任的证书中,server_name 在证书中要验证的名称与地址不同时指定该名称。
重启 Semaphore。如果设置无效或无法读取 CA 文件,Semaphore 将不会启动。