保护网站pipe理部分的最佳做法是什么?
我想知道人们认为保护网站pipe理部分的最佳做法,特别是从authentication/访问的angular度来看。
当然有很明显的事情,例如使用SSL和logging所有访问,但是我想知道以上这些基本步骤的人们认为设置栏。
例如:
- 你只是依靠你用于普通用户的authentication机制吗? 如果不是,什么?
- 你是否在同一个“应用程序域”中运行pipe理部分?
- 您采取了哪些步骤来使pipe理部分未被发现? (或者你拒绝整个“默默无闻”的东西)
到目前为止,来自回答者的build议包括:
- 在每个pipe理员密码检查中引入仿真的服务器端暂停,以防止暴力攻击[开发人员艺术]
- 使用单独的login页面为用户和pipe理员使用相同的数据库表(阻止XSRF和会话窃取授予访问pipe理区) [大师]
- 考虑也添加web服务器本地身份validation到pipe理区(例如通过.htaccess) [大师]
- 考虑一些失败的pipe理员login尝试后阻止用户的IP [大师]
- 失败的pipe理员login尝试后添加validation码[贼大师]
- 为用户和pipe理员提供同样强大的机制(使用上述技术)(例如,不要专门对待pipe理员) [Lo'oris]
- 考虑二级authentication(例如客户端证书,智能卡,纸牌空间等) [JoeGeeky]
- 只允许从受信任的IP /域访问,如果可能的话,将检查添加到基本的HTTPpipe道(通过例如HttpModules)。 [JoeGeeky]
- [ASP.NET]lockingIPrincipal&Principal(使它们不可变且不可枚举) [JoeGeeky]
- 联合权限提升 – 例如在任何pipe理员权限升级时向其他pipe理员发送电子邮件。 [JoeGeeky]
- 考虑pipe理员的细粒度权限 – 例如,而不是基于angular色的权限,为每个pipe理员的个别行为定义权限[JoeGeeky]
- 限制创buildpipe理员 – 例如pipe理员不能更改或创build其他pipe理员帐户。 使用locking的“superadmin”客户端。 [JoeGeeky]
- 考虑客户端SSL证书或RSAtypes密钥(电子令牌) [Daniel Papasian]
- 如果使用Cookie进行身份validation,则对pipe理员和常规页面使用单独的Cookie,例如,将pipe理员部分放在不同的域上。 [Daniel Papasian]
- 如果可行,请考虑将pipe理站点保留在私有子网上,不要使用公共互联网。 [John Hartsock]
- 当在网站的pipe理员/正常使用情况之间移动时重新发放authentication/会话票证[Richard JP Le Guen]
这些都是很好的答案…我通常喜欢为我的pipe理部分添加一些额外的图层。 尽pipe我在主题上使用了一些变体,但通常包含以下内容之一:
- 二级authentication :这可以包括客户端证书(例如x509证书),智能卡,纸牌空间等等。
- 域/ IP限制 :在这种情况下,只有来自可信/可validation域的客户; 如内部子网; 被允许进入pipe理区域。 远程pipe理员通常会经过可信的VPN入口点,所以他们的会话将是可validation的,并且通常也使用RSA密钥进行保护。 如果使用ASP.NET,则可以通过HTTP模块轻松地在HTTPpipe道中执行这些检查,从而防止应用程序在安全检查不满意的情况下收到任何请求。
- lockingIPrincipal&Principal-based Authorization :创build自定义原则是一种常见的做法,尽pipe常见的错误是使得它们可修改和/或权利可枚举。 虽然这不仅仅是一个pipe理问题,但更重要的是,用户可能会提高权限。 确保它们是不可改变的,而不是可枚举的。 此外,确保所有授权评估都是基于委托人进行的。
- 联邦权利提升 :当任何账户收到选定数量的权利时,所有pipe理员和安全官员立即通过电子邮件通知。 这确保了如果攻击者提升我们立即知道的权利。 这些权利通常围绕特权,看到隐私保护信息的权利和/或财务信息(例如信用卡)。
- 发布权利,甚至pipe理员 :最后,这可以是一些更先进的一些商店。 授权权利应尽可能谨慎,并应围绕真实的function行为。 典型的基于angular色的安全(RBS)方法往往有一个团队的心态。 从安全angular度来看,这不是最好的模式。 不要像“ 用户pipe理器 ”这样的组织,尝试进一步分解( 例如创build用户,授权用户,提升/撤销访问权限等 )。 在pipe理方面,这可能会有一些额外的开销,但是这使您可以灵活地分配更大的pipe理员组实际需要的权限。 如果访问受到威胁,至less他们可能无法获得所有权利。 我喜欢用.NET和Java支持的代码访问安全(CAS)权限来封装它,但这超出了这个答案的范围。 还有一件事…在一个应用程序中,pipe理员无法pipe理更改其他pipe理员帐户,或使用户成为pipe理员。 这只能通过一个locking的客户端,只有几个人可以访问。
如果网站需要login常规活动和pipe理员,例如论坛,我会使用单独的login使用相同的用户数据库。 这确保了XSRF和会话窃取不会允许攻击者访问pipe理区域。
此外,如果pipe理部分位于单独的子目录中,则使用Web服务器的身份validation(例如,Apache中的.htaccess)来保护该部分可能是一个好主意 – 那么某个人需要密码和用户密码。
模糊pipe理path几乎不会产生任何安全性收益 – 如果有人知道有效的login数据,他很可能也能够findpipe理工具的path,因为他既可以进行钓鱼或键盘logging,也可以通过社交工程获得(可能会揭示path也是)。
暴力保护措施,例如在3次login失败之后阻止用户的IP,或者在login失败(不是第一次login,因为这对于合法用户而言非常烦人)之后需要validation码也可能是有用的。
- 我拒绝默默无闻
- 使用两个authentication系统而不是一个是矫枉过正的
- 尝试之间的人工暂停也应该为用户完成
- 阻止尝试失败的IP也应该为用户完成
- 用户也应该使用强密码
- 如果您考虑validation码,请猜猜看,您也可以将它们用于用户
是的,写完之后,我意识到这个答案可以概括为“没有特别的pipe理员login,他们都应该用于任何login的安全function”。
如果您只对具有普通用户权限和pipe理员权限的用户使用单一login,则当用户的级别发生更改时,请重新生成其会话标识符(无论是Cookie还是GET参数或其他内容)特权…至less。
所以,如果我login,做一堆普通用户的东西,然后访问pipe理页面,重新生成我的会话ID。 如果我然后从pipe理页面导航到正常的用户页面,请重新生成我的ID。
有一个很好的pipe理员密码。
不是"123456"
而是一串长度足够长的字母,数字和特殊字符,比如15-20个字符。 像"ksd83,'|4d#rrpp0%27&lq(go43$sd{3>"
。
为每个密码检查添加一个暂停以防止暴力攻击。
这里有一些其他的事情要考虑:
- 尤其是如果您pipe理pipe理员的计算机,或者他们在技术上胜任,则需要考虑的一个select是使用基于SSL证书的内容进行客户端身份validation。 RSA钥匙和什么也可以用于增加安全性。
- 如果您使用的是cookie,可能是用于身份validation/会话令牌,则可能需要确保cookie只发送到pipe理页面。 这有助于通过盗取1/2层妥协或XSS来缓解您的网站带来的风险。 这可以通过让pipe理部分位于不同的主机名或域以及使用cookie设置安全标志来轻松完成。
- 通过IP进行限制也很聪明,而且如果你在整个互联网上都有用户,你还可以这样做,如果有一个他们可以join的可信的VPN。
我们使用Windows Authentication
进行pipe理访问。 这是保护pipe理区域的最实际的方式,同时保持与一般最终用户不同的authentication。 系统pipe理员pipe理pipe理员用户访问凭据并对域用户帐户执行密码策略。
严格的方法是有两个完全不同的“农场”,包括数据库,服务器和所有的,并将数据从一个农场移到另一个农场。 大多数现代,大规模的系统都使用这种方法(Vignette,SharePoint等)。 通常被称为具有不同阶段的“编辑阶段” – >“预览阶段” – >“交付阶段”。 这种方法可以让你像处理代码一样对待content / config(dev-> qa-> prod)。
如果你不那么偏执,你可以有一个单一的数据库,但只有你的pipe理部分在“编辑”服务器上可用。 我的意思是,只有编辑脚本/文件放在编辑服务器上。
自然,编辑阶段只能在本地Intranet和/或VPN上使用。
这似乎有点矫枉过正,可能并不是所有使用案例中最简单的解决scheme,但它是最强大的方法。
请注意,诸如“拥有强大的pipe理员密码”是很好的,但仍然让您的pipe理员打开各种聪明的意见。
我没有注意到任何人提到pipe理员密码的存储/validation。 请不要以纯文本格式存储PW,最好甚至不能使用任何可以反转的东西 – 使用类似腌制 MD5哈希的东西,这样至less如果有人碰巧检索到存储的“密码”,他们就没有任何非常有用的东西,除非他们也有你的盐scheme。
这很大程度上取决于你想保护什么样的数据(法律要求等)。
-
很多build议是关于authentication的。我想你应该考虑使用OpenId / Facebook身份validation作为login。 (那么他们很可能会花费更多的资源在身份validation安全上)
-
保存更改以及更新数据库中的值。 这样,您可以回滚用户X或dateX和Y之间的更改。
添加一个密码字段和一个pipe理员将会知道的安全问题,例如,你的第一个女朋友的名字是什么,或者每次查看pipe理面板时随机化问题。
也许你总是可以把pipe理部分放在一个大目录中,例如
但是这不是很好。
也许你可以在主页中包含一个查询string,例如:
如果存在,则会出现用户名和密码字段。