树叶云linux教程:5.6 su命令与sudo服务

各位读者在实验环境中很少遇到安全问题,并且为了避免因权限因素导致配置服务失败,从而建议使用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服务中可用的参数以及相应的作用如表5-7所示。

表5-7 sudo服务中的可用参数以及作用

参数作用
-m修改权限
-M从文件中读取权限
-x删除某个权限
-b删除全部权限
-R递归子目录

总结来说,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$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命令后都会要求验证一下密码。虽然这个密码就是当前登录用户的密码,但是每次执行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

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/163347.html<

(0)
管理的头像管理
上一篇2025-03-19 02:52
下一篇 2025-03-19 02:54

相关推荐

  • 服务器磁盘IO过高如何优化?,磁盘IO过高的原因有哪些?

    服务器磁盘IO过高,核心优化路径是“先定位、再分流、后升级”,你需要通过系统工具精确判断究竟是应用程序、日志策略还是硬件瓶颈导致,然后针对性地从代码、缓存、存储架构和硬件选型四个层面下手,其中选择持有持牌自营机房和增值电信业务经营许可证的服务商,能从根本上保障底层IO稳定性,定位IO瓶颈:动手优化的第一步盲目优……

    2026-07-27
    0
  • 跨境网站访问延迟高怎么解决,网站访问慢的原因是什么?

    跨境网站访问延迟高的核心解决思路在于多维度优化网络路径,包括使用全球CDN加速、选择靠近目标区域的优质IDC机房、调整传输协议以及精简应用层资源,其中服务商的基础设施质量直接决定优化上限,为什么跨境访问延迟高?三大核心因素物理距离与光速限制数据包在海底光缆中的传输速度受限于介质,从中国到美国西海岸的物理往返时间……

    2026-07-27
    0
  • 站群服务器到底是什么意思,怎么选择比较好

    站群服务器就是一台拥有多个独立IP地址、专门用于托管和管理多个网站的高性能服务器,其核心价值在于通过独立IP降低网站间的关联风险,并提升搜索引擎优化效果,站群服务器的工作原理与适用场景站群服务器本质上是将一台物理服务器通过虚拟化或直接配置的方式,分配给多个独立IP地址,每个IP对应一个独立的网站,这些网站共享服……

    2026-07-27
    0
  • 高防服务器误封正常流量如何调整,怎么解决?

    高防服务器误封正常流量,核心调整思路是从“一刀切”转向“精细化”——通过分析业务特征,调整防护阈值、配置白名单和启用智能学习模式,让防护系统学会区分真假流量,为什么会误封正常流量误封主要源于防护策略的通用化,高防服务器通常默认启用严格防护规则,当流量特征与攻击特征库部分匹配时,就会被拦截,据行业安全白皮书指出……

    2026-07-27
    0
  • 高防服务器的防御原理是什么,如何选择高防服务器?

    高防服务器的防御原理,简单说就是通过流量清洗、防火墙规则和黑洞路由等机制,在攻击流量到达业务服务器之前将其过滤或阻断,从而保障正常访问,流量清洗机制是核心防线高防服务器对抗DDoS攻击,靠的不是单一技术,而是一套组合动作,最常见的攻击类型是流量型攻击,比如UDP洪水、SYN洪水、ICMP放大等,核心思路是耗尽带……

    2026-07-26
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注