我想以编程方式更改网络配置,例如 dhcp、ip 地址等。
但我不想以 root 身份运行我的应用程序。所以我的问题是:解决这个问题的常用方法是什么?这可能吗?
是否有任何组被允许执行此操作而无需获得任何其他权限?或者我应该将配置文件“chown”给一个特殊组并将用户添加到该组?
与此相关(如果这与主题无关,请告诉我,我会提出另一个问题):目标是嵌入式设备,应用程序应该是用户唯一可以访问的应用程序。有什么好的(最佳)做法吗?我应该为该应用程序创建一个特殊用户吗?任何提示都值得赞赏。
答案1
您可以在程序上设置功能。这将允许它执行某些特权任务,而无需完全以 的身份运行root
。这里讨论的功能是CAP_NET_ADMIN
:
CAP_NET_ADMIN
Perform various network-related operations:
* interface configuration;
* administration of IP firewall, masquerading, and accounting;
* modify routing tables;
* bind to any address for transparent proxying;
* set type-of-service (TOS)
* clear driver statistics;
* set promiscuous mode;
* enabling multicasting;
* use setsockopt(2) to set the following socket options: SO_DEBUG, SO_MARK,
SO_PRIORITY (for a priority outside the range 0 to 6), SO_RCVBUFFORCE, and
SO_SNDBUFFORCE.
capabilities(7)
您可以在和手册页中找到有关功能的更多信息setcap(8)
。
为了更加安全,如果您只需要特定子集的用户能够运行该程序,您可以将这些用户放入一个组中,将chgrp
您的程序放入该组中,chmod
然后0750
。
答案2
如果你在计算机上使用 NetworkManager,则可以使用网管命令行。
nmcli 是一个用于控制 NetworkManager 并获取其状态的命令行工具。它并非 nm-applet 或其他类似客户端的替代品。相反,它是这些程序的补充实用程序。nmcli 的主要用途是在服务器、无头机器上,或者仅供喜欢命令行的高级用户使用。
The use cases comprise: -- Initscripts: ifup/ifdown can utilize NetworkManager via nmcli instead of having to manage connections itself and possible interfere with NetworkManager. -- Servers, headless machines: No GUI is available; then nmcli is used to talk directly to NetworkManager and control only system-wide connections. -- User sessions: For this case, nmcli can talk to nm-applet to find user connections. It can still talk directly to NetworkManager for manipulating these connections. As nmcli doesn't have direct access to user configuration data in GConf, nm-applet handles that itself. That may, for example, cause the applet to pop up keyring dialogs when secrets are needed.
答案3
如果你的目标设备支持,setuid 机制可能是最佳选择
http://en.wikipedia.org/wiki/Setuid
某些程序需要 root 权限,而使用 setuid 的作用是使可执行文件属于 root 并且设置了 setuid 位,因此当另一个用户执行它时,可执行文件将以 root 权限运行。
但也请注意
由于潜在的安全问题,许多操作系统在应用于可执行 shell 脚本时会忽略 setuid 属性。