zoukankan      html  css  js  c++  java
  • Linux(7):用户管理

    用户管理

    让一个脚本或命令开机自启动的方法:

    # 方法一: 
        把脚本放到  /etc/rc.local  中
    # 方法二: 
        把脚本或命令通过 chkconfig 管理
        
    # 如何让一个脚本被 chkconfig 管理 ?
    # 1). 被 chkconfig 管理的脚本必须要放在 /etc/init.d 下面
    [root@NEO ~]# vim /etc/init.d/oldgirld 
    [root@NEO ~]# cat /etc/init.d/oldgirld 
    echo oldgirl
    [root@NEO ~]# ll /etc/init.d/oldgirld
    -rw-r--r-- 1 root root 13 Apr  8 21:26 /etc/init.d/oldgirld
    
    # 2). 这个脚本要有执行权限
    [root@NEO ~]# chmod +x /etc/init.d/oldgirld 
    [root@NEO ~]# /etc/init.d/oldgirld
    oldgirl
    
    # 我们平时运行脚本是通过 sh 命令,但系统运行脚本是通过 绝对路径
    
    # 3). 这个脚本的开头要有 chkconfig 指定的内容: # chkconfig: 2345 99 99   ---> #空格chkconfig:空格2345空格99空格99
    [root@NEO ~]# vim /etc/init.d/oldgirld
    [root@NEO ~]# cat /etc/init.d/oldgirld
    # chkconfig: 2345 99 99        # 2345 表示这段脚本被 chkconfig 管理的时候 默认在哪些运行级别上开机启动;第一个99表示这个脚本是第几个开机启动的(开机启动顺序;我们自己写的脚本一般放到99开机顺序;最大也是99);第二个99表示关机顺序 
    echo oldgirl
    
    # 4). 让 chkconfig 管理脚本:
    [root@NEO ~]# 
    [root@NEO ~]# chkconfig --add oldgirld   # oldgirld 这个脚本不需要写 绝对路径,因为这个脚本必须放在 /etc/init.d/ 下面
    [root@NEO ~]# chkconfig |grep girl
    oldgirld           0:off    1:off    2:on    3:on    4:on    5:on    6:off
    [root@NEO ~]# 

    chkconfig 背后的原理

    # chkconfig 也是命令,但却能永久生效,是因为它改变了一些文件,拿 3运行级别来说,它影响的是 /etc/rc3.d/ 下面的文件
    [root@NEO ~]# ls /etc/rc3.d/
    K01smartd     K74ntpd         K92iptables      S10network     S22messagebus        S50kdump      S99local
    K10psacct     K75ntpdate      K99rngd          S11auditd      S25blk-availability  S55sshd       S99oldgirld
    K10saslauthd  K75quota_nld    S01sysstat       S12rsyslog     S25netfs             S82abrtd
    K15svnserve   K87restorecond  S02lvm2-monitor  S13cpuspeed    S26acpid             S83abrt-ccpp
    K30postfix    K89netconsole   S05rdma          S13irqbalance  S26haldaemon         S90crond
    K61nfs-rdma   K89rdisc        S08ip6tables     S15mdmonitor   S26udev-post         S95atd            # 这些都是软链接
    [root@NEO ~]# chkconfig iptables on
    [root@NEO ~]# chkconfig |grep ipt
    iptables           0:off    1:off    2:on    3:on    4:on    5:on    6:off
    [root@NEO ~]# ll /etc/rc3.d/ |grep ipt
    lrwxrwxrwx  1 root root 18 Apr  8 22:04 S08iptables -> ../init.d/iptables
    [root@NEO ~]# chkconfig iptables off
    [root@NEO ~]# ll /etc/rc3.d/ |grep ipt
    lrwxrwxrwx  1 root root 18 Apr  8 22:06 K92iptables -> ../init.d/iptables
    [root@NEO ~]# chkconfig |grep ipt
    iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off
    [root@NEO ~]# 
    
    # 由上面可知,chkconfig iptables on/off 对 /etc/rc3.d/ 中的文件 产生了影响:
    chkconfig iptables on ====> /etc/rc3.d/ 下面的 S08iptables -> ../init.d/iptables        # S ---> start
    chkconfig iptables off  ====> /etc/rc3.d/ 下面的 K92iptables -> ../init.d/iptables        # K ---> kill
    
    # 验证 S 代表 start 和 K 代表 kill
    [root@NEO ~]# chkconfig |grep ipt
    iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off
    [root@NEO ~]# mv /etc/rc3.d/K92iptables /tmp/        # 把这个软链接移动到 /tmp/  , 不要删除
    [root@NEO ~]# chkconfig |grep ipt
    iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off
    [root@NEO ~]# ls -l /etc/rc3.d/ |grep ipt
    [root@NEO ~]# ln -s /etc/init.d/iptables /etc/rc3.d/S08iptables        # 给 /etc/init.d/iptables 创建软链接, S08iptables
    [root@NEO ~]# ls -l /etc/rc3.d/ |grep ipt
    lrwxrwxrwx  1 root root 20 Apr  8 23:18 S08iptables -> /etc/init.d/iptables
    [root@NEO ~]# chkconfig |grep ipt
    iptables           0:off    1:off    2:off    3:on    4:off    5:off    6:off        # 此时在3级别上已经变成了 开机启动
    [root@NEO ~]# 
    
    
    # 结论:在执行 chkconfig on/off 时,它会在3运行级别(不止3级别)上 创建一个 S 或 K 开头的文件
    # 08 和 92 的含义如下:
    [root@NEO ~]# head -5 /etc/init.d/iptables 
    #!/bin/sh
    #
    # iptables    Start iptables firewall
    #
    # chkconfig: 2345 08 92            
    
    # 08 是开机时的顺序, 92 是关机时的顺序

    用户分类 与 用户相关文件

    # 用户分类:
        1. root 皇帝  uid:0
        2. 虚拟用户 傀儡  uid: 1-499    # 虚拟用户无法被切换到
            2.1 每个程序、服务运行的时候都需要一个用户
            2.2 傀儡用户不需要用来登陆系统
            2.3 傀儡用户的命令解释器: /sbin/nologin    # 区分傀儡用户最核发的标准;正常用户的命令解释器为: /bin/bash
        3. 普通用户 uid: 500+
    
    [root@NEO ~]# id oldboy
    uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)
    [root@NEO ~]# grep nobody /etc/passwd    # nobody 为 虚拟用户
    nobody:x:99:99:Nobody:/:/sbin/nologin
    [root@NEO ~]# su - nobody
    This account is currently not available.    # 虚拟用户无法登陆
    
    
    # 用户相关的配置文件:
    # /etc/passwd   ---> 存放用户的信息
    # /etc/shadow     ---> 存放用户密码信息
    # /etc/group     ---> 存放用户、用户组信息
    # /etc/gshadow     ---> 存放用户组密码信息
    
    [root@NEO ~]# head -1 /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    [root@NEO ~]# tail -1 /etc/passwd
    oldboy:x:500:500::/home/oldboy:/bin/bash
    
     root        :x                        :0        :0        :root                :/root            :/bin/bash
     oldboy        :x                        :500    :500    :                    :/home/oldboy    :/bin/bash
    # 用户名    原先存放密码的地方        uid        gid        用户的说明信息        用户的家目录    用户的命令解释器(shell;重要)
            (现在密码存放在/etc/shadow)                (添加用户时该列默认为空)            /bin/bash 是用户默认的;/sbin/nologin 是虚拟用户的; 判断是否为虚拟用户的标准
             把x删掉后该用户就没有密码了,可以随便切换到该用户
    
    # 其它的命令解释器:
    [root@NEO ~]# cat /etc/shells 
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash        # ubuntu 系统的命令解释器
    /bin/tcsh        # Unix系统的; tcsh 是 csh 的升级版
    /bin/csh        # Unix系统的

    用户相关的目录:

    /etc/skel   # /etc/skel 目录下的内容是隐藏的
    [root@NEO ~]# ls -l /etc/skel/
    total 0
    [root@NEO ~]# ls -la /etc/skel/
    total 20
    drwxr-xr-x.  2 root root 4096 Oct 16 00:36 .
    drwxr-xr-x. 78 root root 4096 Apr  9 14:22 ..
    -rw-r--r--.  1 root root   18 Mar 23  2017 .bash_logout
    -rw-r--r--.  1 root root  176 Mar 23  2017 .bash_profile
    -rw-r--r--.  1 root root  124 Mar 23  2017 .bashrc
    [root@NEO ~]# 
    
    
    # /etc/skel 下的 .bash_logout        ===> 用户退出的时候会运行里面的命令
    # /etc/skel 下的 .bash_profile    === /etc/profile  (放环境变量)
    # /etc/skel 下的 .bashrc            === 作用相当于 /etc/hashrc (放别名) ;但该 .bashrc 只对某个用户生效
    
    # /etc/skel 目录: 新用户的老家的模板 (新用户家目录的样子)
    [root@NEO ~]# echo 'I am Neo.' >/etc/skel/readme.txt
    [root@NEO ~]# ll /etc/skel/
    total 4
    -rw-r--r-- 1 root root 10 Apr  9 14:57 readme.txt
    [root@NEO ~]# useradd neozheng
    [root@NEO ~]# ls -l /home/neozheng/
    total 4
    -rw-r--r-- 1 neozheng neozheng 10 Apr  9 14:57 readme.txt        # 创建新用户的时候会从 /etc/skel/ 下面复制文件到 新用户的家目录
    [root@NEO ~]# cat /home/neozheng/readme.txt 
    I am Neo.

    -bash-4.1$ 故障分析:登陆到一个用户时,这个用户会提示 -bash-4.1$

    # 模拟:
    [root@NEO ~]# useradd alex
    [root@NEO ~]# su - alex
    [alex@NEO ~]$ whoami
    alex
    [alex@NEO ~]$ pwd
    /home/alex
    [alex@NEO ~]$ 
    m -f .bash*        # 删除该用户家目录下的 .bash开头的所有文件
    [alex@NEO ~]$ logout
    [root@NEO ~]# 
    
    # 故障:
    [root@NEO ~]# su - alex
    -bash-4.1$ 
    -bash-4.1$ 
    -bash-4.1$         # 出现了 -bash-4.1$ 故障
    
    # 故障原因:
    -bash-4.1$ ls -la
    total 16
    drwx------  2 alex alex 4096 Apr  9 15:08 .
    drwxr-xr-x. 5 root root 4096 Apr  9 15:06 ..
    -rw-------  1 alex alex   25 Apr  9 15:08 .bash_history
    -rw-r--r--  1 alex alex   10 Apr  9 14:57 readme.txt
    -bash-4.1$ 
    -bash-4.1$ echo $PS1
    s-v$
    # 原因:用户家目录下的与环境变量相关的隐藏文件被删除了
    
    # 解决:
    # 从其它地方复制这些隐藏文件即可:
    # 方法一: 从其它用户家目录复制
    
    [root@NEO ~]# su - alex
    -bash-4.1$ cp /home/oldboy/.bash* ~
    cp: cannot stat `/home/oldboy/.bash*': Permission denied
    -bash-4.1$ 
    -bash-4.1$ logout
    
    # 问题: 报错原因是哪里权限不足 ??
    [root@NEO ~]# ll -d /home/neozheng/
    drwx------ 2 neozheng neozheng 4096 Apr  9 14:58 /home/neozheng/
    [root@NEO ~]# chmod o=rwx /home/neozheng/
    [root@NEO ~]# ll -d /home/neozheng/
    drwx---rwx 2 neozheng neozheng 4096 Apr  9 14:58 /home/neozheng/
    [root@NEO ~]# su - alex
    -bash-4.1$ cp /home/neozheng/.bash* ~
    -bash-4.1$ logout
    [root@NEO ~]# su - alex
    [alex@NEO ~]$ ls -la 
    total 28
    drwx------  2 alex alex 4096 Apr  9 15:23 .
    drwxr-xr-x. 5 root root 4096 Apr  9 15:06 ..
    -rw-------  1 alex alex   94 Apr  9 15:23 .bash_history
    -rw-r--r--  1 alex alex   18 Apr  9 15:23 .bash_logout
    -rw-r--r--  1 alex alex  176 Apr  9 15:23 .bash_profile
    -rw-r--r--  1 alex alex  124 Apr  9 15:23 .bashrc
    -rw-r--r--  1 alex alex   10 Apr  9 14:57 readme.txt
    [alex@NEO ~]$ 
    
    # 方法二: 从 /etc/skel 复制 (推荐这种方法)
    [root@NEO ~]# su - alex
    [alex@NEO ~]$ 
    m -f .bash*
    [alex@NEO ~]$ logout
    [root@NEO ~]# su - alex
    -bash-4.1$ cp /etc/skel/.bash* ~    # 从 /etc/skel 目录下复制到该用户的家目录
    -bash-4.1$ logout
    [root@NEO ~]# su - alex
    [alex@NEO ~]$ 

    命令行中 .* 极度危险; 正则中 .* 表示所有, 命令行中 .* 表示 以 . 开头的所有文件和目录

    # .* 的情况:
        1. 以点开头的所有的东西
        2. . (当前目录)
        3. ..(当前目录的上一级目录)
        4. 表示以点开头 隐藏的文件或目录
        5. .bash*
    # 举例:
    [root@NEO ~]# 
    [root@NEO ~]# cd /tmp/
    [root@NEO tmp]# ls -la 
    total 32
    drwxrwxrwt.  3 root root 4096 Apr  9 15:35 .
    dr-xr-xr-x. 29 root root 4096 Apr  9 14:21 ..
    -rw-r--r--   1 root root 5984 Apr  9 15:51 date.log
    drwxrwxrwt   2 root root 4096 Apr  9 14:21 .ICE-unix
    -rw-r--r--   1 root root 9312 Apr  9 15:51 ip.log
    
    # 在 /tmp/ 下执行 rm -rf .* 命令时,它也会把 .. 删除(即当前目录的上一级目录,即 / ,根目录);所以平时用到 .* 的时候一定要注意

    添加、删除用户(用户管理命令)

    # 1. 用户相关命令:
        useradd      # 添加用户
            -u  指定用户的uid(数字 身份证号码)
            -s  指定用户使用的shell; 默认为 /bin/bash,虚拟用户(傀儡用户)的为 /sbin/nologin
            -M    表示不创建家目录;一般创建虚拟用户使用;通常和 -s /sbin/nologin 一起使用
            -g    指定 用户属于的组(组的名字);添加用户的时候 默认创建一个与用户名一样的家庭
            -c  添加用户时指定说明信息
        
        userdel   # 删除用户
            要删除一个用户,就把这个用户在 /etc/passwd 中注释掉
            userdel 默认不删除用户的家目录和邮箱
            -r  删除用户、用户的家目录及用户有关的所有信息 (这个参数很危险,通常不用)
        
        usermod  ---> 修改用户信息; useradd 添加的内容, chmod 都能改
            修改用户的信息(这个用户已经存在了)
            -s 修改用户使用的shell
            -g 属于的家庭(用户组)的名字
            -G 属于多个家庭
        
        passwd
            --stdin 参数:从管道中获取用户的密码(--stdin 参数用于 非交互式设置密码); --stdin 参数只能 root 用户使用,普通用户使用不了
        
        chown  ---> 修改文件 或 目录的所有者 和 所属的用户组 
            修改文件或目录所有者和属于的用户组
            -R  递归修改文件或目录的所有者和用户组(递归表示修改目录的及其子目录的;-R 参数没有提示,很危险)
            chown oldboy oldboy.txt  # 只修改了文件的所有者 ; chown oldboy.oldboy oldboy.txt  # 修改了文件的所有者和属于的用户组 
    
    # 2. 用户组相关:
        groupadd  ---> 创建用户组
            -g 参数 :指定用户组的 gid 数字
            添加一个虚拟用户 mysql ,指定用户的 uid gid 都是 999
            
            
            
    # 事例:添加一个用户 alex999 指定uid 为 888 ,禁止该用户登陆系统,不创建家目录 ---> 添加一个uid为888的虚拟用户alex999
    [root@NEO ~]# useradd -u 888 -s /sbin/nologin -M alex999
    [root@NEO ~]# id alex999
    uid=888(alex999) gid=888(alex999) groups=888(alex999)
    [root@NEO ~]# grep alex999 /etc/passwd
    alex999:x:888:888::/home/alex999:/sbin/nologin
    [root@NEO ~]# ls /home/alex999/
    ls: cannot access /home/alex999/: No such file or directory
    [root@NEO ~]# 
    
    # 通过注释的方法删除用户:
    [root@NEO ~]# vim /etc/passwd
    [root@NEO ~]# tail -2 /etc/passwd
    # alex:x:502:502::/home/alex:/bin/bash        # 注释用来删除用户
    alex999:x:888:888::/home/alex999:/sbin/nologin
    [root@NEO ~]# id alex
    id: alex: No such user
    
    
    # 修改用户信息与用户设置密码技巧
    # 通过 usermod -c 修改用户的说明信息
    [root@NEO ~]# id alex999
    uid=888(alex999) gid=888(alex999) groups=888(alex999)
    [root@NEO ~]# grep alex999 /etc/passwd
    alex999:x:888:888::/home/alex999:/sbin/nologin
    [root@NEO ~]# usermod -c "virtual user" alex999
    [root@NEO ~]# grep alex999 /etc/passwd
    alex999:x:888:888:virtual user:/home/alex999:/sbin/nologin
    [root@NEO ~]# 
    
    # 修改用户的家庭组:  usermod -g 修改成的用户组 用户
    [root@NEO ~]# id alex999
    uid=888(alex999) gid=888(alex999) groups=888(alex999)
    [root@NEO ~]# usermod -g oldboy alex999
    [root@NEO ~]# id alex999
    uid=888(alex999) gid=500(oldboy) groups=500(oldboy)
    [root@NEO ~]# 
    
    # 让用户属于多个家庭组(给用户新增家庭组): usermod -G 用户组1,用户组2,用户组3,... 用户
    [root@NEO ~]# usermod -g alex999 alex999
    [root@NEO ~]# id alex999
    uid=888(alex999) gid=888(alex999) groups=888(alex999)
    [root@NEO ~]# usermod -G root,oldboy,neozheng alex999
    [root@NEO ~]# id alex999
    uid=888(alex999) gid=888(alex999) groups=888(alex999),0(root),500(oldboy),501(neozheng)
    [root@NEO ~]# 
    
    
    # 交互式的修改密码:(一问一答式的)
    [root@NEO ~]# passwd oldboy
    Changing password for user oldboy.
    New password: 
    [root@NEO ~]# 
    
    # 非交互式的设置密码:echo 新密码 |passwd --stdin 用户  ---> passwd 加上 --stdin 参数后就能从管道前面获取密码 
    [root@NEO ~]# echo '123456' |passwd --stdin oldboy
    Changing password for user oldboy.
    passwd: all authentication tokens updated successfully.        # 新密码设置成功
    [root@NEO ~]# 
    
    # 上面的非交互式设置密码有坑:通过 history 参数就能看到你设置的新密码,如下:
    [root@NEO ~]# history |tail -3
     1045  echo '123456' |passwd --stdin oldboy    # 通过 history 命令能看到你以前设置过的密码
     1046  history
     1047  history |tail -3
    # 解决办法: 清理修改密码的踪迹: history -c   ===> 把当前的历史记录清空
    [root@NEO ~]# history -c
    [root@NEO ~]# history
       49  history
    
    
    # 企业场景:用户及密码管理:
        1. 密码要复杂,12位以上字母数字特殊字符
        2. 保存密码:密码保存工具: keepass
        3. 大的企业用户和密码统一管理(相当于活动目录(AD),openldap域)
        4. 动态密码:动态口令,第三方提供,自己开发也行
        

    增强系统安全与指纹验证

    # 如何让系统更安全:
        1. 最小化: 
            安装系统
            安装软件
            运行的软件
            
        2. 保护好root 用户 :
            禁止root用户远程登陆
            修改远程连接端口号
            /var/log/secure  日志的分析: failure 或 failed
            
        3. 文件系统权限
            给系统常用命令+i
            给系统常用命令+a
        
        4. 给重要的文件或命令 做一个指纹: 文件的内容变化 === 指纹变化
            1. 给这个文件创建指纹: md5sum oldboy.txt
            2. 对比指纹:
                2.1 把你的系统记录下来: md5sum oldboy.txt >finger.txt   # finger.txt 是指纹库
                2.2 进行指纹对比:          md5sum -c finger.txt
            3. 工作中, 定时任务 + md5sum 定时检查
       
       
    # 给文件做一个指纹:
    # 1. md5sum 命令的简单使用:给文件创建一个指纹
    [root@NEO ~]# cd /oldboy/
    [root@NEO oldboy]# echo neo >oldboy.txt
    [root@NEO oldboy]# cat oldboy.txt
    neo
    [root@NEO oldboy]# md5sum oldboy.txt            # md5sum 文件  ===> 给文件做一个指纹
    17b79ecf8cd0566b59aaa2997612e36d  oldboy.txt
    [root@NEO oldboy]# echo neo >>oldboy.txt
    [root@NEO oldboy]# cat oldboy.txt
    neo
    neo
    [root@NEO oldboy]# md5sum oldboy.txt
    f2a77c18558af260e1fbdcbf5db68a1f  oldboy.txt
       
    # 2. 把创建的指纹保存起来
    [root@NEO oldboy]# md5sum oldboy.txt >>police.log    # 把创建的指纹保存起来;也可用 > 
    [root@NEO oldboy]# cat police.log 
    f2a77c18558af260e1fbdcbf5db68a1f  oldboy.txt
       
    # 根据保存起来的指纹,验证文件是否被修改过: md5sum -c 指纹记录文件
    [root@NEO oldboy]# md5sum -c police.log 
    oldboy.txt: OK        # 文件无变化、没有被修改过
    [root@NEO oldboy]# echo NEO >>oldboy.txt
    [root@NEO oldboy]# md5sum -c police.log 
    oldboy.txt: FAILED
    md5sum: WARNING: 1 of 1 computed checksum did NOT match        # 文件被修改过、内容发生了变化
    [root@NEO oldboy]# 
    
    
    # 面试题:批量添加10个用户 stu01.stu02...stu10,并设置8位随机密码(禁止使用 for , while 等循环)
       
    
    # 添加一个虚拟用户 mysql ,指定用户的 uid gid 都是 999
    [root@NEO oldboy]# useradd -s /sbin/nologin -M -u 999 mysql        # 创建用户时,默认会创建一个和用户名相同的用户组
    [root@NEO oldboy]# id mysql
    uid=999(mysql) gid=999(mysql) groups=999(mysql)
    [root@NEO oldboy]# userdel mysql
    [root@NEO oldboy]# id mysql
    id: mysql: No such user
    [root@NEO oldboy]# groupadd -g 999 mysql    # 创建一个名为 mysql、 gid 为 999 的用户组
    [root@NEO oldboy]# useradd -s /sbin/nologin -M -u 999 -g mysql  mysql   # useradd 的 -g 参数不是指定 gid ,而是指定 用户组的名字
    
    
    # 查询用户信息类命令:   
       id  ---> 查看用户的信息
            一个用户是否存在
            查询用户的 uid gid
            属于哪个用户组
            用户组下面有哪些用户?  --->  /etc/group  文件中有
       w  --->  显示系统中已经远程登陆的用户、在干啥等
       
       查看系统性能的命令:
            w
            uptime
            top        ---> 交互式的命令: 相当于 uptime + free -h + ps -ef 
                M 参数 :按内存排序
                P 参数: 按CPU排序
            htop  # 增强版本的 top 命令
            iotop  # 显示系统中每个进程使用的磁盘io
            iftop  # 显示系统网络流量
       
        last  ---> 哪个用户在什么时候 从哪里 远程登陆你的系统 用户登陆的信息
        lastlog  --->  显示linux中所有用户最近一次远程登陆的信息
       

    sudo 命令

    # sudo 命令: 临时让普通用户获得 root 权限
    
    # su 与 su - 的区别:
    - 是 su 命令的参数,表示 切换用户的时候更新 环境变量
    
    [root@NEO ~]# su oldboy        # su 不加 - ,切换用户后会在 /root 目录,但依然对 /root 目录没有任何权限    
    [oldboy@NEO root]$ pwd
    /root
    [oldboy@NEO root]$ ls
    ls: cannot open directory .: Permission denied
    [oldboy@NEO root]$ touch oldboy.txt
    touch: cannot touch `oldboy.txt': Permission denied
    [root@NEO ~]# su - oldboy    # 所以切换用户的时候,sudo 要加上 -
    [oldboy@NEO ~]$    
       
    # sudo 命令的用法:
    # sudo -l  ---> 查看当前用户已获得的 root 权限
    
    [root@NEO ~]# echo '123456' |passwd --stdin oldboy
    Changing password for user oldboy.
    passwd: all authentication tokens updated successfully.  # 先把 oldboy 用户的密码修改为 123456 ,方便后面输入密码
    
    [root@NEO ~]# su - oldboy
    [oldboy@NEO ~]$ sudo -l        # 第一次用 sudo -l 命令时,会有以下 提示
    
    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 oldboy: 
    [oldboy@NEO ~]$ sudo -l
    [sudo] password for oldboy: 
    Sorry, user oldboy may not run sudo on NEO.        # 此时 oldboy 还没有被赋予 root 权限    
    [oldboy@NEO ~]$ 
       
    # visudo 命令:给普通用户授予 root 权限:
        visudo  === vim /etc/sudoers  # visudo 命令 即 相当于 编辑 /etc/sudoers 文件; visudo 有一个自动语法检测功能,即 会自动执行 visudo -c 命令;所有手动编辑 /etc/sudoers 文件时,编辑结束后,一定要手动执行一下 visudo -c 命令
    [root@NEO ~]# visudo    # 到达 92 行 (92gg)
    [root@NEO ~]# cat /etc/sudoers |awk 'NR==92'
    oldboy  ALL=(ALL)    /bin/ls, /bin/touch            # /bin/ls, /bin/touch  是 oldboy 被授予的 root 权限
    [root@NEO ~]# 
       
    # isudo --> 到达 92 行 --> 添加 oldboy  ALL=(ALL)       /bin/ls, /bin/touch  (要用绝对路径;授予的多个命令之间要用逗号隔开)
       
    # 此时查看 oldboy 被授予的 root 权限:
    [oldboy@NEO ~]$ 
    [oldboy@NEO ~]$ sudo -l
    [sudo] password for oldboy: 
    Matching Defaults entries for oldboy on this host:
        !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 oldboy may run the following commands on this host:
        (ALL) /bin/ls, (ALL) /bin/touch        # oldboy 用户被授予的 root 权限 
    [oldboy@NEO ~]$ ls /root
    ls: cannot open directory /root: Permission denied    
    [oldboy@NEO ~]$ sudo ls /root/                        # 利用 sudo 权限时,要在命令前加上 sudo 
    anaconda-ks.cfg  data  echotest.txt  install.log.syslog  oldboy-20171111.log
    [oldboy@NEO ~]$ sudo ls /root/ -ld
    dr-xr-x---. 3 root root 4096 Apr  9 16:42 /root/
    [oldboy@NEO ~]$ sudo touch /root/alex.txt
    [oldboy@NEO ~]$ sudo ls /root/alex.txt -l
    -rw-r--r-- 1 root root 0 Apr 10 12:07 /root/alex.txt
    [oldboy@NEO ~]$ 
    
    # 这样就通过 sudo  给 oldboy 用户授权了两个 root 命令
    
    # 授权某个目录下面的所有命令
    # 授予 oldboy 用户 /bin/ 目录下所有命令的权限:
    [root@NEO ~]# visudo
    [root@NEO ~]# cat /etc/sudoers |awk 'NR==92'
    oldboy  ALL=(ALL)    /bin/*    # /bin/*          #  /bin/ 目录下的所有命令
    [root@NEO ~]# 
    
    
    [oldboy@NEO ~]$ sudo -l
    [sudo] password for oldboy: 
    Matching Defaults entries for oldboy on this host:
        !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 oldboy may run the following commands on this host:
        (ALL) /bin/*        # 此时已经把 /bin/ 目录下的所有命令授权给 oldboy 用户
    [oldboy@NEO ~]$ 
    
    
    # 但上面的把 /bin/ 下所有命令授权给 oldboy 用户的方法有坑,因为 /bin/ 下面也有 su 命令(能切换到 root 用户),如下:
    [oldboy@NEO ~]$ whoami
    oldboy
    [oldboy@NEO ~]$ sudo su - root
    [root@NEO ~]# 
    
    
    # 授予 oldboy 用户 /bin/ 目录下所有命令的权限,但排除 su 命令
    [root@NEO ~]# visdudo
    [root@NEO ~]# cat /etc/sudoers |awk 'NR==92'    
    oldboy  ALL=(ALL)    /bin/*, !/bin/su            # !/bin/su  表示 排除 /bin/ 下面的 su 命令
    [root@NEO ~]# 
    
    [oldboy@NEO ~]$ sudo -l
    [sudo] password for oldboy: 
    Matching Defaults entries for oldboy on this host:
        !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 oldboy may run the following commands on this host:
        (ALL) /bin/*, (ALL) !/bin/su
    [oldboy@NEO ~]$ sudo su - root
    Sorry, user oldboy is not allowed to execute '/bin/su - root' as root on NEO.        # 此时oldboy 用户就没有切换到 root 的权限了
    [oldboy@NEO ~]$ 
    
    # 但上面的方法也有问题,因其还有 vi 的权限,通过 sudo vi /etc/visdudo 文件,手动给自己加上 ALL 的权限, 如下:
    [oldboy@NEO ~]$ whoami
    oldboy
    [oldboy@NEO ~]$ sudo vi /etc/sudoers    # 通过 强制保存的方式保存: wq!
    [oldboy@NEO ~]$ sudo cat /etc/sudoers |awk 'NR==92'
    oldboy  ALL=(ALL)    ALL
    [oldboy@NEO ~]$ sudo -l
    Matching Defaults entries for oldboy on this host:
        !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 oldboy may run the following commands on this host:
        (ALL) ALL            # 此时 oldboy 用户也就有了所有的权限 
    [oldboy@NEO ~]$ sudo su -    # oldboy 用户也就能切换到 root 用户了
    [root@NEO ~]# whoami
    root
    [root@NEO ~]# 
    
    # 所以,授权的时候,对方要什么命令就给对方什么命令,即要最小化的给;一定要具体到某个命令,或某个命令的某个参数
    
    
    
    # 授权的时候有时需要密码,授权时不用输入密码的方法(这个方法只能给自己用,不要给别人用): 在 权限前面加上: NOPASSWD:空格
    [root@NEO ~]# visudo
    [root@NEO ~]# cat /etc/sudoers |awk 'NR==92'
    oldboy  ALL=(ALL)    NOPASSWD: /bin/ls, /bin/touch    # 加上 NOPASSWD:空格;通过 这种方法 就能在授权的时候不用再输密码
    [root@NEO ~]# 
    
    # 为了保护 root用户的安全,应该避免用 root用户 远程登陆,这时应该用 普通用户 登陆,普通用户登陆后再通过 sudo su - 切换到root 用户 (需要提前配置好)
    
    # 用户名或用户组名
     oldboy                      ALL=(ALL)                                    NOPASSWD: /bin/ls, /bin/touch 
    %用户组名                第一个ALL表示可以在哪台主机上运行sudo(所有)
                            第二个 ALL 表示你可以用谁的身份运行sudo(所有) 

    行为/日志审计 --- 跳板机 :记录用户的操作

    1. 齐治的堡垒机:商业产品
    2. gateone web 跳板机
    3. python 开发的开源的跳板机产品
            开源跳板机(堡垒机) Jumpserver 
    4. shell 跳板机
  • 相关阅读:
    shiro
    leetcode696 C++ 36ms 计算二进制子串
    leetcode557 C++ 56ms 反转字符串中的每个单词
    leetcode657 C++ 16ms 判断回环
    leetcode709 C++ 4ms 转换成小写字母
    leetcode141 C++ 8ms 环形链表
    leetcode160 C++ 32ms 相交链表
    leetcode234 C++ 28ms 回文链表
    leetcode203 C++ 28ms 删除链表中满足条件的节点
    leetcode83 C++ 12ms 删除有序链表中的重复元素
  • 原文地址:https://www.cnblogs.com/neozheng/p/10674547.html
Copyright © 2011-2022 走看看