sudo

作用:允许 系统管理员 授予某些用户或用户组以 其他用户身份 运行某些或所有命令的权限

  • su 用于变更为其他使用者的身份的命令,一般需要键入该使用者的密码
  • sudo 则是对 su 使用的简化,不需要 su 琐碎的操作步骤,更佳的便捷且对权限的操纵更细腻
  • Sudo 是免费软件,遵守 ISC 式许可证,相关详情

基本安装

虽然 sudo 在大多数 Linux 系统上会自带,但这不是绝对的事情

  • 如果是使用 Debian 系统或其分支系统使用如下命令,想了解 Debian 包管理可以查看 此处

    apt install sudo
  • 如果是使用 Ret Hat 相关的系统及其分支可以使用如下命令

    yum install sudo
  • 如果需要想有更多自定义可以进行源码手动编译安装,官方安装说明

配置 sudo

sudo 支持用于安全策略、审计和输入或输出日志记录的插件架构

  • 默认安全策略是 sudoers,sudoers 策略插件作用是 控制用户使用 sudo 时权限的范围
  • 第三方可以开发和分发他们自己的插件以与 sudo 前端无缝协作,一般并情况并不会运用到,如果想要了解可查看 此处

sudoers

sudoers 安全策略要求大多数用户在使用 sudo 之前进行 身份验证,如果满足下列条件则不需要密码

  • 调用用户是root用户
  • 目标用户与调用用户相同
  • 策略已禁用用户或命令的身份验证
  • 可能支持凭证缓存,以允许用户在 sudo 一段时间内再次运行而无需身份验证,默认情况下会以每个终端为基础缓存凭据 5 分钟

注意:与 su 不同之处在 sudoers 需要身份验证时,它会验证 调用用户的凭据 而不是 目标用户或根用户的凭据

  • 如果 sudo 是由 root 用户 运行的,并且设置了 SUDO_USER 环境变量,sudoers 策略将使用该值来确定实际用户是谁
  • 即使调用了根 shell,用户也可以使用该值通过 sudo 记录命令
  • 允许 -e 选项在通过 sudo 运行脚本或程序调用时仍然有用

sudoers 的管理方式通过以下两种方法

  • /etc/sudoers 文件,此方法适合个人使用
  • 可选地在 LDAP 中驱动,此方法适用于大型分布式环境,后面不提想要了解可以点击 此处

使用 /etc/sudoers 配置文件

对于默认安全策略 sudoers,应使用 visudo 程序更改配置文件,这将确保不会引入语法错误

  • visudo 使用 vi 打开 /etc/sudoers 文件,但是在保存退出时,visudo 会检查内部语法,避免用户输入错误信息
  • 所以使用 visudo 建议查询一下 vi 用法,它与 vim 相比使用时会有些许出入

sudoers 文件格式

  • 由两种类型的条目组成:别名(基本上是变量)和用户规范(指定谁可以运行什么)
  • sudoers 文件语法将使用 EBNF 描述

