C++ 请求root密码以获得所需权限

C++ 请求root密码以获得所需权限,c++,c,linux,permissions,linux-kernel,C++,C,Linux,Permissions,Linux Kernel,我正在通过libkmod从我的应用程序中加载一个Linux内核模块,并且一切正常,因为模块中的内容可以在我想要的时候加载和卸载,但要实现这一点,我需要以root用户或特权用户(比如sudoers)的身份运行整个程序。 我希望能够以普通用户的身份加载应用程序,然后,请求root用户的密码user在sudoers中,setuid0;只需加载模块,然后恢复旧uid 我的问题是:当我试图通过KDE的控制面板更改某些内容时,如何通过某种UI对话框询问rootuser的密码 问候 编辑:我不会接受像syst

我正在通过libkmod从我的应用程序中加载一个Linux内核模块,并且一切正常,因为模块中的内容可以在我想要的时候加载和卸载,但要实现这一点,我需要以root用户或特权用户(比如sudoers)的身份运行整个程序。 我希望能够以普通用户的身份加载应用程序,然后,请求root用户的密码user在sudoers中,setuid0;只需加载模块,然后恢复旧uid

我的问题是:当我试图通过KDE的控制面板更改某些内容时,如何通过某种UI对话框询问rootuser的密码

问候


编辑:我不会接受像systemkdesu/gksu my_应用程序或popen and family这样的方法。我正在寻找一种调用密码提示的编程方法。我也不会接受具体的答案,见kdesu和gksu。我正在寻找能够在每个XDG兼容的DE上工作的东西。最后,不需要存在密码提示。我可以在Qt中创建一个简单的对话框,请求密码,然后使用它调用任何接受它的函数,比如setuid'password',0。

嗯,我不确定KDE,但Gnome的版本是/usr/bin/gksudo。这是gnome密钥环的另一个优点,它可以根据您的配置将密码缓存30分钟,这样您就不必重复键入密码。请注意,您必须在/etc/sudoers中。

嗯,我不确定KDE,但Gnome的版本是/usr/bin/gksudo。这是gnome密钥环的另一个优点,它可以根据您的配置将密码缓存30分钟,这样您就不必重复键入密码。请注意,您必须在/etc/sudoers中。

您不想请求root密码。我在没有根访问权限的系统上工作过,但我有sudo权限。这并不少见——特别是如果sudoers被设置为只允许一小部分命令


这就是sudo和它的图形用户界面朋友的目的。如果用户无法进入sudoers文件,则他无权知道root的密码。如果系统上没有sudo,那么它可能应该有sudo——这是一个比使用root作为用户更安全的解决方案。在我的家用机器上,我每天使用sudo,但很少以root用户身份登录。我认为这正是应该的

您不想请求根密码。我在没有根访问权限的系统上工作过,但我有sudo权限。这并不少见——特别是如果sudoers被设置为只允许一小部分命令


这就是sudo和它的图形用户界面朋友的目的。如果用户无法进入sudoers文件,则他无权知道root的密码。如果系统上没有sudo,那么它可能应该有sudo——这是一个比使用root作为用户更安全的解决方案。在我的家用机器上,我每天使用sudo,但很少以root用户身份登录。我认为这正是应该的

您可以使用pam进行身份验证。示例

您可以使用pam进行身份验证。示例

仅仅知道用户密码对调用setuid没有帮助,因为您需要CAP_setuid权限来更改uid,这通常意味着您需要是root用户

请注意,如果您拥有CAP_SETUID权限,则不需要用户密码;任何密码检查都必须由调用setuid的程序完成


允许您的程序加载内核模块的“正确”方法是编写一个简单的帮助程序,它除了加载模块之外什么都不做,然后将该帮助程序安装为set user ID root。

仅仅知道用户的密码对调用setuid没有帮助,因为您需要CAP_setuid权限来更改uid,这通常意味着您需要成为root用户

