草庐IT

MFA 盲点:当部分保护为零保护时

何威风 2023-03-28 原文
多因素身份验证 (MFA) 早已成为标准的安全实践。由于人们对其抵御 99% 以上的帐户接管攻击的能力达成广泛共识,难怪安全架构师将其视为环境中的必备工具。然而,似乎鲜为人知的是传统 MFA 解决方案固有的覆盖范围限制。虽然与 RDP 连接和本地桌面登录兼容,但它们不为 PsExec、Remote PowerShell 等远程命令行访问工具提供保护。

实际上,这意味着尽管拥有功能齐全的 MFA 解决方案,工作站和服务器仍然容易受到横向移动、勒索软件传播和其他身份威胁的影响。对于对手来说,只需采用命令行路径而不是 RDP 即可登录,就好像根本没有安装保护一样。在本文中,我们将探讨这个盲点,了解其根本原因和影响,并查看安全团队可以克服它以维护其环境受保护的不同选项。

MFA 的核心目的:防止对手使用受损凭证访问您的资源#

MFA 最有效的安全措施再次帐户接管。我们首先拥有 MFA 的原因是为了防止对手使用受损的凭据访问我们的资源。因此,即使攻击者能够获取我们的用户名和密码(这很可能发生),它仍然无法利用它们代表我们进行恶意访问。因此,这是抵御凭证泄露的最终最后一道防线,旨在使这种妥协无效。

盲点:Active Directory 环境中的命令行访问工具不支持 MFA#

虽然 MFA 可以完全涵盖对 SaaS 和 Web 应用程序的访问,但在涉及 Active Directory 托管环境时,它的局限性要大得多。这是因为在此环境中使用的密钥身份验证协议 NTLM 和 Kerberos 是在 MFA 存在之前编写的,并且本身不支持它。这意味着无法使用 MFA 保护实现这些协议的每种身份验证方法。这包括所有基于 CMD 和 PowerShell 的远程访问工具,其中最著名的是 PsExec 和 Remote PowerShell。这些是管理员用于远程连接到用户机器以进行故障排除和维护的默认工具,因此几乎可以在任何 AD 环境中找到。

网络安全影响:横向移动和勒索软件攻击没有遇到抵抗。#

根据定义,这种主流远程连接路径不受凭证泄露情况的保护,因此被用于大多数横向移动和勒索软件传播攻击。有一个 MFA 解决方案可以保护 RDP 连接并防止它们被滥用并不重要。对于攻击者来说,使用 PsExec 或 Remote PowerShell 从零号患者机器转移到环境中的其他工作站与使用 RDP 一样容易。这只是使用一扇门而不是另一扇门的问题。

严酷的事实:部分 MFA 保护根本就没有保护#

因此,如果您经历过在所有关键服务器和工作站上安装 MFA 代理的痛苦,那么很可能您在保护它们免受身份威胁方面实际上收效甚微。这是你不能半途而废的情况之一。要么你受到保护,要么你没有。当船底有一个洞时,其余部分都是实木没什么区别。同样,如果攻击者可以通过向命令行访问工具提供受损凭据在您的环境中横向移动,那么您是否拥有针对 RDP 和桌面登录的 MFA 保护就不再重要了。

本地环境中的 MFA 限制也会使您的云资源面临风险#

尽管转向了云,但超过 90% 的组织仍然使用 AD 管理的工作站和服务器以及 SaaS 应用程序和云工作负载来维护混合身份基础架构。因此,由于缺乏 MFA 保护,不仅遗留应用程序和文件共享等核心本地资源会暴露在使用受损凭据的情况下,SaaS 应用程序也是如此。

今天的常见做法是在所有这些资源之间同步密码,因此使用相同的用户名和密码来访问本地文件服务器和组织 SaaS 应用程序。这意味着任何包括泄露和使用用户凭证在内的本地攻击都可以轻松地转向直接从受攻击的机器访问 SaaS 资源。

