Linux sudo 免密设置
测试系统Ubuntu 14.0.4
免密sudo 设置
谨慎操作‼️若改错只能进安全模式还原😱,编辑**/etc/sudoers**,内容如下:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
#%sudo ALL=(ALL:ALL) ALL # 注释这一行,添加下面一行
%sudo ALL=(ALL) NOPASSWD: ALL # 注意NOPASSWD 的写法,否则只能从安全模式改了
或者执行以下这句命令
# 效果跟以上一样,sed 自动完成注释和内容添加
sudo sed -i 's/%sudo/#%sudo/; /#%sudo/a%sudo ALL=(ALL) NOPASSWD: ALL' /etc/sudoers
sudoers 配置公式
以前将%sudo ALL=(ALL:ALL) ALL
改成了%sudo ALL=NOPASSWD: ALL
,出现的现象就是
使用sudo vi /etc/sudoers
之类切换成root
执行命令没有问题,也不需要输入密码
但如果切换成别的普通用户例如sudo -u user01 whoami
即使输入了密码也无法执行
后来看了参考资料里的链接才知道配置有问题,应为%sudo ALL=(ALL) NOPASSWD: ALL
公式定义
对/etc/sudoers
文件进行编辑的代码公式
可以概括为:
授权用户/组 主机 = [(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,…
凡是[ ]
中的内容, 都能省略; 命令和命令之间用逗号,
分隔,
为了方便说明, 将公式的各个部分称呼为字段1
– 字段5
,对应关系如下:
授权用户/组 主机 = [(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,…
字段1 字段2 = [(字段3)] [字段4] 字段5
其中字段3
、字段4
是可以省略的,这5
个字段的取值说明如下:
字段1
不以%
号开头的表示将要授权的用户
,以%
号开头的表示将要授权的组
字段2
表示允许登录的主机
,ALL
表示所有
即从任意地方登录过来都可以
如果该字段不为ALL
,表示授权用户
只能从指定的机器上登录到本服务器来执行sudo 命令
字段3
如果省略,相当于(root:root)
,表示可以通过sudo
只能提权到(root 用户:root 组)
注意是只能
,别的用户或组都不行;如果为(ALL)
或者(ALL:ALL)
, 表示能提权到(任意用户:任意用户组)
请注意,字段3
如果没省略,必须使用( )
双括号包含起来,这样才能区分是省略了字段3
还是省略了字段4
字段4
可取值是NOPASSWD:
,请注意NOPASSWD:
后面带有冒号:
,且只对后面字段5
的命令1
起作用
即在执行sudo 命令1
时可以不需要密码,但是执行sudo 其他非命令1
时还是需要输入密码的字段5
是用逗号,
隔开的一系列授权用户可用的命令,如果为ALL
则表示允许使用所有命令
具体命令
都是使用绝对路径
,这是为了避免目录下有同名命令被执行
,从而造成不可预估的安全隐患
- 另外,
字段3 -- 字段5
是可以有多组重复的,以上只是便于理解的简化版
完整的sudoers
公式如下:
字段1 字段2 = [(字段3)] [字段4] 字段5 [[(字段3)] [字段4] 字段5] …
样例解读
root ALL=(ALL:ALL) ALL
# 用户root 可从任意主机登录本机提权到任何用户或组执行任何命令,但执行前要输入密码
%wheel ALL=(ALL) ALL
# wheel 组的用户可从任意主机登录本机提权到任何用户或组执行任何命令,但执行前要输入密码
%sudo ALL=(ALL:ALL) ALL
# sudo 组的用户可从任意主机登录本机提权到任何用户或组执行任何命令,但执行前要输入密码
%sudo ALL=(ALL) NOPASSWD: ALL
# sudo 组的用户可从任意主机登录本机提权到任何用户或组执行任何命令,且执行前不用输入密码
jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
# 用户jack 可从名为mycomputer 的主机登录本机提权到root 执行reboot 和shutdown,须输入密码
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
# 用户papi 可从任意主机登录本机提权到root 免密执行chown,但执行useradd 仍需要密码
# 这就对应了以上sudoers "公式定义"中的第4 点,NOPASSWD: 只对命令1 起作用,之后的命令无效
# 还要更多关于sudoers 的设置请详见参考资料《Linux 详解sudoers》,非常不错的文章