如何阻止Ubuntu启动未明确要求运行的守护进程?


8

计算机安全性的基本原则之一是永远不要运行不需要的任何东西。

pgrep今天,当我注意到我的Ubuntu 9.04(台式机)计算机正在运行git服务器守护程序时,我正在为一个进程执行ping操作。快速宣誓后,我发现该git-daemon-run软件包已经安装(可能是无意间),并且删除了该软件包,从而摆脱了该过程(并确保以后不会重新启动该软件包)。

但是在其他情况下,我希望安装服务器软件包,但不希望服务器守护程序运行。例如,我lighttpd用于内部测试(它由某些应用程序的特定测试脚本启动,并且仅在那些配置中侦听localhost),但我不希望它通过某些随机配置文件侦听外部连接。(如果我想运行一个监听外部连接,则可以自己配置并运行它。)

我真的不喜欢在暴露于Internet的计算机上运行不需要的各种随机服务器,因为谁知道它们会打开哪些安全漏洞。而且我不想不必为防火墙烦恼,因为那是错误和配置错误的另一个潜在来源,可能会打开安全漏洞。除非管理员明确要求,否则将Unix计算机配置为不启动任何服务器并不难。NetBSD(我想也是OpenBSD)默认情况下就是这种方式。

如何配置我的Ubuntu系统从不启动任何类型的服务器守护程序,除非我明确告诉我要启动它?

(在我的书中,要安装软件包并不是要求启动服务器。如果应该这样做,这是一个糟糕的用户界面,因为许多软件包安装甚至都没有要启动的服务器,所以它使在不自觉地启动服务器的情况下实在太容易了。)

编辑:只是要说清楚,问题不在于我希望能够停止现有服务器。问题是我不希望在没有明确请求的情况下启动新服务器。这意味着我应该能够执行任何sysadmin任务,例如安装软件包,并确信没有服务器启动。大多数答复都没有解决这一点。


3
我已经在.deb程序包内部闲逛了大约10分钟。它们包括“ postinst”脚本,该脚本在安装软件包后运行。他们运行的最后一个命令通常是“ invoke-rc.d <servicename> start”,这会使服务自行启动。通常,对invoke-rc.d的调用是硬连接的,无需检查全局配置变量即可控制是否实际启动该服务。因此,将由invoke-rc.d决定是否启动该服务。那是我的调查结束的地方。
巴里·布朗

2
正如Barry解释的那样,Ubuntu显然不适合您。抱歉,您必须1)更改发行版,或2)密切注意ubuntu所做的一切。
elcuco

在这方面,Ubuntu / Debian与Fedora不同的原因是Debian仅安装您要的内容,而Fedora安装厨房水槽。因此,在Fedora中,通常会安装不需要的软件包,因此默认情况下它不会运行。在Debian中,您明确安装了该软件包,因此希望您希望服务器立即运行。
TRS-80

任何更新。您尝试了哪一个?什么有效?a
Nandhini Anand 2011年

可悲的是,似乎没有比其他解决方案,“仔细检查什么软件程序包的任何更改后您的系统上运行”,明确了非常容易出错的过程。
cjs 2012年

Answers:


12

安装sysv-rc-conf并简单地关闭您不想运行的服务。

sudo apt-get install sysv-rc-conf
描述:sysv-rc-conf提供了一个易于使用的界面来管理“ /etc/rc{runlevel}.d/”符号链接。

替代文字


如何防止打包系统打开新服务器?
cjs

请阅读巴里·布朗(Barry Brown)的评论,它解释了为什么此答案过时。
elcuco

8

作为一个有类似的问题,我感觉很强烈,这是不是 合理的守护程序假定用户希望它每默认启动:有许多非常有效的使用情况下,这是情况并非如此。(更不用说并不总是清楚哪些安装程序实际上包含一个守护程序。)该守护程序可能默认情况下处于关闭状态,可以显式地查询用户,或者可以进行中央设置。其他任何事情都是Microsoft的推理,完全不值得使用Linux。

