• Linux课程笔记 用户身份切换命令


     超级用户root具有超级管理权限,由于权限太大,如果管理不好,就会对系统安全带来安全隐患。在工作场景中,一般临时性处理工作,都是以普通用户的身份完成,只在必要时才使用超级用户root。

    1  su命令

    1.1  su介绍 

    通过su命令可以在用户之间切换,超级用户root向普通用户或虚拟用户切换不需要密码(这就是超极权限所在)。其他普通用户之间或者普通用户切换到root,都需要切换用户的秘密验证。

       

    su参数选项

    注释说明

    -,-l,--login

    使一个shell成为登陆的shell,如执行su - oldboy,表示该用户改变身份为oldboy,并且使用oldboy用户的环境变量配置。

    -c,--command=COMMAND

    切换到一个shell下,执行一个命令,然后退出所切换的用户环境

    -m,--presserve-environment

    切换用户时,不重置用户环境变量,-p的功能同-m,这个参数为su的默认值,较少使用

    -s,--shell=SHELL

    如果/ec/shell允许,则运行指定的shell

      su实例:

    [qinbf@qinbf ~]$ whoami

    qinbf

    [qinbf@qinbf ~]$ su -  #输入的是root的密码

    口令:

    [root@qinbf ~]# whoami

    root

    [root@qinbf ~]# env

    HOSTNAME=qinbf

    SHELL=/bin/bash

    TERM=linux

    HISTSIZE=1000

    USER=root

    ……

    PWD=/root

    LANG=zh_CN.UTF-8

    SHLVL=1

    HOME=/root

    LOGNAME=root

    [root@qinbf ~]# su - qinbf

    [qinbf@qinbf ~]$ whoami

    qinbf

    [qinbf@qinbf ~]$ env

    HOSTNAME=qinbf

    SHELL=/bin/bash

    TERM=linux

    HISTSIZE=1000

    USER=qinbf

    …….

    PWD=/home/qinbf

    LANG=zh_CN.UTF-8

    SHLVL=1

    HOME=/home/qinbf

    LOGNAME=qinbf

    [qinbf@qinbf ~]$ exit   # exit退出当前用户,这个命令可以用ctrl+d替换

    logout

    [root@qinbf ~]#

    总结:su切换到其他用户不加“-”,环境变量是不会改变的,可能会导致异常,比较规范的写法是“su  -  用户”

    如何让系统在每一次开机时自动普通用户启动指定的服务脚本?

    把要执行的脚本放入开机自启动配置文件/etc/rc.local

    su  -  tddoc  -c  ‘/bin/sh /home/tddoc/bin/deploy.sh’

    su命令优缺点

                su命令为我们管理linux带来方便,但是也带来了很大的安全管理问题,切换到root身份,可以改掉root的密码,让其他用户无法再切换到root。使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择。建议使用sudo代替su。

          su致命的缺点:

    1)   普通用户必须知道root密码才可以切换到root,这样root密码就泄露开了。

    2)   使用su命令切换身份,无法对切换后的身份做精细的控制,可以为所欲为,甚至改掉root密码。

    2 sudo命令

    通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细)授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权。

    2.1  sudo执行的流程

    1)                 当用户执行sudo时,系统会首先查找/var/run/sudo/%HOME(如果是新用户会先生成此目录)目录中是否有用户时间戳文件,如果时间戳文件过期,则提示用户是否输入自身的密码(不是root或者要切换的用户密码)

    2)                 当密码验证成功后,系统会查找/etc/sudoers配置文件,判断用户是否有执行相应sudo命令权限

    3)                 如果具备执行相应sudo权限,就会自动由当前用户切换到root,然后以root身份执行该命令

    4)                 执行完成后,又会自动直接退回到当前用户shell下。

    2.2  sudo语法

          sudo  [参数选项] 命令

    sudo参数选项

    注释说明

    -l

    列出用户在主机上可用的和被禁止的命令

    -v

    验证用户的时间戳;当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接运行sudo,可用-v可以跟踪最新的时间戳

    -u

    指定以某个用户身份执行特定的操作

    -k

    同-K,删除时间戳,下一个sudo命令提供密码。前提是该用户授权中不能有NOPASSWD参数

                                sudo授权的方法

    1)   执行visudo命令

    2)   直接修改/etc/sudoers文件

    直接修改sudoers配置文件方法有以下需要注意的几点:

    1. echo命令是追加>>,不是重定向>,除了echo外,可以用cat、sed等命令实现此功能;
    2. 修改操作完成一定要执行visudo  -c进行语法检查,这弥补了直接修改的不足
    3. 确保/etc/sudoers权限是正确的(-r--r-----),权限不对会导致sudo功能异常
    4. 及时对授权的操作进行测试,验证是否正确(最好不要退出当前授权窗口)
    5. 确保知道正确root用户密码,以便在出现问题时可以通过普通用户等候执行su-命令切换到root进行恢复。

    3)   使用用户组的方式实现sudo授权

    通过授权一个用户组的方式来配置/etc/sudoers,这样以后有增加用户需要相同的授权时,直接将用户加入到sa组就可以享受sa组的sudo授权了。

    %sa                     ALL=(All)            ALL

    #注意用户组授权和普通用户的区别,开头为“%”百分号。sa组同用户一样必须是已经存在的。

    2.3  sudo实例:

    [root@qinbf ~]# useradd sun

    [root@qinbf ~]# echo "qbf" |passwd --stdin sun

    Changing password for user sun.

    passwd: all authentication tokens updated successfully.

    [root@qinbf ~]# su - sun

    [sun@qinbf ~]$ touch /root/sun.txt

    touch: 无法触碰 “/root/sun.txt”: 权限不够

    [sun@qinbf ~]$ sudo /root/sun.txt

    We trust you have received the usual lecture from the local System

    Administrator. It usually boils down to these three things:

        #1) Respect the privacy of others.

        #2) Think before you type.

        #3) With great power comes great responsibility.

    [sudo] password for sun:

    Sorry, try again.

    [sudo] password for sun:

    sun is not in the sudoers file.  This incident will be reported.

    方法一:

    [root@qinbf ~]# visudo

    81 ## Allow root to run any commands anywhere

         82

         83 root    ALL=(ALL)       ALL

         84 qinbf   ALL=(ALL)       ALL

         85 sun     ALL=(ALL)       ALL #允许sun用户在任何主机、对任何用户、执行任何操作

    方法二:

    [root@qinbf ~]# echo "sun   ALL=(ALL)   ALL">>/etc/sudoers

    [root@qinbf ~]# visudo -c    #检查/etc/sudoers文件的语法

    /etc/sudoers: parsed OK

    [root@qinbf ~]# ll /etc/sudoers  #检查/etc/sudoers文件的权限

    -r--r----- 1 root root 3438 06-05 15:05 /etc/sudoers

    方法三:

    [root@qinbf ~]# grep sa /etc/group

    sa:x:801:oldboy6

    [root@qinbf ~]# echo "%sa   ALL=(ALL)   ALL">>/etc/sudoers

    [root@qinbf ~]# usermod -G sa sun

    验证:

    [sun@qinbf ~]$ sudo touch /root/sun.doc

    [sun@qinbf ~]$ sudo ls -l /root/sun.doc

    -rw-r--r-- 1 root root 0 06-05 15:10 /root/sun.doc

     3  /etc/sudoers配置文件

     3.1    /etc/sudoers的规则大致可分为两类:一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。

                    

    1)   Host_Alias定义主机别名

    # Host_Alias     FILESERVERS = fs1, fs2

    # Host_Alias     MAILSERVERS = smtp, smtp2

                      

    2)   User_Alias定义用户别名

    User_Alias  ADMINS = jsmith, mikem

    3)   Runas_Alias定义runas别名

    这个别名指定的是“用户身份”,即sudo允许切换至的用户

    Runas_Alias SUPER = root

    4)   Cmnd_Alias定义命令别名

    ## Services

    #Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

    ## Updating the locate database

    #Cmnd_Alias LOCATE = /usr/bin/updatedb

    3.2 别名实例

                                实例1:定义用户别名

    User_Alias  ADMINS = oldboy,  ett,  %oldboy

    #-->定义用户别名ADMINS,包含oldboy,ett及oldboy组的成员

                               

                                实例2:定义命令别名

    Cmnd_Alias  NETWORK = /sbin/ifconfig, /etc/init.d/network

    #

    1)  所有的命令别名下的成员必须是文件或目录的绝对路径

    2) 命令别名超过一行时,可以通过“”号换行

    3) 在定义时,可以使用正则表达式,如/usr/bin/passwd [A-Za-z]*。

                                实例3:定义Runas别名

    Runas_Alias  OP = root, oldboy

    特别说明:runas别名的定义也不多见

     3.3  /etc/sudoers配置文件中的授权规则

                               

    oldboy      ALL=(ALL)    ALL

    #-->授权中的所有ALL字符串必须大写。其中,第一、二个ALL字符串不大写的话,visudo语法检查可以过,但是授权实际配置达不到配置需求,最后一个ALL必须大写,否则visudo语法检查通不过。

    这一行代表的意思是:

    授权用户    主机=(指定的可切换的用户) 可以执行的命令动作

    因此,上面一行授权内容的实际意思就是,oldboy用户可以在所有的主机上,切换到所有用户,执行所有的命令。

    如果忽略上面括号的内容,如写成:

    oldboy      ALL=         ALL

    那么只能切换到root执行所有命令。

    如果希望在执行命令时不提示密码,就用这个NOPASSWD:ALL语法来授权

    如果不希望执行某个命令,那么就在这个命令前面加上“!”

     3.4  /etc/sudoers配置文件授权规则实例

    在/etc/sudoers文件的末尾添加以下两行:

    Cmnd_Alias USER_ADMIN = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

    test  ALL=(ALL)    USER_ADMIN

    "/etc/sudoers" 109L, 3595C 已写入

    [root@test2 ~]# visudo -c

    /etc/sudoers: parsed OK

    [root@test2 ~]# ll /etc/sudoers

    -r--r----- 1 root root 3595 06-08 10:07 /etc/sudoers

    [test@test2 ~]$ vi .bash_profile

    #修改test用户的环境变量,添加以下黄色部分的变量

    PATH=$PATH:$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    [test@test2 ~]$ source .bash_profile

    [test@test2 ~]$ sudo useradd bifeng 

    [sudo] password for test:

    [test@test2 ~]$ sudo passwd bifeng

    Changing password for user bifeng.

    New UNIX password:

    Retype new UNIX password:

    Sorry, passwords do not match.

    New UNIX password:

    Retype new UNIX password:

    passwd: all authentication tokens updated successfully.

    [test@test2 ~]$ sudo passwd root

    [sudo] password for test:

    Sorry, user test is not allowed to execute '/usr/bin/passwd root' as root on test2.localdomain.

    [test@test2 ~]$ sudo passwd

    [sudo] password for test:

    Sorry, user test is not allowed to execute '/usr/bin/passwd' as root on test2.localdomain.

    再添加一行:

    Cmnd_Alias USER_CHANGE = /bin/chown

    修改test的权限:

    test  ALL=(ALL)    USER_ADMIN, NOPASSWD: USER_CHANGE

    [test@test2 ~]$ sudo /bin/chown sun.sun /root/sun.txt

    [test@test2 ~]$

    #-----à不再需要密码提示

    3.5 sudo配置文件/etc/sudoers授权规则注意事项总结:

    1)   授权规则中的所有ALL字符串必须为大写字母

    2)   Cmnd_Alias USERCMD = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd、/usr/bin/passwd[A-Za-z]*, /bin/chown, !/usr/bin/passwd root

    允许执行的命令是有顺序的,从老师的测试结果来看,命令的顺序是从后面向前,即把允许执行的命令放在禁止命令的后面

    3)   一行内容超长可以用“”斜线换行

    4)   “!”叹号表示非,就是命令取反的意思,即禁止执行的命令。

    5)   测试之前要记得修改普通用户的环境变量.bash_profile文件,把root的环境变量加入到普通用户的后面。

    3.6 远程执行sudo命令

    在默认情况下,我们是无法通过ssh远程执行sudo命令的

    在/etc/sudoers有这样的配置:

    53 # Disable "ssh hostname sudo <cmd>", because it will show the password in clear.

     54 #         You have to run "ssh -t hostname sudo <cmd>".

     55 #

     56 Defaults    requiretty

    根据注释我们可以知道,这个“Default  requiretty”就是禁止我们通过ssh远程执行sudo命令的明确配置,但是禁止执行的远程ssh  sudo  命令格式为“ssh  hostname  sudo  <cmd>”,禁止的原因是因为会明文显示密码,但是我们可以通过“ssh  -t  hostname sudo  <cmd>”的方式

     4 配置sudo命令审计

     4.1 日志文件配置

    1)安装sudo,syslog命令服务

    yum  install  sudo syslog

    [root@test2 ~]# yum install sudo syslog

    2)配置系统日志/etc/syslog.conf

               echo  “local2.debug    /var/log/sudo.log” >>/etc/syslog.conf

    31news.=crit                             /var/log/news/news.crit

     32news.=err                             /var/log/news/news.err

     33news.notice                           /var/log/news/news.notice

     34local2.debug                          /var/log/sudo.log

    3) 配置/etc/sudoers

               增加配置“Defaults      logfile=/var/log/sudo.log”>>/etc/sudoers

    4) 重启syslog内核日志记录器

               /etc/init.d/syslog  restart

    [root@test2 ~]# /etc/init.d/syslog restart

    关闭内核日志记录器:                                       [确定]

    关闭系统日志记录器:                                       [确定]

    启动系统日志记录器:                                       [确定]

    启动内核日志记录器:                                       [确定]

    5) 测试sudo日志审计配置结果

    [test@test2 ~]$ sudo useradd bill

    [test@test2 ~]$ sudo passwd bill

    Changing password for user bill.

    New UNIX password:

    Retype new UNIX password:

    passwd: all authentication tokens updated successfully.

    [test@test2 ~]$ sudo useradd lily

    [test@test2 ~]$ passwd lily

    passwd: Only root can specify a user name.

    [test@test2 ~]$ sudo passwd lily

    Changing password for user lily.

    New UNIX password:

    Retype new UNIX password:

    passwd: all authentication tokens updated successfully.

    [test@test2 ~]$ sudo chown root.root /root/sun.txt

    [root@test2 ~]# tail /var/log/sudo.log

     6月  8 11:02:45 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

        COMMAND=/usr/sbin/useradd bill

     6月  8 11:02:52 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

        COMMAND=/usr/bin/passwd bill

     6月  8 11:03:32 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=list

     6月  8 11:03:51 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=validate

     6月  8 11:04:12 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

        COMMAND=/usr/sbin/useradd lily

     6月  8 11:04:22 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

    COMMAND=/usr/bin/passwd lily

    6月  8 11:07:04 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ;

        COMMAND=/bin/chown root.root /root/sun.txt

    4.2 日志写到其他主机:
    1. 配置syslog服务器配置文件(/etc/sysconfig/syslog)中添加:

    SYSLOGD_OPTIONS=”-m O -r -x”  # -r是指接收远程日志的意思

    重启syslog服务器

    /etc/init.d/syslog   restart

    1. 客户端配置

    编辑/etc/syslog.conf

    修改

    local2.debug   /var/log/sudo.log

    修改为

    local2.debug   @中央服务器的IP

     

     

  • 相关阅读:
    LeetCode Lect7 堆及其应用
    Leetcode Lect7 哈希表
    5105 pa3 Distributed File System based on Quorum Protocol
    5105 pa2 Distributed Hash Table based on Chord
    5105 pa1 MapReduce
    分布式系统知识总结
    OS知识点总结
    c++知识点总结3
    c知识点总结2
    c++知识点总结
  • 原文地址:https://www.cnblogs.com/fengze/p/6752468.html
Copyright © 2020-2023  润新知