如何通过 Puppet 为给定用户触发 sudo 的宽限期?

如何通过 Puppet 为给定用户触发 sudo 的宽限期?

我正在尝试部署Redmine服务器。安装过程使用 Bundle 安装其依赖项。交互安装时,sudo如果 Bundle 需要安装一些系统范围的库,会提示用户输入密码。不建议以 root 身份安装 Redmine。

我使用 Ubuntu 14.04 64 位。它puppet是从 LXC 非特权容器内部运行的。

我曾经有过一种解决方法,即/var/lib/sudo在安装 Bundle 之前接触相应的文件。这是很不靠谱的,在最近的 sudo 升级后就失效了。

还有其他方法吗?或者也许 sudo 确实允许以非交互方式授予宽限期,而我只是错过了?

我的sudoers文件已经包含该Defaults !tty_tickets条目。我宁愿没有它,但如果没有这行,我认为解决问题的希望就更小了。


这是我的forcesudo资源:

define forcesudo ($user = $name, $notify = $notify) {
  file { "/etc/sudoers.d/fix-${user}": content => "${user} ALL = (root) NOPASSWD: ALL\n" }

  file { "/etc/sudoers.d/tty_tickets": content => "Defaults         !tty_tickets\n" }

  file { "/var/lib/sudo/${user}":
    ensure => directory,
    owner  => 'root',
    mode   => 700,
    group  => $user
  }

  file { "/var/lib/sudo/${user}/0":
    content => '',
    owner   => 'root',
    mode    => 0600,
    group   => $user
  }

  touch { "/var/lib/sudo/${user}":
    notify  => $notify,
    require => File["/var/lib/sudo/${user}"]
  }

  touch { "/var/lib/sudo/${user}/0":
    notify  => $notify,
    require => File["/var/lib/sudo/${user}"]
  }

}

资源如下touch

define touch ($user = "root", $group = "root", $notify = $notify) {
  exec { "touch ${name}":
    command     => "/usr/bin/touch ${name}",
    user        => $user,
    group       => $group,
    notify      => $notify,
    refreshonly => true,
  }
}

编辑:

可以通过以 root 身份运行 Bundle 来绕过此问题,尽管 Bundle 不鼓励这样做:Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.

这是https://github.com/johanek/johanek-redmine傀儡模块。

由于这只是一种解决方法,而不是解决方案,因此问题仍然存在。

答案1

更新

您是否尝试过使用 puppet 模块来实现这一点?至少有声称可以安装 redmine。更改它以满足您的需求可能会更容易。


您实际上并没有告诉我们如何通过 puppet 启动 redmine 安装。

尝试将其添加到您的 sudoers.d 文件中:

Defaults:username !requiretty

启动 redmine 安装的用户无需拥有 tty。也不应该出现密码提示。

如果 sudo 仍然提示输入密码,那么 redmine 安装程序调用 sudo 的方式就有问题。

至于您的安全担忧:

最佳做法是使用包(RPM、DEB 等),即使您必须自己创建它。

安装完成后,设置 puppet 来删除临时授予的 sudo 权限就足够了。

相关内容