你的基础设施。你的数据。你的密钥。
Cronable生来就像你自己技术栈中值得信赖的一部分。以下正是它如何让你的自动化、密钥和历史始终在你的掌控之中。
从设计上即为本地部署
Cronable安装在你自己的机器上——一个Mac或Windows桌面应用,或是一台在systemd/launchd下运行的服务器。没有SaaS版本,也没有云端依赖。它的例行出站调用包括:定期的许可证检查——用于确认你的订阅并上报简单的任务和用户数量——以及检查是否有新的已签名版本;此外,仅当你启用它们时,还有一个连接到Cronable托管relay的出站连接,用于接收入站webhooks或远程控制。你的工作负载——任务定义、密钥、运行记录和输出——都留在本机,绝不会发送给我们。唯一的例外是一场进行中的远程控制会话:其控制台流量会通过我们的边缘节点中转(与任何托管代理同等的信任级别),而到你自己机器的端到端加密,是一项计划中的Enterprise选项。
密钥与凭据静态加密
密钥值采用AES-256-GCM加密,密钥由你自己的加密密钥派生(使用scrypt,并为每次安装生成随机盐值)。有类型的凭据——API密钥、bearer令牌、basic认证、自定义请求头和Postgres连接字符串——都保存在同一个加密存储中,通过名称引用,绝不会粘贴进任务文件。没有任何内容写入git,也没有任何内容离开你的机器。你需单独备份密钥——从设计上讲,一旦丢失,密钥将无法恢复。
在每一条日志和数据流中屏蔽
已解析的密钥和凭据值会在日志文件、任务输出和实时日志流中一律脱敏为“***”——即使某个值被拆分到多个流式数据块中也是如此。在你机器上运行的,就留在你的机器上。
需认证且最小权限
Web控制台要求按用户登录,采用argon2id密码哈希并具备暴力破解锁定。引擎默认绑定到localhost,并应以专用的低权限用户身份运行。服务器间调用方使用私有的bearer令牌;浏览器使用短时有效的会话cookie——一旦登出或会话过期,即便是开启中的实时日志流也会在数秒内关闭。此外,密码还必须通过强度检查(最小长度以及可猜测性测试),因此弱密码或容易被猜到的密码会被拒绝。可选的双重身份验证(TOTP)会附加来自身份验证器应用(如 Google Authenticator)的一次性验证码,并提供在设备丢失时使用的恢复码;使用远程访问时必须启用双重身份验证,因此只有已启用它的操作员才能在托管仪表板中打开某台机器。
基于角色的团队访问
Web控制台支持多用户,按权限从低到高分为四种角色——查看者(只读)、编辑者(创建任务、密钥和运行)、管理员(管理用户、角色和设置),以及安装时创建的首个账户即所有者。管理员可在“设置 → 用户”中添加和移除用户、指定每个人的角色、重置密码或双重身份验证设备,以及撤销访问权限——这样离开的团队成员会立即失去访问权限,也不会有人共用登录账号。需要更严格锁定的部署可以选用更多控制:执行分级会限制谁能创建可运行命令的任务,变更审批则引入双人复核,因此暂存的任务或密钥变更必须经过第二位管理员批准才会生效。
通过OIDC实现单点登录
接入你的身份提供商——Okta、Entra ID、Google、Keycloak——通过带PKCE的OIDC授权码流程,并对ID令牌进行完整校验。SSO登录必须映射到已有的本地账户:不会自动创建任何账户,并且提供商的错误会以固定、友好的提示呈现,而非原始的重定向。
一份你真正读得懂的审计轨迹
登录和失败尝试、密钥和凭据变更、任务编辑、设置更新以及git同步,都会记录在一份仅追加的审计轨迹中——只含名称和元数据,绝不含具体值——可直接在控制台的“设置 → 审计”中查看和筛选。
经过加固的入站webhook
入站webhook通过我们受许可管控的中继到达你的daemon,走的是你服务器主动向外开启的连接,因此你从不暴露任何端口——除非你有意选择这么做。每个webhook都绑定到你的许可——即使知道其URL,其他客户也无法认领它或接收其事件——并由每个webhook独立的令牌保护,该令牌仅以SHA-256哈希形式存储,并以恒定时间进行校验。URL至少需要32个无法猜测的字符,外加该令牌;错误、缺失、已禁用或未知的请求都返回同样通用的401,来自某个IP的反复探测会被临时封禁——因此既无可枚举之处,也无可暴力破解之处。令牌在生成时仅显示一次,并可一键轮换。如果你希望入站负载完全不经过我们的服务器,可以跳过中继,改为自行提供 HTTPS 端点——这是你确实会开放端口的唯一情形,此时 webhook 会直接到达你的机器。
由git审计、可回退的历史
每个任务定义都是你所拥有的git仓库中的一个文件。每一次改动都是一次提交——完全可diff、可追责、可回退。你的任务历史可以用你团队已经在用的工具进行审计。当你为双向同步关联一个仓库时,Cronable 只接受私有仓库——它会拒绝公开仓库,并在已关联的仓库随后被设为公开时停止同步——因此你的作业定义永远不会变成公开可读。
坦诚对待信任边界
Cronable的职责是代表你运行命令、AI智能体和HTTP,所以请把它当作机器上的一个shell来对待。表达式运行在一个防低级失误的沙箱中,而非一道加固的边界——切勿向它输入不受信任的内容。我们会帮助你以最小权限和合理的网络隔离来部署它。