处理应该能够管理linux用户帐户的程序的用户权限的最佳实践是什么

时间:2012-10-05 12:58:48

标签: c++ linux qt

我需要从我的程序中管理Linux用户帐户,所以我实际上需要某种root访问权限,但是为该程序提供root权限可能不是最佳解决方案。
如何以保存的方式管理它。至少我不知道多进程架构。 对于整个“通用的东西”,我使用Qt。只有特定于操作系统的东西是我自己的。

1 个答案:

答案 0 :(得分:1)

实现权限分离的“经典”解决方案如下:

  • 使用setuid-0
  • 安装程序
  • 程序启动初期(尽早执行此操作,最好是“程序执行的第一件事”):
    • 使用socketpair()
    • 创建一对套接字
    • fork()您的流程
    • 让您的主进程使用setuid()删除所有根UID,并照常继续
  • 您的子进程将执行循环以处理从主进程发送的命令

结果将是您的主进程没有特殊权限,但您有一个root权限的子进程,它通过这些套接字连接到您的主进程。这些套接字是“未命名的”,这意味着没有其他程序可以访问它们。

当然,你仍然有点容易受到攻击。即使您的代码在到达fork()之前是“安全的”,攻击者仍然可以在以后进入您的主程序,并将命令发送到特权进程。即使子进程擅长验证其输入并且不能被破坏,有效命令仍然会在攻击者发出时引起问题 - 例如在您的情况下,攻击者可能会创建新帐户,甚至可能创建一个具有uid的帐户0