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


92

我想知道人们对确保网站的“管理”部分安全的最佳做法,特别是从身份验证/访问的角度来看。

当然,有一些显而易见的事情,例如使用SSL和记录所有访问权限,但是我想知道人们在这些基本步骤的哪些位置设置了标准。

例如:

  • 您是否仅依靠与普通用户相同的身份验证机制?如果没有,那该怎么办?
  • 您是否在同一“应用程序域”中运行“管理”部分?
  • 您采取什么步骤来使管理部分未被发现?(或者您拒绝整个“模糊”的事情)

到目前为止,答复者的建议包括:

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

2
只是一个想法而已。保护管理部分的最佳方法可能是不要将其放置在公共互联网上。您可以选择仅将管理站点保留在专用子网中。
John Hartsock 2010年

1
您指定了以下哪些想法,将其应用于所有用户,而不仅仅是管理员不是一个好主意吗?
维维安河

您可能需要在webloginproject.com上检查WebLoginProject,它是一个协作式登录系统,旨在完全防止XSS,SQL注入,会话固定和CSRF漏洞。它具有ASP和PHP的源代码,它是多语言的,看上去很酷。许多开发人员正在对其进行固定孔,因此这可能会尽可能地确保安全。
stagas 2010年

-1表示非常错误的“强密码”(实际上实际上是非常弱的密码)建议
o0'。

@Lohoris-我真的不明白你为什么拒绝这个问题。您是否因为我总结了某人不同意您的建议而拒绝投票?也许不赞成相关答案会更具建设性。:/您能确切说明您遇到的问题吗?
UpTheCreek 2012年

Answers:


18

这些都是很好的答案...我通常希望为管理部分添加几个附加层。尽管我在主题上使用了一些变体,但它们通常包括以下内容之一:

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

19

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

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

遮盖管理路径几乎不会带来安全收益-如果某人知道有效的登录数据,则他很有可能也可以找出管理工具的路径,因为他要么对它进行了钓鱼或键盘记录,要么通过社交工程获得了该工具(这可能会揭示出路径)。

暴力保护(例如在3次失败的登录后阻止用户的IP或在失败的登录后要求输入验证码(不是第一次登录,因为这对于合法用户而言非常烦人))也可能有用。


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

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


6
感谢你的回答。我个人倾向于不同意,例如:用户会对“ ksd83,|| 4d#rrpp0%27&lq(go43 $ sd {3>)”之类的密码感到满意吗?而且,不是重置有效用户因被健忘会导致不必要的管理员/客户服务工作吗?我个人认为不同的风险水平会证明采取不同的方法是正确的
UpTheCreek 2010年

1
管理员密码应该很复杂,但又不要太复杂,否则,即使管理员也不会记住它,并且会将它写下来(您将迫使他违反所有安全规则)。尝试以失败尝试暂时阻止IP是相当标准的,vbulletin可以做到,phpbb可以实现IIRC,用户已经习惯了。
o0'。

我并不是真的希望使用phpbb或vbulletin来获得安全性最佳实践;)
UpTheCreek 2012年

@UpTheCreek当然,我同意!我只是在问这个问题:“不是重置有效用户因健忘而生成不必要的管理员/客户服务工作而触发的IP阻止” <-我认为这不是问题,因为用户已经使用过这样的功能。
o0'。

3

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

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


您能解释一下这有什么用吗?
Denis Pshenov


我相信这对您的帮助不大。因为如果攻击者能够在普通用户页面上获取您当前的会话ID,则可以使用它来访问管理页面并为自己生成一个新的会话ID。如我错了请纠正我。
Denis Pshenov

1
但是,如果没有密码,攻击者将无法访问管理页面。直到身份验证之后,特权级别才会更改。无法重新生成会话ID意味着他们可以重新使用不安全创建的会话来绕过身份验证。
理查德JP Le Guen

现在明白了。我以为您描述了一种情况,其中用户在普通/管理员上下文之间切换时不必重新登录。
Denis Pshenov

1

有一个好的管理员密码。

"123456",但字母,数字和特殊字符足够长的时间序列,比方说,15至20个字符。像"ksd83,'|4d#rrpp0%27&lq(go43$sd{3>"

为每个密码检查添加一个暂停,以防止蛮力攻击。


您能否解释一下“暂停”是什么?您是在指做Thread.Sleep(5000)之类的事情来消磨时间吗?
地球