此外,我发现以上对原始海报的评论中有些不礼貌,光顾,而且缺乏建设性。提出建议,例如,他应该接受默认行为或更改分布,这确实很了不起。首先,没有一种发行版将是完美的选择,而跳到新的发行版以及相关的额外工作不太可能是针对这件事的现实解决方案。其次,熟练的Linux / Unix用户习惯了每种行为都可以更改的问题:挖掘问题可能需要两个小时的时间,但是随后就解决了。当默认值不合适时,对于此类用户而言,自然的做法是假设存在解决方法,然后尝试找出解决方法。第三,在开源和免费软件礼节中If you don't like it, then patch the source code!'' is an acceptable response; however,......然后徒步旅行!''


5

打包系统的期望是,当您安装服务器软件包时,您想运行该服务器。这是一个合理的期望。

除非我如何配置Ubuntu系统,否则不要启动任何类型的服务器 
专门告诉我我要启动服务器吗? 

罗伊(Roy)为您回答了这个问题。安装新的服务器软件包时,请停止该服务器,然后使用sysv-rc-conf之类的工具阻止该服务器在下次重新引导或更改运行级别时启动。是的,您必须自己做一些工作,这是合理的,因为您对系统的配置与大多数使用Ubuntu的人不同。

例如,我使用lighttpd进行内部测试(它由特定的测试脚本启动 
对于某些应用程序,并且仅在localhost上侦听),但我通常不希望这样做 
监听外部连接。

您应该花一些时间来学习如何配置lighttpd,以便将它永久配置为仅在本地主机上侦听。然后,当您启动服务器时,就知道它已经按照您的喜好进行了配置。


3
首先,我认为这不是一个合理的期望。我已经安装了lighttpd二进制文件并不意味着我想运行公共服务器。其次,我并不总是知道我已经安装了服务器软件包。他们有时会被我安装的其他软件包吸引。
cjs

1
哦,我确实知道如何将lighttpd配置为仅在localhost上侦听,而且在执行此操作的任何特定系统上,我经常有六次或更多的项目签出。
cjs

5

我发现以下对在chroot环境中安装Ubuntu很有帮助,例如,重新启动新的xen guest虚拟机。实际上,功劳是xen-tools脚本来教我这一点:

回声'#!/ bin / sh'> /usr/sbin/policy-rc.d

回声'退出101'>> /usr/sbin/policy-rc.d

chmod 755 /usr/sbin/policy-rc.d

使用此脚本后,apt将不会在安装后启动服务。但是,这只是您问题的一半,因为符号链接仍然存在,所以服务将在下次启动后启动。我不知道如何自动停止:(


1
它可能会破坏nginx logrotation,因为Ubuntu的/etc/logrotate.d/nginx invoke-rc.d nginx rotate在postrotate部分中使用,我使用的版本略有不同gist.github.com/hostmaster/7c25ef4e1e47bc3e2d71
hostmaster

当软件包的软件包从系统中删除时,它还可以防止守护程序停止。这个不好。
hostmaster 2014年

4

巴里·布朗(Barry Brown)在对问题的评论中,为可能的答案提供了线索。

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]这确实有效吗?


3

如何查看初始化脚本所在的目录?您可以使用chatr命令使这些目录不可修改。


嗯 我不知道为什么这个人被否决了?这是一个hack,但至少可以解决我的问题,与此处的大多数回复不同。
cjs

我赞成这一点,因为它是您可能会在Ubuntu上获得的最接近的解决方案,尽管我认为使init目录不可修改是一个糟糕的主意(想像一下,尝试安装您想启动的服务)。我知道find可以用来监视文件和目录中的更改,尽管我对该工具不太熟悉,无法为您提供确切的命令。我会向其中一位大师咨询有效的命令,将其粘贴在bash脚本中,并在每次安装后运行它,然后使用sysv-rc-conf手动禁用您不需要的服务。
巴布(Babu)

2

