麻省理工学院的课程“计算机系统安全”。 演讲4:“共享特权”,第3部分

麻省理工学院。 讲座课程#6.858。 “计算机系统的安全性。” Nikolai Zeldovich,James Mickens。 2014年


计算机系统安全是一门有关开发和实施安全计算机系统的课程。 讲座涵盖了威胁模型,危害安全性的攻击以及基于最新科学研究的安全技术。 主题包括操作系统(OS)安全性,功能,信息流管理,语言安全性,网络协议,硬件安全性和Web应用程序安全性。

第1课:“简介:威胁模型” 第1 部分 / 第2 部分 / 第3部分
第2课:“控制黑客攻击”, 第1 部分 / 第2 部分 / 第3部分
第3讲:“缓冲区溢出:漏洞利用和保护” 第1 部分 / 第2 部分 / 第3部分
讲座4:“特权分离”, 第1 部分 / 第2 部分 / 第3部分

因此,我们的图纸描绘了一种“艺术品”,其创作者试图保护艺术品免受威胁。 在他们的情况下,我认为他们非常担心,因为通过创建okcupid.com约会网站 ,他们确实希望确保该网站用户的声誉不会受到个人数据泄露的影响。 通过与撰写有关此文章的网站的开发人员之一的对话,可以知道他们实际上并未受到损害。 至少,没有发生由于使用OKWS体系结构以及部分由于监视恶意活动而导致的数据泄漏。

人们之所以不会将其应用分解为更小的组件,是因为此过程需要一些努力。 必须选择代码的所有部分,在它们之间定义清晰的接口,并确定每个组件应访问哪些数据。 如果决定实现新功能,则必须更改程序每个组件可以访问的数据,赋予它新的特权或选择一些特权,依此类推。 因此,这是一个相当耗时的过程。



让我们尝试了解Web服务器的设计方式,也许做到这一点的一种方法是跟踪OKWS服务器如何处理http请求。 因此,类似于上图所示,我们有一个Web浏览器想要转到okcupid.com 。 该站点项目的开发人员想象他们将拥有一堆机器,但是我们只会查看OKWS将在其上工作的站点的界面,以及在后台存储数据库的另一台机器。 第二台机器使用MySQL,因为它是完成许多任务的良好软件。 他们想真正保护这些数据,因为使用原始原始数据报很难到达原始磁盘或数据库。

那么,请求如何工作, OKWS服务器如何处理请求? 首先,它到达并由OKWS调度程序的称为okd的进程处理。 他检查自己是否要求此请求,然后做几件事。 由于您可能需要先注册此请求,因此它将其重定向到一个名为oklogd的组件,此后您将需要创建一些模板,甚至可能在请求到达之前就必须创建它们。 并且它还有另一个称为pubd的组件。



最后,有一个将请求发送到的特定服务,因此在okd中有一个它支持的服务集的表。 大概此请求来自这些服务之一,因此在审阅okd之后会将此请求重定向到特定的svc服务进程。 该服务将完全按照请求的要求进行操作,例如,为用户订阅新闻通讯,或者可以使用数据库查看ocupid的用户目录。

为此,您可能需要该服务以将应用程序信息保留在oklogd组件日志中 。 最后,他应该“交谈”数据库。 该站点的创建者实现此“通信”过程的过程与Apache中通常发生的情况有所不同,在Apache中 ,您只需与数据库进行通信并发出任意SQL查询。 他们提出了数据库代理dbproxy的概念,该代理位于MySQL数据库的前面,并接受来自svc服务的请求以执行它们。 我认为此图基本上显示了OKWS的工作方式。



有另一个组件可以启动所有操作,称为okld ,它负责启动此Web服务器界面中的所有进程。 我希望这些东西对您来说看起来很熟悉,因为这正是实验室中考虑的架构。 看起来这是一个不错的设计。 您在LR中没有pubdlogddbproxy ,但是您有okdsvc 。 对OKWS有疑问吗?

