sudo
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sudo相关的知识,希望对你有一定的参考价值。
起因:
linux中root拥有最高权限,有时候我们希望把部分权限授予给某个用户,这个时候我们可以设置类似于passwd命令,设置suid,然后结合组权限进行管理,但是这种方法没有办法控制一些后面跟参数的命令,比如我们希望用户都可以执行ifup eth0但是无法执行ifup eth1,而且这种方法也不安全,比如当我们临时有事离开而忘了关电脑,此时又登录某个用户,这个时候如果有人利用这个用户执行一些危险操作,我们无法防范也无从追责,这个时候sudo就派上用场了。
su(switch user ):切换用户身份
suid:当使用设置了suid权限的命令的时候,进程属主为命令本身属主,而不是当前启用命令用户身份
sudo(switch user do COMMAND):某个用户能够以某个用户的身份在某主机执行某条命令
这里的某主机指的是通过某主机连接到本地服务器执行命令,而不是在那台主机上执行命令,跟ssh 不一样,当执行sudo命令的时候需要输入自身命令,sudo以此鉴定用户身份,并写入日志作为日后追责的依据。
sudo的配置文件:/etc/sudoers 可以利用visudo进行编辑,这个命令可以鉴别sudoers的语法格式错误,类似crontab -e,帮助文档:man 5 sudoers
一个sudo条目:
who which_host=(runas) [TAG:]command
TAG可有可无,比较常见的有:NOPASSWD,表示不需要密码登录,其他比较少用不深究
who的可选格式如下:
User ::= ’!’* user name |
’!’* #uid |
’!’* %group |
’!’* %#gid |
’!’* +netgroup |
’!’* %:nonunix_group |
’!’* %:#nonunix_gid |
’!’* User_Alias
!表示取反,用户可以直接接用户名,也可以#跟uid,或者%跟组名, ::=和* |只是帮助文档的格式,没有特殊意义
which_host:
Host ::= ’!’* host name |
’!’* ip_addr |
’!’* network(/netmask)? |
’!’* +netgroup |
’!’* Host_Alias
runas:
Runas_Member ::= ’!’* user name |
’!’* #uid |
’!’* %group |
’!’* %#gid |
’!’* %:nonunix_group |
’!’* %:#nonunix_gid |
’!’* +netgroup |
’!’* Runas_Alia
command:
Cmnd ::= ’!’* command name |
’!’* directory |
’!’* "sudoedit" |
’!’* Cmnd_Alias
每个部分都可以做成别名,别名必须全部而且只能使用大写英文字母的组合,别名必须事先定义,而且别名也可以引用别人事先定义好的别名。
别名引用:直接输入别名即可
别名格式: 关键字 别名 = 用户 (多个用户之间用,隔开,定义多个别名用:\换行分开)例如:
User_Alias FULLTIMERS = millert, mikef, dowdy
Runas_Alias OP = root, operator
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh,\(写不下的时候用\续行)
/usr/local/bin/tcsh, /usr/bin/rsh,\
/usr/local/bin/zsh
sudo命令:
-l:列出当前用户可以使用的所有sudo类命令
-k:让认证信息失效(sudo的时候,输入密码默认有5分钟的过期时间,在这个时间内,不再需要输入密码)
一个例子:给用户tom 授予useradd权限
答: visudo 添加 tom ALL=(ALL) /usr/sbin/useradd(这里命令要写完整路径,否则报错)
特殊例子:给用户tom授予passwd权限
答:visudo添加 tom ALL=(root) /usr/bin/passwd
看起来没有问题,但是这里有个严重漏洞,当tom执行passwd并且后面不接用户名的时候,因为sudo是以用户root身份执行的,所以会修改root的密码,这个时候我们可以改写成visudo添加
tom ALL=(root) /usr/bin/passwd [a-zA-Z]* ! /usr/bin/passwd root
注:这里的 [a-zA-Z]*是文件名匹配规则,因为你不加! /usr/bin/passwd root是无法单独执行passwd的,正则表达式则可以。
以上是关于sudo的主要内容,如果未能解决你的问题,请参考以下文章