关于Sudo你可能不知道的事情认为你已经知道关于sudo的一切?再想一想。每个人都知道sudo,对吧?该工具默认安装在大多数Linux系统上,并且可用于大多数BSD和商业Unix变体。尽管如此,在与数百名sudo用户交谈后,我得到的最常见答案是sudo是一种让生活变得复杂的工具。有root用户和su命令,那么为什么还要使用另一个工具呢?对于很多人来说,sudo只是管理命令的前缀。只有少数人提到当你在同一个系统上有多个管理员时,你可以使用sudo日志来查看谁做了什么。那么,什么是sudo?根据sudo网站:“sudo允许系统管理员通过授予某些用户以root或其他用户身份运行某些命令的能力来委派权限,同时提供命令及其参数的审计跟踪。”默认情况下,仅sudo简单配置,一条规则允许一个用户或一组用户执行几乎所有操作(本文后面的配置文件中有更多信息):%wheelALL=(ALL)ALL在此示例中,参数的含义如下:第一个参数(%wheel)定义组的成员。第二个参数(ALL)定义组成员可以在其上运行命令的主机。第三个参数((ALL))定义了可以执行命令的用户名。最后一个参数(ALL)定义了可以运行的应用程序。因此,在这个例子中,wheel组的成员可以在所有主机上以所有用户身份运行所有应用程序。但即使是这个允许所有规则也是有用的,因为它跟踪谁在计算机上做了什么。当然,别名不仅可以让您和您最好的朋友管理共享计算机,而且您还可以微调权限。您可以将上述配置中的项目替换为列表:用户列表、命令列表等。大多数时候,您可能会复制并粘贴配置中的一些列表。在这种情况下,别名可以派上用场。在多个位置维护同一个列表很容易出错。您可以一次定义别名并多次使用它。因此,当您不再信任管理员时,只需将他们从别名中删除即可。使用多个列表而不是别名,很容易忘记从具有更高权限的列表之一中删除用户。为特定用户组启用功能sudo命令带有许多默认设置。但是,在某些情况下,您想要覆盖其中的一些情况,那么您可以在配置中使用Defaults语句。通常,这些默认值是针对每个用户强制执行的,但您可以根据主机、用户名等将设置缩小到用户子集。这是我们这一代系统管理员喜欢玩的一个例子:“羞辱”。当有人输入错误的密码时,这些只是一些有趣的消息:czanik@linux-mewy:~>sudols[sudo]passwordforroot:Holdituptothelight---notabraininsight!高分,脑洞太小看不懂[sudo]root密码:我的宠物鼬打字比你还好!#Mypetferretisalsobetterthanyourinput[sudo]passwordforroot:sudo:3incorrectpasswordattemptssczanik@linux-mewy:~>因为不是每个人都喜欢系统管理员的这种幽默,所以默认情况下禁用这些羞辱信息。下面是一个如何仅为有经验的系统管理员(即wheel组的成员)启用此设置的示例:在。摘要验证当然,sudo还有更严肃的特性。其中之一是摘要式身份验证。您可以在配置中包含应用程序的摘要:peterALL=sha244:11925141bb22866afdf257ce7790bd6275feda80b3b241c108b79c88/usr/bin/passwd在这种情况下,sudo在运行应用程序之前检查应用程序摘要并将其与存储在配置中的摘要进行比较。如果没有匹配项,sudo将拒绝运行该应用程序。尽管很难在配置中维护此信息(没有用于此目的的自动化工具),但这些摘要可以为您提供额外的保护层。会话记录会话记录也是sudo的一个鲜为人知的功能。演示结束后,许多人离开我的谈话计划在他们的基础设施上实施它。为什么?因为使用会话日志记录,您不仅可以看到命令名称,还可以看到终端中发生的一切。你可以看到你的管理员在做什么,否则他们会进入机器,日志只会显示bash已经启动。目前有一个限制。记录存储在本地,因此具有足够权限的用户可以删除他们的痕迹。请继续关注即将推出的功能。插件从1.8版本开始,sudo变成了基于插件的模块化架构。通过将大多数功能实现为插件,您可以轻松地通过编写自己的功能来替换或扩展sudo的功能。sudo上已经有开源和商业插件。在我的演讲中,我演示了GitHub上提供的sudo_pair插件。这个插件是用Rust开发的,这意味着编译起来并不容易,而且分发它的编译更难。另一方面,该插件提供了有趣的功能,需要第二个管理员批准(或拒绝)通过sudo运行命令。不仅如此,还可以在屏幕上跟踪会话,并在出现可疑活动时终止会话。在最近的AllThingsOpen会议上进行演示时,我制作了臭名昭著的演示:czanik@linux-mewy:~>sudorm-fr/watchingthecommandsdisplayedonthescreen。每个人都屏住呼吸,看我的笔记本电脑是否被毁了,但它逃脱了。日志记录正如我在开头提到的,日志记录和警报是sudo的重要组成部分。如果您不定期检查,日志在使用sudo时没有多大价值。该工具通过电子邮件针对配置中指定的事件发出警报,并将所有事件记录到系统日志中。可以为调试规则或报告错误打开调试日志记录。警报电子邮件警报现在有点过时,但如果您使用syslog-ng收集日志消息,sudo日志消息会自动解析。您可以轻松创建自定义警报并将它们发送到各种目的地,包括Slack、Telegram、Splunk或Elasticsearch。您可以从我在syslong-ng.com上的博客了解有关此功能的更多信息。配置我们谈了很多关于sudo功能的内容,甚至还看到了几行配置。现在,让我们仔细看看sudo是如何配置的。配置本身在/etc/sudoers中可用,这是一个简单的文本文件。但是,不建议直接编辑此文件。相反,请使用visudo,因为此工具还会执行语法检查。如果您不喜欢vi,您可以通过将EDITOR环境变量指向您首选的编辑器来更改要使用的编辑器。在开始编辑sudo配置之前,请确保您知道root密码。(是的,即使在默认情况下root没有密码的Ubuntu上也是如此。)虽然visudo检查语法,但很容易创建语法正确的配置并将您锁定在系统之外。如果手边有root密码,您也可以直接编辑配置。关于sudoers文件,有一件重要的事情要记住:文件是从上到下读取的,最后的设置为准。这个事实对你意味着你应该从通用设置开始,把例外放在最后,否则,通用设置将覆盖例外。你可以在下面看到一个基于CentOS的简单sudoers文件,并添加我们之前讨论的几行:Defaults!visiblepwDefaultsalways_set_homeDefaultsmatch_group_by_gidDefaultsalways_query_group_pluginDefaultsenv_resetDefaultsenv_keep="COLORSDISPLAYHOSTNAMEHISTSIZEKDEDIRLS_COLORS"Defaultsenv_keep+="MAILPS1PS2QTDIRUSERNAMELANGLC_ADDRESSLC_CTYPE"Defaultssecure_path=/sbin:/bin:/usr/sbin:/usr/binrootALL=(ALL)ALL%wheelALL=(ALL)ALLDefaults:%wheelinsultsDefaults!insultsDefaultslog_output此文件更改多个默认值,从开始的值开始。然后是通常的默认规则:root用户和wheel组的成员对计算机具有完全权限。接下来,我们为wheel组启用“羞辱”,但为其他所有人禁用它们。最后一行启用会话日志记录。上面的配置在语法上是正确的,但是你能发现逻辑错误吗?是的,有一个:后一种通用设置会覆盖较早的、更具体的设置,使所有人都禁用“羞耻”。一旦交换了这两行,设置就会按预期工作:wheel组的成员会收到有趣的消息,但其他用户不会。配置管理一旦您必须在多台机器上维护sudoers文件,您很可能希望集中管理配置。这里主要有两种可能的开源方法。两者各有利弊。您可以使用其中一种配置管理应用程序来配置其余的基础架构:RedHatAnsible、Puppet和Chef都有用于配置sudo的模块。这种方法的问题是更新配置远非实时。同样,用户仍然可以在本地编辑sudoers文件并更改设置。sudo工具还可以将其配置存储在LDAP中。在这种情况下,配置更改是实时的,用户不能乱用sudoers文件。另一方面,这种方法也有局限性。例如,当LDAP服务器不可用时,您不能使用别名或使用sudo。新功能新版本的sudo即将推出。1.9版将包含许多有趣的新功能。以下是最重要的计划功能:日志服务集中收集会话日志,与本地存储相比有很多优势:更容易在一个地方搜索。即使发送记录的机器关闭,也可以进行记录。想要抹去痕迹的人,是抹不掉记录的。审计插件没有向sudoers添加新功能,而是为插件提供了一个API,可以轻松访问任何类型的sudo日志。此插件允许使用插件从sudo事件创建自定义日志。批准插件无需使用第三方插件即可启用会话批准。我个人最喜欢的是:Python对插件的支持,它允许您使用Python代码轻松扩展sudo,而不是使用C语言进行原生编码。###总结希望本文向您证明sudo不仅仅是一个简单的命令前缀。微调系统权限的可能性有无数种。您不仅可以微调权限,还可以通过检查摘要来提高安全性。会话日志记录使您能够检查系统上发生的事情。您还可以使用插件扩展sudo的功能,使用现有插件或编写您自己的插件。最后,正如您从即将推出的功能列表中看到的那样,尽管sudo已有数十年历史,但它仍然是一个活跃且不断发展的项目。
