zoukankan      html  css  js  c++  java
  • Linux学习之十八-sudo分权管理

    sudo分权管理

    1、为什么需要sudo?

    当我的主机是多人共管的环境时,如果大家都使用 su 来切换成为 root 的身份,那么就得每个人知道 root 的密码,这样密码太多人知道可能会流出去,很不安全!怎办?透过 sudo 来处理即可!

    sudo的执行则仅需要自己的密码 ,sudo 可以让你以其他用户的身份执行指令 (通常是使用 root 的身份来执行指令),因此并非所有人都能够执行 sudo ,而是仅有规范到 /etc/sudoers 内的用户才能够执行 sudo 这个指令。

    2、sudo命令用法

    sudo可让用户以其他的身份来执行指定的指令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入当前用户密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

    语法:

    sudo [-bhHpV][-s ][-u <用户>][指令] 或 sudo [-klv]

    参数:

    参数

    描述

    -b

    在后台执行指令

    -H

    将HOME环境变量设为新身份的HOME环境变量

    -k

    结束密码的有效期限,也就是下次再执行sudo时便需要输入密码

    -K

    同-k

    -l

    列出目前用户可执行与无法执行的指令

    -p

    改变询问密码的提示符号

    -s

    执行指定的shell

    -u

    以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份

    -v

    延长密码有效期限5分钟

    -V

    显示版本信息

    3、sudo工作流程

    1)当用户执行 sudo 时,系统于 /etc/sudoers 档案中搜寻该使用者是否有执行 sudo 的权限;

    2)若使用者具有可执行 sudo 的权限后,便让使用者输入用户自己的密码来确认;

    3)若密码输入成功,便开始进行 sudo 后续接的指令(但 root 执行 sudo 时,不需要输入密码);

    4)若欲切换的身份与执行者身份相同,那也不需要输入密码。

    4、visudo单用户授权

    visudo是直接操作/etc/sudoers文件,我们也可以直接 vi /etc/sudoers,但是visudo命令的好处在于,退出/etc/sudoers文件时,系统会检查/etc/sudoers语法是否正确。

    [root@www ~]# visudo

    ....(前面省略)....

    root ALL=(ALL) ALL #<==找到这一行,大约在80 行左右

    yang1 ALL=(ALL) ALL #<==新增这行!则yang1用户通过sudo拥有所有权限

    ....(前面省略)....

    语法解释:

    root

    ALL=(ALL)

    ALL

    使用者账号

    登入者的来源主机名=(可切换的身份)

    可下达的指令

    详细解释:

    使用者帐号

    代表哪个用户使用sudo的权限

    来源主机名称

    指定信任用户,即根据w查看[使用者帐号]的来源主机

    可切换的身份

    代表可切换的用户角色,和sudo -u结合使用,默认是切换为root.

    可下达的指令

    用于权限设置,也可使用!来表示不可执行的命令

    举例:

    [root@www ~]# visudo

    yang2 ALL=(root) !/usr/bin/passwd,!/usr/bin/passwd root

    #允许yang2用户通过sudo来修改所有其它用户的密码,但不能修改root的密码

     

    5、visudo利用群组授权

    [root@www ~]# visudo

    ....(前面省略)....

    %test ALL=(ALL) ALL

    # 在最左边加上 % ,代表后面接的是一个群组,格式和单用户授权一样

    [root@www ~]# usermod -a -G testtest #<==将test 加入root 的组中

    任何加入test这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令

     

    不需要密码即可使用 sudo

    [root@www ~]# visudo

    ....(前面省略)....

    %wheel ALL=(ALL) NOPASSWD: ALL

    #在指令处加入NOPASSWD:ALL即可

     

    6、visudo利用别名授权

    公司有很多部门,要方便管理,就可使用别名的方式,如:开发部,运维部,技术支持部,每个部门里多个人,部门之间拥有的命令权限也不一样,同一部门权限一样。如果一条一条写的话,写也麻烦,改就更麻烦了。

    别名的使用方法:

    使用方法可通过 man sudoers后面的举例找到

    root

    ALL=

    (ALL)

    ALL

    使用者账号

    登入者的来源主机名

    可切换的身份

    可下达的指令

    User_Alias FULLTIMERS = millert, mikef, dowdy

    Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0

    Runas_Alias OP = root, operator

    Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm

    例:

    [root@www ~]# visudo

    User_Alias ADMPW = pro1,pro2, pro3, myuser1, myuser2 #配置用户别名ADMPW

    Cmnd_Alias ADMPWCOM =!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

    #配置命令别名ADMPWCOM

    ADMPW ALL=(root) ADMPWCOM #指定用户别名里的成员,拥有命令别名里的权限

     

    7、visudo与环境变量

    1)现象描述:test1用户sudo命令已经有所有的权限,但不能查看网卡信息。

    [test1@test ~]$ sudo -l

    …省略…

    User test1 may run thefollowing commands on this host:

    (ALL) ALL

    sudo权限已经全部有了

    [test1@test ~]$ sudo ifconfig eth0

    sudo: ifconfig: command notfound

    不可以查看!提示这个命令找不到?为什么?这是因为系统环境变量导致的。

     

    2) root环境变量与普通用户环境变量比较

    test1用户找不到which命令在哪里,而root用户可以。

    [test1@test ~]$ which ifconfig

    /usr/bin/which: no ifconfig in(/application/mysql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/test1/bin)

    [test1@test ~]$ su - root

    Password:

    [root@test ~]# which ifconfig

    /sbin/ifconfig

     

    3)查看两个test1和root的PATH变量

    [root@test ~]# echo $PATH

    /application/mysql/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    [root@test ~]# su - test1

    [test1@test ~]$ echo $PATH

    /application/mysql/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/test1/bin

    发现普通用户都没有sbin的路径,而很多命令都放在这些路径下。

     

    4)在普通用户变量文件添加上述路径,cd ~ && vi ~.profile

    在PATH后加入:/sbin:/usr/sbin:/usr/local/sbin

    [test1@test ~]$ cat.bash_profile |grep PATH

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

    [test1@test ~]$ source.bash_profile #使修改的变量文件生效

    #修改变量后,接下来继续查看网卡信息

    [test1@test ~]$ sudo ifconfigeth0

    eth0 Link encap:Ethernet HWaddr 00:0C:29:3B:DA:97

    inet addr:10.0.0.239 Bcast:10.0.0.255 Mask:255.255.255.0

    可以正常执行了!

     

    5)为防止不出现用户找不到的命令,有两个方法

    5.1)把上述路径添加到环境变量中,~/.bash_profile文件(普通用户可编辑),或/etc/profile全局文件(需root用户编辑)

    5.2)执行命令用绝对路径,如: /sbin/ifconfig eth0

    注:centos6.4没有此问题

     

    8、配置sudo日志文件跟踪

    操作步骤:

    1)查询sample.sudoers文件位置

    [root@yang1 ~]# rpm -ql sudo

    /usr/share/doc/sudo-1.7.2p1/sample.sudoers

    /usr/share/doc/sudo-1.7.2p1/sample.syslog.conf

    2)查看sample.sudoers中的日志相关配置

    sample.syslog.conf这个文件为官方配置sudo日志配置笔记

    [root@yang1 ~]# cat/usr/share/doc/sudo-1.7.2p1/sample.sudoers|grep "log"

    Defaults syslog=auth

    Defaults>root !set_logname

    Defaults@SERVERS log_year, logfile=/var/log/sudo.log

    3)创建日志文件

    touch /var/log/sudo.log

    4)把sudo日志文件加入系统日志

    把下面命令添加到/etc/syslog.conf末尾

    local2.debug /var/log/sudo.log

    注:空白处不能用空格,必须用tab

    centos6.4的日志服务为rsyslog

    5)在/etc/sudoers中添加日志路径(也可用visudo编辑)

    加在/etc/sudoers末尾:

    echo 'Defaults logfile=/var/log/sudo.log' >> /etc/sudoers

    6)测试

    [root@yang1 ~]# cat/var/log/sudo.log #测试前sudo.log为空

    [root@yang1 ~]# su - yang1 #进入普通用户(事先已授权)

    [yang1@yang1 ~]$ sudo -l #查看当前用户sudo可执行的命令

    [sudo] password for yang1:

    Matching Defaults entries foryang1 on this host:

    requiretty, !visiblepw, env_reset, env_keep="COLORS DISPLAYHOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2 QTDIR

    USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATIONLC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC

    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSETXAUTHORITY", logfile=/var/log/sudo.log

     

    Runas and Command-specificdefaults for yang1:

     

    User yang1 may run the followingcommands on this host:

    (ALL)!/usr/sbin/useradd, (ALL) !/usr/sbin/userdel, (ALL) /bin/touch #发现不能创建删除用户,能创建文件。

    [yang1@yang1 ~]$ sudo touchyangrong #使用sudo创建一个文件

    [yang1@yang1 ~]$ cat/var/log/sudo.log #查看sudo.log文件,已有记录,测试成功

    9月 5 12:37:46 : yang1 : TTY=pts/2; PWD=/home/yang1 ; USER=root ; COMMAND=list

    9月 5 12:38:05 : yang1 : TTY=pts/2; PWD=/home/yang1 ; USER=root ;

    COMMAND=/bin/touch yangrong

    测试成功!

    上述为简单的审计,复杂点的可以把日志集中存储,更复杂点的可以对用户行为做录像回放,过滤分析等。

     

    本文转自:http://blog.51cto.com/yangrong/1289452

  • 相关阅读:
    C#Light 和 uLua的对比第二弹
    Unity3D热更新全书FAQ
    Unity3D热更新全书-脚本(五) NGUI
    Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设
    Unity3D热更新全书-下载 唯一的一篇
    Unity3D热更新全书-PageZero
    Netty4.x中文教程系列(二) – 白话概念
    Netty4.x中文教程系列(一) Hello World !
    Java NIO(New I/O)的三个属性position、limit、capacity
    Buffer
  • 原文地址:https://www.cnblogs.com/ssgeek/p/9220650.html
Copyright © 2011-2022 走看看