• N天学习一个Linux命令之sudo


    前言

    新项目打算采用运维搭建的发布系统发代码,发布后生效前需要做一些处理,因为发布系统登录目标机器使用的是非root账号,所以需要使用sudo来提升权限。当执行sudo cd /xxx/xx时会提示报错,提示未找到cd这个命令。一直以为cd是系统命令,bing了一下才知道,shell有内置的命令,cd就是其中之一。担心还会踩到其它坑,于是花时间了解了sudo这块的知识,发现没有自己想象的那么简单,以为只是一个简单的命令而已。


    用途

    以另外一个用户身份执行命令,一般用于提升用户权限


    参数说明

    -l 显示用户可以执行或者禁止的命令,如果未指定用户,默认显示的为当前登录的用户,如果是-ll格式化良好的显示
    -U user 和-l参数一起使用,显示指定用户的可以执行的命令或者权限列表
    -v 如果已超时,重新验证,并更新登录状态过期时间,默认超时时间是5分钟
    -V 显示版本信息,如果是root账号,还会显示更加详细的配置信息
    -- 指示命令停止处理命令行参数,可能后面的参数是传个被执行的命令的
    -u user 指定命令执行的用户,未指定,默认为root
    -s [command] 运行shell,优先选择SHELL环境变量指定的SHEEL,未指定的情况下,使用账号指定的shell。如果未指定需要执行的命令,会直接进入目标用户的shell交互环境,可以通过exit推出。这个权限很大,如果开通了执行shell权限,岂不是可以执行任意root命令?一般不能开通!
    -S 密码通过stdin输入流中读取,默认是通过终端输入,例如echo 'password' | sudo -S
    -p prompt 输入密码提示 例子:sudo -p '你在登陆%H:' command
    扩展符说明
    %H 完整主机名
    %h 本地主机名
    %p 需要输入密码的用户名,可能是当前登录用户或者执行命名的用户或者root用户的密码,这个要看sudoers配置文件里面的策略设置 rootpw, targetpw, and runaspw
    %U 执行命名的用户
    %u 调用sudo的用户
    %% 输出%字面符号
    -P The -P (preserve group vector) option causes sudo to preserve
    the invoking user’s group vector unaltered. By default, the
    sudoers policy will initialize the group vector to the list
    of groups the target user is in. The real and effective
    group IDs, however, are still set to match the target user.
    -n 不显示密码输入,如果命令需要输入密码,会提示错误
    -K The -K (sure kill) option is like -k except that it removes
    the user’s cached credentials entirely and may not be used in
    conjunction with a command or other option. This option does
    not require a password. Not all security policies support
    credential caching.

    -k [command]
    When used alone, the -k (kill) option to sudo invalidates the
    user’s cached credentials. The next time sudo is run a pass-
    word will be required. This option does not require a pass-
    word and was added to allow a user to revoke sudo permissions
    from a .logout file. Not all security policies support cre-
    dential caching.

    When used in conjunction with a command or an option that may
    require a password, the -k option will cause sudo to ignore
    the user’s cached credentials. As a result, sudo will prompt
    for a password (if one is required by the security policy)
    and will not update the user’s cached credentials.
    看描述跟实际的行为不一致,使用这2个参数会发现一个问题,不管密码有没有错误,pam输入密码错误次数都会加1,当达到了pam最大限制密码错误次数时,即使密码正确也会一致提示你重试,不知道是不是sudo工具的bug?
    -i [command] 模拟shell登陆初始化,执行成功会有一个shell交互,需要有指定执行shell的权限
    -h 输出简短帮助信息
    -H 设置环境变量HOME为执行命令所在用户的家目录
    -g group 指定执行命令所在组
    -e 不执行命令,使用指定的editor打开一个策略配置文件,需要执行sudoedit命令的权限,不清楚这个有什么用? 难道针对执行的命令单独设置安全策略?
    -E 保留当前环境变量,如果没有当前环境变量的权限,会提示错误
    -b 后台执行命令


    执行流程

    1.根据安全策略初始化命令执行环境
    2.fork子进程调用execve系统call用于执行命令
    3.sudo主进程等待直到命令执行结束,并把命令的的执行结果传递给安全策略指定的close方法,然后退出
    4.如果配置了I/O logging插件,sudo会创建一个伪终端,用于转发信号


    安全策略配置

    1.由2种类型的entry组成,一种是定义别名(变量),一种是定义用户/用户组权限
    2.支持文件和ldap配置形式,文件默认路径是/etc/sudoers,使用visudo这个命令启动文件编辑,这个命令保存时会检查语法,符合要求才会保存成功,安全策略使用的是ENBF语法来描述
    3.别名类型
        a) 别名必须符合[A-Z]([A-Z][0-9]_)*
        b) 用户别名 User_Alias
            用于定义用户列表或者用户分类,多个使用英文半角逗号分隔,支持用户名和用户id
        c) 目标用户别名 Runas_Alias
            用于定义执行命令时允许的指定用户列表或者分类
        d) 主机别名 Host_Alias
            用于定义主机列表,支持主机名,支持ip,支持网络段
        e) 命令别名 Cmnd_Alias
            用于定义命令列表
    4.别名定义通用形式
        a) 单个别名
            Alias_Type NAME = item1, item2, ...
        b) 多个别名
            Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
    5.标志位设置,详见man sudoers帮助文档
    6.示例
        a) 定义主机别名
            Host_Alias HOST_WX_TEST = 192.168.148.161
        b) 定义命令别名
            Cmnd_Alias GIT = /usr/bin/git
    7.用户权限配置
        a) 基本形式
            用户名/组名 允许的主机别名 = (指定可执行的用户或者用户别名) 修饰tag : 命令或者命令别名,...
        b) 说明:指定用户可选,修饰tag也是可选
        c) 常用的修饰tag
            NOPASSWD 不需要输入密码,默认是需要输入密码
        d) 示例1 允许phper用户组在 HOST_WX_TEST无密码执行git命令
            %phper HOST_WX_TEST = NOPASSWD: GIT


    其它

    1.查看计数器
    pam_tally2 --user=username

    2.重置错误计数器
    pam_tally2 --user=username --reset

    3.查看ssh登录日志
    tail -f /var/log/secure


    后记

    1.安全策略未配置的用户不允许使用sudo执行命令
    2.默认输入的密码是当前登录的用户,可以通过设置指定登录的密码类型
    3.-k,-K这2个参数有bug,不管密码输入是否正确,登录错误次数都会累加
    4.sudo只能执行系统命令,shell内置的指定不能执行
    5.不可能开启shell权限,否则可以通过shell执行任何命令
    6.使用visudo来编辑安全策略文件
    7.sudo配置有点复杂,需要多花点时间了解下


    参考资料

    【1】 man sudo
    【2】 man sudoers
    【3】Redhat关于pam_tally2计数器在每次sudo时都增加的bug
    http://blog.csdn.net/napolunyishi/article/details/23375927

    作者:WadeYu
    出处:http://www.cnblogs.com/wadeyu/
    本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    第二次结对编程作业
    第一次结对编程作业
    第9组 团队展示
    第一次个人编程作业
    第一次博客作业
    2016-2017-1 20155215 信息安全技术 补课上测试
    2017-2018-1 20155215 第九周 加分项 PWD命令的实现
    2017-2018-1 20155215 《信息安全系系统设计基础》实验三
    2017-2018-1 20155215 《信息安全系统设计基础》第9周学习总结
    2017-2018-1 20155215 《信息安全系统设计基础》第8周学习总结
  • 原文地址:https://www.cnblogs.com/wadeyu/p/6690403.html
Copyright © 2020-2023  润新知