开开心心享受生活,没事学学 Linux
su
:是 linux 切换用户的命令
- linux 在切换用户的时候,不需要像 windows 一样先注销当前用户才可以切换到另一个用户
- 直接使用
su
命令就可以切换,并且使用exit
命令就能退出当前用户,返回到登录前的用户
sudo
:是 linux 普通用户临时提权时需要带上的命令
你好,su
- 先说一个冷知识:
root
用户使用su
命令切换到其他普通用户不需要输入密码- 普通用户使用
su
命令切换到其他普通用户和root
用户都是需要输入密码的
- 再说一个冷知识:
- 如果一个用户被分配了
/sbin/nologin
这种shell
时,他是不能被登录的,但是这个用户可以启动有自己权限的服务
最后一个冷知识:
su - <username>
和su <username>
是有区别的su - <username>
表示完全登录到指定的用户,会把env
命令的变量切换成登陆后的用户
su <username>
不会把env
命令的变量切换成登陆后的用户,而是沿用切换前用户的env
变量
- 冷知识结束了,
su
的使用也就差不多了
- 下面使用到的用户需要自己提前创建,或者使用自己已有的用户来验证
- 下面的命令解答:
su - azureray
表示使用登录的方式切换到azureray
这个用户-c "env"
表示不进入到用户的终端来执行命令grep 'PATH'
表示过滤PATH
这个字段
su - azureray -c "env" | grep 'PATH'
同上,区别在于有没有带 -
,通过 env
命令获取的内容,过滤 PATH
来比较之间的差异
su azureray -c "env" | grep 'PATH'
你好,sudo
- 使用
visudo
命令的本质是调用vi
命令去编辑/etc/sudoers
文件,但是会把/etc/sudoers
文件变成只读模式
- 如果再次使用
visudo
命令,会返回:visudo: /etc/sudoers busy, try again later
- 如果直接使用
vim /etc/sudoers
命令,当编辑文件时,会提示:W10: Warning: Changing a readonly file
关于 /etc/sudoers 文件
四个 Alias
/etc/sudoers 文件里面的三个
alias
可以理解成一个管理组,这样,在给不同用户配置相同权限的时候,可以直接分配给alias
定义的名字
Host_Alias
:主机别名
User_Alias
:用户名别名和组名别名(组名前面要带上%)
Runas_Alias
:指定以哪个用户或用户组的权限执行命令的别名
Cmnd_Alias
:命令别名
Defaults
sudo
环境的一些默认配置,这块比较复杂,也比较深,有兴趣可以查阅官方的说明书
- 这里解释一下配置文件自带的
Defaults
Defaults !visiblepw
:阻止 sudo 命令在终端中显示用户输入的密码
Defaults always_set_home
:sudo 命令在以其他用户身份执行命令时总是设置目标用户的家目录(home directory)作为当前工作目录
Defaults match_group_by_gid
:sudo 命令在执行匹配用户组时,将组名替换为组的 GID(组标识符)
Defaults always_query_group_plugin
:sudo 命令始终查询外部组插件来确定用户是否属于特定用户组,而不是仅依赖于本地组信息
Defaults env_reset
:sudo 命令在执行时重置用户的环境变量,以仅允许用户使用特定的环境变量
Defaults env_keep =
:指定要保留的环境变量,这些环境变量将在用户执行 sudo 命令时保持不变
Defaults env_keep +=
:指定要保留的环境变量,并将它们追加到已存在的环境变量列表中
Defaults secure_path
:用于指定安全的 PATH 环境变量,以确保在用户执行 sudo 命令时,只有受信任的目录包含在 PATH 中
一些其他好用的 Defaults
Defaults log_input
和Defaults log_output
:可以用于记录sudo
命令的输入和输出,以便审计Defaults logfile
:指定日志文件
Defaults log_host, log_year, logfile
:指定日志文件的同时,将主机名和四位数年份信息记录到日志内
Defaults editor
:指定用于编辑sudo
临时文件的文本编辑器,需要写 vim 命令的绝对路径
sudo 授权配置语法
USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS
USER/GROUP
:表示需要被授权的用户名(或者 User_Alias)或者用户组名,如果是组则需要以 % 开头
用户名别名
要用User_Alias
定义的
HOST
:表示允许从哪些主机登录的用户运行 sudo 命令,ALL 表示允许从任何终端、机器访问
(USER [:GROUP])
:表示使用 sudo 可切换的用户或者组,组可以不指定,ALL 表示可以切换到系统的所有用户
用户名别名
要用Runas_Alias
定义的
NOPASSWD
:如果指定,则该用户或组使用 sudo 时不需要输入密码
COMMANDS
:表示指定可以使用 sudo 来提权的命令,ALL 表示所有命令
,要使用绝对路径
搞一下不就知道了
配置 sudo
创建普通用户
useradd azureray useradd wings
配置 sudo 文件
visudo
wheel
组是默认自带的,这里就不作修改了root
用户也是默认自带的,这里也不作修改Defaults
也都是遵顼的默认配置,没有修改过
# 定义一个别名叫 DOTA,里面包含了 azureray 和 wings 两个用户 User_Alias DOTA = azureray, wings # 定义一个别名叫 SYSTEM,里面包含了 systemctl,chown,chmod,yum 这几个命令 Cmnd_Alias SYSTEM = /usr/bin/systemctl, /usr/bin/chown, \ /usr/bin/chmod, /usr/bin/yum Defaults !visiblepw Defaults always_set_home Defaults match_group_by_gid Defaults always_query_group_plugin Defaults env_reset Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS" Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin Defaults editor = /usr/bin/vim root ALL=(ALL) ALL # 用户用别名 DOTA # 使用的命令用别名 SYSTEM # NOPASSWD 表示 sudo 命令不需要输入密码 DOTA ALL=(ALL) NOPASSWD: SYSTEM %wheel ALL=(ALL) ALL
如果不生效,可以退出终端,重新连接来生效
免密切换到 root 用户
- 在没有配置的情况下,如果
sudo
用户使用sudo -i
切换到root
用户会报错:Sorry, user xxx is not allowed to execute '/bin/bash' as root on localhost.localdomain.
指定 wings
用户,指定 /bin/bash
命令,随后再切换到 wings
用户,就可以使用 sudo -i
命令来免密切换到 root
用户
wings ALL=(ALL) NOPASSWD: /bin/bash
当然,这是一个比较危险的操作,还是不建议把 /bin/bash
配置到命令里面
查看当前 sudo 命令范围
sudo -l
会返回所有的 Defaults
的配置和可用的命令,因为我没有配置主机名,这里显示的是 localhost
Matching Defaults entries for wings on localhost: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User wings may run the following commands on localhost: (ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/chown, /usr/bin/chmod, /usr/bin/yum
sudo 审计日志
日志路径和日志文件名称
Defaults logfile = /root/.sudo.log
wings 用户使用 sudo 操作后的记录,也会记录用户在哪个路径下操作的什么命令
Nov 2 21:39:10 : wings : TTY=pts/0 ; PWD=/home/wings ; USER=root ; COMMAND=/bin/systemctl disable firewalld
指定日志文件的同时,将主机名和四位数年份信息记录到日志内
Defaults log_host, log_year, logfile = /root/.sudo.log
- 时间后面多了年份
- 用户后面多了 HOST
Nov 2 21:40:52 2023 : wings : HOST=localhost : TTY=pts/0 ; PWD=/home/wings ; USER=root ; COMMAND=/bin/systemctl disable firewalld
使用子配置文件的方式
- 创建一个名字为
system
的文件,配置文件内容和上面的是一致的,也删除了原来配置文件里面的内容了Defaults editor = /usr/bin/vim
写在主配置文件里面,这样,后续的子配置文件都会生效- 以后就可以修改
User_Alias
和Cmnd_Alias
就能针对对应的用户生效了cat << EOF > /etc/sudoers.d/system # 定义一个别名叫 DOTA,里面包含了 azureray 和 wings 两个用户 User_Alias DOTA = azureray, wings # 定义一个别名叫 SYSTEM,里面包含了 systemctl,chown,chmod,yum 这几个命令 Cmnd_Alias SYSTEM = /usr/bin/systemctl, /usr/bin/chown, \ /usr/bin/chmod, /usr/bin/yum # 不同的 sudo 子配置文件,可以配置不同的日志路径和日志文件名称,方便审计 Defaults log_host, log_year, logfile = /root/.sudo_system.log # 用户用别名 DOTA # 使用的命令用别名 SYSTEM # NOPASSWD 表示 sudo 命令不需要输入密码 DOTA ALL=(ALL) NOPASSWD: SYSTEM EOF
sudo
要求配置文件的权限必须是 0440
,不修改的话,校验配置文件会返回:/etc/sudoers.d/system: bad permissions, should be mode 0440
chmod 0440 /etc/sudoers.d/system
校验配置文件
visudo -c
返回都是 ok 就可以了
/etc/sudoers: parsed OK /etc/sudoers.d/system: parsed OK