sudoers文件说明 - sudo免密码 - 限制sudo执行特殊命令
nanshan 2024-10-23 12:00 21 浏览 0 评论
注意:
sudoers文件非常重要, 如果编辑错误有可能使你的系统无法正常启动. 或者你再也无法进行到特权级别. 此时你有可能需要恢复你的操作系统. 请谨慎操作!
文件位置
sudoers文件位于:/etc/sudoers里面存储了sudo权限相关的配置. 默认配置下,里面存储了root用户以及adm用户组,sudo用户组相关的权限说明:
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command (sudo group do not need passwd by lijianhong)
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
默认只配置了1个用户,两个组:
- root用户: 系统的最高管理权限者.
- admin组: 这是一个历史用户组, 目前在Ubuntu中已经没有使用:在 Ubuntu 中,默认情况下确实没有名为 admin 的用户组。然而,在较早的 Ubuntu 版本中,存在一个名为 admin 的用户组,该用户组用于管理系统的超级用户权限。在 sudoers 文件中看到的 %admin ALL=(ALL) ALL 配置是为了向后兼容性和支持。即使在新的 Ubuntu 版本中没有 admin 用户组,但为了确保向后兼容性,并允许 sudo 权限的分配给 admin 组的成员,这个配置仍然存在。因此,如果你的 Ubuntu 系统中没有 admin 用户组,你可以忽略这个配置,它对系统的实际权限没有影响。你可以使用其他用户组或指定特定的用户来配置 sudoers 文件,以满足你的实际需求。
- sudo 组: 这个是就正常的sudo用户所在的组, 一般的Ubuntu的默认安装的使用用户.就会在这个sudo组里面. 这样用户就可以有sudo执行权限.
注: 在sudoers文件中, 每一行配置的第一个字段. 如果不是以%开头,表示一般用户. 如果是以%打头,则表示为用户组. 对照上面的默认内容: root是默认用户, 而admin和sudo是默认的两个用户组.
添加sudo权限
我们可以修改 sudoers文件单独添加一个用户的sudo权限.或者是添加一个用户组的sudo权限. 这样就可以做到既可以控制某一个具体的用户.也可以控制一个特定的权限组,这样在有新的用户加入进来的时候,不需要不断的来修改这个sudoers文件来添加权限. 只需要把相应的用户添加到具体相应的权限组即可. 这个有点像ldap的权限管理.
为单个用户添加sudo权限
这个也是最简单,最基本的使用方式. 比如我们要为一个叫jim用户添加sudo权限. 这样这个用户就可以执行sudo命令. 可以直接参考默认的root的配置. 直接在原来的root配置下再添加一条具体用户的配置即可.
# User privilege specification
root ALL=(ALL:ALL) ALL
jim ALL=(ALL:ALL) ALL
这条指令的解释为:
- jim 要配置的用户名
- ALL=(ALL:ALL):表示授予 root 用户在任何主机上、使用任何用户身份(即以任何用户身份)执行任何命令的权限。ALL:表示允许在任何主机上执行命令。=(ALL:ALL):表示以任何用户身份(即以任何用户身份)执行命令。
- ALL:表示允许执行任何命令。
我们画一个图来解释一下:
为一个组添加sudo权限
这个操作与单个用户一样简单,只需要把用户名换为具体的组名. 同时,记住: 组名是以%为标识符号进行标识的. 也就是说组名的前面需要添加一个%表示一个组. 比如我们添加一个minsudev 的组来表示一个开发组. 进入这个开发组的用户都可以执行sudo权限. 于是我们可以这样配置:
#pdev
%minsudev ALL=(ALL) ALL
这样所有在组minsudev的用户都有sudo权限了. 不过每个用户在执行sudo相关的命令时,还是要输入密码的,至于密码是什么,那就每个用户自己的事情了.
sudo权限免密码
为了在使用sudo命令的时候更加的丝滑,不需要被不停的输入密码打断. 那我们可以使用特殊的配置给相应的用户或者组添加一些额外的配置. 这样就可以在使用sudo命令时,不用输入密码了.
这个配置其实也非常简单, 可以给单个人配置,也可以给相应的组配置. 前面我们解释了配置中最后一个ALL是代表可以执行任何命令. 那如果想要免密使用sudo, 那就可以在ALL前面加一个前缀: NOPASSWD , 前缀与指令之间用:分隔开.
我们还是对我们假想的开发组:minsudev组配置免密sudo权限. 相应的配置可以修改为:
%minsudev ALL=(ALL) NOPASSWD:ALL
当然, 最一般的配置. 大家阅读这篇文章可能用的最基本的配置就是,直接给sudo用户组添加免密sudo权限,其配置如下:
# Allow members of group sudo to execute any command (sudo group do not need passwd by lijianhong)
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
一般用户可能阅读到此就可以结束了, 以下内容一般可能不会涉及. 下面我们会再探讨一些更深入的内容. 看着尝试怎么限制特定用户组的特殊指令权限. 比如关机.
限制特权级命令
在用户分级的系统里面我们想到的是,最原始的想法就是不给相应的用户sudo权限, 这样万事皆休对吧. 但是上面我们讨论了要给用户sudo权限, 而且还要更方便的不输入密码形式的sudo指令执行. 那这就带来了另外一个问题, 我虽然给了某些开发一些比较高级的指令,可以执行sudo, 那我可不可以再限制一些高危操作呢. 或者说是一个运维维护命令呢. 比如:
- reboot: 这个可不好, 直接主用户重启主机了. 那谁都可以操作的确有些危险. (一般的运维好像没有做得这么细. 曾经我也在某公司的时候记得是可以reboot的).
- apt install / yum install 此类的包安装命令. 这个可能就是开发吐槽最多的禁止命令了, 一般运维怕开发乱搞机器.那有可能会限制乱安装包. 也有可能是为了数据安全. 禁止了包安装的命令等.
那上面的这些要求怎么办呢? 我们在上面反复提到的指令最后一个字段:ALL, 这个表示是可以执行所有的命令的. 那是不是可以例一些例外? 答案是可以的:
语法
语法也很简单. 直接在ALL的后面添加新的指令, 指令之间用逗号分隔. 不同的是,后面的指令是用!来取反,表示不可执行. 比如我们要限制用户的关机命令:
%minsudev ALL=(ALL) NOPASSWD:ALL,!/usr/bin/reboot
注: 这里对指令的列举是使用的全路径. 这样才能准确的限制一个特定的命令而不产生歧义.
这样我们在执行reboot命令的时候,就会提示:
reboot
Failed to set wall message, ignoring: Interactive authentication required.
Failed to reboot system via logind: Interactive authentication required.
Failed to open initctl fifo: Permission denied
这个是本身权限不足,非root用户在执行reboot时需要sudo权限. 我们再用sudo权限试试:
[nasdev@homeNas]:~$ sudo reboot
Sorry, user nasdev is not allowed to execute '/usr/sbin/reboot' as root on homeNas.
实际可以重启的命令不止一个,我们添加命令:/sbin/reboot
%minsudev ALL=(ALL) NOPASSWD:ALL,!/usr/bin/reboot,!/sbin/reboot
这样我们添加了两个可以. 实际上可以关机的命令不止这两个. 如果要限止全还需要添加更多的命令.
限制sudo用户提权为root用户
这是一个非常正常的需要,如果一个用户是普通用户. 但是我们给了他sudo权限. 此时,如果不限制如sudo su这样的命令执行, 那用户还是可以提权到root权限执行. 因此,最常见的普通用户的限制就是限止提权,其实现如下:
%minsudev ALL=(ALL) NOPASSWD:ALL,!/bin/su
这样用户在执行 sudo su 进行提权的时候就会被禁止.
命令集与别名
实际我们在应用时, 可能会定制很多的命令集. 比如上面提到的重启相关的命令可能就不止有一个. 那我们如果在配置每一个用户或者用户组的时候都把相应的命令往sudoers文件直接写, 那简直就是维护的噩梦. 这个时候我们就可以用到sudoers文件相关的扩展特性了.
Linux相关的所有的配置文件基本都有扩展功能. 这个sudoders文件也不例外. 实际我们在/etc目录下有一个与sudoers相关的目录:/etc/sudoers.d/
~$ sudo ls -lash /etc/sudoers.d/
total 28K
4.0K drwxr-xr-x 2 root root 4.0K 5月 27 21:10 .
12K drwxr-xr-x 134 root root 12K 5月 27 21:42 ..
4.0K -r--r----- 1 root root 958 2月 3 2020 README
我们可以在这里自定义一些扩展的sudoers相关文件. 然后在主文件: /etc/sudoers中会进行默认加载. 这个我们从 sudoers文件最后的内容可以得知:
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
注意最后一个# 实际并不是注释的意思,这个是包含指令的写法, 如果不存在文件这个包含就不生效. 如果有就进行加载的意思.
我们可以在这里定义一个专门定义命令别名的文件: sudoers_cmdalias
# add by jianhongl , mail: qunar.jianhong.li@gmail.com
# this file define the command alias which can not be executed by common developer.
# date: 2020-04-17
Cmnd_Alias SHUTDOWN = /sbin/shutdown,/usr/bin/poweroff,/sbin/poweroff
Cmnd_Alias HALT = /usr/sbin/halt
Cmnd_Alias REBOOT = /usr/bin/reboot,/sbin/reboot,/sbin/init
Cmnd_Alias SHELLS = /bin/sh,/bin/bash,/usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias NETWORK = /etc/init.d/network,/sbin/ifconfig,/sbin/ip,/bin/hostname,/sbin/ifup,/sbin/ifdown
Cmnd_Alias PASSWORD = /usr/bin/passwd
Cmnd_Alias USERS = /usr/sbin/usermod,/usr/sbin/adduser,/usr/sbin/userdel,/usr/sbin/useradd,/usr/sbin/vipw,/usr/sbin/visudo,/usr/bin/gpasswd
Cmnd_Alias DISKS = /sbin/fdisk,/sbin/parted
# this is end
另外我们在开发组的信息维护中,我们添加一个扩展文件:sudoers_minsu这个文件的内容如下:
%minsudev ALL=(ALL) NOPASSWD:ALL,!SHELLS,!HALT,!SHUTDOWN,!REBOOT,!NETWORK,!PASSWORD,!DISKS,!USERS
这样, 我们的sudoer的组的权限定义就有了一个比较规范的结构. 在minsudev的权限定义中, 我们就可以直接引用上面定义的命令别名. 这样可以简写我们的配置. 同时也让配置更具备可读性.
其它未尽事宜
以下是一些未详细说明到的一些细节. 如果你想更好的管理sudoers文件, 可以继续阅读完后面部分.
使用visudo命令编辑
上面我们都是直接用vi进行编辑的. 但是这个文件的内容非常重要, 如果文件内容损坏或者格式不正确就有可能导致无法进入系统. 所以最佳实践是使用visudo命令进行编辑, 此命令在退出时候会校验文件内容是否正确. 这样可以保证在退出编辑时文件内容是正确的.
使用visudo校验文件
我们也有可能使用一些扩展文件. 此时我们可以使用命令: visudo -c -f /path/to/file验证我们的文件内容是否正确.
扩展指令的文件名与加载顺序
上面的内容扩展时没有特别提, 实际这个加载是按字典序进行加载的. 因此 sudoers_cmdalias是先于: sudoers_minsu 加载的,这个没有什么问题. 如果你的 配置是先于别名加载, 那就有可能报错. 因此. 在起名时一定要注意加载顺序,否则可能出错.
相关推荐
- F5负载均衡器如何通过irules实现应用的灵活转发?
-
F5是非常强大的商业负载均衡器。除了处理性能强劲,以及高稳定性之外,F5还可以通过irules编写强大灵活的转发规则,实现web业务的灵活应用。irules是基于TCL语法的,每个iRules必须包含...
- 映射域名到NAS
-
前面介绍已经将域名映射到家庭路由器上,现在只需要在路由器上设置一下端口转发即可。假设NAS在内网的IP是192.168.1.100,NAS管理端口2000.你的域名是www.xxx.com,配置外部端...
- 转发(Forward)和重定向(Redirect)的区别
-
转发是服务器行为,重定向是客户端行为。转发(Forward)通过RequestDispatcher对象的forward(HttpServletRequestrequest,HttpServletRe...
- SpringBoot应用中使用拦截器实现路由转发
-
1、背景项目中有一个SpringBoot开发的微服务,经过业务多年的演进,代码已经累积到令人恐怖的规模,亟需重构,将之拆解成多个微服务。该微服务的接口庞大,调用关系非常复杂,且实施重构的人员大部分不是...
- 公司想搭建个网站,网站如何进行域名解析?
-
域名解析是将域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转...
- 域名和IP地址什么关系?如何通过域名解析IP?
-
一般情况下,访客通过域名和IP地址都能访问到网站,那么两者之间有什么关系吗?本文中科三方针对域名和IP地址的关系和区别,以及如何实现域名与IP的绑定做下介绍。域名与IP地址之间的关系IP地址是计算机的...
- 分享网站域名301重定向的知识
-
网站域名做301重定向操作时,一般需要由专业的技术来协助完成,如果用户自己在维护,可以按照相应的说明进行操作。好了,下面说说重点,域名301重定向的操作步骤。首先,根据HTTP协议,在客户端向服务器发...
- NAS外网到底安全吗?一文看懂HTTP/HTTPS和SSL证书
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:可爱的小cherry搭好了NAS,但是不懂做好网络加密,那么隐私泄露也会随时发生!大家好,这里是Cherry,喜爱折腾、玩数码,热衷于分享数...
- ForwardEmail免费、开源、加密的邮件转发服务
-
ForwardEmail是一款免费、加密和开源的邮件转发服务,设置简单只需4步即可正常使用,通过测试来看也要比ImprovMX好得多,转发近乎秒到且未进入垃圾箱(仅以Mailbox.org发送、Out...
- 使用CloudFlare进行域名重定向
-
当网站变更域名的时候,经常会使用域名重定向的方式,将老域名指向到新域名,这通常叫做:URL转发(URLFORWARDING),善于使用URL转发,对SEO来说非常有用,因为用这种方式能明确告知搜索引...
- 要将端口5002和5003通过Nginx代理到一个域名上的操作笔记
-
要将端口5002和5003通过Nginx代理到域名www.4rvi.cn的不同路径下,请按照以下步骤配置Nginx:步骤说明创建或编辑Nginx配置文件通常配置文件位于/etc/nginx/sites...
- SEO浅谈:网站域名重定向的三种方式
-
在大多数情况下,我们输入网站访问网站的时候,很难发现www.***.com和***.com的区别,因为一般的网站主,都会把这两个域名指向到同一网站。但是对于网站运营和优化来说,www.***.com和...
- 花生壳出现诊断域名与转发服务器ip不一致的解决办法
-
出现诊断域名与转发服务器ip不一致您可以:1、更改客户端所处主机的drs为223.5.5.5备用dns为119.29.29.29;2、在windows上进入命令提示符输入ipconfig/flush...
- 涨知识了!带你认识什么是域名
-
1、什么是域名从技术角度来看,域名是在Internet上解决IP地址对应的一种方法。一个完整的域名由两个或两个以上部分组成,各部分之间用英文的句号“.”来分隔。如“abc.com”。其中“com”称...
- 域名被跳转到其他网站是怎么回事
-
当你输入域名时被跳转到另一个网站,这可能是由几种原因造成的:一、域名可能配置了域名转发服务。无论何时有人访问域名,比如.com、.top等,都会自动重定向到另一个指定的URL,这通常是在域名注册商设...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)