了解如何在授予受信任用户对托管网络功能和特定服务的权限的同时保护root密码的安全。我最近编写了一个简短的Bash程序,用于将MP3文件从一台网络主机上的USB记忆棒复制到另一台。复制的文件存放在志愿者组织的服务器上的特定目录下,可以下载和播放。我的程序还做其他事情,比如在复制文件之前重命名文件,以便在网页上按日期自动对它们进行排序。验证复制完成后,USB驱动器上的所有文件也将被删除。这个小程序还有一些其他选项,比如-h显示帮助,-t进入测试模式等。我的程序需要以root身份运行才能运行。但是,组织里很少有人有兴趣管理音频和计算机系统,所以我不得不找半生不熟的人,培训他们登录用于传输的计算机并运行这个小程序。不是我自己跑不了程序,而是因为出差、生病等各种原因,不是时时都在。即使我在那里,作为一个“懒惰的系统管理员”,我也希望别人为我做这件事。所以我写了一些脚本来自动执行这些任务,并指定某些人通过sudo运行这些脚本。许多Linux命令要求用户以root身份运行。sudo保护系统免受混乱时刻造成的意外损坏以及恶意用户的故意损坏。尽可能使用sudoSudo是一个非常方便的工具,它让我一个拥有root权限的管理员可以将全部或部分管理任务分配给其他用户,而且不需要告诉他们root密码,从而确保主机安全性高。假设,我授予普通用户ruser访问我的Bash程序myprog的权限,并且该程序的某些功能需要root权限。然后用户可以以ruser身份登录并使用以下命令运行myprog。sudomyprogsudo程序检查/etc/sudoers文件以查看是否允许ruser运行myprog。如果允许,sudo将要求用户输入密码-而不是root密码。用户输入密码后,程序运行。此外,sudo还会记录myprog程序运行的日期和时间、完整的命令以及运行它的人。此数据将记录在/var/log/security中。我发现记录训练时使用sudo执行的每个命令很有帮助。我可以看到谁执行了哪些命令以及他们是否正确执行。我将运行该程序的权限委托给了我自己和另一个人;然而,sudo可以做更多。它允许系统管理员将管理的网络功能或特定服务委托给受信任的人或一组人。这使您可以保证root密码的安全,同时还可以使用这些功能。配置sudoers文件作为系统管理员,我使用/etc/sudoers文件来设置某些用户或某些用户组有权访问某个命令,或一组命令,或所有命令。这种灵活性是使用sudo进行委派的强大和简单的关键。一开始我被sudoers文件弄糊涂了,所以下面我将在我使用的主机上复制并反汇编完整的sudoers文件。希望在分析过程中没有让您感到困惑。无意中发现基于RedHat的发行版中的默认配置文件有很多注释和示例来指导你如何修改,这使得修改配置文件变得非常容易,而且不需要在网上搜索那么多。向上。不要直接用编辑器修改sudoers文件,而是使用visudo命令,因为保存退出编辑器后该命令会立即生效。Visudo还可以使用Vi以外的其他编辑器。我们先来分析一下文件中的各种别名。主机别名主机别名部分用于创建主机组,授予该组中的主机可以访问的命令或命令别名。基本思想是这个文件由组织中的所有主机维护,然后复制到每个主机上的/etc。其中一些主机,比如各种服务器,可以配置成一个组来授予用户访问特定命令的权限,比如启动和停止HTTPD、DNS、网络服务等服务;可以挂载文件系统等。在设置主机别名时,您还可以使用IP地址而不是主机名。##主机别名##机器组。您可能更喜欢使用主机名(可能对整个域使用##通配符)或IP地址。并按组分配特定的root权限。在这部分,我添加了一行User_AliasAUDIO=dboth,ruser,并定义了一个别名AUDIO来指代两个用户。正如sudoers文件中所阐明的,也可以直接使用/etc/groups中定义的组,而无需自己为它们设置别名。如果你定义的组(假设组名是audio)已经满足要求,那么后面分配命令的时候只需要在组名前加一个%号,像这样:%audio。##用户别名##这些通常不是必需的,因为您可以在此文件中使用常规组##(即来自文件、LDAP、NIS等)——只需使用%groupname##而不是USERALIAS#User_AliasADMINS=jsmith,mikemUser_AliasAUDIO=dboth,ruser命令别名后跟命令别名的部分。这些别名代表了一系列相关的命令,比如网络相关命令,或者RPM包管理命令。这些别名允许系统管理员轻松地为一组命令分配权限。这部分已经设置了很多别名,这使得为某些类型的命令分配权限变得更加方便。##命令别名##这些是相关命令组...##Networking#Cmnd_AliasNETWORKING=/sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net,/sbin/iptables,/usr/bin/rfcomm,/usr/bin/wvdial,/sbin/iwconfig,/sbin/mii-tool##软件的安装与管理#Cmnd_AliasSOFTWARE=/bin/rpm,/usr/bin/up2date,/usr/bin/yum##Services#Cmnd_AliasSERVICES=/sbin/service,/sbin/chkconfig##更新locate数据库#Cmnd_AliasLOCATE=/usr/bin/updatedb##Storage#Cmnd_AliasSTORAGE=/sbin/fdisk,/sbin/sfdisk,/sbin/parted,/sbin/partprobe,/bin/mount,/bin/umount##委派权限#Cmnd_AliasDELEGATING=/usr/sbin/visudo,/bin/chown,/bin/chmod,/bin/chgrp##Processes#Cmnd_AliasPROCESSES=/bin/nice,/bin/kill,/usr/bin/kill,/usr/bin/killall##Drivers#Cmnd_AliasDRIVERS=/sbin/modprobeenvironmentdefaults下面部分内容设置默认环境变量。这部分最值得一提的是!visiblepw这一行,意思是当用户环境设置为显示密码时,禁止sudo运行。不应修改此安全措施。#Defaultsspecification##如果无法在tty上禁用echo,则拒绝运行。#Defaults!visiblepwDefaultsenv_resetDefaultsenv_keep="COLORSDISPLAYHOSTNAMEHISTSIZEKDEDIRLS_COLORS"Defaultsenv_keep+="MAILPS1PS2QTDIRUSERNAMELANGLC_ADDRESSLC_CTYPE"Defaultsenv_keep+="LC_COLLATELC_IDENTIFICATIONLC_MEASUREMENTLC_MESSAGES"默认env_keep+="LC_MONETARYLC_NAMELC_NUMERICLC_PAPERLC_TELEPHONE"默认env_keep+="LC_TIMELC_ALLLANGUAGELINGUAS_XKB_CHARSETXAUTHORITY"默认secure_path=/sbin:/sbin:/usr:/usr/local/bin命令部分命令部分是sudoers文件的主体。不使用别名不会影响你想要达到的效果。别名只是简化了整个配置工作。这部分使用之前定义的别名来告诉sudo谁可以在哪些机器上做什么。一旦你理解了这部分的语法,你会发现这些例子非常直观。下面我们来看看它的语法。ruserALL=(ALL)ALL表示ruser可以作为任何主机上的任何用户运行任何命令。这是为用户ruser所做的配置。该行中的第一个ALL表示此规则对所有主机都有效。第二个ALL允许ruser像任何其他用户一样运行命令。默认情况下,命令以root身份运行,但ruser可以在sudo命令行上指定程序以其他用户身份运行。最后一个ALL表示ruser可以不受限制地运行所有命令。这使得ruser有效地成为root。请注意,下面还有一个针对root的配置。这允许root通过sudo在任何主机上运行任何命令。rootALL=(ALL)ALL表示root可以在任何主机上作为任何用户运行任何命令。为了测试效果,我把这行注释掉了,然后尝试以root身份直接运行chown。令人惊讶的是,这很成功。然后我尝试了sudochown,失败并显示消息“Root不在sudoers文件中。将报告此事件”。也就是说root可以直接运行任何命令,但是加sudo就不行了。这样可以防止root像其他用户一样使用sudo命令运行其他命令,但是root绕过这个限制的方法太多了。下面这行是我添加的用来控制对myprog的访问。它指定只有上面定义的AUDIO组中的用户才能在guest1主机上使用myprog命令。AUDIOguest1=/usr/local/bin/myprog允许AUDIO组的成员访问guest1主机上的myprog注意上面一行只指定了允许访问的主机名和程序,并没有说用户可以以另一个用户身份运行程序。省略密码您还可以传递NOPASSWORD以允许AUDIO组中的用户在没有密码的情况下运行myprog。像这样:AUDIOguest1=NOPASSWORD:/usr/local/bin/myprog允许AUDIO组成员在不输入密码的情况下访问guest1上的myprog我不这样做是因为我认为sudo用户必须停下来思考他们在做什么,这对他们有好处。我这里只是举个例子。wheelsudoers文件(如下所示)的命令部分中的wheel规范允许wheel组中的所有用户在任何机器上运行任何命令。wheel组定义在/etc/group文件中,用户必须加入这个组才能工作。组名前的%符号表示sudo应该在/etc/group文件中查找该组。%wheelALL=(ALL)ALL运行/etc/group文件中定义的所有“wheel”组成员。成员可以在任何主机上运行所有命令。此方法是在不提供root密码的情况下为多个用户提供完全root权限的好方法。只需将用户添加到wheel组即可为他们提供完整的root权限。它还提供了一种通过sudo创建的日志来监视其行为的方法。某些Linux发行版,例如Ubuntu,会自动将用户ID添加到/etc/group中的wheel组,这允许它们使用sudo命令运行所有特权命令。结论我只是在这里试验sudo-我只是给一两个用户以root身份运行单个命令的能力。这是通过仅添加两行配置(忽略注释)来实现的。将任务委派给其他非root用户非常容易,并且可以节省您很多时间。同时,它还会生成日志,帮助您发现问题。sudoers文件有许多其他配置和功能。有关详细信息,请参阅sudo和sudoers的手册页。
