• sudo简单命令语法及配置


    参考:http://yangrong.blog.51cto.com/6945369/1289452, https://wiki.archlinux.org/index.php/Sudo_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

    sudo : 以他人身份执行命令,默认为root。可在文件/etc/sudoers中配置。

    若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入当前用户密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

    1. sudo命令语法

    语法:

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

     sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value]
                [-i|-s] [<command>]
    参数:

     参数 参数别名

    描述

    -A

    --askpass

    密码提示使用辅助程序

    -b

    --background

    在后台执行指令

    -C

    --close-from=num

    关闭所有文件描述符 >=num

    -E

    --preserve-env

    运行命令时保存用户环境

    -e

    --edit

    编辑文件,代替执行命令

    -g

    --group=group

    以指定的用户组名或ID执行命令

    -H

    --set-home

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

    -h

    --help

    显示帮助信息和文本

    -h

    --hoe=host

    在主机上运行命令(如果插件支持)

    -k

    --reset-timestamp

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

    -K

    --remove-timestamp

    -k, 彻底删除文件的时间戳

    -l

    --list

    列出目前用户可执行与无法执行的指令;列出用户的权限或检查一个特定的命令;使用两次更长的格式

    -n

    --non-interactive

    非交互模式,无提示使用

    -P

    --preserve-groups

    保存组向量,而不是设置为目标的

    -p

    --prompt=prompt

    改变询问密码的提示符号

    -S

    --stdin

    从标准输入读取密码

    -s

    --shell

    执行指定的shell

    -t

    -type=type

    创建指定类型的SELinux的安全上下文

    -U

    --other-user=user

    在列表模式下,显示用户的权限

    -u

    --user=user

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

    -v

    --version

    延长密码有效期限5分钟

    -V

    --validate

    显示版本信息

    --

     

    停止处理命令行参数

     2. 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的密码

    4. visudo利用群组授权

    [root@www ~]# visudo

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

    %test ALL=(ALL) ALL

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

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

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

    不需要密码即可使用 sudo

    [root@www ~]# visudo

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

    %wheel ALL=(ALL) NOPASSWD: ALL

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

    5. 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 #指定用户别名里的成员,拥有命令别名里的权限

    6. 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)查看两个test1rootPATH变量

    [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没有此问题

    7. 配置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

    测试成功!

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

  • 相关阅读:
    python ddt 传多个参数值示例
    Appium 输入 & 符号,实际输入&-
    curl 调用jenkins的api
    Android WebView的Js对象注入漏洞解决方案
    Could not find com.android.tools.build:gradle:1.3.0.
    react-native疑难
    win上搭建react-native android环境
    gradle大体内容
    android studio This client is too old to work with the working copy at
    sharedPreference
  • 原文地址:https://www.cnblogs.com/toughlife/p/5633927.html
Copyright © 2020-2023  润新知