欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Linux下sudo命令实例讲解

转载自:点击打开链接

一、sudo简介

1、概念:


   sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。Sudo不是对shell的一个代替,它是面向每个命令的。

   它的特性主要有这样几点:

       1、sudo能够限制用户只在某台主机上运行某些命令。

       2、sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。

       3、sudo使用时间戳文件--日志 来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。

       4、sudo的配置文件是/etc/sudoers,属性必须为0440,它允许系统管理员集中的管理用户的使用权限和使用的主机。

2、编辑配置文件命令:visudo

       注意:编辑sudo的配置文件/etc/sudoers是一般不要直接使用vi(vi /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示。

3、语法,参数



sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command

参数:



  1. -V 显示版本编号
  2. -h 会显示版本编号及指令的使用方式说明
  3. -l 显示出自己(执行 sudo 的使用者)的权限
  4. -v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码
  5. -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
  6. -b 将要执行的指令放在背景执行
  7. -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
  8. -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
  9. -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
  10. -H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
  11. command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令


二、实战演练

1定义一个用户(tom)使其拥有添加用户的特殊权限,并进行创建用户操作。

①、创建tom并为其创建密码



  1. [root@localhost ~]# useradd tom
  2. [root@localhost ~]# echo "tom" | passwd --stdin tom
  3. Changing password for user tom.
  4. passwd: all authentication tokens updated successfully.



②、修改配置文件,为tom添加特殊权限useradd


  1. ## Allow root to run any commands anywhere
  2. root    ALL=(ALL)       ALL
  3. tom     ALL=(root)      /usr/sbin/useradd       ##添加权限,这里的/usr/sbin/useradd表示普通用户执行时必须使用全路径,可以使用which 命令查看哦!
  4. ## Allows members of the 'sys' group to run networking, software,




③、切换到用户tom,验证特殊权限


  1. [root@localhost ~]# su - tom    ##切换用户
  2. [tom@localhost ~]$ sudo -l    ##查看此用户拥有的特殊权限
  3. We trust you have received the usual lecture from the local System
  4. Administrator. It usually boils down to these three things:
  5. #1) Respect the privacy of others.
  6. #2) Think before you type.
  7. #3) With great power comes great responsibility.
  8. [sudo] password for tom:     ##这里需要验证密码,以保证是用户本人执行操作
  9. Matching Defaults entries for tom on this host:
  10. requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE
  11.    INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
  12. env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
  13.    LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
  14.    _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
  15. User tom may run the following commands on this host:
  16. (root) /usr/sbin/useradd    ##可以以root身份,使用useradd命令

tom执行useradd

  1. [tom@localhost ~]$ sudo /usr/sbin/useradd test1    ##添加用户test1
  2. [tom@localhost ~]$ tail -1 /etc/passwd
  3. test1:x:501:501::/home/test1:/bin/bash        ##添加成功

④、查看日志/vat/log/secure
注意:要切换回root才有权限查看日志

  1. [root@localhost ~]# tail /var/log/secure
  2. Apr  5 13:55:58 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0)
  3. Apr  5 13:56:11 localhost su: pam_unix(su-l:session): session closed for user tom
  4. Apr  5 13:56:17 localhost passwd: pam_unix(passwd:chauthtok): password changed for tom
  5. Apr  5 13:56:17 localhost passwd: gkr-pam: couldn't update the 'login' keyring password: no old password was entered
  6. Apr  5 13:56:23 localhost su: pam_unix(su-l:session): session opened for user tom by root(uid=0)
  7. Apr  5 13:56:43 localhost sudo:      tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=list
  8. ##tom以管理员身份执行了list命令
  9. Apr  5 14:00:50 localhost sudo:      tom : TTY=pts/0 ; PWD=/home/tom ; USER=root ; COMMAND=/usr/sbin/useradd test1
  10. ##tom以管理员身份执行了useradd命令,添加用户test1
  11. Apr  5 14:00:50 localhost useradd[2128]: new group: name=test1, GID=501
  12. Apr  5 14:00:50 localhost useradd[2128]: new user: name=test1, UID=501, GID=501, home=/home/test1, shell=/bin/bash
  13. Apr  5 14:07:15 localhost su: pam_unix(su-l:session): session closed for user tom

