我正在评估 Hudson 构建系统,将其用作一个集中的、“无菌”的构建环境,用于一家具有非常分布式开发的大公司(从地理和管理的角度来看)。一个目标是确保构建只是源代码控制树和构建脚本(也是该树的一部分)内容的函数。这样,我们可以确定放入生产环境的代码实际上来自我们的源代码控制系统。
Hudson 似乎提供了一个 ant 脚本,其中包含分配给调用 Hudson 服务器本身的用户的全套权限。因为我们希望允许各个开发组在没有管理员干预的情况下修改他们的构建脚本,所以我们想要一种沙箱化构建过程的方法,以 (1) 限制错误构建脚本造成的潜在危害,以及 (2) 避免所有游戏有人可能会在构建中插入恶意代码。
这是我想要的(至少对于 Ant,我们现在没有使用 Maven/Ivy):
- Ant 构建脚本只能访问其工作区目录
- 它只能从源代码树中读取(因此可以信任 svn 更新,并且不会插入其他代码)。
- 它可能被允许读取构建类路径所需的某些目录(Ant 发行版、JDK 等)。
我可以想到三种方法来实现这一点:
- 编写一个使用 Java 安全模型来约束访问的 ant 包装器
- 为每个构建创建一个用户并分配上述权限。在此用户空间中启动构建。
- (更新)使用 Linux “监狱”来避免为每个构建过程创建新用户帐户的负担。虽然我对这些知之甚少,但我们将在最近的 RedHatEL 发行版的 Linux 机器上运行我们的构建。
我是否正确地考虑了这个问题?其他人做了什么?
更新:这家伙考虑了 chroot 监狱的想法:
https://www.thebedells.org/blog/2008/02/29/l33t-iphone-c0d1ng-ski1lz
更新 2:信任是一个有趣的词。我们是否认为任何开发人员都可能尝试任何恶意行为?没有。但是,我敢打赌,在一年中使用开发人员更新的构建脚本构建了 30 个项目,将会有几个实例(1)意外破坏项目工作区之外的文件系统区域,以及(2)构建需要花费大量时间才能弄清楚的腐败。我们相信我们所有的开发人员不会搞砸吗?没有。我不相信自己到那个水平,这是肯定的。
关于恶意代码插入,真正的目标是能够排除考虑的可能性,如果有人认为这样的事情可能已经发生。
此外,通过适当的控制,开发人员可以修改自己的构建脚本并对其进行测试,而不必担心灾难。这将导致更多的构建“创新”和构建过程(单元测试执行等)强制执行的更高质量水平