![如何修复 sudo:setreuid(ROOT_UID,user_uid):操作不允许错误?](https://linux22.com/image/1076961/%E5%A6%82%E4%BD%95%E4%BF%AE%E5%A4%8D%20sudo%EF%BC%9Asetreuid%EF%BC%88ROOT_UID%EF%BC%8Cuser_uid%EF%BC%89%EF%BC%9A%E6%93%8D%E4%BD%9C%E4%B8%8D%E5%85%81%E8%AE%B8%E9%94%99%E8%AF%AF%EF%BC%9F.png)
我在 Ubuntu 11.10 服务器上使用 LDAP 身份验证。我安装了 libpam-ldap,并进行了相应的配置。它运行良好,只是我每次尝试 sudo 时都会收到此错误:
sudo: setreuid(ROOT_UID, user_uid): Operation not permitted
我知道我已正确设置了 sudoers,因为它大多数时候都能正常工作。这不仅仅是我的登录问题,其他人也和我一样遇到同样的问题。当出现此错误时,我根本无法使用常规系统用户进行 ssh 登录。当我直接登录时,我无法启动任何 gnome 终端。
一旦我重新启动服务器,问题就消失了。当然,这不是解决方案,如果是生产服务器,我就有麻烦了。
我该如何解决?
编辑 3/1/12:我刚刚发现,如果停止并启动 nscd 服务,问题就会消失。
service nscd stop
service nscd start
没有很好的解决方案,因为我必须直接登录到服务器,而不是通过 ssh。
答案1
这是一个已知错误这是 Debian(以及 Ubuntu)从使用OpenSSL到加密传输协议和OpenLDAP由于许可困难OpenSSL问题在于libgcrypt
(当前加密后端加密传输协议) 初始化。这个问题自Ubuntu 9.10但还没有真正得到解决,因为上游加密传输协议正在从libgcrypt
(显然还有其他问题)切换到库尼特尔。在此更改向下游进行之前,有三种可能的解决方法,所有这些解决方法都列在错误报告多于。
- 编译
libgnutls26
从源头到使用libnettle
代替libgcrypt
- 编译
libldap
从源头到使用openssl
代替gnutls26
- 使用
libnss-ldapd
而不是libnss-ldap
。这有几种变体。第一种使用作为依赖项libpam-ldap
引入,这会使配置变得复杂。第二种使用不完整。它尤其缺乏所有libnns-ldap
libpam-ldapd
pam_*配置允许限制用户子集。为了克服这一缺陷,您可以将 nssov 覆盖与 slapd 一起使用,但这不包含在 Ubuntu 的 slapd 中(因此您需要从源代码编译)。libpam-ldapd
使用nslcd
守护进程来处理 ldap 查找;因此它使用/etc/nslcd.conf
而不是/etc/ldap
进行配置。特别值得注意的是,您可以使用来pam_authz_search
限制授权。man nslcd.conf
有关详细信息,请参阅。还有一个相当不错的操作方法这里, 和这里如果需要配置startTLS。
更新:截至 2012 年 5 月 29 日,建议的存储库中有一个错误修复可用清醒,纳蒂, 和梦境。这解决了 LDAP 登录的问题;然而,截至 2012 年 9 月 6 日,此新补丁已被证明会破坏其他软件包1,并已被删除。此外,如这个错误,使用 nscd 的解决方法不再有效。这是一个不幸的回归,更糟糕的是,这个问题并没有真正得到解决精确的和量子。最终,唯一真正的解决办法是放弃libgcrypt11
。libnettle4
较新libgnutls28
的精确的和量子已经这样做了,但libldap
仍然使用libgnutls26
。
答案2
不安全的措施:禁用 SSL