zoukankan      html  css  js  c++  java
  • 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

     

     

  • 相关阅读:
    从零开始入门 K8s | 应用编排与管理
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    203. Remove Linked List Elements
    183. Customers Who Never Order
    182. Duplicate Emails
    181. Employees Earning More Than Their Managers
    1261. Find Elements in a Contaminated Binary Tree
    1260. Shift 2D Grid
  • 原文地址:https://www.cnblogs.com/fengze/p/6752468.html
Copyright © 2011-2022 走看看