我正在使用自定义的 Redmine 安装来管理项目。我已设法将新用户的添加挂钩并将登录信息发送到我拥有的 bash 脚本。以下是我的脚本:
#!/bin/sh
UNAME=$1
UPASS=$2
wall "$UNAME $UPASS"
useradd "$UNAME"
echo "$UPASS" | passwd "$UNAME" --stdin
usermod -g restricted "$UNAME"
Echo 是 bash 的内置函数,因此当它输入密码时不会显示在进程表中。问题是我收到了来自 Redmine 的权限投诉:
/opt/rms/redmine/new-user: line 5: /usr/sbin/useradd: Permission denied
Only root can do that.
/opt/rms/redmine/new-user: line 7: /usr/sbin/usermod: Permission denied
这显然表明我需要 root 权限或其他方法来执行此操作。因此,我尝试在文件上设置具有 4755 权限的 UID 位,以便它以 root 身份运行,但出现了与上述相同的错误。知道这是怎么回事吗?
我的一般情况是,我的目标是将新用户自动作为 Linux 用户添加到项目管理系统中,然后当他们被添加到某个组时,我计划将其挂接,以便他们获得扩展权限,让他们通过 SSH 访问 Mercurial 存储库 - 因此用户管理完全通过前端处理。
答案1
由于信息有限,我不会详细阐述您的架构可能带来的安全隐患。不过,我会特别谨慎地授予非 root 用户添加用户的能力。
话虽如此,我不建议出于此目的使用 SUID 位。至少,因为它会给系统上的每个用户带来额外的风险。意思是,每个用户可能添加用户。
另外,你可以配置须藤允许非 root 用户运行 usermod。例如,运行visudo
并添加此行:
redmineuser ALL=NOPASSWD: /usr/sbin/usermod
答案2
从man wall
:
Wall 在所有当前登录用户的终端上显示文件的内容,或默认情况下显示其标准输入。
为什么要向每个登录的用户广播用户名和密码?
Echo 是 bash 的内置函数,因此当它输入密码时不会显示在进程表中。
但是,您将密码作为参数传递给此脚本,使得这一点变得毫无意义。
如果您担心是否echo
显示在ps
输出中的安全性,那么您还应该担心其他事情,例如命令行参数问题以及 SETUIDuseradd
和广播密码都是坏主意。