基于 Cron 的持续审计

https://blueprints.launchpad.net/watcher/+spec/cron-based-continuous-audits

问题描述

Watcher 当前实现用户指定的时间间隔来运行持续审计。这可能会导致在 Watcher 服务宕机时发生冲突,因为下一次审计时间未存储在数据库中。使用时间间隔不是一个灵活或用户友好的解决方案,相反,我们应该使用像 cron 语法这样的行业标准,它提供了一种弹性的方式来调度和执行审计。

用例

  • 作为管理员,我希望使用 cron 语法来调度审计执行。

  • 作为管理员,我希望确保 Watcher 正确设置下一次审计执行时间。

提议的变更

Watcher API 已经有了 Audit 对象中的 ‘interval’ 属性,因此我们可以使用它来存储类似 cron 的格式。API 需要检查传入 interval 的类型,如果它是字符串类型,则 Watcher 使用 croniter 模块来设置下一次运行时间。第二个建议是为当前的 ‘interval’ 列提供持久性。为此,我们需要正确更新 next_run_time,因为它的值可能小于当前时间。在这种情况下,我们可以使用以下算法

delta = timedelta(seconds=
    (interval - (current_time-old_next_run_time).seconds % interval))
next_run_time = current_time + delta

例如,Watcher 应该在上午 7:30 运行审计,但服务宕机,直到上午 9:00 才恢复。使用 interval 值为 3600,Watcher 应该将下一次运行时间设置为上午 9:30。

为了实现此规范,我们需要确保 Watcher 可以存储持续作业,并且它的服务(可能以 HA 模式工作)仅获取带有标签分配的作业。Blueprint background-jobs-ha 负责实现作业存储机制。

备选方案

  • 继续使用已经提供的 interval。

  • 每次维护模式后删除持续审计并创建新的审计。

数据模型影响

  • Audit 表的 interval 列的类型应更改为字符串类型。

  • 必须向 Audit 表添加新的列 next_run_time。

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Alexander Chadin <alexchadin>

工作项

  • 将 next_run_time 列添加到 Audit 表。

  • 使用 croniter 模块来支持 Watcher 中的类似 cron 的语法。

  • 更新 python-watcherclient 以支持类似 cron 的语法。

  • 添加逻辑来计算 next_run_time 字段的值。

依赖项

https://blueprints.launchpad.net/watcher/+spec/continuously-optimization https://blueprints.launchpad.net/watcher/+spec/background-jobs-ha

测试

应更新单元测试。

文档影响

更新文档以提及 cron 和 interval。

参考资料

历史