我正在尝试建立一个系统,访问者可以在表单中输入任何用户名来创建新用户,最终它会在 LDAP 目录中构建,我计划通过让系统在 LDAP 上查找系统帐户,将其映射为 UNIX 帐户(在 Ubuntu Linux 上)。这样做很好,但我觉得应该避免使用许多用户名,其中最明显的一个是“root”,所有其他用户名都被用作守护进程等。
您如何解决这个问题?您是否通过检查 /etc/passwd 来列出不允许的用户名?我在想,如果在内部,用户名可以以“ldap_”或其他名称开头,那么它将避免任何命名冲突,但当 LDAP 条目名称为“joe”但系统帐户看起来像“ldap_joe”时,这似乎很难。甚至不确定如何实现这一点。
答案1
好的表单验证确实是您的第一线防御,不容忽视。
除此之外,我可能还会将所有当前的 uid 导入 ldap ...因此任何尝试重新创建它们的人都会产生命名冲突。
话虽如此,如果我处于你的位置,我会继续分配前缀或自动生成用户帐户名称(firstname.lastname、lastname$i 等...)。我不喜欢任何人创建他们想要的用户名的想法...这只是以后头痛的根源。
例如,如果有人创建了一个用户“www”,而我的包管理器(或我自己)后来决定将其应用于服务帐户,那么我们将会发生冲突,并可能产生安全隐患。为什么要冒这个险呢?
我宁愿谨慎行事,为还没有想到的事情做好计划,也不愿日后遭受损失。
话虽如此,这实际上完全取决于您的情况和要求。
答案2
最简单的方法是进行表单验证,换句话说,让脚本检查表单中是否输入了这些系统用户名。如果输入的用户名在您的“不允许的名称列表”中(可能使用 /etc/passwd 中的帐户作为模板),则返回一条错误消息,指出由于 foo 原因无法创建帐户。
答案3
第二是表单验证(前端)。最简单。
按等级划分的其他选项:
- 中间层(自行开发)- 创建一个选择列表作为数组,并在写入 LDAP 之前查找错误名称作为验证。如果需要,您还可以在数据库中拥有一个选择列表。将其放在数据库或文件中可以将选择列表从代码中外部化,从而更容易在运行时进行更改。
- Middle Ruby - 我不知道您使用的是哪种语言,但您可以在不使用 ActiveRecord 的情况下创建一个验证,以便在写入 LDAP 之前验证字符串。还有其他方法可以做到这一点。只需创建一个验证类,当字符串不符合您的验证规则时增加分数,并检查分数是否为非零。
- 后端 - 在 LDAP 中预先创建用户,并在名称冲突时抛出异常。使用过期的密码锁定 LDAP 帐户。确保 LDAP root 未在 /etc/passwd root 之前使用(例如,在 PAM 中,您会将其排序为 passwd 优先,这是默认的 irc)。