我正在设置一个系统(Ubuntu 18 桌面)。该计算机(主要)用于使用前端的 Web 浏览器应用程序和服务器来控制一些硬件。该服务器是用 Python/Cherrypy 编写的。在本地网络上运行。
一般的想法是,硬件最终用户的用户配置文件(例如,Foobar)将通过浏览器控制它。但是,我仍然需要以某种方式启动服务器,但问题在于:我不希望 Foobar 能够直接查看/访问源 python 代码。我还将拥有另一个管理员帐户用于维护目的(例如我)。
我有什么选择可以实现这一目标? 有一些想法,但我不确定它们如何/是否会起作用:
- 有一个在启动时运行的脚本(bash?)。脚本本身对 (...)/sourcecode/servermain.py 具有执行(仅?)权限,因此可以启动服务器。用户配置文件本身对该文件夹没有任何权限。
- Foobar 仅对 (...)/sourcecode/servermain.py 具有执行权限。因此,配置文件可以在启动时启动代码,但由于它没有读/写权限,因此无法查看任何内容。但是,Foobar 是否仍然能够下载某个 USB 密钥上的文件?这将是一个问题。
- 其他想法/方法?
其他详细信息:我知道我最终可以编译 Python 代码,但由于各种原因,目前这不是一个选项。我需要一个基于用户配置文件/访问权限的解决方案。
Foobar 配置文件将在启动时登录。这基本上意味着用户只需坐在电脑前,就可以立即控制机器,所有东西都已设置好,用户无需费心即可使用。设备位于一个有门禁的房间内,用户配置文件不具备系统的管理员权限。
答案1
脚本本身对 (...)/sourcecode/servermain.py 具有执行(仅?)权限
解释器始终以与启动用户相同的权限运行。因此,如果用户无法读取脚本,Python 解释器也将无法读取它。
对于二进制可执行文件,你可以使用“setuid”位来解决这个问题——但这个功能才不是使用脚本进行工作#!
。
有一个在启动时运行的脚本(bash?)
对于此线程,请务必记住“启动时”和“用户登录时”是截然不同的事件。前者是特权(“启动时”的程序具有 root 权限或您想要的任何非 root 用户权限),而后者则不是(“登录时”的程序始终只具有该用户的权限)。即使您配置了启动时自动登录,这仍然适用。
其他想法/方法?
如果它的行为像一个服务,为什么不开始它是否像实际的服务一样使用操作系统提供的服务管理功能?
为该服务创建一个单独的用户帐户。
useradd -r webapp
创建一个
*.service
在启动时启动的 systemd 文件。[Unit] Description=Cherrypy webapp [Service] Type=... User=webapp ExecStart=/usr/bin/python ... [Install] WantedBy=multi-user.target
这是启动任何需要自己帐户的程序的常用方法,无论它是否是 Web 应用程序。(由于服务管理器是一个特权进程,它可以切换到它需要的任何用户 - 完全独立于“登录”用户(如果有)。)
这同样适用于任何 init 系统,无论是 systemd 、 Upstart 还是 SysV。
但是,如果你真的不想通过 init 系统执行此操作,另一种方法是授予控制台用户sudo -u webapp
仅使用启动服务所需的特定命令的权限。