多语言展示
当前在线:261今日阅读:113今日分享:31

su命令与sudo服务

虽然咱们的学员在实验环境中很少碰到安全问题,并且为了避免因为权限因素导致配置服务失败而推荐您使用root超级用户身份来配合本书来学习,但是在真正的工作生产环境中还是要对安全多一份敬畏之心,不要用root超级用户身份去做一切的事情,因为一旦执行了错误命令后可能会直接导致系统崩溃,没准还会被领导痛批一顿。但转头一想,Linux系统中有许多的系统命令和服务为了安全性考虑,因此只有root超级用户才可以去使用,这无疑让普通用户受到了更多的权限束缚,有时也就没法顺利完成工作任务了。su命令便是为了解决切换用户身份的需求而设计的功能,使用su命令可以让使用者在不注销的情况下顺畅的切换至其他用户,例如从root超级用户切换至普通用户。详情请关注《linux就该这么学》。
工具/原料

一台装有RHEL 7.0操作系统的电脑

方法/步骤
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:unconfined_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='COLORSDISPLAY HOSTNAME HISTSIZE INPUTRC 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/binUser 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 ~]$ poweroffUser 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

推荐信息