sudo命令详解

目录

    • 1、初识sudo
    • 2、sudo命令用法
    • 3、如何编辑配置文件呢?
    • 4、实例

1、初识sudo

  sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的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 更改为其他人)执行的指令
  • 实例

  ① 列出当前用户权限;

[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

3、如何编辑配置文件呢?

  编辑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用户的记录


4、实例

  ① 使用户 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.    //拒绝使用

你可能感兴趣的:(Linux用户组和权限管理)