计算机安全的基本原则之一是永远不要运行您不需要的任何东西。
pgrep
今天,当我注意到我的 Ubuntu 9.04(桌面)机器正在运行一个 git 服务器守护进程时,我正在ping 一个进程。在快速发誓之后,我发现该git-daemon-run
软件包已(可能是无意的)安装,并且删除它摆脱了该过程(并确保它以后不会重新启动)。
但在其他情况下,我希望安装服务器包,但不希望服务器守护程序运行。例如,我lighttpd
用于内部测试(它由某些应用程序的特定测试脚本启动,并且仅在这些配置中侦听 localhost),但我不希望它通过一些随机配置文件侦听外部连接。(如果我想运行一个监听外部连接,我会自己配置和运行它。)
我真的不喜欢在暴露于 Internet 的机器上运行各种我不需要的随机服务器,因为谁知道它们会打开哪些安全漏洞。而且我更喜欢不必为防火墙而烦恼,因为这是另一个可能导致安全漏洞的错误和错误配置的潜在来源。除非管理员特别要求,否则将 Unix 机器配置为不启动任何服务器并不难;NetBSD(我认为也是 OpenBSD)默认采用这种方式。
如何配置我的 Ubuntu 系统从不启动任何类型的服务器守护程序,除非我明确告诉它我希望它启动?
(在我的书中,要求安装一个软件包并不是要求启动一个服务器。如果它应该是,这是一个糟糕的用户界面,因为许多软件包安装甚至没有服务器要启动,所以它使在没有意识到您已经这样做的情况下无意中启动服务器太容易了。)
编辑:为了清楚起见,问题不在于我希望能够停止现有服务器。问题是我不希望在没有明确请求的情况下启动新服务器。这意味着我应该能够执行任何系统管理员任务,例如安装软件包,并且确信没有服务器已启动。大多数回应都没有解决这一点。
安装sysv-rc-conf并简单地关闭您不想运行的服务。
作为有类似问题的人,我非常强烈地认为守护程序假定用户希望它默认启动是不合理 的:有许多完全有效的用例并非如此。(更不用说哪些安装实际上包含守护进程并不总是很清楚。)守护进程可以默认关闭,可以显式查询用户,或者可以有一个中央设置。其他任何东西都是微软的推理,完全不值得 Linux。
此外,我发现上述对原始海报的一些评论是粗鲁的、傲慢的、缺乏建设性的。例如,建议他要么接受默认行为,要么改变分布,这确实很了不起。首先,没有一个发行版是完美的,跳到一个带有相关额外工作的新发行版不太可能是解决这一问题的现实解决方案。其次,熟练的 Linux/Unix 用户习惯于每一种行为都是可以改变的:一个问题可能需要两个小时的时间去挖掘,但它会被修复。当默认值不合适时,这样的用户会自然而然地假设存在一种变通方法并尝试找出它是什么。第三,在开源和自由软件的礼仪中,
If you don't like it, then patch the source code!'' is an acceptable response; however,
……那就去远足吧!'' 不是。打包系统的期望是当你安装一个服务器包时,你想运行那个服务器。这是一个合理的期望。
罗伊已经为您解答了这个问题。当您安装新的服务器软件包时,您会停止该服务器,然后使用 sysv-rc-conf 之类的工具来防止该服务器在下次重新启动或运行级别更改时启动。是的,您必须自己做一些工作,这是合理的,因为您配置系统的方式与大多数使用 Ubuntu 的人不同。
您应该花一些时间来学习如何配置 lighttpd,以便将其永久配置为仅在 localhost 上侦听。然后,当您启动服务器时,您就知道它已经按照您的喜好进行了配置。
我发现以下对于在 chroot 环境中安装 Ubuntu 很有帮助,例如 debootstrapping new xen guest。实际上归功于 xen-tools 脚本教我这个:
echo '#!/bin/sh' > /usr/sbin/policy-rc.d
回声“退出 101”>>/usr/sbin/policy-rc.d
chmod 755 /usr/sbin/policy-rc.d
有了这个脚本,apt 在安装后将不会启动服务。但是,这只是您问题的一半,因为符号链接仍然存在,服务将在下次启动后启动。我不知道如何自动停止:(
巴里布朗在对该问题的评论中为可能的答案提供了线索。
打包系统
invoke-rc.d
在安装包后使用程序启动服务器。 [1] 该程序将运行/usr/sbin/policy-rc.d
以确定启动该服务器的策略。该包
policyrcd-script-zg2
包含policy-rc.d
脚本,/etc/policy-rc.d
如果存在,该脚本将使用其参数运行,并以该脚本的错误代码退出,否则以 0(成功)退出。policy-rc.d
预计提供的界面在invoke-rc.d
管理中简要记录,在/usr/share/doc/sysv-rc/README.policy-rc.d.gz
.我想下一步是让我测试这个。
剩下的有待回答:
[1] 系统的其他部分使用
invoke-rc.d
什么?[2] 这真的有效吗?看看初始化脚本所在的目录怎么样?您可以使用 chatr 命令使这些目录不可修改。
理想情况下,这是
post-inst
脚本的问题。在 Ubuntu 项目开始时,我们有意将 dpkg 配置脚本的默认设置强制为正常,这样您和我就不必回答可能出现的每一个该死的问题,或者浪费时间研究选项。现在 Ubuntu 已经设置了这个,很多人都不知道它的存在。应该可以问一个关于是否安装为守护进程的问题,但我在检查的几个包中没有看到任何这样的问题。也许您应该与 Ubuntu 服务器团队甚至 Debian Policy 合作来改进。
您可以尝试创建将检查已安装服务列表并根据某些允许服务列表验证它们的脚本。如果服务不在列表中,则脚本将其关闭。该脚本必须在启动公共服务之前运行。并且可能像守护进程一样运行以关闭新安装的服务。或者如果可能,在每次安装后自动运行以检查新服务。
PS我可以想到安装包后服务启动的两个可能原因。那是包功能,或者说是包管理器功能。如果那是包功能,我认为没有办法改变服务行为。如果那是包管理器功能,则可能有一些配置选项可以防止安装后服务启动。我现在不知道所以只是抛出想法。
如果您为 INPUT 链设置 iptables 的默认策略 DROP,那么您不必担心监听端口,因为它们会被 iptables 阻止。如果您是 iptables 的新手,Ubuntu 服务器带有一个用户友好的 iptables 界面。
从您的帖子中,我觉得您可能更喜欢使用不同的 Linux 发行版,例如 CentOS。CentOS 的默认安装过程将允许您安装不同的元软件包,如果选择无,您可能会更满意您的基本安装。
另外,当您的意思是在服务器上运行的东西时,如果您用“服务”或“守护程序”代替“服务器”一词,我认为您的问题可能会更清楚一些。人们倾向于使用“服务器”来指代物理机器或虚拟机。虽然我猜它在技术上并不正确。
使用“runlevel”命令查看您所处的运行级别,并删除 /etc/rc
<
runlevel>.d/ 中的所有符号链接。您可能希望某些守护程序运行,但大多数可能会被删除。您可以使用 /etc/init.d 中脚本中的符号链接将它们重新添加。
我认为有一个命令可以做到这一点,并为所有运行级别添加所有符号链接,但我只是手动完成。