【问题标题】:Escalating privileges on linux programmatically以编程方式提升Linux上的权限
【发布时间】:2009-12-17 21:34:41
【问题描述】:

我正在创建一个应该在 Linux 上运行的图形安装程序。安装应该包括将文件复制到/usr 中的某些位置。目前安装程序是用 Python 编写的。

当我需要复制文件时,如何提升安装程序的权限?我看了PolicyKit 但是

  • a) PolicyKit 似乎没有通用的“安装文件”操作 ID
  • b) 我可以使用的操作 ID,我认为它们不是所有发行版的标准

我还查看了 PAM,我有使用 libpam 的代码,但我似乎无能为力。在对我的用户进行身份验证后(通过提供用户名和密码),我没有对/usr 的写访问权。我尝试在身份验证后使用os.setuid(0) 更改我的用户,但我从操作系统收到错误消息。

另外,奇怪的是,我向pam_start 提供什么服务似乎并不重要。只要用户名和密码正确,我就可以传递任何我想要的东西。我看到我有/etc/pam.d/sudo。下面的代码经过简化,密码正确存储在pam_conversation 对象中,我确实传递了一个句柄对象。

pam_start("my_user", "my_pass", "sudo_garbage_12345");

效果一样好

pam_start("my_user", "my_pass", "sudo");

也就是说,他们都成功了。

作为最后的手段,我可​​能可以执行gksudokdesudo,但我不想被这些程序束缚。要求用户使用sudo 调用我的安装程序是(非常)最后的手段。

【问题讨论】:

  • 那么,让我直截了当...您希望能够为任何用户提供不受限制的(root)访问权限?
  • 我想通过允许用户输入密码来模拟 sudo。如果用户无法通过使用 sudo 获得权限,他们也不应该使用我的安装程序来获得权限。我只是想给他们一个新手友好的方式来使用 sudo。

标签: linux installation privileges pam


【解决方案1】:

您最好使用前端封装 RPM,该前端采用用户选项并调用 RPM 来完成繁重的工作。这也为您提供了管理依赖项的基础设施,并与现有的包管理系统很好地配合。如果您需要在基于 .deb 的系统(Debian 或 Ubuntu)上运行,您可能还需要构建一个 .deb 并在前端放置一些机制来确定哪个包管理系统处于活动状态。

在 Linux 或 Unix 系统(或与此相关的任何多用户系统)上,授予随机用户访问 root 权限通常被视为不好的形式,因为它存在重大安全风险。但是,如果用户没有允许他们写入系统区域的 root 访问权限或 sudo 权限,您可以选择让用户将其安装在他们的主目录 (~/bin) 下。在这种情况下,如果他们想安装在 /usr/bin 中,您可以要求他们以 root 身份安装它,但如果他们没有 root 权限,则允许他们将其安装在自己的主目录下以供自己使用。

【讨论】:

    【解决方案2】:

    对于图形安装程序,请坚持使用图形环境。如果可用,请使用 gksudo 或 kdesudo,否则会失败并显示错误对话框,提示它们需要 root。人们(尤其是新手)会下载您的安装程序并双击以从他们的桌面启动它,您需要一种图形方式来询问他们的密码。你不想在他们身上弹出一个终端。

    鉴于此,即使它们从终端运行,也不要为它们执行 sudo。只需输出一个错误,说明您需要 root 并退出。如果用户已经在命令提示符下(就像我很可能会那样),我已经知道如何 sudo 或 su 自己进入 root 如果我想这样做。我向你保证,如果你尝试让经验丰富的用户成为 root,而他们自己可以做到这一点,你很可能会惹恼他们。

    如果您坚持自己在安装程序中执行 sudo,看在上帝的份上,请在删除之前的时间戳之前强制执行“sudo -K”。如果您不这样做,并且我最近使用了 sudo,您将在我不知情的情况下以 root 身份运行您的安装程序(因为我不希望发生这种情况)。 'sudo -K' 将强制提示我,然后我可以决定是否要以 root 身份继续。

    【讨论】:

      【解决方案3】:

      在这种情况下,最好的方法是在您的程序中使用su。重定向输入/输出,一切顺利!

      【讨论】:

        猜你喜欢
        • 2011-04-13
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 1970-01-01
        • 2011-09-10
        • 2015-12-11
        • 1970-01-01
        相关资源
        最近更新 更多