别名 Aliases

  • 分四类:User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias

    Alias ::= 'User_Alias'  User_Alias_Spec (':' User_Alias_Spec)* |
    'Runas_Alias' Runas_Alias_Spec (':' Runas_Alias_Spec)* |
    'Host_Alias' Host_Alias_Spec (':' Host_Alias_Spec)* |
    'Cmnd_Alias' Cmnd_Alias_Spec (':' Cmnd_Alias_Spec)* |
    'Cmd_Alias' Cmnd_Alias_Spec (':' Cmnd_Alias_Spec)* User_Alias ::= NAME
    User_Alias_Spec ::= User_Alias '=' User_List User_List ::= User |
    User ',' User_List
    User ::= '!'* user name |
    '!'* #user-ID |
    '!'* %group |
    '!'* %#group-ID |
    '!'* +netgroup |
    '!'* %:nonunix_group |
    '!'* %:#nonunix_gid |
    '!'* User_Alias Runas_Alias ::= NAME
    Runas_Alias_Spec ::= Runas_Alias '=' Runas_List ::= Runas_Member |
    Runas_Member ',' Runas_List
    Runas_Member ::= '!'* user name |
    '!'* #user-ID |
    '!'* %group |
    '!'* %#group-ID |
    '!'* %:nonunix_group |
    '!'* %:#nonunix_gid |
    '!'* +netgroup |
    '!'* Runas_Alias |
    '!'* ALL Host_Alias ::= NAME
    Host_Alias_Spec ::= Host_Alias '=' Host_List Host_List ::= Host |
    Host ',' Host_List
    Host ::= '!'* host name |
    '!'* ip_addr |
    '!'* network(/netmask)? |
    '!'* +netgroup |
    '!'* Host_Alias |
    '!'* ALL Cmnd_Alias ::= NAME
    Cmnd_Alias_Spec ::= Cmnd_Alias '=' Cmnd_List Cmnd_List ::= Cmnd |
    Cmnd ',' Cmnd_List
    Cmnd ::= Digest_List? '!'* command |
    '!'* directory |
    '!'* Edit_Spec |
    '!'* Cmnd_Alias Digest_List ::= Digest_Spec |
    Digest_Spec ',' Digest_List
    Digest_Spec ::= "sha224" ':' digest |
    "sha256" ':' digest |
    "sha384" ':' digest |
    "sha512" ':' digest
    digest ::= [A-Fa-f0-9]+ |
    [A-Za-z0-9\+/=]+ command ::= command name |
    command name args |
    command name regex |
    command name '""' |
    ALL
    command name ::= regex |
    file name Edit_Spec ::= "sudoedit" file name+ |
    "sudoedit" regex |
    "sudoedit" NAME ::= [A-Z][0-9A-Z]*
    • User_Alias: 用户名别名
    • User_List: 一个或多个用户名或系统组名(以 % 为前缀)、以 UID 或 GID(以 #%# 为前缀)、网络组(以 + 为前缀)、非 Unix 组组成名称和 ID(分别以 %:%:# 为前缀)以及 User_Alias
    • Runas_Alias: 用户身份别名
    • Runas_List: 类似 User_List 但 ALL 是任意或任何的涵义
    • Host_Alias: 主机别名
    • Host_list: 由一个或多个主机名、IP 地址、网络号、网络组(以 + 为前缀)和其他别名组成
    • Cmnd_Alias: 命令别名
    • Cmnd_list: 一个或多个命令、目录或别名的列表
    • Digest_List: 一个或多个 Digest_Spec 条目的 逗号 分隔列表
    • sudo 1.9.0 开始,如果需要可以使用 Cmd_Alias 代替 Cmnd_Alias
  • 别名定义都是以下形式

    Alias_Type NAME = item1, item2, ...
    • Alias_Type: 别名类型
    • NAME: 由大写字母、数字、下划线字符组成的字符串,且必须以大写字母开头
    • 可以将多个相同类型的别名定义放在一行中以 冒号 : 分隔

用户规范

  • 用户规范确定用户可以在指定主机上运行哪些命令

    User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \
    (':' Host_List '=' Cmnd_Spec_List)* Cmnd_Spec_List ::= Cmnd_Spec |
    Cmnd_Spec ',' Cmnd_Spec_List
    Cmnd_Spec ::= Runas_Spec? Option_Spec* (Tag_Spec ':')* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
    Option_Spec ::= (SELinux_Spec | Solaris_Priv_Spec | Date_Spec | Timeout_Spec | Chdir_Spec | Chroot_Spec) SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
    Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')
    Date_Spec ::= ('NOTBEFORE=timestamp' | 'NOTAFTER=timestamp')
    Timeout_Spec ::= 'TIMEOUT=timeout'
    Chdir_Spec ::= 'CWD=directory'
    Chroot_Spec ::= 'CHROOT=directory' Tag_Spec ::= ('EXEC' | 'NOEXEC' | 'FOLLOW' | 'NOFOLLOW' |
    'LOG_INPUT' | 'NOLOG_INPUT' | 'LOG_OUTPUT' |
    'NOLOG_OUTPUT' | 'MAIL' | 'NOMAIL' | 'INTERCEPT' |
    'NOINTERCEPT' | 'PASSWD' | 'NOPASSWD' | 'SETENV' |
    'NOSETENV')
    • 用户规范的基本结构可以理解为 who where = (as_whom) what 描述为 who 在 where 使用 as_whom 的身份执行 what 这件事
    • who: 指使用者,比如用户或用户组等
    • where: 使用场景,比如主机或网络组等
    • as_whom: 使用身份,比如用户或用户组等
    • what: 做什么,比如命令等
  • 示例

    # 允许用户 dgb 在主机 boulder 上可以 operator 的身份执行 /bin/ls、/bin/kill、/usr/bin/lprm 中任意命令
    dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm # 允许用户 dgb 在主机 boulder 上可以用 operator 用户或 operator 组的身份执行 /bin/ls,
    # 可以用 root 身份执行 /bin/kill、/usr/bin/lprm 中任意命令
    dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill,\
    /usr/bin/lprm # 用户 alan 可以作为用户 root 或 bin 运行任何命令,可选择将组设置为 operator 或 system
    alan ALL = (root, bin : operator, system) ALL

    使用

    $ sudo -u operator /bin/ls
    $ sudo -u operator -g operator /bin/ls
    $ sudo -g operator /bin/ls

标签 Tag_Spec

  • 一个命令可能有零个或多个与之关联的标签,后续就会继承该标签,除非它被相反的标签覆盖

  • EXEC 和 NOEXEC

    如果sudo编译时带有 noexec 支持并且底层操作系统支持它,则该 NOEXEC 标记可用于防止动态链接的可执行文件本身运行更多命令

    # 用户 aaron 可以运行 /usr/bin/more, /usr/bin/vi,但将禁用 shell 转义。
    aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
  • FOLLOW 和 NOFOLLOW

    从版本 1.8.15 开始,除非启用 sudoedit_follow 标志,sudoedit 否则将不会打开作为符号链接的文件,如果进行覆盖则可以打开,这对标签仅对 sudoedit 命令有效,对所有其他命令都将被忽略

  • LOG_INPUT 和 NOLOG_INPUT

    在每个命令的基础上覆盖 log_input 标志的值

  • LOG_OUTPUT 和 NOLOG_OUTPUT

    在每个命令的基础上覆盖 log_output 标志的值

  • MAIL 和 NOMAIL

    这些标记通过在每个命令的基础上覆盖 mail_all_cmnds 标志的值,提供对当用户运行命令时是否发送邮件的细粒度控制

  • PASSWD 和 NOPASSWD

    默认情况下,sudo 要求用户在运行命令之前进行身份验证,但可以通过 NOPASSWD 标签修改此行为,相反 PASSWD 标签可以用来颠倒事物

    # 将允许用户 ray 在机器 rushmore 上以 root 身份运行没有密码的情况下运行 /bin/kill,对 /bin/ls, /usr/bin/lprm 则需要密码
    ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm

    但是请注意,该标记对 exempt_group 设置 PASSWD 指定的组中的用户没有影响

  • SETENV 和 NOSETENV

    这些标记在每个命令的基础上覆盖 setenv 标志的值

    • 如果 SETENV 已为命令设置,则用户可以通过选项从命令行禁用env_reset标志
    • -E 选项,在命令行上设置的环境变量不受 env_check, env_delete, env_keep 施加的限制,因此只应允许受信任的用户以这种方式设置变量
    • 如果匹配的命令是 ALL,则 SETENV 该命令隐含该标记,这个默认值可以通过使用 NOSETENV 标签来覆盖
  • INTERCEPT 和 NOINTERCEPT

    如果 sudo 已使用拦截支持进行编译并且底层操作系统支持它,则该 INTERCEPT 标记可用于使命令生成的程序针对 sudoers 进行验证并记录下来,就像 sudo 直接运行它们一样

    • 这与允许 shell 转义的命令(如 shell、编辑器、分页器)结合使用很有用
    • 由于策略检查可能会在运行命令(例如执行大量子命令的 shell 脚本)时增加延迟,因此会产生额外的开销

在 sudoers 文件中的主机名、路径名和命令行参数中允许使用 POSIX.1 标准的通配符,从版本 1.9.10 开始可以对路径名和命令行参数使用正则表达式,使用 POSIX 扩展正则表达式, 强烈建议不要对命令名称使用 取反类型 的正则表达式,可能会存在规则绕过的问题

下列为 POSIX.1 标准的通配符,如果是 POSIX 扩展正则表达式可以自行查询

  • *: 匹配任意一组零个或多个字符(包括空格)
  • ?: 匹配任何单个字符(包括空格)
  • [...]: 匹配指定范围内的任意字符
  • [!...]: 匹配不在指定范围内的任何字符
  • \: 转义特殊字符,从版本 1.9.10 开始,整个路径 可以用双引号括起来,在这种情况下不需要转义

sudoers 文件范围

使用 @include@includedir 指令从当前正在解析的 sudoers 文件中包含其他 sudoers 文件

  • 除了本地的每台机器文件之外,还可以使用包含文件来保留站点范围的 sudoers 文件

    • 站点范围的sudoers文件将是 /etc/sudoers 而每台机器的文件将是 /etc/sudoers.local

      # 在 /etc/sudoers 中包含 /etc/sudoers.local
      @include /etc/sudoers.local
    • @includedir 指令可用于创建一个 sudoers.d 目录,系统包管理器可以将 sudoers 文件规则放入其中作为包安装的一部分,文件按排序的词法顺序进行解析

  • 编写注意:特殊字符和保留字

    • # 在 sudoers 文件中作为 注释符
    • ! 以用作列表或别名中的 逻辑非运算符
    • \ 长行换行作为 续行符
    • ALL 一个内置别名,它总是使匹配成功,正如名称任何或所有
    • 保留字:CHROOT, PRIVS, LIMITPRIVS, ROLE, TYPE, TIMEOUT, CWD, NOTBEFORE, NOTAFTER

个人使用 sudo 方法的更多相关文章

  1. ubantu中执行docker免sudo方法

    1.添加用户组,如果已存在则不用设置. sudo groupadd docker 2.将用户加入该 group (docker)内 sudo gpasswd -a ${USER} docker 3.重 ...

  2. 不需要打密码的sudo方法

    Linux下频繁输入sudo很麻烦.如果你的账户已经是sudoer了,那么编辑/etc/sudoers,将 %sudo ALL=(ALL:ALL) ALL 修改为: %sudo ALL=(ALL) N ...

  3. CentOS用户权限管理--su与sudo

    Linux权限管理--su与sudo 1.su用来切换登录的用户,比如当前用户为chen,可以用su zhu,并输入用户zhu的登录密码,就可以切换到用户zhu.如果一个普通用户想切换到root用户, ...

  4. SSH-KEY服务及批量分发与管理实战

    SSH服务 一.SSH服务介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据 ...

  5. linux下emacs安装

    1.下载地址:http://ftp.gnu.org/pub/gnu/emacs/ 下载文件:emacs-24.2.tar.gz 步骤: 一.安装依赖文件:  (先进入root:终端中输入 su -) ...

  6. Fedora16 安装相关

    安装BCM4312无线网卡驱动 Linux系统BCM4312无线网卡驱动的安装 联想Y450 Linux系统 无线网卡驱动安装 准备工作: Broadcom官网驱动下载地址 http://www.br ...

  7. Ansible进阶--playbook的使用

    一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...

  8. 关于 Ubuntu Linux 16.04中文版的 root 权限及桌面登录问题

    新接触 Ubuntu 的朋友大多会因为安装中没有提示设置 root 密码而不太清楚是什么原因. 起初 Ubuntu 团队希望安装尽可能的简单. 不使用 root , 在安装期间的两个用户交互步骤可以省 ...

  9. ansible系列5-开启加速 Ansible 执行速度的功能

    SSH pipelining 是一个加速 Ansible 执行速度的简单方法.ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选 ...

  10. odoo 权限杂记

    最近做一个任务督办模块,涉及到一些权限问题,折磨了几天,终于是解决了. 任务表中关联了hr_employee,分别有默认字段创建人,Many2one的发布人.监督人和Many2many类型的主责人,这 ...

随机推荐

  1. Your lock file does not contain a compatible set of packages. Please run composer update.

    执行composer install遇到错误:Your requirements could not be resolved to an installable set of packages. 这是 ...

  2. sqlserver 把 某一列的所有值 变成 in 里面的内容

    SELECT  STUFF(( SELECT  ','+'''' +convert(VARCHAR, cDefine3)+'''' from rdrecord08 where dDate>'20 ...

  3. IDEA使用——快捷键修改

    刚转入IDEA的小伙伴都知道,如果将IDEA的快捷键设置为Eclipse模式也会有相当多常用快捷键不一样,下面链接的配置文件是博主自己IDEA配置的导出文件.我将Eclipse常用的快捷键都做了同步, ...

  4. kettle从入门到精通 第四十九课 ETL之kettle 自定义插件01

    1.kettle插件是什么 kettle本身有足够多的转换或者job步骤,但是依然不能覆盖所有的业务场景,所以Kettle 自定义插件在有些独特的业务场景可以大显身手. Kettle的插件架构使得我们 ...

  5. 如何防止 Elasticsearch 服务 OOM ?

    ES 和传统关系型数据库有很多区别, 比如传统数据中普遍都有一个叫"最大连接数"的设置.目的是使数据库系统工作在可控的负载下,避免出现负载过高,资源耗尽,谁也无法登录的局面. 那 ...

  6. CentOS7打开终端快捷键

    点击右上角的用户名,选择设置>>键盘>>快捷键,然后点+,名称自己写,命令是"/usr/bin/gnome-terminal",这个是不能改的,再点应用,这 ...

  7. 在阿里云WINDOWS机器上部署的JAVA SpringBoot 时不时的无效 。

    用telnet 能通.但代码的HTTP 访问不了. 解决方法,在运行时加-Dserver.address=0.0.0.0,让它监听所有: java -Dserver.address=0.0.0.0 - ...

  8. 《Android开发卷——程序自动登录》

    Android程序的自动登录功能 因为是公司的项目,所以这里不方便说出项目名称,这里就说我在做这个项目中用到的一些功能或者叫技术问题吧. 咱们经常用的Android程序中有一个情况,就是当你第一次注册 ...

  9. 在线Base64转文件、文件转Base64工具

    在线Base64转换神器,一键实现Base64编码与文件互转!支持图片.文档等各类文件,快速准确,安全无服务器存储.拖拽上传,轻松编码解码,提升开发效率.跨平台兼容,移动端友好,让数据转换再无障碍. ...

  10. redis 锁

    demo1 public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IOExcepti ...