运行需要根权限才能完成任务子集的 python 程序的最佳实践方法



编写python 应用程序的最佳实践方法是什么,其中大多数代码可以作为普通的非 root 用户运行 - 但至少有一个函数需要 root 权限才能执行?

我正在编写一个python程序,其中99%可以在用户空间中正常运行。但是我现在添加一个需要root的函数。一种解决方案是以 root 身份运行整个应用程序。但这似乎没有必要的危险。

我认为"正确的做法"是生成一些子进程(或线程?

  1. 具有根权限
  2. 仅包含绝对需要root权限的功能
  3. 不接受任何用户输入(或至少尽可能少,并在非常严格的允许列表正则表达式下仔细清理它)

但我不确定如何做到这一切。也许还有其他我没有考虑的最佳实践?

请考虑以下示例代码。

注意我只是使用套接字,因为绑定到端口>= 1024 可以作为普通用户完成,但绑定到任何端口<1024 需要 root 权限。但是,如果有更简单的示例,请使用它。

#!/usr/bin/env python3
import socket
def main():
user_operation()
root_operation()
def user_operation():
sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock.bind( ('localhost', 2222) )
def root_operation():
sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
sock.bind( ('localhost', 22) )
if __name__ == "__main__":
main()

如果我以正常的、未被剥夺的用户身份运行上述程序,则会出现Permission denied错误

user@host:~$ ./spawn_root_child.py 
Traceback (most recent call last):
File "/home/user/tmp/python_spawn_root_child/./spawn_root_child.py", line 18, in <module>
main()
File "/home/user/tmp/python_spawn_root_child/./spawn_root_child.py", line 7, in main
root_operation()
File "/home/user/tmp/python_spawn_root_child/./spawn_root_child.py", line 15, in root_operation
sock.bind( ('localhost', 22) )
PermissionError: [Errno 13] Permission denied
user@host:~$

但是如果我以 root 身份运行它,它运行良好

user@host:~$ sudo ./spawn_root_child.py 
user@host:~$

如何更新上述代码,使其遵循安全最佳实践,包括最小特权原则?

编辑我正在寻找以下内容:

  1. 健壮(它适用于小型 CLI 脚本以及大型 GUI 应用程序)
  2. 跨平台(它应该在Linux,Windows,MacOS和我的python驱动的烤面包机中工作)
  3. Pythonic(遵循Python的最佳实践)

如果你在Linux上运行你的Python程序,你可以编写一个bash脚本并从里面执行你的Python代码。

您可以以非 root 用户身份运行脚本,然后通过sudo python3 script.py将权限提升到 root 用户

仅在需要 root 的命令前面使用sudo是最好的方法,因为 Linux 将以这种方式切换回普通用户。(在我看来,最糟糕的方法是使用sudo su,您需要在其中执行exit才能手动离开root!

我建议将代码分成单独的脚本,不需要root的脚本和需要root的脚本。这样,您就不需要不必要地需要为不需要 root 的脚本运行sudo script.py

最新更新