5
这很愚蠢:太复杂而难以记住的密码将被写下(或保存)在某个地方(或者比您允许使用一个非常好的密码(例如,由于您记住了该密码而不是复制粘贴而将被输入)的密码更糟糕) )。
o0'。

3
哦,我希望我可以把这种废话贬低到石器时代,它是如此愚蠢,如此错误……我讨厌散布这种错误信息的人们。
o0'。

1
@ Lo'oris:您不同意的是什么?

2
我已经写在...上面...上面的评论?
o0'。

1

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

  1. 要考虑的一种选择(尤其是在管理管理员的计算机或技术上胜任的情况下)是使用基于SSL证书的内容进行客户端身份验证。RSA密钥卡和诸如此类的东西也可以用于增加安全性。
  2. 如果您完全使用Cookie(可能是用于身份验证/会话令牌),则可能要确保将Cookie仅发送到管理页面。这可以通过1/2层妥协或XSS来窃取Cookie,从而减轻对网站造成的风险。通过使admin部分位于不同的主机名或域上以及通过cookie设置安全标志,可以轻松完成此操作。
  3. 通过IP进行限制也很聪明,如果您在整个Internet上都有用户,并且可以加入一个受信任的VPN,您仍然可以这样做。

1

我们Windows Authentication用于管理员访问。这是保护管理员区域同时使身份验证与适用于一般最终用户的身份分开的最实用方法。系统管理员管理“管理员”用户访问凭据,并在域用户帐户上实施密码策略。


-1

严格的方法是拥有两个完全不同的“服务器场”,包括数据库,服务器和所有服务器,并将数据从一个服务器场移至另一个服务器场。大多数现代的大型系统都使用这种方法(Vignette,SharePoint等)。通常将其称为“编辑阶段”->“预览阶段”->“交付阶段”具有不同的阶段。此方法使您可以像对待代码一样对待内容/配置(dev-> qa-> prod)。

如果您不太偏执,则可以只有一个数据库,而“编辑”服务器上只有管理部分可用。我的意思是,仅将编辑脚本/文件放在编辑服务器上。

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

这似乎有点过大,并且可能不是所有使用情况的最简单解决方案,但绝对是最可靠的处理方式。

请注意,诸如“具有强壮的管理员密码”之类的东西不错,但是仍然使您的管理员对各种智能行为保持开放。


我认为这仅在纯粹CMS /发布情况下才有用/实用,在这种情况下,您推送内容而不是处理数据。
UpTheCreek 2010年

也许可以,但是我已经知道(并且已经看到)在处理和用户输入中也要完成的情况。对于具有单独的编辑服务器的单个服务器场来说,这是毫无道理的。对于多个服务器场,您要做的是将来自站点的输入放入队列(DB或其他方式)中,并通过使用外部过程进行处理并将其复制到“编辑”服务器/ DB中。这使您可以更好地控制进入系统的内容。但是,实现起来很复杂。
Nir Levy 2010年

-2

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

  • 很多关于身份验证的建议。我想您应该考虑使用OpenId / Facebook身份验证作为登录名。(与您相比,他们很可能会在身份验证安全上花费更多的资源)

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


1
网站管理部分的Facebook身份验证...您真的认为这是个好主意吗?对于一般用户,是...但是对于管理员部分?对我来说有点危险……
理查德JP Le Guen 2010年

我不确定。但我认为该网站仅运行openid身份验证。而且我认为Facebook身份验证和openid之间没有任何大的(理论上)差异。但是我还没有阅读任何许可协议或类似协议。
卡尔·伯格奎斯特

1
非常糟糕的主意是用于管理员身份验证的openid,大多数时候也无法回滚,而且坏人已经在系统内部准备就绪...回滚是什么?
亚里士多德(Aristos)2010年

随意解释为什么您认为它不好。好吧,如果以管理员身份登录可以让您完全访问数据库并进行备份,那么肯定很难回滚,但是那样的话,一切都准备就绪了。我的建议针对cmsisch网站。
卡尔·伯格奎斯特

-3

我没有注意到有人提到管理员密码的存储/验证。请请不要以纯文本形式存储密码,最好甚至不要使用任何可以反转的东西-使用盐腌 MD5哈希之类的东西,以便至少在有人碰巧检索他们没有的“密码”的情况下任何非常有用的东西,除非他们也有您的食盐方案。


1
md5为-1。您不希望密码快速散列,甚至不涉及md5ing的其他问题。bcrypt将是一个更好的选择。
Kzqai 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.