为Apache和SSH构建双因素身份验证像这样的服务器),那么您如何限制有人访问您的站点并进行破坏的风险?SSH呢?SSH是一个更大的风险!在当今的环境中,重要的是要考虑您面临的风险并采取必要的步骤,以尽可能降低风险。在本教程中,我将详细介绍实现用于访问您的网站和SSH访问的自建双因素身份验证系统的步骤。运行您自己的硬件的基础设施和“挑战”可能很烦人。在处理了风扇故障、电源故障、硬盘故障等各种硬件故障后,你可能最终会决定丢弃你在托管中心或家中卧室的机柜和硬件,毅然投入到弹性计算的怀抱中。一个这样的选择是亚马逊的EC2平台,它提供了多种Linux版本,并且拥有市场上最可靠和最成熟的云平台之一。我不是亚马逊代表,但我还是要说试试看。这个产品很棒,微实例(microinstance)可以免费使用一年。在本文的测试场景中,我使用运行Ubuntu12.04LTS的AmazonEC2服务器来托管多个Web应用程序。如果您使用不同的Linux发行版,可以稍微修改这些步骤以满足您的特定要求。假设这些应用程序中的大多数仅供个人使用。如果您只从工作或家中访问该网站,您可以通过简单地创建仅允许来自这些IP地址的Web流量的防火墙规则来保护该网站。顺便说一句,这正是您为保护SSH所做的。但是,假设这种方法不适合您的Web应用程序,因为您经常出差并且需要在出门在外时能够访问这些应用程序,因此仅靠一些防火墙规则将无济于事。还假设您的应用程序有自己的安全系统,但您仍然需要额外的安全层。您可以设置一个虚拟专用网络(VPN)服务器,但您可能希望允许家庭成员访问其中一个网站,因此VPN方法将不起作用。另一个要考虑的选项是使用GoogleAuthenticator进行真正的双因素身份验证。当然你可以选择走这条路,但是你要找的是一个你自己可以做的系统,一个属于你的独立系统。就像Linux世界中的许多事情一样,有志者事竟成!事实证明,您可以轻松组合您自己的双因素身份验证解决方案,并使用它来控制对您的Web应用程序和SSH的访问,同时,您可以允许其他用户偶尔访问您的网站。Apache身份验证和授权由于本示例中的Web服务器是Apache服务器,您不妨利用服务器的身份验证和授权功能,要求用户在您的任何网站为用户提供服务之前提供一系列登录凭据。为了简单起见,并且由于您将遵循仅允许进出Web服务器的https流量的最佳实践,因此请使用mod_auth_basic模块进行身份验证。首先成为root并在新安装的Ubuntu上安装Apache:sudosuapt-getinstallapache2假设您的Web应用程序在主www文档文件夹的子文件夹中运行。这样,你只需要在http服务器的根文件夹中创建一个.htaccss文件来管理你所有的网站:vim/var/www/.htaccess现在,添加几行命令Apache请求身份验证以及在哪里找到密码文件:AuthTypeBasicAuthName"restrictedarea"AuthUserFile/home/ubuntu/.htpasswdrequirevalid-user这一步完成后,现在需要更改文件的所有权,以便Apache进程可以读取该文件content:chownwww-data:www-data/var/www/.htaccess接下来,您需要创建.htaccess文件中引用的.htpasswd文件并配置其所有权,以便Web服务器可以读取该文件:htpasswd-cb/home/ubuntu/.htpasswdjameslittontest123chownwww-data:www-data/home/ubuntu/.htpasswd现在,您需要命令Apache要求身份验证,使用mod_auth_basic模块进行身份验证:vim/etc/apache2/sites-available/default-ssl然后,你需要设置AllowOverrideChangeNone为AllowOverrideAuthConfig:Serviceapache2restart现在访问您的网站将提示您输入您的用户名和密码(参见图1)。图1:来自mod_auth_basic的身份验证请求每日密码/PIN我将在这里采用的方法是让您的辅助身份验证密码每天更改一次,而不是更频繁。这允许上面的mod_auth_basic方法工作。在这里我不赘述,但一句话:每次更改密码时都需要立即重新验证,这不是您想要的行为。假设我们采用一个六位数的数字PIN,并在每天午夜将该PIN发送到我们的手机。我真的很喜欢Pushover,这是一种可以通过您自己的脚本和应用程序立即向手机和平板电脑发送即时通知的服务。要实现此机制,请创建一个bash脚本:vim/home/ubuntu/2fac.sh现在,添加以下行:1#!/bin/bash2ppwd=`od-vAn-N4-tu4/home/ubuntu/.2fac第2行生成一个随机的六位PIN并将其分配给一个名为ppwd的变量。第3行将PIN发送到Pushover服务,后者又将PIN发送到您的手机。第4行使用新密码更新.htpasswd文件;最后但同样重要的是,第5行以可恢复的方式保存了PIN的副本,稍后您将看到。现在,保存脚本并使其可执行:chmod+x/home/ubuntu/2fac.sh要完成此解决方案的最后一步,您只需通过cron安排脚本在每晚半夜运行:crontab-e0000***/home/ubuntu/2fac.sh让它可以通过网络访问当然你可以忽略它并且你已经完成了,但是假设你没有收到PIN码并想强制它改变.或者,也许您授予某人临时访问您网站的权限,但现在想强制更改密码以确保此人永远无法再次访问该网站。您始终可以通过SSH连接到服务器并手动运行脚本,但这工作量太大。创建一个Web可访问的PHP脚本,让它为您处理。首先,更改2fac.sh脚本的所有权,以便您的Web服务器可以运行它:chownwww-data:www-data/home/Ubuntu/2fac.sh现在,您需要创建一个新文件夹来放置脚本,并且创建PHP脚本本身,允许手动运行新的“密钥”:mkdir/vaw/www/twofactorvim/var/www/twofactor/index.php1因为这是可以想象的:你需要强制一个新的密钥,因为没有收到以前的密钥,你需要确保把该脚本文件夹不需要验证。为此,您需要更改Apache配置:vim/etc/apache2/sites-available/default-ssl现在,在/var/www目录命令下添加以下内容:
