su、sudo、runuser区别

一、su 命令临时切换用户身份

 

SU:( Switch user切换用户),可让一个普通用户切换为超级用户或其他用户,并可临时拥有所切换用户的权限,切换时需输入欲切换用户的密码;也可以让超级用户切换为普通用户,临时以低权限身份处理事务,切换时无需输入欲切换用户的密码。

 

zai Linux 系统中,有时候普通用户有些事情是不能做的,除非是 root 用户才能做到。这时就需要用 su 命令临时切换到 root 身份来做事了。

 

1、su 的语法

 

su [OPTION选项参数] [用户]

 

-, -l, –login

 

切换用户时,使环境变量(home,shell,user,logname,path等)和欲切换的用户相同、不使用则取得用户的临时权限,不加载环境变量。用su命令切换用户后,可以用 exit 命令或快捷键[Ctrl+D]可返回原登录用户;

 

-c, –command=COMMAND

 

使用 -c 传递单个命令到 shell 中,执行命令后,就恢复原来的用户身份,退出所切换到的用户环境;

 

–session-command=COMMAND

 

使用 -c 传递单个命令到 shell 中,并且不创建新的会话;

 

-f, –fast

 

通过 -f 参数到 shell (针对 csh 或 tcsh);

 

-m, –preserve-environment

 

不重置环境变量;

-s, –shell=SHELL

 

2、su 的范例:

su -

su - root

su - root -c "ls -l /root"

su - oracle -c "ulimit -aHS"

su -s /bin/sh -c "/usr/local/nginx/sbin/nginx"

 

二、sudo 命令

1、sudo 的适用条件

由于su 对切换到超级权限用户 root 后,权限的无限制性,所以 su 并不能担任多个管理员所管理的系统。如果用 su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作,这时我们就有必要用到 sudo。通过 sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道 root 密码,所以 sudo 相对于权限无限制性的 su 来说,还是比较安全的,所以 sudo 也能被称为受限制的 su。另外 sudo 是需要授权许可的,所以也被称为授权许可的 su。

sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户,而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权。默认只有 root 用户能使用 sudo 命令,普通用户想要使用 sudo,是需要 root 预先设定的,默认 root 能够 sudo 是因为这个文件中有一行”root ALL=(ALL) ALL”。

 

2、sudo 配置文件

 

我们可以用他的专用编辑工具 visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的。

 

/etc/sudoers 文件中每行算一个规则,前面带有 # 号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用 \ 号来续行,这样看来一个规则也可以拥有多个行。

 

/etc/sudoers 的规则可分为两类:一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。

 

sudo授权规则(sudoers配置):

1

        

授权用户 主机=命令动作

 

这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密码直接运行命令的,应该加 NOPASSWD: 参数,但这些可以省略。举例说明:

 

执行visudo之后,可以看见缺省只有一条配置:

 

root    ALL=(ALL) ALL

 

那么你就在下边再加一条配置:

admin ALL=(ALL) ALL

 

这样,普通用户 admin 就能够执行 root 权限的所有命令。

 

让普通用户support只能在某几台服务器上,执行root能执行的某些命令,首先需要配置一些Alias,这样在下面配置权限时,会方便一些,不用写大段大段的配置。Alias主要分成4种:

Host_Alias

 

Cmnd_Alias

 

User_Alias

 

Runas_Alias

 

配置Host_Alias:就是主机的列表

 

Host_Alias      HOST_FLAG = hostname1, hostname2, hostname3

 

配置Cmnd_Alias:就是允许执行的命令的列表,命令前加上 ! 表示不能执行此命令。命令一定要使用绝对路径,避免其他目录的同名命令被执行,造成安全隐患 ,因此使用的时候也是使用绝对路径!

 

Cmnd_Alias      COMMAND_FLAG = command1, command2, command3 ,!command4

 

配置User_Alias:就是具有sudo权限的用户的列表

 

User_Alias USER_FLAG = user1, user2, user3

 

配置Runas_Alias:就是用户以什么身份执行(例如root,或者oracle)的列表

 

Runas_Alias RUNAS_FLAG = operator1, operator2, operator3

 

配置权限的格式如下:

 

USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG

 

如果不需要密码验证的话,则按照这样的格式来配置

 

USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG

当然新用户的配置也可以放到,/etc/sudoers.d/ 下的文件里,也会生效,修改也方便。

 

3、sudo 语法

sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command

 

 

三、runuser 命令

 

runuser命令使用一个替代的用户或者组ID运行一个Shell。这个命令仅在root用户时有用。

仅以会话PAM钩子运行,并且没有密码提示。如果用一个非root用户,并且该用户没有权限设置user ID,这个命令将会因为程序没有setuid而失败。因runuser不会运行认证和账户PAM钩子,它比su更底层。

 

1、runuser 语法

 

语法与 su 命令基本一样:

 

-, -l, –login

 

让shell成为登录shell,用 runuser -l PAM 文件替代默认的;

 

-g –group=group

 

指定主要的组;

 

-G –supp-group=group

 

指定追加组

 

-c, –command=COMMAND

 

使用 -c 传递单个命令到 shell 中,执行命令后,就退出到 root;

 

–session-command=COMMAND

 

通过一个单一的命令用 -c 参数到 shell ,不创建一个新的会话;

 

-f, –fast

 

通过 -f 参数到 shell (针对 csh 或 tcsh);

 

-m, –preserve-environment

 

不重置环境变量;

-p     same as -m

 

-s, –shell=SHELL

 

指定执行命令的shell;

 

2、runuser 样例

runuser -l userNameHere -c '/path/to/command arg1 arg2'

runuser -l oracle -c 'ulimit -SHa'

runuser -s /bin/sh -c "/usr/local/nginx/sbin/nginx"

 

有时,root用户由于权限(安全)问题不能浏览NFS挂载的共享:

ls -l /nfs/wwwroot/http或cd /nfs/wwwroot/http

可能的输出:

-bash: cd: /nfs/wwwroot/http/: Permission denied

 

这时若apache用户被允许浏览或访问挂载在/nfs/wwwroot/http/下基于nfs的系统:

runuser -l apache -c 'ls -l /nfs/wwwroot/http/' 或

runuser -l apache -c 'cd /nfs/wwwroot/http/; vi index.php'

使用runuser命令,无需使用密码,并且,只能在root用户下使用。

 

四、总结:su VS su VS dorunuser

 

命令

root到用户

用户到root

任意用户到任意用户

认证方式

日志文件

备注

runuser

Y

N

N

因runuser不会运行认证和账户PAM钩子,它比su更底层。

su

Y

Y

Y

目标用户的密码

/var/log/auth.log 或/var/log/secure

你必须与其它用户分享你的密码或 root 密码。

sudo

Y

Y

Y

认证用户使用他们自己的密码,而不是目标用户。

/var/log/auth.log 或/var/log/secure

允许系统管理员委托授权给一个特定的用户(或用户组),让其在提供审计跟踪命令后可以以root或其它用户运行某些(或全部)命令。

 ref:https://www.cnblogs.com/bodhitree/p/6018369.html

posted on 2018-01-31 14:06  石下江的太阳光  阅读(247)  评论(0)    收藏  举报

导航