受众:我们是否正确理解dbproxy不接受SQL查询,而是另一种查询?

教授:是的,对! 该界面是什么样的? 他们没有对此进行详细描述,但是使用此dbproxy可以做的一件事是为SQL查询模板存储大量参数。 例如,它可能是您的朋友的搜索查询模板,可以通过ID选择他们。



假设有一个模板,例如“从您的朋友列表中选择^ ID ,其中^ ID =“%S” 。 假设您想在朋友中找到Alice并发送一个S请求,其参数为“ alice” 。 让我们的应用程序(在接口中可用)知道dbproxy准备好代表其执行三种类型的请求。 如果要执行查询1,其参数为“ Alice” ,则可以访问数据库。

受众:网络浏览器级别的外部用户可以将这样的请求发送到数据库吗?还是全部仅适用于网络的内部用户?

教授:是的,也许。 那么它是如何工作的呢? 实际上,奇怪的是,该数据库位于单独的计算机上,因为您可以仅连接到OKWS数据库还是MySQL服务器? 那么什么阻止了这个呢?

听众:防火墙?

教授:是的,可能在某种程度上。 开发人员没有对此进行详细描述,但是第二台计算机上可能存在一些内部网络,并且接口和数据库之间存在无法从外部访问的切换。 实际上,两台计算机都在同一网络上,但是有一个防火墙具有某些规则。 可能是您只能通过端口80连接到此接口计算机,而不能直接连接到内部服务器。 这是保护措施之一。



另一个可能是,当您连接到该dbproxy数据库代理时 ,需要提供20字节的加密令牌或密钥,如果不提供,则dbproxy将拒绝您的连接。 因此,规则是您打开一个TCP连接,发送20个字节,如果错误,则连接将关闭。 我认为,这就是这种系统设计的意义。

因此,让我们尝试在这里找出这些不同的流程是如何隔离的。 您如何确保所有这些组件都不会彼此淹没?

受众:不同的root权限和不同的用户ID?

教授:是的,几乎所有这些组件都可以用作不同的uid ,因此,在系统说明中,这里有一张完整的表格,为每个组件描述了其工作位置以及uid 。 所以我们可以这样写: okd有自己的uidpubd有自己的uidoklogd也有自己的uid

Okldroot 身份工作,虽然不成功,但这也许没什么大不了的。 然后,每个服务都有一大堆动态分配的用户标识符,例如ID 51001等。



因此,这确保了每个服务都不会干扰其他服务的过程。 Chroot在这里也被广泛使用,因此其中一些组件在单独的目录中拥有chroot权限。 例如, okdsvc在某些目录中具有通用的chroot权限。 您为什么认为这两个组件与其他chroot组件具有单独的区别,而不是共同点?

受众:因为okd没有root特权。

教授:是的,但是为什么不把pubdoklogd和其他所有人放在同一个chroot中呢?

受众:如果服务需要共享大量数据,是否应该将它们彼此隔离?

教授:也许吧。 我认为他们应该共享一些数据,但是这些数据不在文件中,它们通过套接字从okd传输到服务。 但是实际上,这些组件中没有一个在文件系统中存储任何有趣的东西。

因此, chroot目录中没有任何有趣的东西,我认为OKWS的人只是决定减少chroot的非生产性支出,例如需要创建目录的副本。 也许他们还想摆脱每个chroot命令的管理开销。 但是由于这里没有实际文件,所以一切都井井有条。

这些人为环境组件分配不同的chroot的原因是因为一些有趣的事情。 可能有模板,但是这里可能有一个日志文件,因此他们不希望意外读取日志文件,等等。

受众:这些服务是否包含文件,例如aspx

教授:正如文章中所描述的那样,该服务是单个编译的C ++二进制文件,因此实际上没有其他文件。

有模板,但是它们确实是通过这种奇怪的机制传输的: pubd在其目录中有模板,它以okd的某种预计算机,家庭形式显示它们,并且okd已经通过RPC调用为所有服务提供了模板。 因此,它们位于内存中,但实际上实际上不能直接通过文件系统访问。 当我什至无法阅读模板时,这是一种偏执的设计。
那么,分离所有这些组件的意义何在? 为什么我们需要单独的oklogd

受众:是否消除覆盖或修剪日记的可能性?

教授:是的,所以我们真的想确保如果出现问题,则至少不会损坏日志。 因此,存在一个可由该uid写入的单独的日志文件,并且所有日志消息均作为该日志服务的RPC发送。 而且,即使其他一切都毁了,除了okld之外 ,该杂志也不会受到伤害。

听众:如果您不小心发现了一种阅读杂志的方式,却看不到其他人的做法,该怎么办?

教授:不,我认为,如果您“入侵”了某些服务, 发布或其他服务, 可以在日记中写任何东西。 因此,创建一个单独的oklogd条目是有意义的。 实际上, oklogd是一个单独的过程,而不仅仅是通过将文件附加为仅附加文件来更新。 因此, oklogd不能向每个日志条目添加一些其他信息,因为如果OS支持仅附加文件,则在这种情况下您将不知道有人已对该文件进行了写入。 而oklogd为每条消息都添加了时间戳,并允许您找出哪个服务进行了录音或它来自okd 。 因此,您实际上在此日志文件中获得了其他信息,因为它是一项单独的服务。

okld分隔的含义是什么 ,为什么它应该与根权限一起使用? 我认为有几个原因。

受众:如果您不想让其他人以root特权运行,则需要委派okld用户身份验证功能。



教授:是的。 有人必须配置整个uid chroot ,而这个Unix需要root ,因此okld提供了它。 这是原因之一。 还有吗

受众: 80端口定义?

教授:是的,当然! 您必须绑定侦听端口80,该端口是okld并提供其他功能吗?

受众:由于我们不想让oklogd打开以防止访问日志文件,因此它完成了oklogd日志文件的打开。

教授:也许吧。 但是我不知道开发人员是否真的做到了,因为他们没有看他们的源代码。 您认为okld打开日志文件并将其传递给oklogd吗? 可能吧

受众:因为否则,破坏oklogd的攻击者可能会删除整个日志。

教授:是的,没错。 也许您想以附加模式打开它,然后将其传递给oklogd ,那么您就可以为该日志提供更多的安全保证。 如果没有root特权,这是您不能做的。

因此,我们有一个关于作业的问题,当“泄漏”这个20字节的令牌访问数据库时会发生什么。 这会造成什么损坏? 我们应该为此担心吗?

受众:在这种情况下,攻击者可以控制特定的服务。

教授:是的,因为现在您可以连接并获取所有查询模板。 实际上看起来很简单。 为了可能能够首先连接到服务器数据库,您可能需要折衷这些组件之一。 因此,我认为,如果您拥有此令牌,并且可以破坏图中所示的这些组件之一,则可以使用所有这些查询。

现在让我们看看如何改进OKWS设计? 例如,除了为每个服务分配单独的uid之外,还可以为每个用户分配一个单独的uid单元。 在这里,每个服务(例如新闻,搜索朋友或创建帐户)都具有单独的用户ID ,但每个OKWS用户均未表示为Unix uid 。 实际上,这里没有用户ID ,只有服务ID 。 您是否认为每个OKWS客户端都需要具有不同的uid

受众:在这种情况下,事实证明,如果一个用户“入侵”一项服务,他将能够访问该服务器其他用户的所有数据。

教授:是的,没错!

受众:但是,实际上,如果您为每个用户提供了单独的服务和单独的dbproxy ,则将无法访问其他人的数据。

教授:是的,但是这可以成为一个更强大的模型吗? 我认为OKWS开发人员不采取这样的步骤有两个原因。 首先是性能。 如果您拥有okcupid站点的数百万用户,数百万个正在运行的进程以及数百万的dbproxie ,则可能会产生性能开销。 并且这将无法实现与现有OKWS体系结构所提供的相同的性能。

