我有一个以非特权用户身份运行的 Web 应用程序,需要创建 Linux 帐户。
我不希望以 root 身份运行它,因此我想到的唯一方案是创建一个简单的 C suid 程序,该程序接受一个参数并运行 adduser 来创建帐户。作为附加的安全性,该程序将对运行 Web 应用程序的用户帐户进行 700 的授权。
还有其他想法/方法可以做到这一点吗?
答案1
让网站仅在必要时使用 sudo 实用程序调用受保护的脚本来获取 root 权限。
答案2
如果你不需要立即的帐户创建,大约1分钟的延迟是可以接受的,您可以使用以下想法。
Web 应用程序应有 2 个可写入目录:www-tmp、www-job
每次 Web 应用收到创建帐户请求时,它都会在目录 web-tmp 中创建一个文件。然后将该文件移动到 web-job。不直接在 www-job 中创建文件的原因是为了防止 cron 作业(参见下一步)读取不完整的文件。
创建一个具有所需权限的 cron 作业,每分钟运行一次。每次运行时,它将处理 www-job 中的所有文件,创建帐户,然后删除文件。继续检查和处理,直到 www-job 为空。使用 pid 锁防止并行运行。
通过上述流程,您的 Web 应用程序不需要任何额外的权限。
Web app 是订单台。Cron job 是生产线。www-job 是排队区。不同的部门,不同的权限。
可以使用数据库表代替文件/目录进行排队。
PS:您的 cron 作业,无论是 bash、php 还是 perl,都应该在将参数传递给系统调用之前进行最后的检查。
用户名应该只包含字母(如果希望用户名不区分大小写,则可全部小写或大写)数字,或许还可以添加句点(.)。
对于密码,检查其最小长度。确保(双重检查,三重测试)脚本将其作为一个字符串传递给系统调用,和系统调用将其作为一个字符串。