以后可以使用此命令日志查看主机是否遭到入侵攻击,或者查看某用户登录进来并使用特殊权限执行错误指令等等。所以我们要实时监控此文件的动向。


⑤、-k参数示例


  1. [root@localhost ~]# su - tom
  2. [tom@localhost ~]$ sudo -k    ##结束密码有效期
  3. [tom@localhost ~]$ sudo /usr/sbin/useradd test2
  4. [sudo] password for tom:     ##有效期结束后,执行特殊命令,需重新验证密码
  5. [tom@localhost ~]$ tail -1 /etc/passwd
  6. test2:x:502:502::/home/test2:/bin/bash    #添加test2成功

2、别名应用,alias:

  1. sudoers文件支持使用别名对同类对象进行分组:组名必须使用全大写字母,使用逗号将同类对象命令隔开。
  2. Host_Alias:主机别名
  3. User_Alias:用户别名
  4. Runas_Alias:在哪些主机以谁的身份运行  的别名
  5. Cmnd_Alias:命令别名

①、在配置文件中定义别名



  1. [root@localhost ~]# visudo
  2. Host_Alias USERHOSTS = 172.16.0.0/16,127.0.0.0/8,192.168.0.0/24    ##定义主机别名,可以在哪些机器执行特殊命令
  3. Cmnd_Alias    USERADMIN=/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel    ##定义命令别名
  4. root    ALL=(ALL)       ALL
  5. tom     ALL=(root)      USERADMIN    ##此处定义tom可以执行别名USERADMIN中的所有命令
  6. tom     USERHOSTS=(ROOT)        USERADMIN    ##可以在别名USERHOSTS中机器上执行别名USERADMIN中的命令





验证:


  1. [root@localhost ~]# su - tom
  2. [tom@localhost ~]$ sudo /usr/sbin/userdel -r test2    ##删除用户test2
  3. [sudo] password for tom:
  4. [tom@localhost ~]$ tail -1 /etc/passwd    ##删除成功
  5. test1:x:501:501::/home/test1:/bin/bash
②、设禁止某用户执行某操作
  1. tom ALL=(root) /usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
  2. ##tom可以以root的身份更改密码,但禁止更改root的密码。


③、设置执特权命了时,无需输入密码


  1. tom   ALL=(root)    /usr/sbin/useradd,NOPASSWD: /usr/sbin/userdel,/usr/sbin/groupdel,PASSWD: /usr/sbin/usermod,/usr/sbin/groupmod
  2. ##这里的/usr/sbin/useradd 操作时必须使用密码;/usr/sbin/userdel, /usr/sbin/groupdel操作时可以不使用密码(跟在其后的所有操作一律不使用密码);/usr/sbin/usermod, /usr/sbin/groupmod 操作时还是要输入密码;还有PASSWD和NOPASSWD不可定义于别名中哦!


验证:



  1. [root@localhost ~]# su - tom
  2. [tom@localhost ~]$ sudo /usr/sbin/useradd test3
  3. [sudo] password for tom:
  4. [tom@localhost ~]$ sudo -k
  5. [tom@localhost ~]$ sudo /usr/sbin/useradd test4
  6. [sudo] password for tom:     ##useradd每次都需要输入密码
  7. [tom@localhost ~]$ sudo -k
  8. [tom@localhost ~]$ sudo /usr/sbin/userdel test3    ##执行userdel没有要求输入密码,NOPASSWD设置生效
  9. [tom@localhost ~]$ tail -3 /etc/passwd
  10. tom:x:500:500::/home/tom:/bin/bash
  11. test1:x:501:501::/home/test1:/bin/bash
  12. test4:x:503:503::/home/test4:/bin/bash


来自  https://blog.csdn.net/yongchaocsdn/article/details/78680085


linux sudo 命令

简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。
严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。sudo 支持插件架构的安全策略,并能把输入输出写入日志。第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo 一起工作。默认的安全策略记录在 /etc/sudoers 文件中。而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo 命令时要求用户输入自己账号的密码。如果验证失败,sudo 命令将会退出。(注意,本文介绍的 sudo 命令运行在 ubuntu 14.04中。)