理想情况下,这是post-inst脚本问题。在Ubuntu项目开始之初,我们就进行了有力的努力,将默认值强制设置为dpkg配置脚本,这样您和我就不必回答所有可能出现的问题,也不必浪费时间研究这些选项。既然Ubuntu已经设置好了,许多人都不知道它的存在。应该可以问一个有关是否作为守护程序安装的问题,但是我在检查的几个软件包中没有看到这样的问题。

也许您应该与Ubuntu服务器团队合作,甚至应该与Debian Policy进行合作以改善情况。


1

您可以尝试创建脚本,该脚本将检查已安装服务的列表并针对允许的服务列表进行验证。如果服务不在列表中,则脚本将其关闭。该脚本必须在启动公共服务之前运行。并且可能像守护程序一样运行以关闭新安装的服务。或者,如果可能,则在每次安装后自动运行以检查新服务。

附言:我可以想到两种可能的服务原因,是在安装软件包后启动的。那就是包功能,或者就是包管理器功能。如果那是软件包功能,我认为没有办法改变服务行为。如果这是程序包管理器功能,则可能有一些配置选项来防止安装后启动服务。我现在不知道,所以只发表想法。


1

如果为INPUT链使用默认策略DROP设置了iptables,则不必担心监听端口,因为它们会被iptables阻塞。如果您不熟悉iptables, Ubuntu服务器将为iptables提供用户友好的界面

从您的帖子中,听起来像是您对使用其他Linux发行版(例如CentOS)更满意。CentOS的默认安装过程将允许您安装不同的元软件包,并且通过不选择任何一个,您可能会更满意基本安装。

另外,我想您的意思是在服务器上运行的内容时,如果用“服务”或“守护程序”代替“服务器”一词,可能会更清楚一些。人们倾向于使用“服务器”来指代物理机或虚拟机。虽然我猜它在技术上不正确。


0

使用“ runlevel”命令查看您所处的运行级别,并删除/ etc / rc <runlevel> .d / 中的所有符号链接。您可能希望某些守护程序运行,但大多数守护程序可能会被删除。

您可以使用/etc/init.d中脚本中的符号链接将它们添加回去。

我认为有一个命令可以做到这一点,并为所有运行级别添加所有符号链接,但我只是手动执行。


问题是,我不知道何时可以添加符号链接。我需要阻止添加符号链接和启动服务器(主要是包装系统,看来)的任何操作,除非我采取一些明确要求这样做的操作。
cjs

设置防火墙可能更容易,更可靠。也许编写脚本以将端口和协议作为参数来添加/删除防火墙规则,使事情变得容易。
谐振器

或以单用户模式运行您的计算机……这可能会带来更多的问题,但所节省的问题却更多。
谐振器

我是Ubuntu的新手,是Fedora / RedHat的长期用户。关于Ubuntu的一件事让我感到奇怪:默认情况下,服务是打开的。在Fedora下,默认情况下服务处于关闭状态。
巴里·布朗

以单用户模式运行台式机或服务器不是很实际。
cjs

0

或者,您可以使用update-rc.d命令。

禁用apache2服务

# update-rc.d [-f] apache2 remove

编辑:

这意味着我应该能够执行任何sysadmin任务,例如安装软件包,并确信没有服务器启动。

此行为由.deb软件包中的脚本控制。安装软件包时,该脚本将自动执行。IIRC,我们无法绕过此脚本。


0

基本上,你不能。

如果您安装了软件包并启动了服务,则将发生这种情况。如果您不喜欢,https://launchpad.net/上提交错误。

您不应该混帐Deb软件包。这类事情可能会回来,以后又会咬你。

如果要使用OpenBSD风格的“默认情况下什么也不运行”,请运行OpenBSD。并非每个发行版都适合所有人。Ubuntu中肯定会有一些您不喜欢的东西。如果仍要运行ubuntu,则必须检查正在运行的服务并关闭。


-2

您可以在GNOME的“系统”>“服务”菜单中启用和禁用某些服务。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.