已解决:控制用户对计算机特权程序和文件的访问是一件非常痛苦的事情。为应对将现实世界的特权映射到数字方案而进化的系统都不是很好。最好的访问控制系统只会比其他系统伤害更小。
类Unix系统通过用户和组控制程序和文件访问。每个用户都有一个唯一的标识符,可以是用户名或用户ID号(UID)。用户被安排在唯一标识的组中,以组名或组ID号(GID)的形式给出。特定的用户和组有权访问特定的文件和程序。
在UNIX的童年时期,这个方案就足够了。一所大型大学可能有几台UNIX服务器。数百名用户登录到每台服务器上,用于邮件、新闻和计算密集型应用程序。学生分为一组,研究生分为另一组,然后是教授、教职员工等。个别班级和部门可能有自己的小组。
系统所有者有一个特殊账户,root 。 root 帐户具有最终的系统控制权。作为安全和稳定的预防措施,类Unix系统限制某些操作,只有 root 才能执行这些操作。只有 root 可以重新配置网络、装载新的文件系统和重新启动连接到特权网络端口的程序。当整个园区只有两台服务器时,这是有道理的——在这种环境下,重新配置网络或添加新的磁盘驱动器是一项艰巨的任务。管理价值数百万美元的系统的工作应该留在值得信赖、技术娴熟的人手中。
在21世纪,类Unix系统既便宜又丰富。团队成员可能会共享系统管理任务,或者一个人可能完全控制一个系统,或者介于两者之间的任何事情。这两种情况都会彻底改变您对上个世纪的安全要求。
大型组织通常将系统管理职责分配给熟练的人员。一个人可能负责操作系统的维护和供给,而另一个人则负责处理服务器上运行的应用程序。服务器支持应用程序,应用程序是服务器存在的原因,但两个人都需要执行需要根级别(root-level)权限的任务。但根级别特权是一件要么全有要么全无的事情。“更改内核的权限”和“运行特权应用程序的权限”之间没有区别。如果应用程序管理员具有根级访问权限,他可以更改内核。你总是可以依靠君子协定来只触及你负责的系统部分,但是当你的组织雇佣一个系统管理员团队和一个数据库管理员团队来支持几十或几百台服务器时,这些君子协定很快就会变成相互指责的血洗——即使没有供应商提供的应用程序设置脚本,这些脚本也可以在不告诉任何人的情况下帮助定制内核。这些组织需要比 root 提供的更细粒度的访问控制系统。
当每个人都有一个类Unix系统时,全有或全无模型会更加崩溃。抛开无数的手机和平板电脑,它们有额外的软件使其用户友好,许多人在台式机或笔记本电脑上运行类Unix操作系统。每次他们访问USB驱动器或使用咖啡店无线网络时,系统上的某些内容都需要根级别权限。使用 root 权限并不十分繁重——使用您的常规帐户登录,使用su命令切换用户,输入root密码,运行需要root访问权限的命令,然后退出root帐户。但是,当你在任何时候放入USB驱动器、弹出网络、添加、重新配置或重新启动软件时,都必须使用root帐户,这很快就会变得非常烦人。虽然软件可以为您管理大部分内容,但有时您必须为常规任务触发root权限。
计算行业充满了真正聪明的人,他们扩展了经典的UNIX权限控制模型。一种方法是通过 setuid 和 setgid 程序。虽然程序通常以运行它们的用户的权限工作,但setuid和setgid程序会将其有效UID和GID更改为其他值。您可以有一个以root身份运行的setuid程序。更改密码需要编辑 /etc/ 中的安全文件,因此 passwd
命令是setuid。但入侵者真的很喜欢setuid和setgid程序。这些程序中的缺陷可能会被利用来获得完全的root访问权限。而且大多数操作系统不允许你创建shell脚本setuid,只允许你创建程序。
然后有几种类型的访问控制列表(access control lists ——ACL),它们更广泛地扩展了 user-group-others 所有权模型。ACL允许您声明类似“此人拥有文件,但 these 组和人员可以修改它,有这些排除项,these 组和人(当然有一些排除项!)可以执行它,而这些其他人可以从中读取数据,除了……”此时,系统管理员感到头疼,并开始考虑从事清理真实污水而不是隐喻性污水的职业。当然,所有不同的ACL实现都有点不兼容。很少有人能在单个平台上正确实施ACL,而且这种专业知识并没有真正扩展到其他平台。ACL在系统管理中占有一席之地,如果你真的需要它们,它们是无价的。但我们大多数人并不需要它们。
遗憾的是,访问控制列表已经达到了其应有的水平。
除了sudo。
sudo是一个控制以root或其他用户身份访问正在运行的命令的程序。系统所有者创建了一个每个用户都可以执行的特权命令列表。当用户需要运行需要根级别权限的命令时,他会要求sudo为他运行该命令。sudo查询其权限列表。如果用户有权运行该命令,则会运行该命令。如果用户没有运行命令的权限,sudo告诉他。运行sudo不需要root密码,而是用户自己的密码(或其他身份验证)。
系统管理员可以将根级别权限委托给特定人员执行非常特定的任务,而无需提供根密码。她可以告诉sudo对某些用户或命令要求身份验证,而对其他用户或命令则不要求。她可以允许用户在某些机器上访问,而在其他机器上则不允许,所有这些都可以通过一个共享的配置文件来实现。
一些应用程序,特别是大型企业数据库软件,在特定的专用帐户下运行。用户在管理软件之前必须切换到此帐户。您可以配置sudo以允许用户以该帐户运行特定命令。也许你的初级数据库管理员只需要运行备份,而首席DBA需要一个完整的shell提示符作为数据库帐户。Sudo允许你这样做。
最后,sudo会记录所有人要求它做的事情。它甚至可以重放单个sudo会话的内容,以显示谁破坏了什么。
如果sudo这么棒,为什么不是每个人都使用它?
Sudo增加了另一层系统管理。添加该层需要时间、精力和注意力。当你已经有太多事情要做时,它需要学习另一个危险的程序。如果你负责运行一个有多组管理员的企业系统,投资sudo可以减少你的工作量。但你必须先学会如何使用它。
一些商业UNIX不包含sudo,因为它们已经包含了自己专有的升级权限管理系统。基于OpenSolaris的系统具有 pfexec
和基于角色的访问控制(role-based access control —— RBAC)。惠普有 pbrun
。如果您是一家商业UNIX供应商,花费大量资金和精力开发基于ACL的权限管理系统,您会包括并鼓励使用更简单、更容易的工具吗?我可能会,但这就是为什么我不是一个大型的商业UNIX供应商。
许多开源类Unix操作系统确实在其基础系统中包含了sudo。有些,如Ubuntu和OS X,完全禁用root帐户,只允许通过sudo进行特权访问。这是一个正确的方向,但大多数拥有sudo的人使用不当。
使用sudo的错误方式是什么?Sudo不是su的替代品。Sudo不是一种完全避免特权访问需要身份验证的方法。Sudo不是强迫别人给你做三明治的工具。正确的sudo设置简化了系统管理。不正确的sudo设置会让入侵者和未经授权的用户更快、更容易地损坏或破坏您的系统。
“正确使用sudo”并不意味着复杂甚至广泛的政策。我见过系统管理员花几个小时编写复杂的sudo策略,结果却看着用户跳过他们的限制。有时用户甚至没有意识到这些限制已经到位。Sudo有其局限性。一旦你了解了这些限制,你就可以对你的组织如何以及在哪里部署sudo做出现实的决定。
我经常看到的sudo问题与软件本身无关。在复杂的组织中正确部署sudo需要系统管理团队同意谁负责什么。Sudo在配置文件中强制执行工作职责和责任。配置文件是灵活的,但人们不能超过其中指定的权限。
你的职责范围是什么?你需要什么权限才能完成真正的工作,其他人应该做哪些任务?被迫坐下来思考这些事情可能会让人感到不舒服,并可能暂时增加组织内部的冲突。然而,一旦争论平息,冲突就会减少。对于谁做了什么、何时做了什么或如何做,没有争吵。每个人都知道数据库团队无法格式化文件系统,web团队无法重新启动数据库,sudo日志清楚地显示了谁采取了任何特权操作。拥有审计跟踪可以提高系统的稳定性。当人们知道系统记录了他们的特权行为,并且他们可以而且将会对破坏东西负责时,他们就会停止经常破坏东西。奇怪的。
Sudo保护系统免受入侵者或系统管理员的伤害,并保护系统管理员免受许多管理问题的影响。
仅允许用户访问一组有限的特权命令,可以限制用户对系统造成的损害。只有权管理web服务器或数据库的用户无法损坏磁盘分区。如果入侵者入侵了该用户的帐户,入侵者同样会被减缓或控制。
同样,当出现问题时,缺乏访问权限可以保护系统管理员。即使没有sudo日志,具有有限管理权限的用户也可以说“嘿,我没有重新配置web服务器。我没有那个权限,记得吗?”问责制是双向的。利用它来发挥你的优势。
Sudo是免费提供的开源软件。欢迎您从主网站下载(http://sudo.ws)或镜像,并在整个组织中免费使用。许可证允许您使用sudo作为自己产品的基础,将其转售给客户,或将其整合到您重新分发或转售的软件中。你可以用sudo做任何你喜欢的事情。
你得不到的是复杂的支持。
Sudo不是由商业公司创建的。它由需要它的用户开发和支持,并在过去几年由Todd Miller协调。您可以通过提交补丁和错误报告来为sudo做出贡献。你可以找到支持你安装sudo的人和公司,他们甚至会为你编写自定义代码。但是,如果你的sudo安装没有按照你期望的方式工作,你也没有人可以大喊大叫。没有免费电话,也没有最低工资的支持仆从,他们对你的语言掌握有问题,等着用辱骂和谩骂来换取现金。
话虽如此,sudo邮件列表上的人都非常乐于助人,并且对真实的问题报告非常感兴趣。他们对求助请求反应良好,对要求反应不佳。如果你想寻求帮助——如果你想尖叫、咆哮、狂欢,直到你的问题消失——任何数量的公司都会卖给你。
该软件是免费的。Sudo的“官方支持”是一份礼物,一旦你不再把它当作礼物来对待,它就会消失。
在类Unix系统上工作的每个人都应该了解sudo。
如果您是负责维护复杂系统的系统管理员,您可能希望为应用程序管理员分配完成工作所需的权限,不多也不少。正确的sudo配置可以节省您的时间,并保护系统免受善意的灾难。
如果你是一名应用程序管理员,你需要做好你的工作。这意味着您需要访问权限才能执行特权任务。通过sudo工作意味着稍微改变你的进程——不是以任何主要的方式,但你可能会完全发疯,试图弄清楚为什么sudo cd不起作用,直到你明白到底发生了什么。了解sudo后,您可以起草所需的sudo规则并将其交给系统管理员。即使系统管理员不同意,使用sudo策略语言进行协商也意味着你们都完全理解自己的请求。你可以就谁负责什么进行具体讨论。没有系统管理员会告诉应用程序管理员他不需要访问权限来管理他的应用程序——她当然不想要这份工作!唯一的问题是:如何最好地实现这种访问?
如果团队之间的分歧足够广泛,这就是你要求管理层做出非常具体的决定并设定明确的权力和责任线的地方。在某些环境中,让经理迈出这一步本身就是一个奇迹。但是,实施sudo的授权可以让你把他逼到角落里。如果你有一个脾气暴躁的系统管理员,他声称在不给你root权限的情况下授予你必要的访问权限是不可能的,这本书将让你断然反驳这一点。诚然,这是它自己的报复乐趣。
如果你只维护你的个人系统,为什么你会关心sudo?即使在个人笔记本电脑上,一些命令也比其他命令更值得思考和考虑。我能理解想要轻松地重新配置笔记本电脑的网络、调整可移动媒体或杀死那个疯狂的网络浏览器。你可能经常做这些任务,以至于你很好地理解了它们——我的手指可以在不干扰大脑的情况下配置网卡。但是,您执行的频率较低的任务,如安装软件或格式化磁盘,需要更多的关注。允许sudo在没有密码的情况下运行常规任务是有意义的,但在升级之前需要身份验证。
本书假设您在类Unix操作系统上运行sudo。Sudo可用于BSD和Solaris衍生产品、Linux和每个商业UNIX。虽然我的参考平台是FreeBSD,但sudo可以在所有这些系统和更多系统上运行。
我的参考实现是sudo 1.8.8。如果您运行的是旧版本,则可能缺少某些功能。数量惊人的操作系统供应商包括严重过时的sudo软件包。通过运行 sudo –V
检查系统上的sudo版本。如果您的版本比1.8.8旧得多,请升级。您始终可以在主sudo网站http://sudo.ws上获取最新的源代码和一系列预编译的包。
sudo文档和本书假设您的操作系统与传统的文件系统布局非常接近。本书中的示例显示了 /bin 、 /usr/bin 、 /sbin 等标准目录中的命令。如果您的操作系统使用自己的目录布局,则需要调整示例以匹配。
许多重要的程序在使用之前都需要相关软件的广泛背景知识,而sudo是很好的,因为它是相当独立的。您可以在不了解用户可以通过sudo访问的所有程序的情况下掌握sudo。然而,Sudo是一个系统管理工具;您对系统了解得越多,就越能利用sudo,对配置就越有信心。我假设您可以从操作系统软件包或源代码安装sudo。
配置sudo需要在类Unix系统上拥有root权限,并熟悉终端模式文本编辑器。Sudo默认使用 vi
,但您可以使用Emacs或任何其他编辑器。
这就是全部。真正地。我们走的时候,你会学到的所有其他知识。
本书的目标是让您将通过 su
命令和root密码访问特权命令替换为 sudo
命令和用户的个人身份验证凭据。一旦你熟悉了sudo,你就可以使用系统的身份验证机制来消除用户通过su成为root的能力。root密码只会在灾难中使用,或者当你在物理控制台时使用。消除root的通用身份验证可以提高组织内系统管理员的责任感。但让这个项目失败的最好方法之一是部署sudo太快。
配置sudo有其自身的陷阱。您需要了解sudo如何适应您的环境。没有什么比把自己锁在自己的服务器之外更令人痛苦、沮丧的自责了。不要太快通过su禁用root访问,因为您可以使用该访问来修复损坏的sudo配置。是的,sudo有功能和工具来验证您的sudo策略在语法上是否正确。然而,说“没有人能做任何事情(nobody can do anything)”的sudo策略在语法上是正确的。保留旧的root访问权限,直到您对新的sudo安排完全有信心,或者习惯于将系统引导到单用户模式以修复su或sudo。虚拟机或jail可以成为破坏性学习的有用工具。
一些操作系统(特别是Ubuntu和OS X)提供使用sudo而不是su的root访问权限。如果你正在尝试使用sudo,并且sudo是你访问特权命令的主要方法,那么你就处于危险之中。在使用sudo之前,请启用root访问权限并在您的学习机器上设置root密码。确保它正常工作,并且您可以在没有sudo的情况下获得root访问权限。然后,您可以在不阻止特权访问的情况下自由探索sudo。一旦你熟悉了sudo,你就可以放心地完全部署它。
sudo官方文档描述了扩展巴科斯范式(Extended Backus-Naur Form —— EBNF)中的各种sudo功能,这是一种用于程序配置的正式语法。虽然熟悉EBNF对任何系统管理员来说都是一项有用的技能,但我选择不带你了解正式的定义。相反,本书通过实际配置策略的片段演示了最重要的sudo功能。
还要注意,这本书并没有涵盖所有可能的sudo配置,也没有涵盖所有可用的sudo功能。我涵盖了绝大多数系统管理员的需求,但如果你运行的是旧版本的操作系统,使用旧版本的sudo,或者管理的是一个与通用标准大相径庭的类Unix系统,你需要深入了解文档,以确定你的情况。但读完这本书后,你将对sudo技术有一个坚实的基础,并对你要查找的信息以及如何使用它有一个很好的了解。
许多系统管理员将其系统配置为在应该使用基本操作系统支持的组权限时,需要root权限才能执行常规任务。我们倾向于查看用户和其他人的权限,但较少关注组权限。在运行sudo解决访问问题之前,看看你是否可以用组来解决你的问题。要求root权限来允许访问文件或程序就像需要使用大锤来挂图片一样。
对需要由多人访问的程序或文件使用组权限,并且只能由这些人访问。举个简单的例子,假设有几个人维护一个网站的文件。您可以创建一个名为 webadmins 的组,并将该组指定为网站目录及其所有文件的所有者。请查看我们网站的顶级目录:
# ls -l
total 94
drwxrwxr-x 2 mike webadmins 512 Jul 12 2013 content
-rw-rw-r-- 1 thea webadmins 16584 Oct 20 2013 logo.jpg
-rw-rw-r-- 1 pete webadmins 767 Oct 20 2013 errata.html
-rw-rw-r-- 1 mike webadmins 2736 Jul 12 2013 index.html
-rw-rw-r-- 1 pete webadmins 167 Jul 12 2011 index2.html
-rw-rw-r-- 1 thea webadmins 66959 Oct 20 2006 banner.jpg
个人文件归一个人所有—— mike 、 thea 或 pete 。但是这些文件也可以由组 webadmins 可读写。此组中的任何人都可以读取和编辑这些文件,以及此文件下目录中的任何内容。
添加组的具体细节因操作系统而异。我会告诉你编辑 /etc/groups ,但有些操作系统有专门用于使组过于复杂(呃,管理)的特殊工具。使用操作系统手册中推荐的工具。
要确定您是哪些组的成员,请运行 id(1)
:
xxxxxxxxxx
# id
uid=1001(mike) gid=1001(mike) groups=1001(mike),10020(webadmins)
我的用户帐户在 mike 和 webadmins 组中。我可以根据我的组成员资格编辑上面示例中的文件。我还可以编辑其中几个文件,因为我拥有它们,并且权限允许所有者编辑文件。
组权限并不能解决程序的所有访问问题。有些程序执行特权功能,让一个组运行程序不会赋予程序执行任务的权限。记住,程序以运行程序的人的权限运行。
为了延续我们网络管理团队的传奇,网络服务器在TCP端口80和/或443上运行。只有root可以连接到1024以下的网络端口。如果用户在没有任何额外权限的情况下运行web服务器程序,则该程序将以该用户帐户运行。它没有连接到这些网络端口的必要权限,因此web服务器无法正常启动。设置程序权限以便用户可以运行程序并不意味着程序可以工作。如果你想让你的webadmins组获得专门用于启动、停止和管理web服务器软件的root权限,你需要给该组中的用户root权限。这就是sudo发挥作用的地方——你可以分配web管理团队的成员对web服务器的控制权,而无需给他们任何其他东西。
Sudo是一套相互关联的程序。如果你了解这些不同部分是如何组合在一起的,那么配置sudo会得到更好的结果。
传统的sudo有两个组件:sudo程序和sudoers策略引擎。第2章为您提供了这两方面的基础知识。
sudoers策略文件只能使用root权限进行编辑。sudoers文件中的错误阻止任何人使用sudo获得root权限。如果您通过其他方式禁用了root访问,则会出现一个sudoers错误,将您锁定在系统之外。sudo套件包括一个特殊的工具 visudo
,仅用于编辑和验证sudoers文件。使用visudo可以降低你对自己非常生气的几率。我在第三章中介绍了visudo。
Sudo政策很快变得非常复杂。如第4章所述,通过使用列表和别名来降低这种复杂性。 但是,您无法通过策略规则调整sudo行为的所有部分。sudoers策略引擎还包括各种默认设置和更改它们的选项,我将在第5章中详细介绍。
一些程序通过shell转义提供了突破sudo限制的方法——不是因为它们是故意为了避免sudo而编写的,而是因为它们的本质。第6章介绍了防止从文本编辑器和类似程序获取不受限制的根shell的方法。
这本书的大部分内容都是关于sudoers安全策略引擎的,但sudo程序本身也可以进行调整。第7章讨论了 sudo.conf 。
当特权程序使用用户的环境时,可能会造成各种麻烦。第8章介绍了清理shell环境,以及在sudo上下文中阻止或允许环境变量。
Sudo可以在运行程序之前对程序执行基本的完整性检查。你将在第9章中看到。
您可以使用一个中央策略并将其推送到所有主机,而不是在数十或数百台机器上分别维护一个单独的安全策略。第10章介绍了在整个网络中实际使用单一策略。
Sudo还可以从LDAP身份验证服务器获取其安全策略,而不是通过sudoers文件。我将在第11章介绍LDAP和sudo。
一旦你控制了用户对特权命令的访问,下一个问题就变成了“用户做了什么?”Sudo包括三个不同的日志系统,每个系统都有不同的用例。第12章讨论了这三个问题。
最后,sudo可以以多种方式处理用户凭据,如果你想调整sudo安装处理密码和其他身份验证数据的方式,你需要阅读第13章。
但在我们开始学习高级内容之前,让我们先从sudo的基础知识开始。