sudo 命令语法

sudo [-bhHpV][-s ][-u <用户>][指令]

sudo [-klv]
参数
  -b  在后台执行指令。
  -h  显示帮助。
  -H  将HOME环境变量设为新身份的HOME环境变量。
  -k  结束密码的有效期限,也就是下次再执行sudo时便需要输入密码。
  -l  列出目前用户可执行与无法执行的指令。
  -p  改变询问密码的提示符号。
  -s  执行指定的shell。
  -u  <用户>  以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份。
  -v  延长密码有效期限5分钟。
  -V  显示版本信息。
  -S  从标准输入流替代终端来获取密码

sudo 程序相关文件

/etc/sudoers
/etc/init.d/sudo
/etc/pam.d/sudo
/var/lib/sudo
/usr/share/doc/sudo
/usr/share/lintian/overrides/sudo
/usr/share/bash-completion/completions/sudo
/usr/bin/sudo
/usr/lib/sudo

基本配置

系统默认创建了一个名为 sudo 的组。只要把用户加入这个组,用户就具有了 sudo 的权限。
至于如何把用户加入 sudo 组,您可以直接编辑 /etc/group 文件,当然您得使用一个有 sudo 权限的用户来干这件事:

$ sudo vim /etc/group

在 sudo 组中加入新的用户,要使用逗号分隔多个用户。

或者您可以使用 usermod 命令把用户添加到一个组中:

$ sudo usermod -a -G sudo jack

上面的设置中我们把用户 jack 添加到了 sudo 组中,所以当用户 jack 登录后就可以通过 sudo 命令以 root 权限执行命令了!

详细配置

在前面的配置中我们只是把用户 jack 加入了 sudo 组,他就具有了通过 root 权限执行命令的能力。
现在我们想问一下,这是怎么发生的?是时候介绍如何配置 sudo 命令了!
sudo 命令的配置文件为 /etc/sudoers。(注意,/etc/sudoers 的配置内容十分丰富,我们仅做简单的介绍。要了解更多信息,请参考 man sudoers。)
编辑这个文件是有单独的命令的 visudo(这个文件我们最好不要使用 vim 命令来打开),是因为一旦你的语法写错会造成严重的后果,这个工具会替你检查你写的语法,这个文件的语法遵循以下格式:
who where whom command
说白了就是哪个用户在哪个主机以谁的身份执行那些命令,那么这个 where, 是指允许在那台主机 ssh 连接进来才能执行后面的命令,文件里面默认给 root 用户定义了一条规则:

root    ALL=(ALL:ALL)       ALL

root    表示 root 用户。
ALL     表示从任何的主机上都可以执行,也可以这样 192.168.100.0/24。
(ALL:ALL)   是以谁的身份来执行,ALL:ALL 就代表 root 可以任何人的身份来执行命令。
ALL     表示任何命令。
那么整条规则就是 root 用户可以在任何主机以任何人的身份来执行所有的命令。

现在我们可以回答 jack 为什么具有通过 root 权限执行命令的能力了。打开 /etc/sudoers 文件:

sudo 组中的所有用户都具有通过 root 权限执行命令的能力!

再看个例子:

nick   192.168.10.0/24=(root) /usr/sbin/useradd

上面的配置只允许 nick 在 192.168.10.0/24 网段上连接主机并且以 root 权限执行 useradd 命令。

设置 sudo 时不需要输入密码

执行 sudo 命令时总是需要输入密码事件很不爽的事情(抛开安全性)。有些应用场景也需要在执行 sudo 时避开输入密码的交互过程。
那么需要如何设置呢?其实很简单,只需要在配置行中添加 NOPASSWD: 就可以了:

******    ALL=(ALL) NOPASSWD: ALL

再试试看,是不是已经不需要输入密码了?

sudo 的日志

在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的。比如下图中显示的就是一次执行 sudo 命令的日志:


来自  https://www.cnblogs.com/sparkdev/p/6189196.html











普通分类: