麻省理工学院。 讲座课程#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中没有
pubd ,
logd和
dbproxy ,但是您有
okd和
svc 。 对
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有自己的
uid ,
pubd有自己的
uid ,
oklogd也有自己的
uid 。
Okld以
root 身份工作,虽然不成功,但这也许没什么大不了的。 然后,每个服务都有一大堆动态分配的用户标识符,例如ID 51001等。

因此,这确保了每个服务都不会干扰其他服务的过程。
Chroot在这里也被广泛使用,因此其中一些组件在单独的目录中拥有
chroot权限。 例如,
okd和
svc在某些目录中具有通用的
chroot权限。 您为什么认为这两个组件与其他
chroot组件具有单独的
区别,而不是共同点?
受众:因为
okd没有root特权。
教授:是的,但是为什么不把
pubd ,
oklogd和其他所有人放在同一个
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网关接口的机制,或者甚至可以在
Apache或
Nginx中使用的一种可以在服务器端使用的协议。 因此,我认为其中许多想法并非
OKWS所独有,它们可以在其他Web服务器中实现。 它们只是表明,提高安全性并不排除使用这些“技巧”。 我认为他们从类似于
Apache的方案开始,但认为这样做不够安全。
因此,我认为
OKWS的创建者不想为用户引入单独的特权的原因之一可能是性能下降。

另一个原因是,他们的完整应用程序模型围绕着试图访问每个用户数据的服务,例如在
okcupid上搜索朋友或可以邀请您约会的人。 结果,这种用户隔离模型没有多大意义,因为最终应该为您发送请求的服务,并且它将查看所有其他数据以查找与您的请求匹配的数据。 因此,即使您具有用户标识符或某种隔离它们的机制,您仍然必须为每个用户打开对服务的访问权限。
对于其他服务(例如
Gmail或
Dropbox) ,这些服务更多地针对特定用户,并且不提供共享文件的开放功能,因此隔离用户可以提供更多优势。 例如,在
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服务器的上等课程?