Jenkins安全部署规范及安全基线
- 进入安全设置界面
- 启用安全
- Disable remember me
- 访问控制——安全域(Security Realm)
- servlet容器代理(Delegate to servlet container)
- Jenkins专有用户数据库(Jenkins’ own user database)
- LDAP
- UNIX用户/组数据库(Unix user/group database)
- 访问控制——授权(Authorization)
- 任何用户可以做任何事(Anyone can do anything)
- 传统模式(Legacy mode)
- 登录用户可以做任何事(Logged-in users can do anything)
- 安全矩阵(`推荐使用`)
- 项目矩阵授权策略
- 其他全局安全配置
- 标记格式化程序(Markup Formatter)
- 代理(Agents)
- CLI
- 插件管理
- 构建的权限控制
- 隐藏安全警告(Hidden security warnings)
- SSH服务器
进入安全设置界面
在Jenkins的主界面,点击Manage Jenkins,
点击 configure Global Security 选项,进入Jenkins的系统安全设置界面。
启用安全
启用安全,如果启动此项,除非匿名用户被允许进行操作,否则任何操作都需要用户名/密码登录。
Disable remember me
在启用安全的复选框后,有一个禁用记住我(Disable remember me)的复选框。勾选这个复选框会在登录界面上移除在这台计算机上记住我(Remember me on this computer)的选项。
访问控制——安全域(Security Realm)
servlet容器代理(Delegate to servlet container)
这里提到的servlet容器就是运行Jenkins实例的一种方法。现在,通常会使用Jetty,但如果是定制化安装的话,则有可能是Tomcat或其他的servlet。使用这个选项,你可以通过servlet容器支持的任何机制来进行身份验证。
关于如何进行设置的细节,取决于你正在使用的特定servlet容器是如何配置身份验证的。最好的办法就是查阅servlet容器的文档。在v1.163之前,这是安全域的默认选项。当前由于其他选项的出现,已经不太可能使用这种方法了,但是向后兼容依旧是有价值的,或者你已经在servlet容器的配置中为身份验证做了大量的设置。
Jenkins专有用户数据库(Jenkins’ own user database)
此选项将身份验证委托给Jenkins维护/熟悉的人员列表。这不是一个典型的用例,但适用于轻量的、基本的安装设置。需要注意的是,这不仅包括Jenkins明确知道的用户,也包括提交信息中提到了的用户。
有一个子选项允许用户进行“注册”——这意味着他们在第一次需要登录到Jenkins的时候,可以创建他们自己的账户。在默认情况下,此选项被禁用以便更严格地控制访问。
LDAP
轻 量 级 目 录 访 问 协 议 ( LDAP , Lightweight DirectoryAccess Protocol)是用于在网络上定位人员、组织、设备和其他资源的一种软件协议。如果你的公司使用LDAP,你就可以为Jenkins配置它。你可以添加一个以上的LDAP服务器(如果需要的话,每一个服务器都有不同的配置)。
UNIX用户/组数据库(Unix user/group database)
此选项将身份验证委托给UNIX主机系统的用户数据库。如果使用此方法,用户可以使用UNIX用户名和密码登录Jenkins。UNIX组也能用于身份验证。如果一个用户和一个组有相同的名字,那么在名字前加上一个@将它与一个组区分开。需要注意的是,可能会需要其他额外的配置来使得这个方法真正生效,比如,把Jenkins设置成shadow组的成员,以便操作系统可以访问和使用它。
访问控制——授权(Authorization)
任何用户可以做任何事(Anyone can do anything)
使用此选项将不会进行真正的身份验证。
总的来说,每个人都被认为是“可信的”——包括匿名用户(即使他们还没登录)。这是不被推荐的,但在一个完全可信的环境中,为了简单和高效,它适应于允许无限制访问的情况。
传统模式(Legacy mode)
这种模式模拟了v1.164版本之前的Jenkins特性:任何具有“管理员”角色的人都有完全的控制权,而其他人只有只读权限。
登录用户可以做任何事(Logged-in users can do anything)
顾名思义,用户必须先登录,然后才能完全访问。如果你不介意每个人都能完全访问,而只是想要追踪谁正在做什么的话(通过他们的登录),这是有用的。
这里还有一个子选项能开启匿名用户拥有只读权限。
安全矩阵(推荐使用
)
此选项允许你通过矩阵排列中的复选框为单个用户或组指定非常详细的权限。矩阵中的列被划分为类别(分组),比如总体、任务、运行等。然后在这些项的下面是与该类别相关的更细的权限。
矩阵的每一行代表一个用户或组。有两个默认组是自动添加的:匿名用户(未登录的用户)和已验证用户(登录的用户)。矩阵下的文本框可以允许你添加新用户。
要给一个用户或组授权一个指定的权限,其实就是点击这个用户/组对应的行以及指定权限对应的列相交的框。删除权限只需要再次点击以清除复选框。
每行最后的可以点击的复选框可以一次性地为用户/组授权所有权限或删除所有权限。
在添加用户/组的后面输入已经存在的用户的用户名,点击添加,然后在表的相应位置选中相应的功能赋值给用户。
项目矩阵授权策略
此选项是前面章节中描述的“安全矩阵”模型的扩展。在选择此选项后,会为每个项目的配置页添加一个类似的矩阵。这允许每个项目可以以用户/组来配置,因此你可以限制对某些项目的访问,但同时允许访问其他项目。
说得再具体一些,当在全局安全配置页面中设置此选项时,每个项目的配置页面在基础配置部分中都有一个启用基于项目的安全(Enable project-based security)选项。选择此选项后将会出现那个项目的授权矩阵,该矩阵可以像全局矩阵一样配置,以提供特定项目的访问权限。一个附加选项可以允许你选择是否从父访问控制列表继承权限,即全局定义的权限。
其他全局安全配置
除了身份验证和授权设置,在全局安全配置页面上还有其他多种选项可以设置。这是一个配置的集合,主要目的是保证Jenkins的隐式安全,而不是显式地定义访问权限。
标记格式化程序(Markup Formatter)
Jenkins允许用户在各种文本域中放置自由形式的文本,比如,任务描述、构建描述等。你可以选择将这些格式设置为纯文本或HTML。如果你想使用HTML,请将此选项设置为安全HTML(Safe HTML)。这里的“安全”指的是只允许不会引起黑客攻击安全风险的HTML结构(即以会使系统处于风险中的操作方式进行修改)。安全HTML结构的示例包括基本的粗体、斜体、超链接等。
代理(Agents)
请忽略这个常用的名称,这部分用于配置通过JNLP进程启动的代理的TCP端口。(JNLP是指Java网络启动协议(Java Network LaunchProtocol)—— 一种可以在客户端桌面上通过使用远程服务器上的资源来启动应用的方式)。
在通常情况下,这里会使用随机端口。然而,你可以指定一个固定端口替代之而使得它更加安全(只需要为固定端口打开防火墙)。如果你没有使用JNLP功能,你可以在这里使用禁用选项(Disable option)来保证你的系统更加安全。
子选项允许你选择一个指定的JNLP协议版本,如果需要的话。
防止跨站请求伪造攻击
跨站请求伪造(CSRF,Cross-Site Request Forgery)是一种可以强制用户在通过身份验证的Web应用程序上执行多余操作的攻击类型。这部分的预防方法是验证Jenkins中的用户是否存在碎屑踪迹(导航历史)。
子选项允许激活代理兼容性,用来防止代理过滤掉关于碎屑踪迹的信息。
CLI
CLI是一个用于使用命令行接口的传统选项,允许被称为“远程处理”模式。这种模式被认为是不安全的,和其他的一些模式(比如HTTP或SSH)相反。这与它实际使用的编程风格有关,比如Java序列化,会打开安全漏洞和注意事项。这种传统协议也被认为是不易理解的,因此,从Jenkins 2.54开始实施了更新的、更安全的选项。
启用CLI进行远程处理(Enable CLI over Remoting)选项默认是关闭的,但如果你了解风险并需要向后兼容的话,在这里可以打开它。
插件管理
此选项是“使用浏览器进行元数据下载”,并且通常情况下它处于未选中(关闭)状态。打开这个选项就是告诉Jenkins让浏览器通过插件下载元数据而不是Jenkins自己来做。除非你有特殊原因要激活它,否则最好让它保持关闭状态并允许Jenkins进行下载操作。
构建的权限控制
如果你选择安装了授权项目插件(Authorize Project plugin),在这里就会有附加的条目。这个插件允许设置附加项目选项,用于使用指定的权限运行构建。
全局配置部分会出现在这里,允许你选择哪种类型的授权用户可以作为选项出现在项目中。
点击链接,可以生成一个简单的配置界面,允许你选择对这个插件进行全局配置的选项,以控制谁可以运行这个任务
隐藏安全警告(Hidden security warnings)
此选项与从已安装组件的更新站点获取的安全警告有关。(在以前版本的Jenkins中,这些并不在Jenkins中直接呈现,而是以邮件、博客等形式通知。从2.40版本开始,它们直接在Jenkins中显示。)如果你有一个警告列表,那么已被勾选的警告会被显示,没被勾选的那些则不显示。
这里的另一个选项是,启用代理到主机(agent to master)访问控制。这与代理可以发送什么样的命令到主机来使得它们的交互更安全有关。如果你需要调整这些规则来处理特定的实例或插件,那么这里也有一个链接来完成这些操作。
SSH服务器
为了通过SSH执行命令行子集,Jenkins可以充当SSH服务器。一些插件也可能会使用这个功能。如果需要用到这个功能,可以在这里设置一个固定端口以简化安全性。也可以使用随机端口来避免冲突。如果不需要此功能,则最好使用禁用选项来禁用已打开的端口。