Linux权限管理漫谈之用户切换
Posted 已注销
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux权限管理漫谈之用户切换相关的知识,希望对你有一定的参考价值。
Linux中文件有细致的权限控制,许多操作只有文件的拥有者或root才能执行,所以在日常使用过程中,需要进行用户切换。Linux设计之初,提供了 su
命令用于用户的切换,但由于 su 命令粗粒度的控制方式,不符合权限最小化原则,后来(其实很早,在1980年代)又设计了sudo
命令提供精细化的权限控制。su
和sudo
虽然可以切换到任何用户,但是主要还是用于切换到root用户执行系统管理操作。目前Ubuntu等发行版直接取消了root用户,使用 sudo
实现系统的管理功能。下面分别说明两组命令的使用方法及优缺点。
su命令
su命令是Switch User的缩写,功能是把命令执行环境切换到其他用户。从root切换到其他用户时免口令;其他用户间切换或普通用户切换到root时,需要输入目标用户口令。
命令格式:
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
参数说明:
- -f,--fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell
- -,-l,--login:使用登录shell,使用此参数,系统环境变量和home目录都会设置为目标用户的,未指定目标用户则默认是root
- -m,-p,–-preserve-environment:执行su时不改变环境变数
- -c --command=COMMAND:变更账号后,执行COMMAND指令,然后退回原用户
- -s,--shell=SHELL:启动指定shell
- --help:显示帮助信息
- --version:显示版本信息
- USER:要切换的目标用户
- ARG:传入新Shell的参数
su和su -的区别
su
:只切换用户,不切换用户的环境变量和home目录su -
:切换目录并同时切换到目标用户的环境变量和home目录,切换到root时,建议加上 -
参数,不然会出现一些命令无法执行的情况。
su命令的缺点
- 用户切换时,要输入目标用户口令,切换到root用户时需要输入root的口令,导致用户口令泄露
- 切换到root后,不会自动退出,用户会一直在root用户环境下操作,不符合权限最小化原则
- 在多用户系统中,如果多个用户同时
su
到root执行操作,日志中无法区分是哪个用户的操作,工作无法审计和回溯 - 权限控制的粒度太粗,用户只能 All or nothing,无法做到精细化控制,无法实现多个管理员分工、协同工作
sudo命令
sudo
是superuserdo的简称,用于把命令切换到其他用户上下文去执行,一般是切换到root特权用户。和 su
命令的简单粗暴不同,sudo
提供了精细化的权限控制,同时,每种技术都是一把双刃剑,复杂的技术也会带来更多潜在的安全问题,需要在使用时小心配置。sudo命令主要有如下特点:
- 通过配置文件进行集中、细粒度(用户级、命令级、主机级)的授权控制
- 切换用户时输入的是当前用户口令,不会泄露目标用户口令
- sudo提供会话功能,在sudo会话有效期内,用户再次执行sudo命令免密码;过期后则需要重新输入口令
- 每条sudo命令执行后,执行环境直接退回到当前用户,只有使用sudo前缀的命令会在特权用户下执行,符合权限最小化原则
- sudo提供了详细的日志功能,可以记录每个用户使用sudo执行了哪些操作,
sudo命令
sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command
详细命令使用说明请参考命令帮助,常见参数介绍如下:
- -V 显示版本信息
- -h 显示版本信息及指令的使用方法
- -l 显示出当前用户sudo权限命令列表
- -v 延长密码有效期限5分钟
- -k 清除sudo会话,下次sudo需要输入口令
- -b 把命令放在后台执行
- -p prompt 修改输入口令提示语
- -u username/#uid 指定sudo运行的用户,不指定则默认为root
- -s 指定使用的shell
- -H 将HOME环境变量设为sudo用户的HOME环境变量
- command 要执行的命令
sudo的配置
不是任何用户都可以使用sudo命令来执行任何命令,任何用户想要使用sudo命令,都必须在sudo配置文件(或其include的文件)中进行配置。
sudo的主配置文件是/etc/sudoers
,此文件主要配置了哪些用户能在哪些主机上以何种身份执行哪些命令,此文件可以用vi直接编辑,但是官方建议使用visudo编辑此文件,visudo会锁定用户,防止多用户同时编辑,会在文件保存时对执行语法检查,有语法错误的文件无法保存并提示错误。
sudoers配置文件分为多个段,每段负责不同的配置,我们此处主要说明如何使用用户特权配置段配置用户权限,其他配置可参考此说明 /etc/sudoers配置详解。
用户权限的最基本格式如下:
user host=(run_as) [TAG:] cmd_list
各字段的意义说明如:
- user:要配置sudo权限的用户(哪些用户)
- host:此配置在哪个主机中生效(哪些主机)
- run_as:此用户可以切换到哪些用户执行命令,多个用户通过逗号分隔(何种身份)
- cmd_list:用户可执行命令的列表,多个命令通过逗号分隔(执行哪些命令)
- TAG:可选参数,如设置为NOPASSWD,则sudo时免输入口令
user字段,可以设置通配符,%表示用户组,!表示取反,如%group1,表示所有group1组的用户,!user1表示除user1外的其他所有用户。
run_as字段,也可以以!开头,表示不允许以此用户身份运行,如!root说明此sudo不能以root身份运行。
如果对某个参数没有限制,则写ALL。
系统的缺省配置为:
root ALL=(ALL) ALL
意思是:root用户可以在所有主机上,以任何用户执行任何命令
以下命令表示运行apache用于在免口令的情况下,使用sudo执行tomcat的启动和停止脚步,禁止通过sudo执行其他命令。
apache ALL=(ALL) NOPASSWD: /usr/local/tomcat/bin/shutdown.sh,/usr/local/tomcat/bin/startup.sh
sudo安全
由于sudo命令一般用于系统管理操作,命令的执行权限很高,使用不当的情况下,会产生提权漏洞,在使用时,要遵循一定的安全规则。
- 所有sudo执行的脚本,此脚本及此脚本引用的其他脚本和配置文件,设置为只有执行此脚本的最高权限用户有写权限,防止文件被其他低权限用户篡改后,sudo执行导致提权。例如:一个脚本sudo时,以root用户执行,则所有相关脚本和配置文件只有root有修改权限。
- sudo使用的脚本排除时,除了
/etc/sudoers
文件,还要排查通过include
和include_dir
引用的其他所有文件。 - 配置sudo可执行的命令时,所有命令要配置为绝对路径,以防用户通过修改环境变量导致执行其他同名命令的漏洞。
- 给用户分配sudo权限时,尽量少使用ALL参数,而是使用具体的配置值。
- 给用户分配命令权限时,只赋予需要执行命令的最小集,对敏感高危命令限定参数。
- sudo到root时,非必要情况禁止使用NOPASSWD参数。
以上是关于Linux权限管理漫谈之用户切换的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段