实验环境中很少遇到安全问题,并且为了避免因权限因素导致配置服务失败,从 而建议使用 root 管理员来学习本书,但是在生产环境中还是要对安全多一份敬畏之心,不要用 root 管理员去做所有事情。因为一旦执行了错误的命令,可能会直接导致系统崩溃,这样一来,不但 客户指责、领导批评,没准奖金也会鸡飞蛋打。但转头一想,尽管 Linux 系统为了安全性考虑, 使得许多系统命令和服务只能被root管理员来使用,但是这也让普通用户受到了更多的权限束缚, 从而导致无法顺利完成特定的工作任务。 su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切 换到其他用户,比如从 root 管理员切换至普通用户: [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 命令与用户名之间有一个减号(-),这意味着完全切 换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强 烈建议在切换用户身份时添加这个减号(-)。 另外,当从 root 管理员切换到普通用户时是不需要密码验证的,而从普通用户切换成 root 管理员就需要进行密码验证了;这也是一个必要的安全检查: [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 ~]# 尽管像上面这样使用 su 命令后,普通用户可以完全切换到 root 管理员身份来完成相应工作, 但这将暴露 root 管理员的密码,从而增大了系统密码被黑客获取的几率;这并不是最安全的方案。 刘遄老师接下来将介绍如何使用 sudo 命令把特定命令的执行权限赋予给指定用户, 这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。我们要做 的就是合理配置 sudo 服务,以便兼顾系统的安全性和用户的便捷性。sudo 服务的配置原 则也很简单—在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。 sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式 为“sudo [参数] 命令名称”。sudo 服务中可用的参数以及相应的作用如下 所示。 参数 作用 -h 列出帮助信息 -l 列出当前用户可执行的命令 -u 用户名或 UID 值 以指定的用户身份执行命令 -k 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证 -b 在后台执行指定的命令 -p 更改询问密码的提示语 总结来说,sudo 命令具有如下功能: ¾限制用户执行指定的命令: ¾记录用户执行的每一条命令; ¾配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数; ¾验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。 当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令 来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还 可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。 注意:只有 root 管理员才可以使用 visudo 命令编辑 sudo 服务的配置文件。 visudo: >>> /etc/sudoers: syntax error near line 111 <<< What now? Options are: (e)dit sudoers file again (x)it without saving changes to sudoers file (Q)uit and save changes to sudoers file (DANGER!) 使用 visudo 命令配置 sudo 命令的配置文件时,其操作方法与 Vim 编辑器中用到的方法 一致,因此在编写完成后记得在末行模式下保存并退出。在 sudo 命令的配置文件中,按照下 面的格式将第 99 行(大约)填写上指定的信息: 谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表 [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:此处输入 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_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 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 参 数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的 权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给 出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 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) /usr/bin/cat 在编辑好后依然是先保存再退出。再次切换到指定的普通用户,然后尝试正常查看某个 文件的内容,此时系统提示没有权限。这时再使用 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$J9pBuPGUSgZslj83jyoI7ThJla9ZAULku3BcncAYF00Uwk6Sqc4E36 MnD1hLtlG9QadCpQCNVJs/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 命令后都会要求验证一下密码。虽然这个密码就是当前登录用户的密码,但 是每次执行 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
|