【问题标题】:How can we execute Jenkins job using other user credential我们如何使用其他用户凭证执行 Jenkins 作业
【发布时间】:2013-06-20 05:08:14
【问题描述】:

我需要使用登录的用户凭据通过 Jenkins UI 执行一些 Jenkins 作业,例如“发布到生产”。原因是,我们有单独的支持团队成员,他们可以访问生产盒,而不是开发团队成员。因此,为了将任何代码库部署到生产环境,所有 Windows 部署命令(例如,创建、更新文件、文件夹等)都需要使用有权访问 Production Box 的特定用户凭据运行。因此,即使是无法访问生产框但是 Jenkins 管理员的开发团队成员,执行相同的作业也会因“拒绝访问”而导致失败。仅当支持团队成员使用其凭据运行该作业时,该作业才应该成功。

我尝试使用参数化插件,但无法成功将密码传递给包含 MSDeploy 指令的批处理文件。甚至 Jenkins 控制台日志也会显示在其控制台输出中传递的参数,这是一个安全问题。

我检查了基于角色的安全插件,但这对我没有多大帮助。我只需要一个插件,它应该要求用户在开始构建作业之前提供他们的凭据,并且应该使用用户凭据来执行作业,这样我的 MSDeploy 命令将能够在生产盒上部署代码,当支持团队成员使用他们的凭证构建该作业。我希望有人支持冒充。

现在,所有 Jenkins 作业都使用托管 Jenkins 的 Tomcat 服务配置运行的服务帐户执行。

任何帮助将不胜感激。

【问题讨论】:

  • 我无法评论上述 Steve Radich-Bitshop 的答案,因此创建了一个单独的答案。史蒂夫的回答让我如痴如醉,所以我想让未来的读者意识到这一点。 Windows RUNAS 不允许在其命令行上输入密码,也不允许通过管道输入密码。这在其他答案中有所说明,例如来自 stackoverflow :stackoverflow.com/a/16116329/5047366 PowerShell 确实允许在命令行上使用凭据,从而使其成为可能。现在的 Jenkins 包含一个 PowerShell 插件和一个用于秘密字符串的插件,这使其成为一种可能的前进方式。

标签: jenkins hudson


【解决方案1】:

以防万一,Jenkins 作业将始终以同一个操作系统用户身份运行。基于 Matrix 的安全性适用于登录 Jenkins 服务器并控制创建或启动作业等功能的用户。

您可以将作业配置为使用一组通用生产凭据,然后阻止您的开发人员调用该作业。

也许更好的方法是将构建代码的过程与部署代码的过程分开。下图(取自xebia-france 项目)演示了我最喜欢的一些工具RundeckNexus 如何与Jenkins 集成。

最后,我强烈推荐阅读以下链接:

【讨论】:

  • 感谢您的回复。 “您可以将作业配置为使用一组通用生产凭据,然后阻止您的开发人员调用该作业。”不知道我们该怎么做,因为开发团队在 Jenkins Web 服务器和 Jenkins Web 应用程序上都是管理员。我的场景是我想要一份工作“发布到生产”,它在生产 Web 服务器上执行 MSDeploy 命令。但这里的问题是,hudson 作业使用部署了 hudson 的 Tomcat 服务正在运行的服务帐户的凭据执行。此服务帐户无权访问 prod Web 服务器。
  • @user1233802 如果您的开发人员是 Jenkins 的管理员,那么您实际上无法限制他们的访问权限...。为部署而设置第二个 Jenkins 实例是一种选择,但在那个阶段为什么不考虑使用 rundeck构建和部署的单独责任?开发人员可以授予对 Rundeck 的有限访问权限,使他们能够部署到开发和测试系统,但无权访问生产 Rundeck 项目。
  • 嗯,这可能是一个选择。但理想情况下,我希望在另一个用户的上下文中执行作业,而不是在托管 Jenkins 的 Tomcat 使用的用户帐户的上下文中。我会尝试 rundeck,但是是否可以在其他用户的凭据下执行 rundeck 作业(模拟这是我感兴趣的)或者 rundeck 也使用 Tomcat 正在使用的用户帐户?请帮忙
  • 你是在windows上运行的吧?安装 SSH 服务器,您可以将其设置为以不同的用户 ID 在本地主机上运行作业。这就是 rundeck 的配置方式,您也许可以使用 Jenkins 来做同样的事情。请参阅 SSH 插件。
【解决方案2】:

您好,我知道我在这个线程上来晚了,但我刚刚遇到这个问题并且很难解决它,所以我想我可以分享一下我设法设置的内容。

首先要做的事:如果您想“作为特定用户”(具有所有正确的能力)运行 Jenkins 作业,最简单的方法是作为该用户运行 Jenkins SLAVE。 p>

那么您很可能会遇到以下情况:您可能希望在与 windows 服务 相同的 windows 机器上运行多个从属服务器。这很好,只要每个奴隶都有自己的Remote root directory 并且可能也有特定的“标签”。

一旦您设法将您的从属服务器作为 Windows 服务运行,启动服务控制台(运行 services.msc)。编辑新创建的服务属性,转到登录选项卡。选择“登录为:此帐户”并输入您的帐户凭据。

干杯:)

【讨论】:

    【解决方案3】:

    您可以使用内置的 windows runas 或 Powershell InvokeCommand cmdlet 和 -Credential 来运行 - 这两者都会以纯文本形式存储用户名/密码 - 所以请考虑风险,但这会给您带来灵活性。

    我很惊讶这没有更好的答案,即在另一台机器上设置代理以作为另一项服务运行并将代理定义为一种特殊的“类型”,它可以接手工作 - 我会这样做期待,但我还没有在 Jenkins 中看到过这样的实现(我是 Jenkins 的新手,所以正在寻找答案并找到了这个线程)。

    对于更熟悉 Jenkins 的人来说,可以考虑的其他事情是,当您将自定义路径设置为 MSBuild 时,您可以将其设置为 runas /user:... msbuild.exe 吗?我目前没有额外的 Jenkins 服务器来尝试它。

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多