代码之家  ›  专栏  ›  技术社区  ›  andreja

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

  •  82
  • andreja  · 技术社区  · 7 年前

    我想知道人们认为保护网站管理部分的最佳实践是什么,特别是从身份验证/访问的角度。

    当然,有一些明显的事情,比如使用SSL和记录所有访问,但是我想知道上面这些基本步骤人们认为应该在哪里设置这个条。

    例如:

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

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

    • 在每个管理员密码检查中引入一个人工服务器端暂停,以防止暴力攻击 [开发者艺术]
    • 使用相同的db表为用户和管理员使用单独的登录页面(以停止XSRF和会话窃取授权访问管理区域的权限) [小偷大师]
    • 还可以考虑将Web服务器本机身份验证添加到管理区域(例如via.htaccess) [小偷大师]
    • 考虑在多次管理员登录尝试失败后阻止用户IP [小偷大师]
    • 在管理员登录尝试失败后添加验证码 [小偷大师]
    • 为用户和管理员提供同样强大的机制(使用上述技术)(例如,不要专门对待管理员) [洛里斯]
    • 考虑二级身份验证(例如客户端证书、智能卡、卡空间等) [乔格基]
    • 仅允许从受信任的IP/域访问,如果可能,请添加对基本HTTP管道(通过httpmodules)的检查。 [乔格基]
    • [ASP.NET]锁定IPrincipal&principal(使其不可变和不可枚举) [乔格基]
    • 联合权限提升-例如,当任何管理员的权限升级时,向其他管理员发送电子邮件。 [乔格基]
    • 考虑对管理员的细粒度权限-例如,不是基于角色的权限,而是为每个管理员的指示操作定义权限 [乔格基]
    • 限制创建管理员-例如,管理员不能更改或创建其他管理员帐户。为此,请使用锁定的“超级管理员”客户端。 [乔格基]
    • 考虑客户端SSL证书或RSA类型的keyobs(电子令牌) [丹尼尔·帕帕西恩]
    • 如果使用cookie进行身份验证,请为管理页面和普通页面使用单独的cookie,例如将管理部分放在不同的域中。 [丹尼尔·帕帕西恩]
    • 如果可行,考虑将管理站点保留在私有子网上,远离公共Internet。 [ John Hartsock ]
    • 在网站的管理/正常使用上下文之间移动时重新颁发身份验证/会话票证 [理查德·杰普·勒冈]
    11 回复  |  直到 12 年前
        1
  •  15
  •   ThiefMaster    15 年前

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

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

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

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

    隐藏管理路径几乎不会带来安全收益-如果有人知道有效的登录数据,他很可能也能找到管理工具的路径,因为他要么钓鱼,要么键盘记录你,要么通过社会工程(这可能也会揭示路径)。

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

        3
  •  7
  •   o0'.    16 年前
    • 我拒绝默默无闻
    • 使用两个身份验证系统而不是一个是过度杀伤力的
    • 尝试之间的人工暂停也应该为用户完成
    • 也应该为用户阻止失败尝试的IP
    • 用户也应该使用强密码
    • 如果你认为Captchas是好的,猜猜看,你也可以把它用在用户身上。

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

        4
  •  3
  •   Richard JP Le Guen    16 年前

    如果对同时具有普通用户权限和管理权限的用户只使用一个登录名,则当权限级别发生更改时,请重新生成其会话标识符(无论是在cookie或get参数中,还是其他…)。至少。

    因此,如果我登录,做一些普通的用户资料,然后访问一个管理页面,重新生成我的会话ID。如果我然后从一个管理页面导航到一个普通的用户页面,重新生成我的ID。

        5
  •  1
  •   user151323    16 年前

    有一个好的管理员密码。

    不是 "123456" 但是字母、数字和特殊字符的序列足够长,比如说,15-20个字符。喜欢 "ksd83,'|4d#rrpp0%27&lq(go43$sd{3>" .

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

        6
  •  1
  •   Daniel Papasian    16 年前

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

    1. 要考虑的一个选项是使用基于SSL证书的东西进行客户机身份验证,特别是在管理管理员的计算机或它们在技术上有能力的情况下。rsa keyobs和whatnot也可以用于增加安全性。
    2. 如果您使用的是cookies(可能是身份验证/会话令牌),那么您可能希望确保cookies只发送到管理页面。这有助于通过窃取cookie、1/2层泄露或XSS来降低对站点造成的风险。这可以通过让管理部分位于不同的主机名或域以及使用cookie设置安全标志来轻松完成。
    3. 通过IP限制也可以是智能的,如果你在整个互联网上有用户,你仍然可以这样做,如果有一个可信的VPN,他们可以加入。
        7
  •  1
  •   this. __curious_geek    16 年前

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

        8
  •  -1
  •   Nir Levy    16 年前

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

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

    当然,编辑阶段只能在本地Intranet上和/或使用VPN。

    这可能看起来有点过分杀伤力,对于所有的使用案例来说,这可能不是最简单的解决方案,但它无疑是最强大的方式。

    请注意,“拥有强大的管理密码”这样的东西是不错的,但仍然让您的管理对各种智能连接开放。

        9
  •  -2
  •   Carl Bergquist    16 年前

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

    • 很多建议都是关于身份验证的。我认为您应该考虑使用OpenID/Facebook身份验证作为登录。(他们很可能会在身份验证安全上花费更多的资源,而不是您)

    • 保存更改并更新数据库中的值。这样,您就可以从用户x或日期x和y之间回滚更改。

        10
  •  -2
  •   Wayne Werner    16 年前

    我没有注意到有人提到管理密码的存储/验证。请不要将密码以纯文本的形式存储,最好不要使用可以反转的内容-使用类似 salted MD5散列,这样至少当某人碰巧检索存储的“密码”时,他们没有任何非常有用的东西,除非他们也有您的salt方案。

        11
  •  -3
  •   MacMac    16 年前

    添加一个密码字段和一个管理员会知道的安全问题,例如,你的第一个女朋友的名字是什么,或者在每次查看管理面板时随机化这些问题。

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

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

    但那不是很好哈。

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

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

    当它这样做时,用户名和密码字段将出现。