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
也是用于把命令切换到其余用户上下文去执行,个别是切换到root特权用户。和 su
命令的简略粗犷不同,sudo
提供了精细化的权限管制,同时每种技术都是一把双刃剑,简单的技术也会带来许多潜在的平安问题,须要在应用时小心配置。sudo命令次要有如下特点:
- 通过配置文件进行集中、细粒度(用户级、命令级、主机级)的受权管制
- 切换用户时输出的是以后用户口令,不会泄露指标用户口令
- sudo提供会话性能,在sudo会话有效期内,用户再次执行sudo命令免明码;过期后则须要从新输出口令
- 每条sudo命令执行后,执行环境间接退回到以后用户,只有应用sudo前缀的命令会在特权用户下执行,合乎权限最小化准则
- sudo提供了具体的日志性能,能够记录每个用户应用sudo执行了哪些操作,
sudo命令
待补充。
sudo的配置
不是任何用户都能够应用sudo命令来执行任何命令,任何用户想要应用sudo命令,都必须在sudo配置文件(或其include的文件)中进行配置。
sudo的主配置文件是/etc/sudoers
,此文件次要配置了哪些用户能在哪些主机上以何种身份执行哪些命令,此文件能够用vi间接编辑,然而官网倡议应用visudo编辑此文件,visudo会锁定用户,避免多用户同时编辑,会在文件保留时对执行语法查看,有语法错误的文件无奈保留并提醒谬误。
sudoers配置文件分为多个段,每段负责不同的配置,咱们此处次要阐明如何应用用户特权配置段配置用户权限,其余配置可参考此阐明 /etc/sudoers配置详解。
用户权限的最根本格局如下:
user host=(run_as) [NOPASSWD:] cmd_list
各字段的意义阐明如:
- user:要配置sudo权限的用户(哪些用户)
- host:此配置在哪个主机中失效(哪些主机)
- run_as:此用户能够切换到哪些用户执行命令,多个用户通过逗号分隔(何种身份)
- cmd_list:用户可执行命令的列表,多个命令通过逗号分隔(执行哪些命令)
- NOPASSWD:可选参数,sudo时免输出口令
user字段,能够设置通配符,%示意用户组,!示意取反,如%group1,示意所有group1组的用户,!user1示意除user1外的其余所有用户。
如果对某个参数没有限度,则写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参数。