适当的.htpasswd用法

Why*_*rrh 13 apache .htaccess .htpasswd

假设一个小的(页面<5)站点,什么是.htaccess.htpassword?的正确用法?我最近看了Nettuts +的教程,其中给出了这个示例代码:

的.htaccess

AuthName "Login title"
AuthType Basic
AuthUserFile /path/to/.htpasswd
require valid-user
Run Code Online (Sandbox Code Playgroud)

.htpasswd (使用htpasswd -c <file> <username>命令创建)

username:encrypted-version-of-password
Run Code Online (Sandbox Code Playgroud)

我也对这提供的实际安全级别感到好奇:它可以轻易绕过吗?如果默认情况下Apache不允许用户直接访问这两个文件中的任何一个,那么它们是否需要位于公共目录之外?有速度影响吗?

Wil*_*mer 60

这提供了什么级别的安全性?

.htpasswd本身并不提供太多安全性.也就是说,它提供了登录机制,如果没有正确的凭据,Apache将不会响应,但除非单独配置,否则不会对交换进行任何加密(甚至是模糊处理).例如,GET使用Wireshark监听请求可以很好地查看客户端发送的所有标头,包括:

Authorization: Basic d3BhbG1lcjp0ZXN0dGVzdA==
Run Code Online (Sandbox Code Playgroud)

" d3BhbG1lcjp0ZXN0dGVzdA=="只是base64编码形式的" wpalmer:testtest".如今,黑客(或更可能是病毒)可以坐在公共WiFi连接上并记录包含以Authorization:供稍后阅读的任何请求.通常,通过未加密的HTTP连接发送任何身份验证信息被认为是一个坏主意,即使您是通过有线或安全的WiFi端到端.例如,如果您将客户数据,付款信息等存储在锁定之后,它就不会满足PCI合规性的要求.htpasswd.

添加https到混合,你完全消除了这个特定的问题,但是......

.htpasswdApache httpd实现的身份验证不提供任何形式的速率限制或暴力保护.您可以同时尝试密码猜测,因为Apache愿意同时提供服务页面,而Apache会尽快响应成功/失败.您可以使用类似Fail2Ban的内容来限制在客户端被阻止与服务器通信之前可以进行的失败尝试次数,但这不一定能提供针对僵尸网络的任何有用保护,僵尸网络可能会自动将您的服务器定位于数千个独特的地址.这可能会导致"我是否容易受到来自僵尸网络的密码尝试的影响,或者当整个帐户因多个客户端的故障而被锁定时,我是否容易受到拒绝服务攻击?"

可以通过向.htaccess文件添加基于IP的限制来限制这些攻角,从而仅允许来自特定地址的连接.根据您的操作方式,这可能不方便,但它也严重限制了您容易受到威胁的类型.您仍然会面临专门针对您网站的人员或部分网络基础架构本身的感染风险.根据您要保护的内容类型,这可能"足够好".这种限制的一个例子是:

Order deny,allow
Deny from all
Allow from 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

简而言之,这意味着"只允许来自本地主机的连接".逐行,这意味着:

  • Order deny,allow 定义处理规则的顺序,最后一个匹配优先.
  • Deny from all 首先假设所有客户都被拒绝
  • Allow from 127.0.0.1如果客户端有IP 127.0.0.1,则允许

在某种程度上,基于IP的限制还可以保护您到可以认为HTTPS可选的程度.攻击者/病毒仍然可以看到您的凭据,但他们更难在页面上使用这些凭据.同样,这不符合PCI标准,并且它不适合"重要"信息,但在某些情况下,这可能被认为是"足够好".请注意,许多人在多个站点上重复使用凭据,因此,即使站点本身受到保护,通常也会认为未能保护登录详细信息对用户非常危险.

最后,.htaccess文件本身有点负债.请参阅"他们是否需要在公共目录之外?"的回复?有关详细信息.

可以轻松绕过吗?

不可以.没有理由期望服务器在正确配置后,无法要求登录详细信息来访问受保护的内容.虽然HTTP Basic身份验证有其缺陷,但Apache httpd非常强大,并且是世界上经过最全面测试的软件之一.如果您告诉Apache需要HTTP Basic身份验证才能访问某些内容,那么将需要它.

如果默认情况下Apache不允许用户直接访问这两个文件中的任何一个,那么它们是否需要位于公共目录之外?

