防止其他应用程序绑定到端口80和443


16

上周,我接到一个害怕的客户打来的电话,因为他认为他的网站被黑了。当我查找他的网站时,我看到了apache2默认页面。那天晚上,我的服务器(Ubuntu 16.04 LTS)已升级并重新启动。通常,当出现问题时,我会在一夜之间收到警报。这次不是,因为监视系统检查HTTP状态代码200,并且apache2默认页面带有状态代码200。

发生的事情是,在启动期间apache2,绑定到端口80和443的速度比实际的Web服务器nginx快。我自己没有安装apache2。通过aptitude why apache2我发现php7.0包需要它。

简单地删除apache2将不起作用,因为显然php7.0需要它。是否可能以某种方式创建限制,以便仅允许nginx绑定到端口80和443?

其他解决方案也非常受欢迎。


15
这就是为什么您应该将活动服务器配置为仅在明确请求更新时才进行更新,以便可以首先在开发计算机上测试更新。
Nzall

2
我不会先在测试计算机上测试升级,但一定要在手动安排升级之前检查更改日志。而且看起来apache2在较早的升级过程中漏了。只是这次重新启动apache2是第一个绑定到http和https端口的绑定。
Boyd

9
作为旁注- This time not, because the monitoring system checks for HTTP status code 200。您可以通过检查网页的实际内容(正文或标题中的某些特定字符串)来改进监视系统,这将更加可靠。
VL-80

2
@Boyd 我不首先在测试机上测试升级,但始终检查更新日志,但是您刚刚体验到该方法的可靠性。阅读变更日志不能告诉您对已部署系统的影响,也不能告诉您所引入的错误或不兼容性。
安德鲁·亨利

5
@Nzall是公平的,听起来这种问题可能未在测试机上出现……他实际上对apache2或nginx是否会绑定端口具有竞争条件,理论上测试机可能会遇到nginx在测试过程中获胜(只是偶然),因此不会发现问题。
Doktor J

Answers:


29

您无法防止端口受到错误服务的束缚。在您的情况下,只需从自动启动中删除apache,您应该会很好。

对于16.04及更高版本:

sudo systemctl disable apache2

对于较旧的Ubuntu版本:

sudo update-rc.d apache2 disable

2
我会这样做,但我希望我能为将来的情况保卫自己,在这种情况下,我会在不知不觉中将另一个绑定到端口80和443的软件包作为另一个软件包的依赖项安装在我的系统上。
Boyd

1
由于这是16.04,因此:systemctl disable apache2
大师

12
@Boyd:为什么您会“不知不觉地”盲目安装软件包?为什么在客户使用的实时服务器上,您甚至没有读取正在安装的软件包和依赖项?您为什么不在执行之前就在镜像服务器上测试所有内容?这些是基本的操作原则,将解决您的所有问题。
与莫妮卡(Monica)进行的轻度比赛

6
@BoundaryImposition想要防止软件绑定到端口并不意味着我只是盲目地安装软件包。但是我们也是人,也会犯错误。不幸的是,我们无法首先在虚拟服务器上测试每个操作,但是在这种情况下,它不会立即显示问题,因为apache2是在问题出现前一周安装的(系统甚至在没有任何问题的情况下重新启动了) )。尽管无法测试每个升级,我们仍然每周进行升级。与(通过监视)有限的停机风险相比,我们更喜欢最新的安全补丁。
Boyd

3
@Boyd:“很遗憾,我们无法首先在虚拟服务器上测试每个操作”,为什么不呢?您的客户是否知道您跳过此过程?
与莫妮卡(Monica)进行的轻量级比赛

27

如果您确实没有使用apache2,而PHP 7.0则需要它,那么看起来您已经libapache2-mod-php7.0安装了。如果没有Apache,该软件包将无用。由于您使用的是nginx,因此您可能也已经安装php7.0-fpmphp7.0-cgi安装了它们,足以满足php7.0的依赖项要求:

$ apt-cache depends php7.0
php7.0
 |Depends: php7.0-fpm
 |Depends: libapache2-mod-php7.0
  Depends: php7.0-cgi
  Depends: php7.0-common
  Conflicts: <php5>

如果您确实安装了其中任何一个php7.0-{fpm,cgi},则可以继续并卸载Apache。


6
我确实今天确实了解到,就我而言,我最好只安装php7.0-fpm而不是安装php7.0软件包。OndřejSurýgithub.com/ oerdnj
Boyd

5
这是解决实际问题的真正解决方案:如何在Ubuntu上安装nginx和PHP而不安装Apache。
David Cullen

2

为了回答您的问题,您可以使用SElinux将端口限制为特定的应用程序。我自己并没有使用过它,而对其功能只有肤浅的了解,但是这里有一个我在此站点中找到的指针:

/server//a/257056/392230

在该答案中,wzzrd似乎显示了如何授予特定的应用程序(foo)绑定到特定端口的权限(803)。您只需要设置策略,以便只允许您的应用程序(nginx)指定的端口(80和443)。

根据wzzrd的答案,可能只是将其添加到策略中一样简单

allow nginx_t nginx_port_t:tcp_socket name_bind;

并运行这个

semanage port -a -t nginx_port_t -p tcp 80
semanage port -a -t nginx_port_t -p tcp 443

但是,我想您在策略中还需要指定一行,以指定没有其他程序可以绑定到这些端口。

最后,我只是在猜测适当的配置是什么。

无论如何,我认为没有默认安装并启用SElinux的Ubuntu。因为我认为它要求对各种实用程序和内核选项应用某些补丁,所以简单地使用确实安装了并从一开始就启用了SElinux的Centos可能会更容易。

抱歉,我没有更多帮助。也许再过一段时间,我将下载Centos的图像并尝试一下。这将是一个很好的学习步骤。如果可以,我将更新此答案。


2
大声笑@“使用Centos可能会更容易”
David Cullen

2

我还没有在答案中看到的东西,但是仍然有可能:

更改Apache配置以侦听另一个端口,以防万一。您可以通过打开Apache配置文件,然后将必须更改的行更改Listen 80为另一个端口来实现。


这“解决”了与接受的答案相同的问题,但又增加了一个问题,那就是必须解释/记录您的更改。同样,虽然它确实可以解决问题,但都不能解决整个问题。如果禁用了apache,但下次重新启动,则应用程序X绑定到端口80,那么您将再次遇到相同的错误。
Darren H

0

对于您的确切问题,我没有答案,但是也许您需要查看发行版。我会考虑使安装的服务(此处为Apache2)不安全的任何发行版。考虑研究一个不这样做的发行版。我不能说我曾经在Archlinux上看到过这种行为,我敢肯定还有其他行为。


1
那么,您如何建议格式化服务器并安装其他发行版?为什么您认为ubuntu无法处理特定服务,如其他答案所示?这个答案是一种宗教评论,无济于事。
Wtower

我现在不会格式化服务器并安装新的发行版,但是下次我必须升级服务器时我肯定会更改。Ubuntu刚刚在这篇文章中显示是不合适的,因为它启用了尚未配置的服务(此例外是诸如图形登录或声音服务之类的东西,这些东西通常可以正常工作,并且不会暴露于公共互联网中)。我担心答案可能有点宗教性,但这不是目的,它试图为我认为更大的问题提供解决方案。
phelbore

1
尽管我同意您的意见,但这并不适合发行版,但我认为这更适合作为评论,因为它并不能真正回答问题。
JoL

这是一个公平的观点。
与莫妮卡(Monica)进行的轻度比赛
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.