Basic Jenkins Information

支持 HackTricks

访问

用户名 + 密码

在 Jenkins 中登录的最常见方式是使用用户名或密码。

如果 授权的 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 在密码块链 (CBC) 模式下使用 AES,带有 PKCS#5 填充和随机 IV 来加密存储在 $JENKINS_HOME/secrets/ 中的 CryptoConfidentialKey 实例,文件名对应于其 CryptoConfidentialKey id。常见的密钥 id 包括:

  • hudson.util.Secret:用于通用秘密;

  • com.cloudbees.plugins.credentials.SecretBytes.KEY:用于某些凭证类型;

  • jenkins.model.Jenkins.crumbSalt:由 CSRF 保护机制 使用;以及

凭证访问

凭证可以 作用于全局提供者 (/credentials/),任何配置的项目都可以访问,或者可以作用于 特定项目 (/job/<project-name>/configure),因此仅可从特定项目访问。

根据 文档:在作用域内的凭证可以无限制地提供给管道。为了 防止在构建日志中意外暴露,凭证会 被屏蔽,因此 env(Linux)或 set(Windows)的调用,或打印其环境或参数的程序不会 在构建日志中向本不应有权访问凭证的用户揭示它们

这就是为什么攻击者需要,例如,将凭证进行 base64 编码以提取凭证。

参考

支持 HackTricks

Last updated