这里是 CentOS,但我认为这并不重要,因为这个应该是一个核心 Linux 问题(我认为)。当尝试在 CentOS 机器上安装和运行 Apache Kafka(一个 Java 可执行文件)时,我想到了一个通常适用于 Linux 的问题。
当您运行 shell 脚本或本机可执行文件(例如java
)时,脚本/可执行文件是否指示它以哪个用户身份运行,或者操作系统是否指示脚本/可执行文件以哪个用户身份运行(即哪个用户正在执行脚本) /可执行文件)?
进程是否可能和/或典型地决定它们以哪个用户身份运行?意义能脚本/应用程序指定它必须以 root 用户身份运行,还是以其他特定类型的用户身份运行?
不管怎样,为什么会有关于以 root 身份运行进程与以非特权用户身份运行进程的一般警告?
答案1
简短的回答:两者都有。
更长(也更有用)的答案:默认情况下,程序将以启动它的用户身份运行。但是,如果编写了程序并赋予了正确的权限,则程序可以取得 root 权限和/或返回到“系统”用户来运行自己。但是,必须通过打包和安装过程或通过该计算机的管理员采取的操作来明确赋予程序这种能力。
之所以存在一般警告,是因为 UNIX 和 Linux 的历史经验表明,使用不需要的提升(即 root)权限的程序常常会对系统造成不良影响。这可能是由于数据损坏、导致系统其余部分无法使用/无响应的失控进程、无意中允许攻击者以您不希望的方式访问您的系统的进程。
答案2
当执行“shell 脚本”时,它会以执行该脚本的用户的权限执行。大多数使用包管理器(yum、apt 等)安装的服务(kafka、redis、nginx 等)都会安装帮助程序脚本以方便控制这些服务,并创建与这些服务(apache、redis、nginx、等)几乎所有这些帮助程序脚本最初都是以 root 身份执行的,然后将权限授予分配给该服务的服务用户。这确保了只有授权用户(即被授权执行“sudo service kafka start”的用户)才能有效控制这些服务。这意味着系统管理员 Sally 可以启动、停止和重新启动 kafka 和 nginx,而开发人员 Jim 可能仅限于启动和停止 kafka(或类似的东西)。虽然 java 用户可能是由管理员创建的,但这不是我所拥有的在实践中,这与 ruby 用户或 python 用户不同。相反,服务所有权通常固定于与该特定服务相关的服务用户。
某些进程依赖于以 root 身份运行(通常 ssh 服务器守护进程以 root 身份运行。)其他进程将拒绝以 root 身份启动(postgresql 就是其中之一。)
如果您在 /etc/init.d/someservice (或 /etc/init/someservice.conf)查看服务的帮助程序脚本,则导致权限升级或下降的实际脚本将在那里编码。或者,如果您以用户 stephan 身份登录,并执行类似 /usr/sbin/redis-server -c /etc/redis.conf 的内容,然后从另一个窗口检查该进程,您将看到 redis 已被拥有由斯蒂芬.
希望有帮助。