范式转变:从传统 MFA 到统一身份保护#

我们所描述的差距源于传统 MFA 的设计和实施方式。关键的限制是今天的 MFA 解决方案插入到每个单独资源的身份验证过程中,因此如果执行此身份验证的软件不支持 MFA(如在 AD 命令行访问工具中),则不会有保护点空白。

然而,今天有一种新方法将重点从将 MFA 放在每个单独的资源上转移到目录上,从而完全克服了障碍。

Silverfort 开创了第一个统一身份保护平台,该平台可以将 MFA 扩展到任何资源,无论它本身是否支持 MFA。利用无代理和无代理技术,Silverfort 直接与 AD 集成。通过这种集成,每当 AD 收到访问请求时,它都会等待它的裁决并将其转发给 Silverfort。然后,Silverfort 分析访问请求,并在需要时向用户提出 MFA 挑战。根据用户的响应,Silverfort 确定是否信任用户,并将判决传递给分别授予或拒绝访问权限的 AD。

这种方法的创新之处在于,无论此访问请求是通过 RDP 还是命令行发出的,以及它是否支持 MFA,都不再重要。只要是发给AD的,AD就可以传给Silverfort。因此,通过从资源级别的 MFA 保护转移到目录级别的 MFA 保护,攻击者滥用多年的盲点终于得到解决和保护。

