保护网站管理部分的最佳做法是什么? [关闭]

问题描述 投票:85回答:11

我想知道人们认为保护网站管理员部分的最佳做法,特别是从身份验证/访问角度来看。

当然有明显的事情,比如使用SSL和记录所有访问权限,但我想知道上面这些基本步骤的位置,人们会考虑设置这个栏。

例如:

  • 您是否只依赖于普通用户使用的相同身份验证机制? 如果不是,那是什么?
  • 您是否在同一个“应用程序域”中运行“管理”部分?
  • 您采取了哪些措施来使管理部分未被发现? (或者你拒绝整个'默默无闻'的事情)

到目前为止,来自回答者的建议包括:

  • 在每个管理员密码检查中引入一个人为的服务器端暂停,以防止暴力攻击[开发者艺术]
  • 使用相同的数据库表为用户和管理员使用单独的登录页面(停止XSRF和会话窃取授予对管理区域的访问权限) [Thief Master]
  • 考虑还将管理员本机身份验证添加到管理区域(例如,通过.htaccess) [Thief Master]
  • 在多次失败的管理员登录尝试后,请考虑阻止用户IP [Thief Master]
  • 管理员登录尝试失败后添加验证码[Thief Master]
  • 为用户和管理员提供同样强大的机制(使用上述技术)(例如,不要特别对待管理员) [Lo'oris]
  • 考虑二级身份验证(例如客户端证书,智能卡,卡片空间等) [JoeGeeky]
  • 仅允许从可信IP /域进行访问,如果可能,将检查添加到基本HTTP管道(通过例如HttpModules)。 [JoeGeeky]
  • [ASP.NET]锁定IPrincipal和Principal(使它们不可变且不可枚举) [JoeGeeky]
  • 联合权利提升 - 例如,在升级任何管理员权限时向其他管理员发送电子邮件。 [JoeGeeky]
  • 考虑管理员的细粒度权利 - 例如,而不是基于角色的权利,为每个管理员定义指示性行为的权利[JoeGeeky]
  • 限制管理员的创建 - 例如,管理员无法更改或创建其他管理员帐户。 使用锁定的'superadmin'客户端。 [JoeGeeky]
  • 考虑客户端SSL证书或RSA类型密钥卡(电子令牌) [Daniel Papasian]
  • 如果使用cookie进行身份验证,请为管理员和普通页面使用单独的cookie,例如将管理部分放在其他域中。 [Daniel Papasian]
  • 如果可行,请考虑将管理站点保留在公共互联网上的私有子网上。 [约翰哈茨克]
  • 在网站的管理/正常使用情况之间移动时重新颁发身份验证/会话票据[Richard JP Le Guen]
security authentication
11个回答
19
投票

如果网站需要登录常规活动和管理员,例如论坛,我会使用使用相同用户数据库的单独登录。 这可确保XSRF和会话窃取不允许攻击者访问管理区域。

此外,如果admin部分位于单独的子目录中,使用Web服务器的身份验证(例如Apache中的.htaccess)保护该部分可能是个好主意 - 那么有人需要该密码和用户密码。

模糊管理路径几乎不会产生任何安全性 - 如果有人知道有效的登录数据,他很可能也能找到管理工具的路径,因为他要么是通过网络钓鱼,要么是通过社交工程来获取它(这可能会揭示出来道路,也)。

蛮力保护,例如在3次登录失败后阻止用户的IP或在登录失败后需要CAPTCHA(不是第一次登录,因为这对于合法用户来说非常烦人)也可能有用。


-2
投票

我没有注意到有人提到管理员密码的存储/验证。 请不要以纯文本形式存储PW,最好甚至不能反转的东西 - 使用像盐渍 MD5哈希这样的东西,以便至少如果有人碰巧检索存储的“密码”他们没有任何非常有用的东西,除非他们也有你的盐计划。


-3
投票

添加密码字段和管理员将知道的安全问题,例如您的第一个女朋友姓名,或者每次查看管理面板时随机化问题。

也许您总是可以将管理部分放在一个大目录中,例如

http://domain.com/sub/sub/sub/sub/sub/index.php

但那不是很好啊。

也许您可以在主页中包含查询字符串,例如:

http://domain.com/index.php?display=true

如果是,将显示用户名和密码字段。


16
投票

这些都是很好的答案......我通常喜欢为我的管理部分添加一些额外的图层。 虽然我在主题上使用了一些变体,但它们通常包含以下内容之一:

  • 二级身份验证 :这可能包括客户端证书(例如x509证书),智能卡,卡片空间等...
  • 域/ IP限制 :在这种情况下,只有来自可信/可验证域的客户端; 如内部子网; 被允许进入管理区域。 远程管理员经常通过可信的VPN入口点,因此他们的会话将是可验证的,并且通常也使用RSA密钥进行保护。 如果您正在使用ASP.NET,则可以通过HTTP模块在HTTP管道中轻松执行这些检查,这将阻止您的应用程序在不满足安全检查时接收任何请求。
  • 锁定IPrincipal和基于委托人的授权 :创建自定义原则是一种常见的做法,尽管常见的错误是使它们可修改和/或权利可枚举。 虽然它不仅仅是一个管理问题,但更重要的是,因为用户可能拥有更高的权限。 确保它们是不可变的而且不是可枚举的。 此外,请确保所有授权评估均基于校长进行。
  • 联邦权利提升 :当任何帐户收到选定数量的权限时,将立即通过电子邮件通知所有管理员和安全员。 这可以确保如果攻击者立即提升我们知道的权利。 这些权利通常围绕特权,查看隐私保护信息的权利和/或财务信息(例如信用卡)。
  • 即使对于管理员来说,也要谨慎地发行权利 :最后,对于某些商店来说,这可能会更先进一些。 授权权应尽可能谨慎,并应围绕真实的功能行为。 典型的基于角色的安全(RBS)方法往往具有群体心态。 从安全角度来看,这不是最好的模式。 而不是像“ 用户管理器 ”那样的“ 群组 ”,请尝试进一步细分( 例如,创建用户,授权用户,提升/撤销访问权限等 )。 这在管理方面可能会有更多的开销,但这使您可以灵活地分配较大管理组实际需要的权限。 如果访问受到损害,至少他们可能无法获得所有权利。 我喜欢将它包含在.NET和Java支持的代码访问安全性(CAS)权限中,但这超出了本答案的范围。 还有一件事......在一个应用程序中,管理员无法管理更改其他管理员帐户,或使用户成为管理员。 这只能通过一个只有几个人可以访问的锁定客户端来完成。

8
投票
  • 我拒绝默默无闻
  • 使用两个身份验证系统而不是一个是过度的
  • 尝试之间的人为暂停也应该为用户完成
  • 也应该为用户阻止IP失败的尝试
  • 用户也应该使用强密码
  • 如果您认为验证码可以,猜猜看,您也可以将它们用于用户

是的,在写完之后,我意识到这个答案可以概括为“管理员登录没有什么特别之处,它们都是应该用于任何登录的安全功能”。


3
投票

如果对具有普通用户权限和管理员权限的用户仅使用一次登录,则在级别发生更改时重新生成其会话标识符(无论是在cookie还是GET参数中等等)。特权......至少。

因此,如果我登录,请执行一些普通用户的操作,然后访问管理页面,重新生成我的会话ID。 如果我然后从管理页面导航到普通用户页面,请再次重新生成我的ID。


1
投票

有一个很好的管理员密码。

不是"123456"而是一系列字母,数字和特殊字符,足够长,例如15-20个字符。 比如"ksd83,'|4d#rrpp0%27&lq(go43$sd{3>"

为每次密码检查添加暂停以防止暴力攻击。


1
投票

以下是一些需要考虑的事项:

  1. 要考虑的一个选项,特别是如果您管理管理员的计算机或技术上有能力,则使用基于SSL证书的内容进行客户端身份验证。 RSA密钥和诸如此类的东西也可用于增加安全性。
  2. 如果您正在使用cookie(可能是用于身份验证/会话令牌),您可能希望确保仅将cookie发送到管理页面。 这有助于通过窃取cookie,通过第1/2层妥协或XSS来减轻您的网站带来的风险。 这可以通过将管理部分放在不同的主机名或域上以及使用cookie设置安全标志来轻松完成。
  3. 通过IP限制也可以是智能的,如果您在整个互联网上拥有用户,您仍然可以执行此操作,如果他们可以加入可信任的VPN。

1
投票

我们使用Windows Authentication进行管理访问。 这是保护管理区域的最实用方法,同时保持认证与适用于一般最终用户的认证分开。 系统管理员管理管理员用户访问凭据并对域用户帐户强制实施密码策略。


-1
投票

严格的方法是拥有两个完全不同的“农场”,包括数据库,服务器和所有,并将数据从一个农场移动到另一个农场。 大多数现代化的大型系统都使用这种方法(Vignette,SharePoint等)。 它通常被称为具有不同阶段的“编辑阶段” - >“预览阶段” - >“交付阶段”。 此方法允许您以与处理代码相同的方式处理内容/配置(dev-> qa-> prod)。

如果你不那么偏执,你可以拥有一个数据库,但只能在“编辑”服务器上使用你的管理部分。 我的意思是,只有编辑脚本/文件放在编辑服务器上。

当然,编辑阶段应仅在本地Intranet和/或VPN上可用。

这可能看起来有点过分,可能不是所有使用案例的最简单的解决方案,但它绝对是最强大的做事方式。

请注意,像“拥有强大的管理员密码”这样的东西很不错,但仍然可以让您的管理员对所有种类的智能行为开放。


-2
投票

这在很大程度上取决于您要保护的数据类型(法律要求等)。

  • 很多建议都是关于身份验证的。我认为你应该考虑使用OpenId / Facebook身份验证作为登录。 (他们很可能会花更多的资源用于身份验证安全性)

  • 保存更改以及更新数据库中的值。 这样,您可以回滚用户X或日期X和Y之间的更改。

© www.soinside.com 2019 - 2024. All rights reserved.