sudo命令详解
1、初识sudo
sudo是linux下常用的允许普通用户使用超级用户权限的工具,sudo 用来执行需要提升权限(通常是作为 root 用户)的命令,允许系统管理员让普通用户执行一些或者全部的root命令 ,如halt,reboot,shutdown、init等等。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。sudo是对Shell的一个代替,它是面向每个命令的。
它的特性主要有这样几点:
① sudo能够限制用户只在某台主机上运行某些命令 。
② sudo提供了丰富的日志,详细地记录了每个用户干了什么 。它能够将日志传到中心主机或者日志服务器。
③ sudo使用时间戳文件------日志来执行类似的"检票"系统。当用户调用sudo并且输入他的密码时,用户获得了一张存活期为5分钟的票(这个值可以在/etc/sudoers设置)。
④ sudo的配置文件是/etc/sudoers,属性必须为0440,它允许系统管理员集中地管理用户的使用权限和使用主机。
2、sudo命令用法
命令解释
sudo --- execute a command as another user(以其他用户身份执行命令)
命令语法
sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command
命令选项
选 项 | 解 释 |
---|---|
-V | 显示版本编号 |
-h | 显示版本编号及指令的使用方式说明 |
-l | 显示出自己(执行 sudo 的使用者)的权限 |
-v | 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码 |
-k | 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟) |
-b | 将要执行的指令放在后台执行 |
-p | prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称 |
-u | username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码) |
-s | 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell |
-H | 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root ) |
command | 要以系统管理者身份(或以 -u 更改为其他人)执行的指令 |
实例
① 列出当前用户权限;
bash
[tom@localhost /]$ sudo -l
匹配 %2$s 上 %1$s 的默认条目:
!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
用户 tom 可以在 localhost 上运行以下命令:
(root) /sbin/useradd
② 以root身份使用useradd命令创建cat用户;
bash
[tom@localhost /]$ sudo -u root useradd cat
③ 查看版本信息;
bash
[tom@localhost ~]$ sudo -V
Sudo 版本 1.8.23
Sudoers 策略插件版本 1.8.23
Sudoers 文件语法版本 46
Sudoers I/O plugin version 1.8.23
3.如何编辑配sudo的配置文件/etc/sudoers?
编辑sudo的配置文件/etc/sudoers一般不直接使用vi(vi /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如果有错也会保存从而导致sudo工具无法使用,最好使用visudo命令去配置。虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错误会给出提示。
① 别名规则
别名规则的定义格式:
AliasType NAME = item1, item2, ...
或
AliasType NAME = item1 : NAME = item2, item3 : ...
其中,AliasType 指别名类型,包括:HostAlias、UserAlias、RunasAlias 和 Cmnd_Alias 四种。NAME 指别名,命名可以包含大写字母、下划线以及数字,但必须以大写字母开头。
② 授权规则
授权规则的定义格式:
授权用户 主机=命令动作
或
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] [命令1],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2], ...
其中,授权用户、主机和命令动作这三个要素缺一不可,在命令动作之前可以指定切换到特定用户或用户组下,在这里指定切换的用户或用户组要用 () 小号括起来;如果不需要密码直接运行命令的,应该加NOPASSWD:参数。
示例
接下来,我们以一个栗子来教会大家该如何配置:
① 使用户 tom 能够有权限挂载/dev/sr0到/media目录下;
bash
[root@localhost ~]# visudo //打开配置文件
...省略部分信息
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(root) /bin/mount /dev/sr0 /media //添加该条信息
...省略部分信息
[root@localhost ~]# su - jerry //切换到jerry用户
[jerry@localhost ~]$ sudo mount /dev/sr0 /media/ //测试jerry用户是否可以运行此命令
[sudo] password for jerry:
jerry is not in the sudoers file. This incident will be reported. //jerry被拒绝运行
[jerry@localhost ~]$ su - tom //切换到tom用户
Password:
[tom@localhost ~]$ sudo mount /dev/sr0 /media/ //运行mount /dev/sr0 /media/命令
mount: block device /dev/sr0 is write-protected, mounting read-only //挂载成功
② 使用户 tom 和 jerry 能够有权限修改IP,使用别名实现,且不需要输入密码;
bash
[root@localhost ~]# sudoedit /etc/sudoers.d/ip //在/etc/sudoers.d下编辑一个配置文件
User_Alias IPMOD_USERS = tom,jerry //定义用户别名IPMOD_USERS,其中有用户tom,jerry
Cmnd_Alias IP = /sbin/ip //定义命令别名,为/sbin/ip命令设置别名IP
IPMOD_USERS ALL=(root) NOPASSWD:IP //IPMOD_USERS用户在任何主机使用root身份不需要密码执行IP命
[root@localhost ~]# su - tom //切换到tom用户
[tom@localhost ~]$ ip a //查看ip信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d8:94:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.140.137/24 brd 192.168.140.255 scope global eth0
inet6 fe80::20c:29ff:fed8:94d9/64 scope link
valid_lft forever preferred_lft forever
[tom@localhost ~]$ sudo ip add add 192.168.140.138/24 dev eth0 //添加ip地址
[tom@localhost ~]$ ip a //查看ip信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d8:94:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.140.137/24 brd 192.168.140.255 scope global eth0
inet 192.168.140.138/24 scope global secondary eth0 //添加成功
inet6 fe80::20c:29ff:fed8:94d9/64 scope link
valid_lft forever preferred_lft forever
[tom@localhost ~]$ su - jerry //切换到jerry用户
Password:
[jerry@localhost ~]$ sudo ip add del 192.168.140.138/24 dev eth0 //删除ip地址
[jerry@localhost ~]$ ip a //查看ip信息,可以看到已经删除成功
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d8:94:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.140.137/24 brd 192.168.140.255 scope global eth0
inet6 fe80::20c:29ff:fed8:94d9/64 scope link
valid_lft forever preferred_lft forever
③ 使用户 jerry 能够有权限使用 /user/sbin/ 下的所有命令,除了 /use/sbin/userdel 命令;
bash
[root@localhost ~]# visudo //打开配置文件
...省略部分信息
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
jerry ALL=(root) /usr/sbin/*,!/usr/sbin/userdel //添加该条信息
[root@localhost ~]# su - jerry //切换到jerry用户
[jerry@localhost ~]$ sudo useradd jerry_testuser //添加用户jerry_testuser
[sudo] password for jerry:
[jerry@localhost ~]$ tail -1 /etc/passwd //查看/etc/passwd文件最后一条
jerry_testuser:x:503:503::/home/jerry_testuser:/bin/bash //添加成功
[jerry@localhost ~]$ sudo userdel jerry_testuser //测试是否可以使用/use/sbin/userdel 命令
Sorry, user jerry is not allowed to execute '/usr/sbin/userdel jerry_testuser' as root on localhost.localdomain. //拒绝使用
sudo命令下环境变量失效问题
在sudo命令时,系统会默认重置环境变量为安全的环境变量,即之前设置的变量都会失效
bash
sudo sed '/^#/d;/^$/d' /etc/sudoers
Defaults env_reset表示默认会重置环境变量
secure_path 当使用sudo命令时,自定义的环境变量PATH将失效,系统只识别该行定义的环境变量
- 解决方法
- 将 sudo 执行命令时改成系统的 PATH 变量中的路径
将 Defaults env_reset 改成 Defaults !env_reset 来取消掉对 PATH 变量的重置,
然后在 .bashrc 中最后添加 alias sudo='sudo env PATH=$PATH'。这样 sudo 执行命令时所搜寻的路径就是系统的 PATH 变量中的路径 - 修改sudo配置文件
修改 /etc/sudoers 文件的 env_keep 和 secure_path 配置项
su 命令
Linux操作系统中的su命令是一种用于切换用户身份的命令。su是"Switch User"的缩写,它允许当前用户切换到其他用户账户,包括超级用户(root)。
su命令的语法如下:
bash
su [选项] [用户名]
当不指定用户名时,默认切换到超级用户(root)账户。如果指定了用户名,则会切换到该用户的账户。
su命令常用的选项包括:
- -:切换到目标用户的环境变量,类似于登录该用户。
- -c command:执行指定的命令,然后切换回原用户。
- -l 或 --login:切换到目标用户的环境变量,类似于登录该用户。
使用su命令需要输入目标用户的密码,只有拥有目标用户密码的用户才能切换到该用户账户。
su命令的主要用途是在需要进行系统管理或执行需要超级用户权限的任务时,临时切换到超级用户账户。通过切换到超级用户,用户可以执行一些普通用户无法执行的操作,如安装软件、修改系统配置等。
由于su命令需要输入目标用户的密码,这可能会导致安全风险。为了提高系统的安全性,建议使用sudo命令来代替su命令。sudo命令允许普通用户以超级用户权限执行指定的命令,而无需知道超级用户的密码。
总结来说,su命令是一种用于切换用户身份的命令,可以在需要进行系统管理或执行需要超级用户权限的任务时使用。为了提高系统的安全性,建议使用sudo命令代替su命令。