允许user1不用密码即可“ su-user2”


51

我需要允许用户martin切换到martin-test没有密码的用户

su - martin-test

我认为这可以在中配置/etc/pam.d/su。该文件中已经有一些行可以取消注释。但是,我不喜欢将用户添加martin到group 的想法wheelmartin除了切换到,我不想授予更多特权martin-test。我也不想使用sudo

在保持用户特权martin最小化的同时,最好的方法是什么?


2
这是比较容易做sudosudo -u martin-test -i。您有具体要问的原因su吗?
jordanm 2014年

我不想sudo仅仅因为这个而安装(我通常不使用sudo并且我不太喜欢它)。而且我认为使用pam这样做是更清洁,更透明的方式。
Martin Vegter 2014年

3
@MartinVegter从脚本答案中可以看出,通过某种pam机制执行此操作非常难看。真的,这正是sudo本意。除了不正常使用外,还有什么异议?
帕特里克

1
如果可以使用干净的解决方案pam,我宁愿这样sudo。如果sudo是唯一的可能性,那也很好。我的反对意见sudo主要是意识形态的:我不喜欢用户使用进行管理的想法sudo foo。当需要进行管理时,我以root用户身份登录。否则,我将以用户身份登录,这两个不同的角色不应混在一起。另外,我已经安装了pam基础架构。我不想安装setuid可能引入安全性错误的其他程序。
Martin Vegter 2014年

5
@MartinVegter您不必sudo foo对特定命令进行操作。Sudo具有sudo -s启动外壳的功能。sudo是一个非常普遍的实用程序,这意味着它的安全性已经过彻底的审查,远远超过了一些pam骗局。我还要指出,获得根shell任务比启动特定命令要不安全得多。启动外壳程序时,您将所有内容都作为root 运行。如果其中任何一项(例如simple ls)都存在安全漏洞,那么您刚刚打开了一个安全漏洞。
帕特里克

Answers:


61

pam_rootok.so在您的行下面添加以下行/etc/pam.d/su

auth  [success=ignore default=1] pam_succeed_if.so user = martin-test
auth  sufficient                 pam_succeed_if.so use_uid user = martin

这些行使用pam_succeed_if.so模块执行检查。另请参阅Linux-PAM配置文件语法以了解有关这些auth行的更多信息。

  • 第一行检查目标用户是否为martin-test。如果是,则什么也不会发生(success=ignore),我们在下一行继续检查当前用户。如果不是,则将跳过下一行(default=1),然后我们按照常规身份验证步骤继续进行下一行。
  • 第二行检查当前用户是否为martin。如果是,则系统认为认证过程成功,并返回(sufficient)。如果不是,则什么也不会发生,我们将按照常规的身份验证步骤继续进行后续工作。

您也可以限制su为一个组,这里该组allowedpeople可以su没有密码:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople

1
如果您想授权它们是否在某个组中:auth足够的pam_succeed_if.so用户ingroup GROUP
虾wagon 2015年

@gnp超级谢谢!!使用nrpe在iCinga上工作,必须以其他用户身份执行一些命令!帮助很多!谢谢!!!!!
saravanakumar's


最好添加有关如何应用更改的信息。
Kyslik

@Kyslik是什么意思?有关如何编辑必要文件的说明,请参见答案...
GnP

12

如果您不想更改组或使用sudo,请使用pam模块,该模块pam_exec在pam阶段执行外部脚本。

在您/etc/pam.d/supam_rootok.so行后添加一行:

auth       sufficient pam_exec.so quiet /path/to/script

/path/to/script 具有权限755(rwxr-xr-x)和以下内容:

#!/bin/bash
if [ "$PAM_TYPE" == "auth" ] && \
[ "$PAM_USER" == "martin-test" ] && \
[ "$PAM_RUSER" == "martin" ]; then
  exit 0
else
  exit 1
fi

因此,如果满足su以下条件,则此脚本成功存在:

  • 在身份验证的上下文中被称为
  • 主叫用户是martin
  • 要验证的用户是martin-test

看到:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 

1
pam_access可用于提供类似的功能,而无需依赖脚本。(这就是pam_access要做的)
jsbillings 2014年

1
@jsbillings您能否(再详细说明)另一个答案?
Hauke Laging

1
我需要如何修改自己的信息/etc/pam.d/supam_access适合自己的情况?
Martin Vegter 2014年

3
@jsbillings实际上pam_access不能这样做。当su通过pam堆栈时,它是作为您要更改的用户,而不是您要更改的用户。因此,如果您添加诸如之类的规则+ : martin : ALL,它将允许任何人更改 martin。即使您更改martinmartin-test,它仍将允许任何人这样做。您需要分析您来自的用户和您要更改的用户。真的,这正是sudo......
帕特里克

0

如果您无权访问root帐户,但拥有要用于运行命令的用户的密码,则可以执行以下操作。

  • 这将询问您toto的密码:su-toto -c whoami
  • 这不会:ssh toto @ localhost whoami

只需将公共密钥安装在toto的authorized_keys中


考虑周到的答案。但是,想要尝试运行的命令已经在计算机上。因此,没有必要在同一个服务器上使用。
Raja Anbazhagan

-1

我的简单解决方案是:

sudo login -f martin-test

如果您想不惜一切代价避免使用sudo,我认为应该可以将其放在脚本中:

  1. 由root拥有并具有root特权(使用setuid标志)
  2. 每个人都可以执行,也没有任何sudo。

但是,我无法弄清楚chown rootchmod +s ToTest.sh位,才能使其真正起作用:

#!/usr/bin/env bash
echo howdy, I am $(whoami)
sudo login -f martin-test

回声告诉我,我仍然以普通用户身份运行。而且它仍然需要sudo密码。如果它以root身份运行,则可以取消sudo最后一行中的...


Shell脚本(或任何其他脚本)上的setuid标志在Linux中不起作用,这有充分的理由。请注意,上面带有有效suid标志的脚本将立即成为陷阱:它通过“ env”与bash进行交互(非常令人反感,因为如果您假设不知道位置在哪里bash,为什么还要假设您知道位置在哪里env,或者是否存在?)。但是最后,您不知道bash这将是什么。它可能来自调用用户的目录,并且早于其源代码已被编译。你知道我要去哪里吗?否则用户可以覆盖whoami...
David Tonhofer

目前,我的大脑距离这些问题还很遥远,无法完全掌握,但是对于详细的解释仍然不胜其烦。
Frank Nocke
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.