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

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

上周,我接到一位惊慌失措的客户的电话,因为他认为他的网站被黑客入侵了。当我查看他的网站时,我看到了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?

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

答案1

您无法阻止端口被错误的服务绑定。对于您来说,只需从自动启动中删除 apache 即可。

对于 16.04 及更新版本:

sudo systemctl disable apache2

对于较旧的 Ubuntu 版本:

sudo update-rc.d apache2 disable

答案2

如果您确实没有使用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。

答案3

回答你的问题,你可能可以使用 SElinux 限制某个端口到特定应用程序。我自己没有用过它,对它的功能只有肤浅的了解,但这是我在这个网站上找到的一个提示:

https://serverfault.com/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

不过,我想您还需要在策略中添加一行,指定任何其他程序都不能绑定到这些端口。

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

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

抱歉,我帮不上什么忙。也许下次我会下载 Centos 的图片并尝试一下;这将是一个很好的学习步骤。如果我这样做了,我会更新这个答案。

答案4

我没有确切的答案,但也许你需要看看你的发行版。我认为任何在安装时启用服务(此处为 apache2)的发行版都是不安全的。考虑寻找一个不这样做的发行版。我不能说我从未在 Archlinux 上看到过这种行为,我相信还有其他的。

相关内容