1、sudo介绍
sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性。Sudo不是对shell的一个代替,它是面向每个命令的。
它的特性主要有这样几点:
1、sudo能够限制用户只在某台主机上运行某些命令。
2、sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
3、sudo使用时间戳文件–日志 来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。
4、sudo的配置文件是/etc/sudoers,属性必须为0440,它允许系统管理员集中的管理用户的使用权限和使用的主机。
2、语法
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 更改为其他人)执行的指令
3、测试案例一
定义一个用户(user1)使其拥有添加用户的特殊权限,并进行创建用户操作。
①、创建用户user1创建密码
②、修改配置文件,为user1添加特殊权限useradd
vim /etc/sudoers
添加下面一行:
这里的/usr/sbin/useradd表示普通用户执行时必须使用全路径
③、切换到用户user1,验证特殊权限
[root@centos7 user1]# su user1
[user1@centos7 ~]$ sudo -l
[sudo] user1 的密码:
匹配 %2$s 上 %1$s 的默认条目:
!visiblepw, always_set_home, match_group_by_gid, 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
用户 user1 可以在 centos7 上运行以下命令:
(root) /usr/sbin/useradd
[user1@centos7 ~]$
user1执行useradd操作:
[user1@centos7 ~]$ sudo /usr/sbin/useradd user2 #添加用户user2
[user1@centos7 ~]$ tail -1 /etc/passwd
user2:x:1005:1006::/home/user2:/bin/bash # 添加成功
[user1@centos7 ~]$
④、切换回root查看日志/vat/log/secure
[root@centos7 user1]# tail /var/log/secure
Nov 19 11:34:24 centos7 unix_chkpwd[33386]: password check failed for user (user1)
Nov 19 11:34:24 centos7 sudo: pam_unix(sudo:auth): authentication failure; logname=root uid=1004 euid=0 tty=/dev/pts/0 ruser=user1 rhost= user=user1
Nov 19 11:34:28 centos7 sudo: user1 : command not allowed ; TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=list
Nov 19 11:35:01 centos7 su: pam_unix(su:session): session opened for user root by root(uid=1004)
Nov 19 11:35:27 centos7 su: pam_unix(su:session): session opened for user user1 by root(uid=0)
Nov 19 11:35:34 centos7 sudo: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=list
Nov 19 11:36:45 centos7 sudo: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/usr/sbin/useradd user2
##user1以管理员身份执行了useradd命令,添加用户user2
Nov 19 11:36:45 centos7 useradd[33547]: new group: name=user2, GID=1006
Nov 19 11:36:45 centos7 useradd[33547]: new user: name=user2, UID=1005, GID=1006, home=/home/user2, shell=/bin/bash
Nov 19 11:37:56 centos7 su: pam_unix(su:session): session opened for user root by root(uid=1004)
⑤、-k参数示例
[root@localhost ~]# su - tom
[tom@localhost ~]$ sudo -k ##结束密码有效期
[tom@localhost ~]$ sudo /usr/sbin/useradd test2
[sudo] password for tom: ##有效期结束后,执行特殊命令,需重新验证密码
[tom@localhost ~]$ tail -1 /etc/passwd
test2:x:502:502::/home/test2:/bin/bash #添加test2成功
3、测试案例二【配置别名】
①、visudo指令可以在在配置文件中定义别名
[root@localhost ~]# visudo
Host_Alias USERHOSTS = 172.16.0.0/16,127.0.0.0/8,192.168.0.0/24 ##定义主机别名,可以在哪些机器执行特殊命令
Cmnd_Alias USERADMIN=/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel ##定义命令别名
root ALL=(ALL) ALL
tom ALL=(root) USERADMIN ##此处定义tom可以执行别名USERADMIN中的所有命令
tom USERHOSTS=(ROOT) USERADMIN ##可以在别名USERHOSTS中机器上执行别名USERADMIN中的命令
[root@centos7 user1]# su user1
[user1@centos7 ~]$ sudo /usr/sbin/userdel -r user2
[sudo] user1 的密码:
[user1@centos7 ~]$ tail -1 /etc/passwd
user1:x:1004:1005::/home/user1:/bin/bash # 说明user1继承了USERADMIN组中的权限。
②、设禁止某用户执行某操作
vim /etc/sudoers
[user1@centos7 ~]$ sudo passwd test1 # 更改普通用户密码,成功
更改用户 test1 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[user1@centos7 ~]$ sudo passwd root # 更改root用户密码失败。
对不起,用户 user1 无权以 root 的身份在 centos7 上执行 /bin/passwd root。
③、设置某些权限,无需输入密码
vim /etc/sudoers
[root@localhost ~]# su - tom
[tom@localhost ~]$ sudo /usr/sbin/useradd test3
[sudo] password for tom:
[tom@localhost ~]$ sudo -k
[tom@localhost ~]$ sudo /usr/sbin/useradd test4
[sudo] password for tom: ##useradd每次都需要输入密码
[tom@localhost ~]$ sudo -k
[tom@localhost ~]$ sudo /usr/sbin/userdel test3 ##执行userdel没有要求输入密码,NOPASSWD设置生效
[tom@localhost ~]$ tail -3 /etc/passwd
tom:x:500:500::/home/tom:/bin/bash
test1:x:501:501::/home/test1:/bin/bash
test4:x:503:503::/home/test4:/bin/bash