读者: OKWS的描述说,该系统的性能优于其他系统。 这是如何实现的?

教授:我认为这部分是因为他们将设计微调到了特定的工作负载,此外,他们还用C ++编写了所有这些内容。 另一种选择是用PHP编写一些东西,那么您可能会在这方面获得好处。

此外,它们不具有Apache具有的许多功能。 它具有通用设计,因此具有许多工作流程,并且会不时重新加载它们。 有许多TTP连接可确保连接过程的持续时间并维持其活动。 它还增加了系统上运行的进程数。 Apache已变得更加通用,可以完成您希望从Internet服务器获得的所有功能,而OKWS的人员则更加专注于解决特定问题。

但是我认为这些还有其他Web服务器可以与OKWS性能匹配。 例如, Nginx是一个非常优化的Web服务器,您现在可以运行。 如果要在服务器端使用高性能的应用程序,则可能需要较长的过程与OKWS服务非常相似。 这样,它就具有一种用于将外部程序连接到Web服务器的快速通用CGI网关接口的机制,或者甚至可以在ApacheNginx中使用的一种可以在服务器端使用的协议。 因此,我认为其中许多想法并非OKWS所独有,它们可以在其他Web服务器中实现。 它们只是表明,提高安全性并不排除使用这些“技巧”。 我认为他们从类似于Apache的方案开始,但认为这样做不够安全。

因此,我认为OKWS的创建者不想为用户引入单独的特权的原因之一可能是性能下降。



另一个原因是,他们的完整应用程序模型围绕着试图访问每个用户数据的服务,例如在okcupid上搜索朋友或可以邀请您约会的人。 结果,这种用户隔离模型没有多大意义,因为最终应该为您发送请求的服务,并且它将查看所​​有其他数据以查找与您的请求匹配的数据。 因此,即使您具有用户标识符或某种隔离它们的机制,您仍然必须为每个用户打开对服务的访问权限。

对于其他服务(例如GmailDropbox) ,这些服务更多地针对特定用户,并且不提供共享文件的开放功能,因此隔离用户可以提供更多优势。 例如,在Dropbox服务器上,每个Dropbox客户端都有一个用户ID 。 而且,如果有一个进程正在为您运行,而一个进程正在为其他人运行,那么即使使用恶意利用,您也将无法掌握他人的信息。
现在,让我们看看OKWS在这种服务器模型中是否真的能够提高安全性。 要评估安全性,您需要考虑系统的每个组件,并确定可能危害其的攻击类型。

让我们从okd开始。 可以通过浏览器通过请求来攻击它,例如,导致缓冲区溢出。 c++, , - , okd . ?



: ?

: , , . ?

: , .

: , . , , , http , , , . , .

: ?

: , . , , , , , match.com . , , OkCupid . , - ? ?

: , , okd . , ?

: . , okd .

: , ?

: ! , , , , , . , , , , . , , . «» okd , , , .

: DOS-?

: , , , «» «» , DOS- - .

: okd , , …

: , . , , okd , okd , . okd , . , okd , , , , .

: .

: , . , okd . , oklogd ? ?

: .

: , , , ? pubd , , , - .

: , , «» oklogd .

: , . , , append-only , .

: , …

: , , . .

svc ? , , . , , okd oklogd . , , .

svc - -, , , . , , , .

okld ? , root. ? , . dbproxy . okld ? «»? ?

: , - ?

: , . , , . , , - , , , - . - . root- .

: -, , - dbproxy .

: !

: , , , RPC , , , , , ! .



: , . dbproxy ? , . , «» , dbproxy - .

: , svc

: , svc , !

: , , !

: , , «» , …

: dbproxy .

: . , dbproxy , .

, , . , . , . , , , , .


.

感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? , 30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

戴尔R730xd便宜2倍?在荷兰和美国,我们有2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) 阅读有关如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?

Source: https://habr.com/ru/post/zh-CN418211/


All Articles