当前位置: 首页 > 科技观察

为Apache和SSH搭建双因子验证系统

时间:2023-03-12 22:59:19 科技观察

为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目录命令下添加以下内容:满足any现在让我们配置所有权并重启Apache:chown-Rwww-data:www-data/var/www/twofactorServiceapache2restart所以仔细考虑这一点后,可以想象Pushover服务可能完全不可用。这会让您陷入困境:您无法访问您的网站。应对这种情况做好应急准备。为此,创建第二个脚本可能是个好主意,它会复制您的PIN(不要忘记您之前保存的.2fac文件)并将其通过电子邮件发送给您。在此示例中,使用您的移动运营商的电子邮件到SMS桥接功能将信息作为文本消息发送给您。开始安装mailutils,如果你还没有的话;请务必选择Internet选项:apt-getinstallmailutils现在,创建第二个脚本:vim/home/Ubuntu/2fac2.sh然后,添加代码:#!/bin/bashppwd=`cat/home/ubuntu/。2fac|base64--decode`echo""|mail-s$ppwdxxx5551212@vtext.com不要忘记更改文件的所有权:chownwww-data:www-data/home/ubuntu/2fac2.shchownwww-data:www-data/home/ubuntu/.2fac在这一步之后,现在您需要修改PHP脚本:vim/var/www/twofactor/index.php将第2行替换为以下内容:2if(isset($_GET["sms"])){3exec('/home/ubuntu/2fac2.sh');4}else{5exec('/home/ubuntu/2fac.sh');6}然后,创建两个书签,以便每当你想生成一个新的PIN和通过Pushover将其发送给自己,只需单击链接即可完成。万一Pushover服务不可用,第二个小书签会将现有PIN的副本发送到您选择的电子邮件地址。2Factor=https://www.thelittonfamily.com/twofactor/index.php2Factor-SMS=https://www.thelittonfamily.com/twofactor/index.php?sms=1ExtendtoSSHExtendthissolutiontocoverSSH它是其实很简单。关键是使用sshd_config文件中鲜为人知的ForceCommand命令。这会强制SSH守护进程在生成终端会话之前运行脚本。让我们从这个脚本开始:vim/home/ubuntu/tfac-ssh.sh现在,添加以下行:1#!/bin/bash2code=`cat.2fac|base64--decode`3echo-ne"EnterPIN:"4whileIFS=read-r-s-n1pass;do5如果[[-z$pass]];then6echo7break8else9echo-n'*'10input+=$pass11fi12done13if[$code=$input];14then15sleep116clear17/bin/bash18else19sleep120curl-s-F"token=id"-F"user=id"-F"message=$input"↪https://api.pushover.net/1/messages.json21第2行将PIN加载到变量中。第3行到第12行提示输入PIN并为每个按键返回一个星号。第13行将用户输入的PIN与PIN进行比较。如果两者匹配,第14到17行清除屏幕并启动bash会话。如果用户输入的PIN与PIN不匹配,第18-21行会向Pushover发送通知,以便您知道出现问题并结束会话。让我们配置SSH守护进程来运行脚本:vim/etc/ssh/sshd_config现在,将以下行添加到文件的顶部:ForceCommand/home/ubuntu/tfac-ssh.sh图2:双因素身份验证请求来自SSH这个方法可以的。唯一的限制是没有退格键。如果您按错了键,会话将终止,您将不得不重试。就是这样,一个简单的双因素身份验证系统,根本不需要太多的努力;根据我的经验,它的工作非常可靠!原文地址:http://www.linuxjournal.com/content/two-factor-authentication-system-apache-and-ssh