1、[root@linuxprobe ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@linuxprobe ~]# su - linuxprobe
Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ id
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_u:unconfine
d_r:unconfined_t:s0-s0:c0.c1023
细心的同学一定会发现上面的su命令与用户名之间有一个减号(-),这意味着完全的切换到新的用户,即把环境变量信息也变更为新的用户,而不保留原始的用户信息,这个是推荐必加的参数,一定要记下哦~另外当超级用户切换到普通用户时是不需要密码验证的,而普通用户切换成超级用户身份就需要密码验证后才能成功了,这是一个必要的安全检查:
[linuxprobe@linuxprobe root]$ su root
Password:
[root@linuxprobe ~]# su - linuxprobe
Last login: Mon Aug 24 19:27:09 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]#
2、虽说像上面使用su命令允许普通用户完全变更为root用户身份来完成工作,但这也无疑会暴露了root超级管理员的密码,使得系统密码被黑客获取的几率也大大提高了,这似乎并不是最安全的方案。因此刘遄老师决定教给同学们使用sudo程序来把特定命令的执行权限赋予给指定的用户,这样既可保证了正常工作的同时也避免了泄露root超级用户密码,平时只要合理的配置sudo服务便可以合理的兼顾系统的安全性和用户便捷性,配置的原则也很简单——在保证普通用户完成工作的前提下,尽可能少的给予额外的权限。
当然如果感觉直接修改配置文件不太放心,担心出现问题的话还可以使用sudo服务提供的visudo命令来配置用户权限,这条命令在配置用户权限时可以避免多个用户同时修改配置文件,以及对配置文件内的参数进行语法检查,在发现错误参数时会直接提示并报错。
只用超级用户才可以使用visudo命令编辑sudo程序的配置文件(/etc/sudoers),平时还可以使用visudo命令来配置用户权限吧,这样既能防止多个用户同时修改配置文件,还能对配置文件内的参数进行语法检查,对于错误的参数会直接提示并报错。
使用visudo命令配置sudo服务的服务文件时,操作的方法与咱们学习过的vim编辑器是一致的,因此在编写完成后记得在末行模式下保存并退出。sudo服务程序配置文件中约第99行按照下面的格式填写上指定的信息即可。
3、谁可以使用超级用户身份 允许使用sudo命令的主机=(以谁的身份执行命令) 可执行命令的列表
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
这样填写后记得要保存后再退出,然后切换至指定的用户身份就可以用sudo -l命令查看到所有可执行的命令啦(此处验证的是该普通用户的密码,而不是root用户的密码,同学们不要搞混喽):
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ sudo -l
[sudo] password for linuxprobe:
Matching Defaults entries for linuxprobe on this host:
requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="
LC_COLLATELC_IDENTIFICATION LC_MEASUREMENT
LC_MESSAGES", env_keep+="LC_MONETARYLC_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
User linuxprobe may run the following commands on this host:
(ALL) ALL
接下来就是见证奇迹的时刻,因为作为一名普通用户是肯定不能查看到root超级用户家目录(/root)中的文件信息的,但咱们只需要在想执行的命令前面加上sudo命令就变得有权限了:
[linuxprobe@linuxprobe ~]$ ls /root
ls: cannot open directory /root: Permission denied
[linuxprobe@linuxprobe ~]$ sudo ls /root
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
效果非常明显哦!但是考虑到真实的工作环境中肯定不能允许某个普通用户拥有了整个系统中所有命令的最高执行权,也不符合刚刚提到的权限赋予原则——在保证普通用户完成工作的前提下,尽可能少的给予额外的权限,因此ALL的参数就显得有些不合适了,应该代之以具体的命令来既让用户满足了工作需求,也能够受到必要的权限约束。如果需要让某个用户只能使用超级用户的身份执行指定的命令,切记一定要写上的是该命令的绝对路径,否则系统会识别不出来哦,咱们可以先用whereis命令找出命令所对应的保存路径,然后把刚刚配置文件中约第99行的用户权限参数修改成对应的路径即可:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /bin/cat
4、这样编辑好后依然是记得要保存退出,然后咱们再次切换到指定的普通用户上面,尝试正常查看某个文件的内容被提示没有权限,然后再用sudo命令后就可以顺利的查看文件内容啦:
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:51:01 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
root:$6$GV3UVtX4ZGg6ygA6$J9pBuPGUSgZslj83jyoI7ThJla9ZAULku3BcncAYF00Uwk6Sqc4E36MnD1hLtlG9QadCpQCNVJs/5awHd0/pi1:16626:0:99999:7:::
bin:*:16141:0:99999:7:::daemon:*:16141:0:99999:7:::
adm:*:16141:0:99999:7:::lp:*:16141:0:99999:7:::
sync:*:16141:0:99999:7:::
shutdown:*:16141:0:99999:7:::
halt:*:16141:0:99999:7:::
mail:*:16141:0:99999:7:::
operator:*:16141:0:99999:7:::
games:*:16141:0:99999:7:::
ftp:*:16141:0:99999:7:::
nobody:*:16141:0:99999:7:::
………………省略部分文件内容………………
不要以为到这里就算结束了,刘遄老师还有更压箱底的宝贝,不知同学们有没有发觉到在每次执行sudo命令后都会被要求验证一下密码,虽然这个密码就是当前登录用户的密码,但这样每条命令都要输入一次密码其实也挺麻烦的,因此再添加NOPASSWD参数来使得用户执行sudo命令时不再需要密码验证啦:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff
这样当咱们切换到普通用户后再执行命令时,就不用再频繁麻烦的要求验证密码了,在日常工作会一定会感觉到痛快极了~
[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:58:31 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ poweroff
User root is logged in on seat0.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.
[linuxprobe@linuxprobe ~]$ sudo poweroff