请注意,如果您拥有CAP_SETUID权限,则不需要用户密码;任何密码检查都必须由调用setuid的程序完成


允许您的程序加载内核模块的“正确”方法是编写一个简单的助手程序,该程序除了加载模块之外什么都不做,并将该助手安装为set user ID root。

好的,假设我已经在sudoers中,我如何调用gksudo?我想避免使用systemgksudo。。。。。;因为那真的很难看。@alexandernst,用烟斗吗?@AnishRam我不知道你是什么意思。管道在这里有什么帮助?您需要运行gksudo命令。因此,使用命令,指定,gksudo作为命令,使用fgets或类似的方法来读取输出并解析它。如果您的应用程序不是Gnome-one,那么您不希望依赖gksudo。KDE有/usr/lib/kde4/libexec/kdesu和/usr/bin/kdesudo。然而,最安全的方法是查看那些KCM模块或PartitionManager的源代码,它们以类似的方式请求根权限好吧,假设我

已经在sudoers了,我怎么称呼gksudo?我想避免使用systemgksudo。。。。。;因为那真的很难看。@alexandernst,用烟斗吗?@AnishRam我不知道你是什么意思。管道在这里有什么帮助?您需要运行gksudo命令。因此,使用命令,指定,gksudo作为命令,使用fgets或类似的方法来读取输出并解析它。如果您的应用程序不是Gnome-one,那么您不希望依赖gksudo。KDE有/usr/lib/kde4/libexec/kdesu和/usr/bin/kdesudo。然而,最安全的方法是查看那些KCM模块或PartitionManager的源代码,它们以类似的方式请求根权限。对不起,我解释错了。实际上,我不想询问root用户的密码,但如果用户的密码已经在sudoerso中,请使用sudo或图形变体之一。没有理由做其他事情。我不希望我的整个应用程序在sudo模式下运行。我只想获得sudoers的权限一秒钟,足够的时间做我想做的事情,然后回到有限的用户权限。请记住,如果应用程序正在执行setuid或它的朋友之一,它需要由具有root权限的人安装,我不完全确定我们要解决的问题是什么。要么应用程序本身需要在root权限下运行,要么它的安装方式只能由某些用户运行。这还不够好吗?它适用于许多其他类型的应用程序。是的,我理解。检查如何做到这一点的方法是查看这些工具是如何做到这一点的(正如上面的评论所建议的),或者sudo是如何工作的,它也做类似的事情。如果系统配置工具不只是在sudo中调用,我会非常惊讶,但是我从来没有看过源代码,所以我不能说。对不起,我解释错了。实际上,我不想询问root用户的密码,但如果用户的密码已经在sudoerso中,请使用sudo或图形变体之一。没有理由做其他事情。我不希望我的整个应用程序在sudo模式下运行。我只想获得sudoers的权限一秒钟,足够的时间做我想做的事情,然后回到有限的用户权限。请记住,如果应用程序正在执行setuid或它的朋友之一,它需要由具有root权限的人安装,我不完全确定我们要解决的问题是什么。要么应用程序本身需要在root权限下运行,要么它的安装方式只能由某些用户运行。这还不够好吗?它适用于许多其他类型的应用程序。是的,我理解。检查如何做到这一点的方法是查看这些工具是如何做到这一点的(正如上面的评论所建议的),或者sudo是如何工作的,它也做类似的事情。如果系统配置工具不只是在sudo中调用,我会非常惊讶,但是我从来没有看过源代码,所以我不能说。在Arch中没有这样一个包可以提供openpam.h。你是如何编译的?但无论如何,更进一步,我看不出这对我有什么帮助。这只是在运行exec,它与system几乎相同,只是有一些小的变化。我不想运行shell命令,我想在代码中获得适当的权限。另外,只是为了确保。。。这是否需要将二进制文件转换为root并设置+s?如果是这样的话,这真的不是我想要的。在Arch中没有这样一个包可以提供openpam.h。你是如何编译的?但无论如何,更进一步,我看不出这对我有什么帮助。这只是在运行exec,它与system几乎相同,只是有一些小的变化。我不想运行shell命令,我想在代码中获得适当的权限。另外,只是为了确保。。。这是否需要将二进制文件转换为root并设置+s?如果是这样的话,这真的不是我想要的。好吧,我也在考虑加载内核的其他东西,但这让我想知道另外两件事。a我怎么能称之为另一个二进制文件?通过系统还是家庭?b其他二进制文件如何获得特权以加载内核?经周氏根;chmod ugo+xs?使用任何工作系统、fork+exec、posix_spawn等。。这就是我对set-user-ID-root的意思。好吧,这至少是目前的退路。谢谢你的回答。如果我没有其他选择,我会接受它并给你+50。我真的希望能够在代码中获得特权,而不必使用任何二进制文件;任何其他东西都会破坏整个安全机制。@alexandernst-这就是你对unix缺乏了解的地方。关键是,只有当特权已经授予程序时,您才能获得特权。通常,这是通过执行setuid可执行文件来完成的,其中预先存在的授权绑定到可执行文件,或者执行setuid executab
le,它将依次执行您的程序。任何让一个现有的、以前没有特权的进程切换到以root身份执行的程序都被归类为bug,并以高优先级进行修补。好吧,我也在考虑加载内核的其他程序,但这让我想知道另外两件事。a我怎么能称之为另一个二进制文件?通过系统还是家庭?b其他二进制文件如何获得特权以加载内核?经周氏根;chmod ugo+xs?使用任何工作系统、fork+exec、posix_spawn等。。这就是我对set-user-ID-root的意思。好吧,这至少是目前的退路。谢谢你的回答。如果我没有其他选择,我会接受它并给你+50。我真的希望能够在代码中获得特权,而不必使用任何二进制文件;任何其他东西都会破坏整个安全机制。@alexandernst-这就是你对unix缺乏了解的地方。关键是,只有当特权已经授予程序时,您才能获得特权。通常,这是通过执行一个setuid可执行文件来完成的,其中预先存在的授权绑定到可执行文件,或者执行一个setuid可执行文件来执行程序。任何允许现有的、以前没有特权的进程切换到以root用户身份执行的操作都被归类为bug,并以高优先级进行修补。-1您不会接受标准a拒绝了解合理的设计实践以及unix风格操作系统的安全性工作原理,特别是进程和安全上下文之间的关联。我的“不接受”标准表明拒绝使用拙劣、黑客和糟糕的方法来完成我的要求。不多也不少。我会接受任何符合我的需要或答案的答案,这解释了为什么我要问的是不可能的。你最好考虑一下密码到底能做什么。内核一点也不关心密码。相反,密码所做的只是检查现有的setuid可执行文件(如login或sudo)是否作为给定的潜在不同用户(如超级用户)启动shell或其他请求的进程。因此,最终,您必须执行一些setuid程序来执行您想要的操作。您自己获取用户密码不会改变这一点,而且这是一种糟糕的做法。-1您不会接受标准A表明您拒绝理解合理的设计实践以及unix风格操作系统的安全性工作原理,特别是进程和安全上下文之间的关联。我的“不接受”标准表明拒绝使用拙劣、黑客和糟糕的方法来完成我的要求。不多也不少。我会接受任何符合我的需要或答案的答案,这解释了为什么我要问的是不可能的。你最好考虑一下密码到底能做什么。内核一点也不关心密码。相反,密码所做的只是检查现有的setuid可执行文件(如login或sudo)是否作为给定的潜在不同用户(如超级用户)启动shell或其他请求的进程。因此,最终,您必须执行一些setuid程序来执行您想要的操作。自己获取用户密码不会改变这一点,而且这是一种糟糕的做法。