我正在设计一款需要使用 root 配置 iptables 的应用程序。是否已有某种框架可用于获取应用程序的超级用户访问权限,还是我必须自己设计?
答案1
最简单的方式,使用
sudo application name
或启动您的应用程序引自
man pkexec
要指定以另一个用户身份执行程序 /usr/bin/pk-example-frobnicate 所需的授权类型,只需编写一个如下操作定义文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>Examples for the PolicyKit Project</vendor>
<vendor_url>http://hal.freedesktop.org/docs/PolicyKit/</vendor_url>
<action id="org.freedesktop.policykit.example.pkexec.run-frobnicate">
<description>Run the PolicyKit example program Frobnicate</description>
<description xml:lang="da">Kør PolicyKit eksemplet Frobnicate</description>
<message>Authentication is required to run the PolicyKit example program Frobnicate (user=$(user), program=$(program), command_
line=$(command_line))</message>
<message xml:lang="da">Autorisering er påkrævet for at afvikle PolicyKit eksemplet Frobnicate (user=$(user), program=$(program)
, command_line=$(command_line))</message>
<icon_name>audio-x-generic</icon_name>
<defaults>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_self_keep</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/pk-example-frobnicate</annotate>
</action>
</policyconfig>
并将其放入/usr/share/polkit-1/actions
目录中合适的名称下(例如,与操作的命名空间匹配)。请注意,除了指定程序之外,还可以指定身份验证消息、描述、图标和默认值。请注意,消息中出现的字符串 $(user)、$(program) 和 $(command_line) 将分别替换为用户(格式为“真实姓名(用户名)”或如果用户名没有真实姓名,则仅替换为“用户名”)、要执行的二进制文件(完全限定路径,例如“/usr/bin/pk-example-frobnicate”)和命令行,例如“pk-example-frobnicate foo bar”。例如,对于上面定义的操作,将显示以下身份验证对话框:
[IMAGE][2]
+----------------------------------------------------------+
| Authenticate [X] |
+----------------------------------------------------------+
| |
| [Icon] Authentication is required to run the PolicyKit |
| example program Frobnicate |
| |
| An application is attempting to perform an |
| action that requires privileges. Authentication |
| is required to perform this action. |
| |
| Password: [__________________________________] |
| |
| [V] Details: |
| Command: /usr/bin/pk-example-frobnicate |
| Run As: Super User (root) |
| Action: org.fd.pk.example.pkexec.run-frobnicate |
| Vendor: Examples for the PolicyKit Project |
| |
| [Cancel] [Authenticate] |
+----------------------------------------------------------+
如果用户使用 da_DK 区域设置,则对话框如下所示:
[IMAGE][3]
+----------------------------------------------------------+
| Autorisering [X] |
+----------------------------------------------------------+
| |
| [Icon] Autorisering er påkrævet for at afvikle |
| PolicyKit eksemplet Frobnicate |
| |
| Et program forsøger at udføre en handling der |
| kræver privilegier. Autorisering er påkrævet. |
| |
| Kodeord: [___________________________________] |
| |
| [V] Detaljer: |
| Bruger: Super User (root) |
| Program: /usr/bin/pk-example-frobnicate |
| Handling: org.fd.pk.example.pkexec.run-frobnicate |
| Vendor: Examples for the PolicyKit Project |
| |
| [Annullér] [Autorisering] |
+----------------------------------------------------------+
请注意,pkexec 不会验证传递给 PROGRAM 的参数。在正常情况下(每次使用 pkexec 时都需要管理员身份验证),这不是问题,因为如果用户是管理员,他可能只需运行 pkexec bash 即可获得 root 权限。
但是,如果使用用户可以保留授权的操作(或者如果用户被隐式授权),例如上面的 pk-example-frobnicate,则这可能是一个安全漏洞。因此,根据经验,默认所需授权已更改的程序永远不应隐式信任用户输入(例如,像任何其他编写良好的 suid 程序一样)。
答案2
我认为最好编写一个精简的系统 dbus 服务来处理需要 root 权限的事情。然后将需要 root 权限的应用程序部分的请求发送到该 dbus 服务。
我还没有准备好样品,但谷歌确实。
繁琐的部分是:
您正在编写一个迷你应用程序(dbus 服务)和应用程序本身。
它会将大约 2 个文件添加到您的软件包中。服务文件本身和dbus 服务的配置文件。
您可能希望为该服务的所有用户提供权限升级,或者您可能希望包含某种身份验证/授权。
这有点儿像问题,但事实并非如此。
好处是:
无需提示。它就能正常工作。