个人使用 sudo 方法
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 方法的更多相关文章
- ubantu中执行docker免sudo方法
1.添加用户组,如果已存在则不用设置. sudo groupadd docker 2.将用户加入该 group (docker)内 sudo gpasswd -a ${USER} docker 3.重 ...
- 不需要打密码的sudo方法
Linux下频繁输入sudo很麻烦.如果你的账户已经是sudoer了,那么编辑/etc/sudoers,将 %sudo ALL=(ALL:ALL) ALL 修改为: %sudo ALL=(ALL) N ...
- CentOS用户权限管理--su与sudo
Linux权限管理--su与sudo 1.su用来切换登录的用户,比如当前用户为chen,可以用su zhu,并输入用户zhu的登录密码,就可以切换到用户zhu.如果一个普通用户想切换到root用户, ...
- SSH-KEY服务及批量分发与管理实战
SSH服务 一.SSH服务介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据 ...
- linux下emacs安装
1.下载地址:http://ftp.gnu.org/pub/gnu/emacs/ 下载文件:emacs-24.2.tar.gz 步骤: 一.安装依赖文件: (先进入root:终端中输入 su -) ...
- Fedora16 安装相关
安装BCM4312无线网卡驱动 Linux系统BCM4312无线网卡驱动的安装 联想Y450 Linux系统 无线网卡驱动安装 准备工作: Broadcom官网驱动下载地址 http://www.br ...
- Ansible进阶--playbook的使用
一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...
- 关于 Ubuntu Linux 16.04中文版的 root 权限及桌面登录问题
新接触 Ubuntu 的朋友大多会因为安装中没有提示设置 root 密码而不太清楚是什么原因. 起初 Ubuntu 团队希望安装尽可能的简单. 不使用 root , 在安装期间的两个用户交互步骤可以省 ...
- ansible系列5-开启加速 Ansible 执行速度的功能
SSH pipelining 是一个加速 Ansible 执行速度的简单方法.ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选 ...
- odoo 权限杂记
最近做一个任务督办模块,涉及到一些权限问题,折磨了几天,终于是解决了. 任务表中关联了hr_employee,分别有默认字段创建人,Many2one的发布人.监督人和Many2many类型的主责人,这 ...
随机推荐
- 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. 这是 ...
- sqlserver 把 某一列的所有值 变成 in 里面的内容
SELECT STUFF(( SELECT ','+'''' +convert(VARCHAR, cDefine3)+'''' from rdrecord08 where dDate>'20 ...
- IDEA使用——快捷键修改
刚转入IDEA的小伙伴都知道,如果将IDEA的快捷键设置为Eclipse模式也会有相当多常用快捷键不一样,下面链接的配置文件是博主自己IDEA配置的导出文件.我将Eclipse常用的快捷键都做了同步, ...
- kettle从入门到精通 第四十九课 ETL之kettle 自定义插件01
1.kettle插件是什么 kettle本身有足够多的转换或者job步骤,但是依然不能覆盖所有的业务场景,所以Kettle 自定义插件在有些独特的业务场景可以大显身手. Kettle的插件架构使得我们 ...
- 如何防止 Elasticsearch 服务 OOM ?
ES 和传统关系型数据库有很多区别, 比如传统数据中普遍都有一个叫"最大连接数"的设置.目的是使数据库系统工作在可控的负载下,避免出现负载过高,资源耗尽,谁也无法登录的局面. 那 ...
- CentOS7打开终端快捷键
点击右上角的用户名,选择设置>>键盘>>快捷键,然后点+,名称自己写,命令是"/usr/bin/gnome-terminal",这个是不能改的,再点应用,这 ...
- 在阿里云WINDOWS机器上部署的JAVA SpringBoot 时不时的无效 。
用telnet 能通.但代码的HTTP 访问不了. 解决方法,在运行时加-Dserver.address=0.0.0.0,让它监听所有: java -Dserver.address=0.0.0.0 - ...
- 《Android开发卷——程序自动登录》
Android程序的自动登录功能 因为是公司的项目,所以这里不方便说出项目名称,这里就说我在做这个项目中用到的一些功能或者叫技术问题吧. 咱们经常用的Android程序中有一个情况,就是当你第一次注册 ...
- 在线Base64转文件、文件转Base64工具
在线Base64转换神器,一键实现Base64编码与文件互转!支持图片.文档等各类文件,快速准确,安全无服务器存储.拖拽上传,轻松编码解码,提升开发效率.跨平台兼容,移动端友好,让数据转换再无障碍. ...
- redis 锁
demo1 public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IOExcepti ...