Sudo授权需谨慎,不然亲人哭了!sudo代表“superuserdo”,它允许经过身份验证的用户像其他用户一样运行命令。其他用户可以是普通用户或超级用户。但是,大多数时候我们使用它来以提升的权限运行命令,而不是直接使用root用户。sudo命令与安全策略结合使用,可以通过文件/etc/sudoers.conf来配置。其安全策略具有高度可扩展性并支持插件扩展。默认情况下,/etc/sudoers不能被任何人直接编辑,因为它的权限是440。虽然授予写权限后也可以编辑,但是建议使用visudo命令编辑该文件。1.了解工作模式并简单描述其使用流程和配置文件配置![1]了解sudo命令的工作流程sudo读取并解析/etc/sudoers文件,找到调用该命令的用户及其权限。然后提示调用该命令的用户输入密码,或者可以通过传递NOPASSWD标志来跳过密码验证。之后sudo创建一个子进程调用setuid()切换到目标用户。优选地,它将在上述子进程中执行给定的shell或命令。[2]理解sudo命令授权配置USER/GROUPHOST=(USER[:GROUP])[NOPASSWD:]COMMANDSUSER/GROUP:表示需要授权的用户或组;如果是组,需要以%HOST开头:表示权限从哪些主机登录的用户运行sudo命令;ALL表示允许从任何终端或机器访问(USER[:GROUP]):表示使用sudo切换用户或组,组不能指定;ALL表示切换到系统所有用户NOPASSWD:如果指定,用户或组在使用sudo时不需要输入密码COMMANDS:表示运行指定的命令;ALL表示允许执行所有命令#允许sudo组执行所有命令%sudoALL=(ALL:ALL)ALL#允许用户执行所有命令而不输入密码escapeALL=(ALL)NOPASSWD:ALL#只允许用户执行执行echo,ls命令escapeALL=(ALL)NOPASSWD:/bin/echo/bin/ls#运行本机的用户执行关机命令escapelocalhost=/sbin/shutdown-hnow#允许users用户组的用户使用mount,unmount,和chrom命令类似root用户%usersALL=/sbin/mount/mnt/cdrom,/sbin/umount/mnt/cdrom[3]configurationDefaultsoption#指定用户尝试输入密码的次数,默认valueis3Defaultspasswd_tries=5#设置密码超时时间,默认5分钟defaultspasswd_timeout=2默认sudo询问用户自己的密码,添加targetpw或rootpw配置可以让sudo询问root密码Defaulttargetpw#指定自定义日志文件Defaultslogfile="/var/log/sudo.log"#记录主机名和四位数year在自定义日志文件中,可以添加log_host和log_year参数defaultslog_host,log_year,logfile="/var/log/sudo.log"#保留当前用户的环境变量Defaultsenv_keep+="LANGLC_ADDRESSLC_CTYPECOLORSDISPLAYHOSTNAMEEDITOR"Defaultsenv_keep+="ftp_proxyhttp_proxyhttps_proxyno_proxy"#放置一个安全的PATH环境变量Defaultssecure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin》2.使用技巧总结主要介绍sudo相关命令的使用技巧和解决问题的方法![1]如何将visudo编辑器从nano改成vim?我用visudo命令的时候,总是用nano编辑器打开,对于用惯了vi或者vim的用户来说,显得有点别扭,操作起来也不太方便。那么,如何更好的把visudo编辑器从把nano改成vim就变得很重要了,最好的办法就是调用命令将终端编辑器永久替换成vim编辑器,一劳永逸,我们只需要执行下面的命令,输入我们编辑器的序号即可需要并按下回车键。n下次执行visudo命令时,您将使用vim编辑器打开该文件。#因为/etc/sudoers普通用户无法打开使用$sudoupdate-alternatives--configeditorThereare4choicesforthealternativeeditor(providing/usr/bin/editor).SelectionPathPriorityStatus-----------------------------------------------------------*0/bin/nano40automode1/bin/ed-100manualmode2/bin/nano40manualmode3/usr/bin/vim.basic30manualmode4/usr/bin/vim.tiny10manualmodePressentertokeepthecurrentchoice[*],ortypeselectionnumber:3第二种方案是通过环境变量修改当前终端的默认编辑器。#在.zshrc或.profile文件中$exportEDITOR=vim;#想实现对visudo生效$sudoEDITOR=vimvisudo#或者修改/etc/sudoers文件的默认编辑器defaultseditor=/usr/bin/vim[2]如何强制Vim保存只读文件?在使用vim时,普通用户打开一个只有root用户有操作权限的文件时,编辑后保存时发现该文件没有修改权限。好不容易编辑完文件,却无法保存,只能作罢,然后退出,用root权限打开,重新编辑,好痛苦!那么有没有什么好的方法可以解决这个问题呢?咳咳咳,一定有。#Vim命令模式可以执行强制保存#w:表示保存文件#!:表示执行外部命令#tee:表示将数据重定向到给定的文件和屏幕#%:执行外部命令时,%将扩展成为当前文件名:w!sudotee%上面的方法完美解决了只读文件无法保存的问题,但毕竟命令还是有点长。为了避免每次输入一长串命令,可以映射到一个简单的命令添加到.vimrc。这样,只需运行:w!!,命令的后半部分>/dev/null用于显式丢弃标准输出的内容。"AllowsavingofffilesassudowhenIfforgottostartvimusingsudo.cmapw!!w!sudotee>/dev/null%[3]如何更安全地编辑文件?Sudoedit是一个内置命令,允许用户安全地编辑文件。根据sudo手册页,sudoedit是相当于使用-e命令行选项执行sudo。那么这个命令是做什么的,它首先创建一个你要编辑的文件的临时副本。命令然后搜索SUDO_EDITOR,VISUAL和EDITOR环境变量(按顺序)来确定哪个应该调用编辑器打开刚刚创建的临时副本。当用户完成修改工作时,更改将被复制回原始文件。#Sudo命令手册页-e,--editEditoneormorefilesinsteadofrunningacommand.Inlieuofapathname,thestring"sudoedit"isusedwhenconsultingthesecuritypolicy.Iftheuserisauthorizedbythepolicy,thefollowingstepsaretaken:1.Temporarycopiesaremadeofthefilestobeeditedwiththeownersettotheinvokinguser.2.Theeditorspecifiedbythepolicyisruntoeditthetemporaryfiles.ThesudoerspolicyusestheSUDO_EDITOR,VISUALandEDITORenvironmentvariables(inthatorder).IfnoneofSUDO_EDITOR,VISUALorEDITORareset,thefirstprogramlistedintheeditorsudoers(5)optionisused.3.Iftheyhavebeenmodified,thetemporaryfilesarecopiedbacktotheiroriginallocationandthetemporaryversionsareremoved.Ifthespecifiedfiledoesnotexist,itwillbecreated.Notethatunlikemostcommandsrunbysudo,theeditorisrunwiththeinvokinguserisenvironmentunmodified.If,forsomereason,sudoisunabletoupdateafilewithitseditedversion,theuserwillreceiveawarningandtheeditedcopywillremaininatemporaryfile.#Sudo命令手册页-e,--editEditoneormorefilesinsteadofrunningacommand.Inlieuofapathname,thestring"sudoedit"isusedwhenconsultingthesecuritypolicy.Iftheuserisauthorizedbythepolicy,thefollowingstepsaretaken:1.Temporarycopiesaremadeofthefilestobeeditedwiththeownersettotheinvokinguser.2.Theeditorspecifiedbythepolicyisruntoeditthetemporaryfiles.ThesudoerspolicyusestheSUDO_EDITOR,VISUALandEDITORenvironmentvariables(inthatorder).IfnoneofSUDO_EDITOR,VISUALorEDITORareset,thefirstprogramlistedintheeditorsudoers(5)optionisused.3.Iftheyhavebeenmodified,thetemporaryfilesarecopiedbacktotheiroriginallocationandthetemporaryversionsareremoved.Ifthespecifiedfiledoesnotexist,itwillbecreated.Notethatunlikemostcommandsrunbysudo,编辑器与调用用户一起运行,环境未修改。如果出于某种原因,sudo无法使用编辑后的版本更新文件,用户将收到警告,并且编辑后的副本将保留在临时文件中。[4]如何随意设置sudo会话时间?其中sudo命令是一个授权命令,在生产环境中使用非常普遍。默认情况下,sudo命令会话时间为15分钟设置sudo密码超时值,需要通过passwd_timeout参数进行设置。您可以在几分钟内将其设置为您想要的任何时间,它会一直等到超时。如果您希望为每个执行的sudo命令弹出密码提示,您也可以将时间设置为0,或者通过将值设置为-1来永久禁用密码提示。#设置超时时间#表示sudo密码提示会在用户使用20分钟后过期。Defaultsenv_reset,timestamp_timeout=20[5]如何更安全地授权服务器权限?对于我们管理的服务器,开发人员或者其他人员需要登录服务器调试环境或者重现问题。这个时候我们就需要开启对应用户的登录访问权限。但是如果我们直接编辑/etc/sudoers这个文件,我就需要在对方用完后自己手动清理一下。如果我们忘记了,开发者或其他人员将始终能够登录服务器,就会存在一定程度的安全问题。遗憾的是,对于临时授权,在/etc/sudoers文件中并没有相应的配置,只能在指定的时间范围内对用户或用户组进行授权。当用户到达指定时间点时,将拒绝用户再次登录。对应这种情况,我们可以通过crontab定时任务和/etc/sudoers.d目录的机制来完美解决上述问题。我们使用定时任务的定时执行目录,定时删除/etc/sudoers.d/目录下的用户或用户组的授权配置文件。比如我们需要每天删除临时授权的用户或者用户,可以创建rm-rf命令删除/etc/cron.daily目录下的/etc/sudoers.d/目录,然后定时自动删除。对于授权用户,我们使用在/etc/sudoers.d/目录下单独创建一个配置文件,而不是直接修改/etc/sudoers文件。#crontab有多种定时机制#下面分别表示$ls-dl/etc/cron.*|grep-vcron.d$drwxr-xr-x2rootroot4096May1506:18/etc/的每天、每小时、每月、每周执行cron.dailydrwxr-xr-x2rootroot4096Feb142019/etc/cron.hourlydrwxr-xr-x2rootroot4096Feb142019/etc/cron.monthlydrwxr-xr-x2rootroot4096Jun1809:57/etc/cron.weekly#创建单独的授权配置文件$ls-lh/etc/sudoers.d/-r--r-----1rootroot666Oct62017lisi-r--r-----1rootroot958Jan182018zhangsan#查看授权配置文件内容$cat/etc/sudoers.d/zhangsanALLALL=(root)NOPASSWD:zhangsan[6]如何解决sudo命令找不到环境变量的问题?我们在日常使用sudo命令的时候,经常会遇到切换用户后,为什么会发现之前设置的环境变量不见了呢?这是因为我们执行完sudo命令后会切换用户。如果保留环境变量,会存在一定的安全问题。系统默认会将环境变量重置为安全环境变量。之前设置的变量将失效,只能保留配置文件中指定的少数环境变量。我们可以查看sudo的配置文件/etc/sudoers来找出原因。我们执行下面的命令后,可以看到如下输入(这里可能和我的不一样)。其中env_reset表示默认会重置环境变量,这样我们自定义的变量在sudo命令执行后就会失效,无法正确获取变量值。而env_keep的意思就是用来保持一些环境变量不被重置,需要保持的变量写在双引号里面,需要保持的变量可以自己添加。最后是secure_path变量,它的作用是将包含的路径作为sudo环境的PATH变量。如果在sudo环境下找不到某些命令,可以在配置项中加入这些命令的路径。$sudosed'/^#/d;/^$/d'/etc/sudoersDefaultsenv_resetDefaultsenv_keep="COLORSIDSPLAYHOSTNAMEHISTSIZELS_COLORS"Defaultsenv_keep+="MAILPS1PS2QTDIRUSERNAMELANGLC_ADDRESS"Defaultssecure_path="/usr/local/sbin:/usr/local/bin/bin:/usr/usr/bin:/sbin:/bin:/snap/bin”知道原因后,我们可以针对上述情况做出不同的解决方案,解决sudo命令找不到环境变量的问题。第一种方案是在使用的时候加上-E参数。添加-E选项后,用户在执行sudo时可以保留当前用户已有的环境变量,不会被sudo重置。另外,如果用户对指定的环境变量没有权限,也会报错。需要注意的是,在内测机中,在对安全性要求不高的情况下使用。$sudosudo-E第二种方案是修改sudo配置文件。可以通过修改/etc/sudoers文件中的env_keep和secure_path配置项来指定sudo环境中需要保留的环境变量和路径。当然我们也可以把配置文件的变量!env_reset去掉,这样就不会有限制了。$sudovim/etc/sudoersDefaults!env_reset3。参考链接地址如何解决sudo命令找不到环境变量的问题
