共计 2539 个字符,预计需要花费 7 分钟才能阅读完成。
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 参数。