对此有几点意见.首先,Apache不默认为防止到这些文件的访问.Apache httpd的许多发行版包括初始配置,该配置阻止访问(使用"拒绝所有"规则),具体取决于分发,.htaccess/ .htpasswd文件,.ht*文件或.*文件.这是很常见的,但有很多原因可能不是这种情况.您可以自己添加规则来阻止这些文件,如果它们尚未被阻止:

<FilesMatch "^.(htaccess|htpasswd)$">
    Order Allow,Deny
    Deny from all
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

其次,应该指出.htaccess文件的工作方式,它们在它们所在的目录匹配时被处理.也就是说:.htpasswd可能在其他地方,但.htaccess需要在同一目录中.也就是说,请参阅"速度影响"部分了解更多细节.

那么,因为它们可以被轻易阻止,为什么要保留.htpasswd在公共目录之外?因为错误发生了,.htpasswd文件是一个很大的责任.即使您使用HTTPS,您的.htpasswd文件曝光也意味着您的密码可以通过暴力攻击轻松破解.目前,消费级GPU可以每秒进行数百万次密码猜测.这可以使"强"密码在相对较短的时间内下降.同样,这个论点通常只适用于目标攻击,但事实仍然是,如果攻击者拥有您的.htpasswd文件并希望访问您的系统,那么他们可能很容易这样做.有关事物状态的最近(2012年4月)概述,请参阅编码恐怖的速度哈希.

考虑到这一点,偶然(暂时)暴露您的.htaccess文件的可能性值得将它移动到httpd正在寻找要服务的内容时永远不会被看到的地方.是的,仍有配置更改可能会暴露它,如果它是"一级"而不是"在公共目录中",但这些更改不太可能意外发生.

有速度影响吗?

一些.

首先,.htaccess文件的使用确实会使某些事情变慢.更具体地说,该AllowOverride all指令导致许多潜在的减速.这会导致Apache在每个目录中查找.htaccess文件,以及访问的目录的每个父级(直到并包括DocumentRoot).这意味着为每个请求查询文件系统中的文件(或文件更新).与可能永远不会访问文件系统的替代方案相比,这是非常不同的.

那么,为什么.htaccess存在呢?有很多原因可能使它"值得":

  • 根据您的服务器负载,您可能永远不会注意到差异.您的服务器是否真的需要挤出每个请求的最后一毫秒?如果没有,那就不用担心了.一如既往,不要担心估计和预测.描述您的真实情况,看看它是否有所作为.
  • .htaccess可以在不重新启动服务器的情况下修改.实际上,这就是它如此慢的原因--Apache检查.htaccess每个请求上的更改或文件的存在,因此立即应用更改.
  • 错误.htaccess将取消目录,而不是服务器.这使得它比更改httpd.conf文件更不容易.
  • .htaccess即使您只对单个目录具有写访问权限,也可以进行修改.这使其成为共享托管环境的理想选择.根本不需要访问权限httpd.conf,或访问重启服务器.
  • .htaccess可以保留他们想要影响的文件旁边的访问规则.这可以使它们更容易找到,并且只是让事情更有条理.

不想使用.htaccess,即使考虑以上所有?适用的任何规则.htaccess都可以直接添加到httpd.conf包含的文件中.

怎么样.htpasswd?这取决于您拥有多少用户.它是基于文件的,在实现方面是最低限度的.来自httpd 2.2的文档:

由于指定了基本身份验证的方式,因此每次从服务器请求文档时都必须验证用户名和密码.即使您正在重新加载同一页面以及页面上的每个图像(如果它们来自受保护的目录),这也是如此.你可以想象,这会减慢一些事情.减慢速度的因素与密码文件的大小成正比,因为它必须打开该文件,然后沿用户列表向下,直到找到您的名字.每次加载页面时都必须这样做.

这样做的结果是,您可以在一个密码文件中放入多少用户存在实际限制.此限制将根据您的特定服务器计算机的性能而有所不同,但是一旦超过几百个条目,您可能会看到减速,并且可能希望在此时考虑不同的身份验证方法.

总之,.htpasswd很慢.如果您只有少数需要进行身份验证的用户,您将永远不会注意到,但这是另一个考虑因素.

摘要

保护管理部分.htpasswd不适合所有情况.鉴于其简单性,安全性和性能不是优先级最高的风险和问题可能是值得的.在许多情况下,通过一些调整,它可以被认为是"足够好".什么构成"足够好"是对你的判断要求.