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的主要内容,如果未能解决你的问题,请参考以下文章

Liunx权限操作

Ubuntu sudo 找不到java

Linux安全必做的几个设置

用户切换命令:su 与 sudo

linux基础之sudu的简单用法

sudo: cd: command not found