sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,shutdown、init等等。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。sudo是对Shell的一个代替,它是面向每个命令的。
它的特性主要有这样几点:
① sudo能够限制用户只在某台主机上运行某些命令。
② sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
③ sudo使用时间戳文件——日志来执行类似的“检票”系统。当用户调用sudo并且输入他的密码时,用户获得了一张存活期为5分钟的票(这个值可以在/etc/sudoers设置)。
④ sudo的配置文件是/etc/sudoers,属性必须为0440,它允许系统管理员集中地管理用户的使用权限和使用主机。
选 项 | 解 释 |
---|---|
-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 更改为其他人)执行的指令 |
① 列出当前用户权限;
[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用户;
[tom@localhost /]$ sudo -u root useradd cat
③ 查看版本信息;
[tom@localhost ~]$ sudo -V
Sudo 版本 1.8.23
Sudoers 策略插件版本 1.8.23
Sudoers 文件语法版本 46
Sudoers I/O plugin version 1.8.23
编辑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用户,并为其创建密码
[root@localhost ~]# useradd tom
[root@localhost ~]# echo "123456" | passwd --stdin tom
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
//使用visudo打开配置文件
[root@localhost ~]# visudo
//文件中字段很多,我们需要做更改的地方在这里
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
...省略部分信息
//root 表示用户名,如果是用户组,可以写成"%group_name"
//第一个ALL:代表可以执行sudo命令的主机(ALL表示任何主机)
//第二个ALL:代表可以执行sudo命令的时候以哪个用户的身份执行(ALL表示root用户)
//第三个ALL:代表可以sudo可以执行的命令,多个命令可以用","分隔(ALL表示所有命令)
//为tom用户添加在任何主机上以root用户身份使用useradd命令的权限
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(root) /sbin/useradd //可以使用 which 命令查看命令的二进制可执行文件位置
[root@localhost ~]# su - tom //切换到tom用户
[tom@localhost ~]$ sudo -l //查看tom用户拥有的特殊权限
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] tom 的密码:
匹配 %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` //这里说明我们以及添加成功了
[tom@localhost ~]$ sudo useradd jerry //我们以添加一个jerry用户为例作为测试
[tom@localhost ~]$ tail -1 /etc/passwd //验证/etc/passwd文件是否添加成功
jerry:x:4003:4003::/home/jerry:/bin/bash
[root@localhost ~]# tail /var/log/secure //查看安全日志
Mar 10 22:12:25 localhost sudo: tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=/sbin/user add jerry //使用tom用户以root身份使用useradd命令创建jerry用户的记录
① 使用户 tom 能够有权限挂载/dev/sr0到/media目录下;
[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,使用别名实现,且不需要输入密码;
[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 命令;
[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. //拒绝使用