当前位置: 首页 > 科技观察

2022年的五项新Sudo功能

时间:2023-03-12 08:56:57 科技观察

如果您想授予某些用户管理权限,同时控制和检查他们在您的系统上执行的操作,您可以使用sudo。不过,就算是sudo',也有相当的失控,想想给shell权限吧。最新版本的sudo添加了一些功能,可以让您看到这些问题,甚至可以控制它们。例如,您可以启用更详细、更易于处理的日志记录信息,并记录在shell会话中执行的每个命令。其中一些功能是全新的。有些是1.9.0甚至更早版本中出现的功能。例如,sudo可以记录终端上发生的一切,即使在1.8版本中也是如此。但是,系统将这些记录保留在本地,并且可以轻松删除它们,尤其是在记录最有用的地方:Shell会话。1.9.0版本增加会话记录集中收集,本地用户无法删除记录。最新版本还增加了中继功能,使收藏功能更加强大。1.JSON格式的日志我要介绍的第一个新特性是JSON格式的日志。我是一个日志狂热者(我12年前开始从事syslog-ng项目),这个功能是我在这里发布后介绍的第一个功能。启用后,sudo会记录更多信息,并以更易于解析的方式进行记录。传统的系统日志消息很短,只包含最少量的必要信息。这是由于旧系统日志实施的限制。大小超过1k的消息将被丢弃或截断。1月28日13:56:27localhost.localdomainsudo[10419]:czanik:TTY=pts/0;PWD=/home/czanik;用户=根;COMMAND=/bin/bash最近的syslog实现可以处理更大的消息量。syslog-ng默认接受64k的日志消息(当然,它可以更小或更大,具体取决于实际配置)。同样的事件,如果以JSON格式记录,将包含更多信息。更多并不意味着更难处理。许多日志管理软件应用程序更容易解析JSON格式的信息。下面是一个例子:Jan2813:58:20localhost.localdomainsudo[10518]:@cee:{"sudo":{"accept":{"uuid":"616bc9efcf-b239-469d-60ee-deb5af8ce6","server_time":{"seconds":1643374700,"nanoseconds":222446715,"iso8601":"20220128125820Z","localtime":"Jan2813:58:20"},"submit_time":{"seconds":1643374700"nanoseconds":209935349,"iso8601":"20220128125820Z","localtime":"1月28日13:58:20"},"submituser":"czanik","command":"/bin/bash","runuser":"root","runcwd":"/home/czanik","ttyname":"/dev/pts/0","submithost":"localhost.localdomain","submitcwd":"/home/czanik","runuid":0,"columns":118,"lines":60,"runargv":["/bin/bash"],"runenv":["LANG=en_US.UTF-8","HOSTNAME=localhost.localdomain","SHELL=/bin/bash","TERM=xterm-256color","PATH=/home/czanik/.local/bin:/home/czanik/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin","MAIL=/var/mail/root","LOGNAME=root","USER=root","HOME=/root","SUDO_COMMAND=/bin/bash","SUDO_USER=czanik","SUDO_UID=1000","SUDO_GID=1000"]}}}你可以在sudoers文件中启动JSON格式的日志信息:Defaultslog_format=json可以从我的syslog-ng博客了解更多关于如何使用sudo的JSON格式日志信息2.使用sudo_logsrvd集中收集日志1.9.4中另外一个与日志相关的sudo_logsrvd的功能就是收集所有的sudo日志信息(包括失败的)。以前,系统仅在sudo_logsrvd实际记录时才记录成功的会话。最后,通过syslog进行日志记录仍然是默认设置。为什么这很重要?首先,您可以将与sudo相关的所有内容集中在一个地方。会话记录和所有相应的日志信息。其次,它还保证所有与sudo相关的事件都被正确记录,因为如果sudo_logsrvd不可访问,sudo可以拒绝执行命令。您可以使用以下设置在sudoers文件中启用sudo_logsrvd日志记录(当然替换IP地址):默认log_format=json如果您想要JSON格式的日志信息,您需要在sudo_logsrvd的[eventlog]部分中设置以下内容配置:log_format=json否则,sudo_logsrvd使用传统的sudo日志格式并进行简单修改。它还包括有关日志来自的主机的信息:11月18日12:40:16centos8splunk.localdomainsudo[21028]:czanik:3次不正确的密码尝试;HOST=centos7sudo.localdomain;TTY=点/0;PWD=/home/czanik;用户=根;COMMAND=/bin/bashNov1812:40:23centos8splunk.localdomainsudo[21028]:czanik:HOST=centos7sudo.localdomain;TTY=点/0;PWD=/home/czanik;用户=根;TSID=00000A;COMMAND=/bin/bashNov1812:40:30centos8splunk.localdomainsudo[21028]:czanik:命令被I/O插件拒绝;HOST=centos7sudo.localdomain;TTY=点/0;PWD=/home/czanik;用户=根;COMMAND=/bin/bash3.Relaysudo_logsrvd(version1.9.0)最初是为了集中收集session记录而引入的,客户端只能直接发送记录。1.9.7版引入了中继的概念。使用中继,您可以将记录发送到构成网络的多个级别的中间主机,而不是直接发送记录。为什么这很重要?首先,即使集中主机由于网络问题或维护不可用,中继也可以收集会话记录。默认情况下,sudo在无法发送记录时拒绝运行,因此中继可确保您可以24/7全天候使用sudo。其次,它还允许您对网络进行更严格的控制。您不需要为所有主机打开到中央sudo_logsrvd的防火墙,只需允许您的中继通过即可。最后,它允许您从没有直接互联网访问的网络收集会话日志,例如AWS专用网络,您可以在网关主机上以中继模式安装sudo_logsrvd。当您使用中继时,sudo客户端和集线器的sudo_logsrvd配置保持不变。在中继主机上,将以下行添加到sudo_logsrvd.conf的[relay]部分:relay_host=172.16.167.161如果您知道与中央服务器的网络连接存在问题,则可以配置一个中继来存储日志在转发它之前:store_first=true4.记录子命令你有没有想过在通过sudo启动的shell会话中发生了什么?是的,存在会话日志记录,但查看几个小时的日志记录只是为了查看一些命令是如何执行的,这让人筋疲力尽。无聊而且浪费大量时间。幸运的是,1.9.8版本引入了子命令日志记录。现在,只需定期检查您的日志信息,只有在发生可疑情况时才查看日志。您甚至不需要规则来允许shell访问,您只需要访问编辑器即可访问shell。大多数编辑器都可以运行外部命令。我最喜欢的编辑器是JOE,这是我通过sudo启动它时可以看到的内容:Aug3013:03:00czplaptopsudo[10150]:czanik:TTY=pts/1;PWD=/home/czanik;用户=根;COMMAND=/usr/bin/joe不要感到惊讶,在编辑器中,我生成了一个shell并从该shell中删除了一些文件和分区。现在让我们看看启用子命令日志记录时会发生什么:Aug3013:13:14czanik:TTY=pts/1;PWD=/home/czanik;用户=根;COMMAND=/usr/bin/joeAug3013:13:37czanik:TTY=pts/1;PWD=/home/czanik;用户=根;COMMAND=/bin/sh-c/bin/bashAug3013:13:37czanik:TTY=pts/1;PWD=/home/czanik;用户=根;COMMAND=/bin/bashAug3013:13:37czanik:TTY=pts/1;PWD=/home/czanik;用户=根;COMMAND=/usr/bin/readlink/proc/10889/exe[...]8月30日13:13:37czanik:TTY=pts/1;PWD=/home/czanik;用户=根;命令=/usr/bin/sed-rs@/*:|([^\\\\]):@\1\n@g;H;x;s@/\n@\n@8月30日13:13:37czanik:TTY=pts/1;PWD=/home/czanik;用户=根;命令=/usr/bin/ttyAug3013:13:42czanik:TTY=pts/1;PWD=/home/czanik;用户=根;COMMAND=/usr/bin/idAug3013:13:56czanik:TTY=pts/1;PWD=/home/czanik;用户=根;COMMAND=/usr/bin/ls-A-N--color=none-T0/usr/share/syslog-ng/include/scl/我省略了几十行以节省一些空间,但你仍然可以看到我启动了一个shell,在log中也可以看到bash_profile执行的命令。您可以在sudoers文件中使用以下设置启用子命令日志记录:`Defaultslog_subcmds`在传统的sudo日志中,您可以从sudo进程ID看出这些日志来自完全相同的sudo会话。如果打开JSON格式的日志记录,如前所示,sudo会在日志中记录更多信息,便于分析。5.拦截子命令记录子命令可以消除sudo的大部分隐患,但在某些情况下,你不仅要观察正在发生的事情,还要控制事件的流向。例如,您需要授予用户shell权限,但仍希望阻止他们运行特定命令。在这种情况下,拦截是理想的。当然,也有一些限制,比如你不能限制shell的内置命令。例如,who命令是危险的。您可以分两步启用拦截。第一步是启用它,第二步是配置它。在这种情况下,不允许我的用户运行who:DefaultsinterceptczanikALL=(ALL)ALL,!/usr/bin/who当我通过sudo启动rootshell会话并尝试运行who时,会发生以下情况:$sudo-s#who抱歉,不允许用户czanik在czplaptop.bash上以root身份执行'/usr/bin/who':/usr/bin/who:Permissiondenied您可以轻松地完全禁用运行shell:默认值interceptCmnd_AliasSHELLS=/usr/bin/bash,/usr/bin/sh,/usr/bin/cshczanikALL=(ALL)ALL,!SHELLS这意味着您无法通过sudo启动shell会话。不仅如此,您还无法从编辑器执行外部命令。当我尝试从vi中启动ls命令时会发生这种情况:$sudovi/etc/issue抱歉,不允许用户czanik在czplaptop上以root身份执行'/bin/bash-c/bin/ls'。无法执行shell/bin/bashPressENTER或键入命令以继续下一步是什么?我希望在阅读我的帖子后,我会亲自尝试这些新功能。您可以通过包管理器在许多Linux发行版和UNIX变体上安装最新的sudo,或者使用Sudo网站上的二进制安装程序。