Basic Jenkins Information
访问
用户名 + 密码
在 Jenkins 中最常见的登录方式是使用用户名或密码
Cookie
如果授权的 cookie 被盗,它可以用来访问用户的会话。这个 cookie 通常叫做 JSESSIONID.*
。(用户可以终止他所有的会话,但他需要先发现 cookie 被盗)。
SSO/插件
Jenkins 可以通过插件配置为通过第三方 SSO 访问。
令牌
用户可以生成令牌,以便通过 CLI 或 REST API 模拟他们的应用程序访问。
SSH 密钥
此组件为 Jenkins 提供了内置的 SSH 服务器。这是 Jenkins CLI 的替代接口,可以使用任何 SSH 客户端以这种方式调用命令。(来自 文档)
授权
在 /configureSecurity
中可以配置 Jenkins 的授权方法。有几种选项:
任何人都可以做任何事:即使是匿名访问也可以管理服务器
传统模式:与 Jenkins <1.164 相同。如果你有**"admin" 角色**,你将被授予完全控制系统的权限,否则(包括匿名用户)你将有读取权限。
登录用户可以做任何事:在这种模式下,每个登录用户都可以完全控制 Jenkins。唯一没有完全控制权限的是匿名用户,他只有读取权限。
基于矩阵的安全性:你可以在表格中配置谁可以做什么。每个列代表一个权限。每个行代表一个用户或组/角色。这包括一个特殊用户 'anonymous',代表未认证用户,以及 'authenticated',代表所有认证用户。
基于项目的矩阵授权策略:这种模式是**"基于矩阵的安全性"**的扩展,允许为每个项目单独定义额外的 ACL 矩阵。
基于角色的策略:启用使用基于角色的策略定义授权。在
/role-strategy
中管理角色。
安全领域
在 /configureSecurity
中可以配置安全领域。默认情况下,Jenkins 支持几种不同的安全领域:
委托给 servlet 容器:用于将认证委托给运行 Jenkins 控制器的 servlet 容器,如 Jetty。
Jenkins 自己的用户数据库:使用Jenkins 自己内置的用户数据存储进行认证,而不是委托给外部系统。这是默认启用的。
LDAP:将所有认证委托给配置的 LDAP 服务器,包括用户和组。
Unix 用户/组数据库:将认证委托给 Jenkins 控制器上的底层 Unix 操作系统级用户数据库。这种模式还允许重用 Unix 组进行授权。
插件可以提供额外的安全领域,这可能对将 Jenkins 集成到现有身份系统中有用,例如:
Jenkins 节点、代理和执行器
来自 文档 的定义:
节点是运行构建代理的机器。Jenkins 监控每个附加节点的磁盘空间、临时空间、交换空间、时钟时间/同步和响应时间。如果这些值中的任何一个超出配置的阈值,节点将被下线。
代理通过使用执行器来管理任务执行,代表 Jenkins 控制器。代理可以使用任何支持 Java 的操作系统。构建和测试所需的工具安装在代理运行的节点上;它们可以直接安装或在容器中安装(Docker 或 Kubernetes)。每个代理实际上是主机上的一个进程,具有自己的 PID。
执行器是任务执行的插槽;实际上,它是代理中的一个线程。节点上的执行器数量定义了该节点一次可以执行的并发任务数量。换句话说,这决定了该节点一次可以执行的并发 Pipeline stages
的数量。
Jenkins 秘密
秘密和凭证的加密
来自 文档 的定义:Jenkins 使用 AES 加密和保护秘密、凭证及其各自的加密密钥。这些加密密钥存储在 $JENKINS_HOME/secrets/
中,以及用于保护这些密钥的主密钥。应配置此目录,使得只有运行 Jenkins 控制器的操作系统用户对该目录具有读写权限(即 chmod
值为 0700
或使用适当的文件属性)。主密钥(有时在加密术语中称为“密钥加密密钥”)未加密地存储在 Jenkins 控制器文件系统中的 $JENKINS_HOME/secrets/master.key
中,这不能防止直接访问该文件的攻击者。大多数用户和开发人员将通过 Secret API 间接使用这些加密密钥来加密通用秘密数据,或通过凭证 API 使用这些密钥。对于加密爱好者,Jenkins 使用 AES 的密码块链接(CBC)模式,带有 PKCS#5 填充和随机 IVs 来加密 CryptoConfidentialKey 的实例,这些实例存储在 $JENKINS_HOME/secrets/
中,文件名对应于其 CryptoConfidentialKey
id。常见的密钥 id 包括:
hudson.util.Secret
:用于通用秘密;com.cloudbees.plugins.credentials.SecretBytes.KEY
:用于某些凭证类型;jenkins.model.Jenkins.crumbSalt
:用于 CSRF 保护机制;和
凭证访问
凭证可以范围限定为全局提供者(/credentials/
),可以被任何配置的项目访问,或者范围限定为特定项目(/job/<project-name>/configure
),因此只能从特定项目访问。
根据 文档:范围内的凭证可以无限制地提供给 pipeline。为了防止在构建日志中意外暴露,凭证从常规输出中屏蔽,因此调用 env
(Linux)或 set
(Windows),或打印其环境或参数的程序不会在构建日志中向没有访问凭证权限的用户透露它们。
这就是为什么攻击者需要例如 base64 编码来外传凭证。
参考资料
Last updated