我正在尝试了解有关在 Ubuntu 10.04 Server 上的 Apache 下运行的 Web 应用程序的安全性和环境变量的一些概念。
我有几个应用程序想以没有 shell 或密码的用户身份运行(我知道这是个好主意,但我不是专家)。其中一个应用程序是通过系统初始化脚本启动的 Web 应用程序,其他应用程序是通过开关从命令行临时启动的实用sudo
程序-u
。
每个应用程序都需要访问同一组环境变量。我可以修改启动每个应用程序的脚本,并在其中设置环境变量,但我更希望以某种方式为运行应用程序的用户设置环境变量。
我的问题是:
可以为没有 shell 的用户设置“每个用户”环境变量吗?我读过“在 Debian 上为没有登录 shell 的服务设置环境变量“,但给出的解决方案本质上与修改我的每个应用程序脚本相同。
如果我无法为每个用户设置环境变量,那么为用户提供 shell 会带来哪些安全风险?
对于这种可能很常见的情况,有什么替代方案或建议吗?
答案1
使用配置文件并通过应用程序的启动脚本添加变量确实是处理此问题的正确方法。如果您需要向非 shell 脚本或二进制文件(如 perl、python 或 java)提供某些环境变量,则可以使用 shell 包装器调用它们,提供所需的变量,然后提供exec
实际脚本。
如果您的应用程序是由某种脚本启动的,则必须通过调用 shell(文件顶部的 shebang)来启动它,即使用户没有登录 shell。因此,您可以像普通用户一样通过 shell 的 rc 文件修改环境变量。我相信您仍然需要插入 BASH_ENV 变量来触发 rc 文件,因为您是非交互地调用脚本。
我强烈建议您使用前一种方法,并为应用程序创建某种配置。从长远来看,这将更容易管理。
答案2
环境变量是 shell 的一个方面。所以我很确定没有 shell == 没有环境变量。
一般情况下,我不会授予服务帐户登录权限。简而言之,这只是需要担心的另一件事。这只是另一个潜在的入侵点。
就我个人而言,我会在这里使用配置文件 (/etc/myapp.conf)。您只需拥有启动 Web 应用程序的 init 脚本,获取文件,然后让其他应用程序在默认位置查找或在命令行上获取参数。