Sudo是一种实用程序,可让系统管理员为用户或组提供以其他用户身份运行命令的功能。 换句话说,可以在不损害其他用户密码的情况下委派命令特权。 该过程由root用户在/ etc / sudoers文件中创建sudo条目来执行。 使用visudo命令编辑文件。 在委派权限时,需要有信任的元素,以便尊重您所交出的责任。 让我们搁浅一个城市神话:sudo并非纯粹用于允许用户以root用户身份运行某些命令; 它主要用于,因此可以委派另一个用户以应用程序用户/所有者的身份运行应用程序或系统命令。 如果您当前在系统上安装了sudo,它将不会覆盖现有的sudoers文件。 但是与往常一样,制作/ etc / sudoers的备份副本并阅读升级说明。
下载最新版本的sudo 。
本文不是sudo的介绍。 相反,它着眼于不同的sudo功能。
在本演示中,我使用了sudo 1.7.2版。 如果您正在运行AIX®5.3,请确保您具有当前的gcc版本,即4.0.0。
# export LIBPATH=/usr/lib # ./configure --with-aixauth # make # make install要以root用户身份确认安装的版本并查看构建选项以及当前安装的配置,请使用:
# sudo -V Sudo version 1.7.2 Sudoers path: /etc/sudoers Authentication methods: 'aixauth' < rest of output truncated>从1.6.9版开始,在sudo执行给定的脚本或命令之前,将剥离某些系统环境变量(如LIBPATH)。 这可能会导致在sudo下运行的现有命令出现问题。 但是,通常有一种解决方法。
默认:
sudo放在/ usr / local / bin中。 使用此命令以其他用户身份运行命令。 visudo放在/ usr / local / sbin中。 使用它来编辑sudoers文件。 sudoers文件(如果尚不存在)放在/ etc中。 该文件包含sudo条目。/ etc / sudoers(通常称为sudoers)文件控制着可以使用sudo运行的对象和对象。 这些条目由root用户或具有root特权的用户执行。 sudoers中sudo条目的最基本形式是:
<user> <host> = <user to alias> <password required> < command to run>要查看用户可以运行哪些命令以及在sudo下分配了哪些其他约束,请以用户身份运行:
sudo -l要运行sudo命令,常规格式为:
sudo -u < user to run as> <command to run>使用/etc/syslog.conf文件中的条目,使用syslog将所有以sudo运行的命令记录到/ var / adm / messages中:
*.debug /var/adm/messages但是,我认为sudo命令应该记录到一个单独的文件中,这使得查看和调查已运行的sudo命令更加容易。 当然,这也有助于密切注意失败的sudo事件。 创建文件/var/adm/sudo.log,然后在/ etc / sudoers文件中,输入以下条目:
Defaults logfile=/var/adm/sudo.log Defaults !syslog现在,所有成功执行的sudo事件是否都转到/var/adm/sudo.log。
随着时间的流逝,您的sudoers文件将随着越来越多的条目而增长,这是可以预期的。 这可能是因为在服务器上放置了更多的应用程序环境,或者是由于将当前任务的委派进一步拆分以分离责任。 在很多条目中,可能会出现错别字,这很常见。 使sudoers文件更易于由root用户管理,这具有良好的管理意义。 让我们看一下可以实现这一目标的两种方法,或者至少可以建立一个良好的标准。 如果您有很多静态条目(意味着在sudo所在的每台机器上都运行相同的命令),请将它们放入单独的sudoers文件中,这可以使用include指令来实现。
在添加或修改条目时,为单个用户设置多个条目也很耗时。 对于许多用户条目,最好将它们分组。 使用组,您可以从字面上将用户分组在一起,并且这些组是有效的AIX组。
现在,仔细研究这两种方法。
在大型企业环境中,保持sudoers文件是一项重要且定期需要的任务。 使此琐事变得更容易的解决方案是重新组织sudoers文件。 一种实现方法是提取静态或可重复使用的条目,其中在每个框中运行相同的命令。 像审核/安全性或storix备份或一般性能报告一样,使用sudo现在可以使用include指令。 然后,主sudoers文件可以包含本地条目,并且包含文件几乎不需要编辑,因为这些条目是静态的。 调用visudo时,它将在看到包含项时扫描sudoers。 它将扫描该文件,然后返回到主目录并进行扫描。 实际上,它是这样工作的。 当您从sudoers主文件退出visudo时,它将带您进入包含文件进行编辑。 退出包含后,您将返回到AIX提示符。 您可以有多个包含文件,但我想不出您想要多个的原因。
让我们将辅助sudoers文件称为sudo_static。<hostname>。 在此演示的示例中,我使用的主机名是rs6000。 在主sudoers文件中,进行如下输入:
#include /etc/sudo_static.rs6000接下来,将一些条目添加到/etc/sudo_static.rs6000文件中。 您不必放入所有的sudoers指令或节。 如果此文件包含不需要的条目,请不要包含它们。 例如,我的包含文件仅包含以下文本,仅此而已。
您可以使用%h,而不用输入实际的主机名:
我个人不使用此方法,因为我经历过在主机名上返回多余的字符。 此问题已在sudo 1.7.2 p1中修复。
bravo rs6000 = (root) NOPASSWD: /usr/opt/db2_08_01/adm/db2licd -end bravo rs6000 = (root) NOPASSWD: /usr/opt/db2_08_01/adm/db2licd bravo rs6000 = (db2inst) NOPASSWD: /home/db2inst/sqllib/adm/db2start bravo rs6000 = (db2inst) NOPASSWD: /home/db2inst/sqllib/adm/db2stop force当您运行visudo并保存并退出文件时,visudo会通知您单击Enter以编辑include sudoers文件。 编辑完文件后,sudo会处理语法错误(如果有的话),与主文件一样。 或者,要直接编辑包含文件,请使用:
visudo -f /etc/sudo_static.rs6000。
可以将属于有效AIX组的用户包括在sudoers中,从而使sudoers文件更易于管理,每个用户的条目更少。 重新组织sudoers条目以包括组时,可能必须在AIX下创建一个新组,以包括仅允许对某些命令使用sudo的用户。 要使用组,只需在条目前面加上'%'。 假设您有称为devops和devuat的组,并且这些组具有以下用户:
# lsgroup -f -a users devops devops: users=joex,delta,charlie,tstgn # lsgroup -f -a users devuat devuat: users=zebra,spsys,charlie为了允许组devops作为dbdftst运行/usr/local/bin/data_ext.sh命令。
为使组devuat能够以dbukuat的身份运行命令:/usr/local/bin/data_mvup.sh、/usr/local/bin/data_rep.sh。
我们可能有以下sudoers条目:
%devops rs6000 = (dbdftst) NOPASSWD: /usr/local/bin/data_ext.sh %devuat rs6000 = (dbukuat) /usr/local/bin/data_mvup.sh %devuat rs6000 = (dbukuat) /usr/local/bin/data_rep.sh注意,在前面的条目中,执行/usr/local/bin/data_ext.sh时不会提示devops组用户输入密码。 但是,将向组忠实用户提供密码。 用户“ charlie”是这两个组( devops和devuat )的成员,因此他可以执行上述所有命令。
Sudo具有一项功能,该功能使用时间票来确定自上一个sudo命令运行以来的时间。 在此时间段内,用户可以重新运行命令而不会提示输入密码(这是用户自己的密码)。 一旦此分配时间结束,系统将再次提示用户输入密码以重新运行命令。 如果用户输入了正确的密码,则将执行命令,然后重新设置工单,并重新开始计时。 如果您在sudoers中的用户条目中没有NOPASSWD,票证功能将不起作用。 默认超时为五分钟。 如果要更改默认值,只需在sudoers中放置一个条目即可。 例如,要将用户“ bravo”在他运行的所有命令上的超时值设置为20分钟,可以使用:
Defaults:bravo timestamp_timeout=20要以用户身份销毁票证,请使用:
$ sudo -k销毁票证后,将在运行sudo命令时提示用户再次输入密码。
请不要为所有用户设置超时值,因为这会引起问题,尤其是在批量运行作业且批量运行比正常运行更长的时间时。 要禁用此功能,请在timestamp_timeout变量中使用值-1 。 工单是目录条目,用户名位于/ var / run / sudo中。
如前所述,sudo将去除潜在的危险系统变量。 要检查保留了哪些变量以及去除了哪些变量,请使用sudo -V 。 输出将为您提供保留和剥离的变量的列表。 剥离LIBPATH显然是一个不便之处。 有两种解决方法-编写包装脚本或在命令行上指定环境。 首先查看包装器脚本解决方案,假设您有一个停止或启动DB2®实例的应用程序。 您可以创建一个使变量完整的准系统脚本。 在清单1. rc.db2中 ,请注意,您获取了实例概要文件,该概要文件又通过使用以下命令导出了各种LIBPATH和DB2环境变量,使环境变量保持完整:
. /home/$inst/sqllib/db2profile为了完整起见,sudoers中要执行此操作的条目是但不去除任何系统环境变量:
bravo rs6000 = (dbinst4) NOPASSWD: /home/dbinst4/sqllib/adm/db2start bravo rs6000 = (dbinst4) NOPASSWD: /home/dbinst4/sqllib/adm/db2stop force bravo rs6000 = (dbinst4) NOPASSWD: /usr/local/bin/rc.db2 stop db2inst4 bravo rs6000 = (dbinst4) NOPASSWD: /usr/local/bin/rc.db2 start db2inst4请注意,在此示例中,用户“ bravo”可以以用户“ dbinst4”的身份执行上述命令。 通常,用户将运行:
sudo -u dbinst4 /usr/local/bin/rc.db2 stop db2inst4 sudo -u dbinst4 /usr/local/bin/rc.db2 start db2inst4保留系统环境变量的另一种方法是使用Defaults!env_reset指令,如sudoers中所示:
Defaults !env_reset然后从命令行中,指定环境变量名称及其值:
$ sudo LIBPATH=″/usr/lib:/opt/db2_09_05/lib64″ -u delta /usr/local/bin/datapmp如果不放入!env_reset条目,则在尝试运行命令时,将从sudo收到以下错误:
sudo: sorry, you are not allowed to set the following environment variables: LIBPATH如果发现sudo还在剥离其他环境变量,则可以在sudoers中指定变量名称,以便sudo保持这些变量完整(使用Defaults env_keep + =指令)。 例如,假设sudo从我的suodo脚本中删除了应用程序变量DSTAGE_SUP和DSTAGE_META。 为了保留这些变量,我可以将以下条目放在sudoers中:
Defaults env_keep += "DSTAGE_SUP" Defaults env_keep += "DSTAGE_META"请注意,我给出了变量名而不是变量值。 这些值已经包含在我的脚本中,如下所示:
export DSTAGE_SUP=/opt/dstage/dsengine; export DSTAGE_META=/opt/dstage/db2现在,当执行sudo脚本时,将保留上述环境变量。
可以使用secure_path指令在sudoers中设置默认PATH。 该伪指令指定用户执行sudo命令时在何处查找二进制文件和命令。 该选项显然试图锁定用户运行sudo命令的特定区域,这是一种好习惯。 在sudoers中使用以下指令,并在其搜索目录中指定安全PATH:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/opt/freeware/bin:/usr/sbin"可以设置限制以将某些命令限制给用户。 假设您有一个名为dataex的组,其成员为“ alpha”,“ bravo”和“ charlie”。 现在,该组已被允许运行sudo命令/ usr / local / bin / mis_ext * ,其中星号表示传递给脚本的许多参数。 但是,如果参数为import ,则不允许用户“ charlie”执行该脚本。 可以通过使用逻辑NOT '!'来满足这种条件。 操作员。 这是在sudoers中实现的方式:
%dataex rs6000 = (dbmis) NOPASSWD: /usr/local/bin/mis_ext * charlie rs6000 = (dbmis) NOPASSWD: !/usr/local/bin/mis_ext import请注意,逻辑非运算符条目位于非限制性条目之后。 可以在同一行上应用许多条件NOT条目。 只需确保它们之间用逗号分隔即可,如下所示:
charlie rs6000 = (dbmis) NOPASSWD: /usr/local/bin/aut_pmp * charlie rs6000 = (dbmis) NOPASSWD: !/usr/local/bin/aut_pmp create, !/usr/local/bin/aut_pmp delete, !/usr/local/bin/aut_pmp amend在visudo中时,不要认为仅保存sudo条目并停留在visudo中会使更改生效。 不会的。 您必须退出visudo才能使更改生效。
最好使用ssh脚本作为root用户将sudo命令推出到企业环境中的远程主机,并且应该在主机之间交换密钥,以便进行无密码登录。 让我们看一个如何做到这一点的例子。 对于地理上远程的机器,如果遇到某种硬件问题(磁盘或内存),IBM®工程师将在现场更换故障硬件。 在某些情况下,他们需要输入root密码才能执行任务。 您可能要执行的一种过程是让工程师获得对root的访问权限,他们必须使用sudo。 在访问密码之前通知工程师是有利的。 清单2演示了可以推广此配置的一种方法。 更仔细地查看清单2 ,使用一个for循环,其中包含要推出的主机列表。 (不过,通常,您会将这些主机保存在一个文本文件中,并使用while循环读取它们。)使用“ here”文档方法,制作sudoer的备份副本,然后将一个条目附加到sudoer,就像这样:
# -- ibmeng sudo root ibmeng host1 = (root) NOPASSWD:ALL接下来,创建用户“ ibmeng”,并使用chpasswd为该用户设置密码。 在此演示中,它是ibmpw 。 然后,一条消息将添加到他们的配置文件中,通知用户如何sudo到root。 因此,当工程师登录时,会向他显示以下消息:
IBM Engineer, to access root account type: sudo -u root su -当然, ibmeng的帐户将在访问后被锁定。
Sudo允许您控制谁可以与谁一起运行哪些命令。 但是您必须能够完全理解sudoers的功能,以最大程度地了解其含义和责任。
翻译自: https://www.ibm.com/developerworks/aix/library/au-sudo/index.html