如何保护Apache安全,让我们在Debian 8上加密

介绍

本教程将告诉您如何设置从TLS / SSL证书让我们的加密运行Apache作为Web服务器在Debian 8服务器上。我们还将介绍如何使用cron作业自动执行证书续订过程。 Web服务器中使用SSL证书加密服务器和客户端之间的流量,为访问应用程序的用户提供额外的安全性。 Let's Encrypt提供了一种免费获取和安装受信任证书的简单方法。

先决条件

为了完成本指南,您将需要一个非root一个Debian 8服务器sudo管理任务的用户。 您可以按照我们的设置与相应权限的用户Debian 8 初始服务器设置指南 。 您必须拥有或控制您希望使用证书的注册域名。如果您还没有注册域名,您可以向其中一个域名注册商注册一个域名(例如Namecheap,GoDaddy等)。 如果你还没有准备好,一定要创建一条A记录指向你自己的域名服务器的公网IP地址(如果您使用的是DigitalOcean的DNS,你可以按照本指南 )。 这是必需的,因为Let's Encrypt验证您拥有它为其颁发证书的域。 例如,如果你想获得一个证书example.com ,该域必须解析到服务器的验证过程工作。 我们的安装程序将使用example.comwww.example.com作为域名,所以需要两个DNS记录 。 当您准备好继续时,使用您的sudo帐户登录您的服务器。

第1步:安装Certbot,让我们加密客户端

第一步用咱们加密获得SSL证书是安装certbot您的服务器上让我们的加密客户端。 该certbot Debian 8 发布时包不可用。 要访问certbot包,我们必须使我们的服务器上的反向移植杰西库。此存储库可用于安装比稳定存储库中包含的更新版本的软件。 键入以下命令将backports存储库添加到服务器:
echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list
添加新的存储库后,更新apt包指数下载有关新包的信息:
sudo apt-get update
一旦存储的更新,您可以安装python-certbot-apache包,拉在certbot ,通过瞄准backports中的库: 注意:当使用反向移植,建议只安装您需要的特定的软件包,而不是使用存储库一般更新。与主存储库相比,Backport软件包的兼容性保证较少。 为了避免意外安装或使用该资料库的更新包,你必须明确地传递-t标志和存储库名称从backports中安装软件包。
sudo apt-get install python-certbot-apache -t jessie-backports
certbot客户现在应该可以使用了。

第2步:设置Apache ServerName和ServerAlias

这是可能通过,我们希望确保作为参数调用时域certbot工具。 然而, certbot还可以从Apache配置本身阅读这些。 既然是很好的做法,始终明确您的服务器应该回应,我们将设置域ServerNameServerAlias直接在Apache配置。 当我们安装python-certbot-apache服务,Apache的安装,如果它是不存在的系统上。打开默认的Apache Virtual Host文件,以便我们可以显式设置我们的域名:
sudo nano /etc/apache2/sites-available/000-default.conf
在内部,虚拟主机块中,添加或取消对ServerName指令并将其设置为您的主域名。 到可使用添加该服务器也应响应任何替代域名ServerAlias指令。 在我们的例子中,我们使用example.com作为我们的标准名称,并www.example.com别名。当我们设置这些指令时,它将如下所示:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    . . .
    ServerName example.com
    ServerAlias www.example.com
    . . .
</VirtualHost>
当你完成后,保存并通过按住CTRL键 ,按X关闭文件。 键入Y,然后按Enter键保存文件。 检查配置文件以捕获您的更改可能引入的任何语法错误:
sudo apache2ctl configtest
在输出中查找此行:
Syntax OK
如果文件通过语法测试,请重新启动Apache服务以实现更改:
sudo systemctl restart apache2
现在,Apache的配置了您的域名,我们可以使用certbot获得我们的SSL证书。

第3步:调整防火墙

如果您启用了防火墙,则需要调整设置以允许SSL流量。所需的过程取决于您使用的防火墙软件。如果您当前没有配置防火墙,请随时跳过。

UFW

如果你正在使用UFW,可以看到通过键入当前设置:
sudo ufw status
它可能看起来像这样,意味着只允许SSH流量到Web服务器:
Status: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
为了另外允许HTTP和HTTPS流量,我们可以允许“WWW Full”应用程序配置文件:
sudo ufw allow 'WWW Full'
您的状态现在应该如下所示:
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)
您的服务器现在应该接受HTTP和HTTPS请求。

IPTables

如果您在使用iptables ,你可以看到通过键入当前的规则:
sudo iptables -S
如果您启用了任何规则,则会显示它们。示例配置可能如下所示:
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
打开SSL流量所需的命令将取决于您当前的规则。对于像上面的基本规则集,您可以通过键入以下内容添加SSL访问权限:
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
如果我们再次查看防火墙规则,我们应该看到新规则:
sudo iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
如果您正在使用一个程序来自动应用iptables在开机的规则,你将要确保你的新规则更新配置。

第4步:设置SSL证书

使用Let's Encrypt客户端生成Apache的SSL证书非常简单。客户端将自动获取并安装对我们的Apache配置中的域有效的新SSL证书。 要执行交互式安装并获取Apache配置中定义的所有域的证书,请键入:
sudo certbot --apache
certbot工具会评估你的Apache配置发现,应覆盖申请的证书的域。您将能够取消选择您不希望在证书下涵盖的任何定义的域。 您将看到一个分步指南来自定义您的证书选项。你会被要求提供一个电子邮件地址丢失了密钥恢复和通知,并且您将能够使两者之间选择httphttps访问或迫使所有请求重定向到https 。 它通常是最安全的需要https ,除非你有未加密的特定需要http流量。 当安装完成后,你应该能够找到生成的证书文件/etc/letsencrypt/live 。 您可以验证与以下链接您的SSL证书的状态(不要忘了您的域名替换example.com):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
测试可能需要几分钟才能完成。你现在应该可以使用访问您的网站https前缀。

第5步:设置自动续订

让我们加密证书有效期为90天,但建议您每60天更新证书以允许有误差。该certbot客户端有一个renew命令,可自动检测当前安装的证书,并试图续约他们,如果他们从到期日不到30天了。 要为所有已安装的域触发更新过程,您应该运行:
sudo certbot renew
因为我们最近安装了证书,所以命令将只检查到期日期,并打印一条消息通知证书不是由于更新。输出应该类似于:
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
请注意,如果您创建了具有多个域的捆绑证书,则只有基本域名将显示在输出中,但续订应对此证书中包含的所有域有效。 确保您的证书不会过时的一个实用方法是创建一个定期执行自动更新命令的cron作业。由于更新首先检查到期日期,并且仅当证书距离到期少于30天时才执行更新,因此可以安全地创建每周或甚至每天运行的cron作业。 让我们编辑crontab来创建一个新作业,它将每周运行续订命令。要为root用户编辑crontab,请运行:
sudo crontab -e
系统可能会提示您选择编辑器:
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny

Choose 1-3 [1]:
除非你更舒服vim ,然后按Enter键使用nano ,默认。 在crontab的结尾处包含以下内容,全部在一行中:
. . .
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
保存并退出。这将创建一个新的cron作业将执行letsencrypt-auto renew凌晨2:30命令每星期一。 由命令生成的输出将通过管道输送到位于日志文件/var/log/le-renewal.log有关如何创建和调度cron作业的更多信息,你可以检查我们如何使用cron来自动执行任务的VPS引导。

结论

在本指南中,我们看到了如何从Let's Encrypt安装一个免费的SSL证书,以保护用Apache托管的网站。我们建议您检查的官方咱们博客加密重要更新,不时。