![安全地允许用户创建帐户](https://linux22.com/image/46065/%E5%AE%89%E5%85%A8%E5%9C%B0%E5%85%81%E8%AE%B8%E7%94%A8%E6%88%B7%E5%88%9B%E5%BB%BA%E5%B8%90%E6%88%B7.png)
1)我正在努力寻找一种安全的方法来允许新用户创建帐户而不授予他们管理员权限。如果您已经在我的系统上拥有一个帐户并且可以使用 UNIX 命令行,那么您可以使用 puTTY 等程序来访问它。我目前正在制作一个程序,可以让您直观地来回传输文件,其布局类似于 dropbox。但是,我想添加“创建新用户”功能,但我不确定如何安全地执行此操作。
当然,我可以让程序执行类似“sudo adduser jim”的操作并提供 sudo 密码,但这需要我在 jar 文件中包含管理密码。我知道有一些混淆程序,但它并不一定会使其更安全。我更喜欢使用 ssh 创建用户,但我对任何可行且安全的方法持开放态度。
2)我刚刚想到一件事。如果我创建了一个管理用户,其 sudo 能力仅限于创建新用户,该怎么办?这听起来像是一个相当安全的解决方案吗?如果是这样,我应该如何去做呢?如果不是,这种方法有什么缺点?
编辑:这是我到目前为止的解决方案:假设我已经清理了输入,我将制作一个脚本,该脚本将第一个参数作为用户名,第二个参数作为密码,然后将其权限(setuid 位)设置为不可写,当非 root 帐户运行它时,他们只能以 root 权限运行它。这是迄今为止最基本的代码:
adduser --disabled-password --gecos "" "$1"
echo "$1":"$2" | chpasswd
你怎么认为?您认为我可以如何改进它?
答案1
如果您唯一的问题sudo
是必须使用密码,您可以NOPASSWD
在sudoers
文件中添加标签。你要
some_user ALL = (ALL) NOPASSWD:/path/to/adduser
答案2
有很多方法可以解决这个问题,但我会编写一个小程序或脚本来接收用户信息并运行adduser
。该程序将由 root 拥有,并设置了 setuid 位。
尽可能保持简单。如果您没有正确清理输入,则可能存在安全漏洞。无论如何,向系统添加用户是一件危险的事情。不过,此策略的好处是您的整个可执行文件不需要以 root 身份运行,只需添加用户的脚本/程序即可。
编辑:
至于清理输入,您执行此操作的方式取决于您如何实现程序。如果用 C 语言编写,请使用 execve() 函数而不是 system()。有一份很棒的文档,其中包含可在 CERT 中利用的清理失败示例。如果你用 Python 编写,更喜欢子流程模块出于类似的原因到 system() 。
除非您有特定需要,否则我会通过删除所有非字母或数字的字符来进行清理。用户是否创建密码?如果是这样,那就更困难了。关键是您不希望它们能够将任何具有特殊含义的特殊字符传递给正在调用的 shell 或程序。对于 bash 来说,一些明显的内容是$
, ;
, &&
。对于 mysql,您至少希望防止'
, "
, 和;
.
不幸的是,消毒可能是一项艰巨的任务。如果您可以枚举用户可能需要使用的所有值,那么我建议使用白名单。