有关MFA 盲点:当部分保护为零保护时的更多相关文章

  1. ruby - 如何使用部分字符串搜索数组并返回索引? - 2

    我想使用部分字符串搜索数组,然后获取找到该字符串的索引。例如:a=["Thisisline1","Wehaveline2here","andfinallyline3","potato"]a.index("potato")#thisreturns3a.index("Wehave")#thisreturnsnil使用a.grep将返回完整的字符串,使用a.any?将返回正确的true/false语句,但都不会返回匹配的索引找到了,或者至少我不知道该怎么做。我正在编写一段代码,该代码读取文件、查找特定header,然后返回该header的索引,以便它可以将其用作future搜索的偏移量。如果

  2. ruby-on-rails - 如何将数据传递给部分? - 2

    K伙计们,所以我创建了这个赞成/反对的投票脚本(基本上就像stackoverflow上的那个),我试图向其中添加一些Ajax,这样页面就不会在您每次投票时都重新加载。我有两个Controller,一个叫grinder,一个叫votes。(磨床基本都是帖子)所以这是所有研磨机的索引(看起来像这样)这是该页面的代码。Listinggrinders"grinders/grinders")%>这就是我在views/grinders/_grinders.erb中的内容true)do|u|%>grinder.id%>"up"%>'create')%>true)do|d|%>grinder.id%>

  3. ruby-on-rails - 将 restclient 与多部分帖子一起使用 - 2

    我将restclient用于多部分表单,以将数据发送到restfulweb服务(它是Panda视频编码服务)。不过,诀窍在于我传递给restclient(Technoweenie分支)的文件来自用户提交的我自己的表单。那么,让我们来看看这个。用户将文件发布到我的Rails应用程序。在我的Controller中,它从params[:file]接收文件。然后我想使用RestClient将params[:file]传递给Panda。我在Panda服务器上遇到的错误如下。我注意到堆栈跟踪中的文件参数也在一个字符串中(我假设Panda将其转换为字符串以获得更好的堆栈跟踪)。~Startedreq

  4. ruby-on-rails - 在 Rails 中使用 accepts_nested_attributes_for + 批量赋值保护 - 2

    假设你有这个结构:classHouse请注意,Tv的用户是故意不可访问的。所以你有一个三层嵌套的表单,允许你在一个页面上输入房子、房间和电视。这是Controller的创建方法:defcreate@house=House.new(params[:house])if@house.save#...standardstuffelse#...standardstuffendend问题:您究竟如何为每台电视填充user_id(它应该来自current_user.id)?什么是好的做法?这是我在其中看到的catch22。将user_ids直接填充到params散列中(它们嵌套得很深)保存将失败,因

  5. ruby-on-rails - 独立测试 Rails 部分 View - 2

    我在标准rails2.1项目中使用Test/Unit。我希望能够独立于任何特定的Controller/操作来测试分部View。好像ZenTest'sTest::Rails::ViewTestCase会有所帮助,但我无法让它工作,与view_testhttp://www.continuousthinking.com/tags/view_test类似Google出现的大部分内容似乎都已经过时了,所以我猜它并不真正适用于Rails2.1非常感谢任何帮助。谢谢,罗兰 最佳答案 我们正在使用RSpec在我们的Rails2.1项目中,我们可以做

  6. ruby - 如何在 ruby​​ 中实现 curry(部分函数) - 2

    我需要一些在ruby​​(1.8.6或1.8.7而不是1.9)中实现curry函数的示例。 最佳答案 下面是如何用block而不是方法来柯里化(Currying):defcurry(&block)arity=(block.arity>=0)?block.arity:-(block.arity+1)#returnanimmediatevalueiftheblockhasonereturnblock[]ifarity==0#otherwise,curryitargumentbyargumentargs=[]innermost=lambd

  7. ruby-on-rails - Rails 4 通过渲染部分传递多个变量 - 2

    这个问题已经被问过很多次了,但我无法让它工作。我想像这样将多个变量传递给我的部分...这是部分material_fields.html.erb中的一行,我希望f.select预先填充Yes选项或“true”值。(有些情况下我希望它是假的)f可用并且有效,而feed不可用......我不知道为什么这不起作用。我在select语句之外尝试了,但它仍然不起作用。在这两种情况下,我都得到未定义的局部变量或方法“feed”。有人知道我的语法有什么问题吗? 最佳答案 我想通了是什么问题。我有后来我在同一个View中显然,当从一个文件渲染相同的部

  8. ruby-on-rails - 是否可以在部分中只放置一个 rails 表单元素? - 2

    我的应用有一个选择框供用户选择“地点”。如您所料,此选择框位于一个表单中。我还在页面上的某处执行了一个操作,该操作通过AJAX创建了一个新场所。创建新field后,我想更新field选择框以反射(reflect)这一点。我的解决方案是将选择框放在局部中,并从Controller中的创建操作中呈现局部。'venue/venue_select_box'%>局部看起来像这样:'Selectavenue'%>其中f是表单引用:问题是f在部分中未定义,所以我得到一个错误。一种解决方案是包括整个表格,但我觉得没有必要这样做,因为我没有更新整个表格。关于如何解决这个问题有什么想法吗?

  9. ruby-on-rails - 在这部分代码中设置 klass = self 的动机是什么 - 2

    我正在查看讨论中的一些代码并偶然发现了这个并且想知道为什么klass=self.据我所知,他们是比我更好的ruby​​开发人员,这一定是有充分理由的。他们为什么不调用self.remove_from_cache!(message["key"],false)?该block是否正在创建一个新范围,其中self引用MessageBus类?是否有其他示例说明您需要在Ruby中创建此类构造,或者这是主要示例?如果MessageBus.subscribe是MessageBus的一个实例(比如说m_bus.subscribe)会自己引用block中的m_bus吗?ensure_class_liste

  10. ruby-on-rails - 如果字段不为零,则葡萄实体有条件地公开 - 2

    在一个葡萄实体中,我只想在没有运气的情况下显示一个字段(不是零?)。我正在尝试这段代码,但根本没有按预期工作,但总是隐藏该字段。expose:winner,:using=>PlayerEntity,:unless=>{:winner=>nil}我认为代码本身解释了我真正需要的东西,但正如我所说,我没有得到预期的结果。有什么线索吗? 最佳答案 好的,检查grape-entity的代码我发现你需要将这个block作为RubyProc传递。此代码将按预期工作:expose:winner,:using=>PlayerEntity,:unle

随机推荐