在Ubuntu 14.04上保护Apache的安全

我想在家里托管一个小网站,并已经按照以下步骤安装了Apache等:
1. sudo apt-get update 2. sudo apt-get install tasksel 3. sudo tasksel install lamp-server 这些步骤都成功了,一切都正常运行。
现在我习惯使用XAMPP进行开发,但是我不想将其用于实际环境,因为很多参考资料说它不够安全。
所以我的问题是,现在我通过上述方法安装了Apache/PHP和MySQL,那么默认情况下的安全级别如何?
是否有办法使其更加安全,并且是否有任何推荐的更改的清单或说明?
澄清一下:LAMP服务器将是一个实际运行的网站,而不是开发中的网站。

你想要保护什么?这完全取决于需求。通常情况下,Apache的安全性都是默认设置的。如果你在Apache安装中发现了安全问题,你应该将其报告为错误(bug),以便修复。 你可以做一些事情来增强安全性,比如启用SSL,确保你的代码尽可能安全等。 - Dan
sudo apt-get install taskselsudo tasksel install lamp-server -> sudo apt-get install lamp-server^ 做的是同样的事情,而且还能节省安装 tasksel 的步骤 ;) - Rinzwind
@Dan 我只是一般地指安全。从XAMPP过来,看到很多关于它在实际使用中的负面评论让我有些担心。如果这个LAMP安装通常是可行的,那就满足我的要求了。我会尽力编写安全的代码。 - Rog
@Rinzwind 谢谢你 - 我对Ubuntu和Linux非常陌生,但我正在努力学习 :) - Rog
2个回答

我在Ubuntu上运行自己的LAMP服务器并连接到互联网,因此我总是遵循相同的指南。通常,我会检查以下内容:
  • 在Apache中,删除文档或至少不要通过Web服务器呈现它(通过删除链接/etc/apache2/conf-enabled/apache2-doc.conf)。
  • 在Apache中,请确保不加载不必要的模块。在Ubuntu中,这是通过删除/etc/apache2/mods-enabled中的链接来完成的。每个链接指向/etc/apache2/mods-available目录中的一个文件,该文件一次加载和配置一个模块。
  • 您可能希望查看并启用/etc/apache2/conf-available/security.conf。他们提出了一些安全提示,默认情况下未激活:
  • 拒绝访问整个文件系统,除非您稍后明确允许的目录
  • 修改服务器横幅,尽可能少地提供有关正在运行的软件的信息。
  • 在PHP中,请检查在错误处理和日志记录部分(/etc/php4/apache2/php.ini文件)中的参数,在发生错误时不要在屏幕上打印太多日志信息。文件中的注释提供了很多关于最好做什么的信息。
  • 无需将MySQL服务器暴露在Internet上。在Ubuntu中,默认情况下,Mysql服务器仅侦听本地主机。在/etc/mysql/my.cnf中检查mysqld部分的bind-address参数。它应该在127.0.0.1上:

    bind-address = 127.0.0.1

  • 不要在此服务器上安装比您需要的更多的服务。

  • 不要忘记在更新到达时进行更新。
  • 不要仅依赖于LAMP服务器的配置,不要忘记您还必须运行可以引入一些安全威胁的PHP应用程序(输入验证和所有这些避免在输入字段中键入SQL查询以从DB检索更多信息的内容,...)
这些是我脑海中首先想到的事情。当然,你可以在互联网上找到更详细的教程和指南:

非常感谢,这正是我需要开始并让我更加安心的建议和清单。因此,我已将其标记为答案。干杯 :) - Rog
你可以使用a2disconfa2dismod命令来禁用配置文件或Apache模块。这比手动删除链接更安全。我尽可能避免以sudo身份运行rm命令。 - Dan

这是我在设置LAMP之后通常会做的事情: (仅供开发使用,不适用于生产环境)
  • 禁止apache2自动启动:

    sudo update-rc.d apache2 disable
    

    当您想使用时,可以通过以下方式启动:

    sudo service apache2 start
    
  • 禁止mysql自动启动:

    echo "manual" | sudo tee /etc/init/mysql.override
    

    当您想使用时,可以通过以下方式启动:

    sudo service mysql start
    
  • 阻止防火墙上的传入端口80和3306以保护您的LAMP免受入侵:

    sudo iptables -A INPUT -p tcp --dport 80 -j DROP
    sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
    

    (事实上,我会阻止除了一些关键端口之外的所有传入端口,但是Linux安全是一个不同的主题!)


1你也可以关掉服务器,这样安全性就会完全得到保障。说真的,你认为通过手动启动服务会更安全吗?如果你的网站使用的是受心脏出血漏洞影响的旧版本SSL,那么不管你是手动启动还是自动启动,当你的web服务器运行时都会出现问题。当然,你也可以阻止对端口443的访问! - Benoit
@Benoit - 就像我说的,我会阻止所有进入我的机器的端口,那么心脏出血漏洞怎么可能影响到我呢?至于手动启动,那更多是为了提高性能而不是安全。无论如何,OP有一个开发环境,所以总是保持这些服务运行的必要性是什么呢? - Prahlad Yeri
顺便说一句,安全的基本前提是要及时更新安全补丁。即使只是这样,也能解决你的心脏出血问题。 - Prahlad Yeri
谢谢Prahlad的回复。我想我表达得不清楚 - 我确实在开发中使用XAMPP - 但是我设置LAMP的Linux机器实际上将被一些人用于实时环境,尽管只有少数人。嗯,我可以说只有少数人,但我们都知道互联网可能会变成什么样子!Benoit - 关闭它将是最高级别的安全措施,我同意哈哈 - Rog
1@Rog - 即使在这种情况下,你可以巧妙地利用iptables(或其他防火墙软件)来允许来自可信源的流量访问Apache和MySQL端口。 - Prahlad Yeri
1顺便说一句,没有必要以root身份运行echo命令。只需要以root身份运行tee命令即可。echo "manual" | sudo tee /etc/init/mysql.override就足够了。 - Dan
没错,@Dan。我已经纠正了它。 - Prahlad Yeri