个人使用 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类型的主责人,这 ...
随机推荐
- 【工作记录】JDBC连接MySQL,跨时区调查CST转Asia/Shangha
根据业务要求,不同的国家设置jvm参数,来确定当前时区. // -Duser.timezone=Asia/Kolkata 印度加尔各答 GMT+05:30 // -Duser.timezone=Asi ...
- FlexBox 行间距
问题背景 在Flex布局方式下, 父容器约定是换行的方式, 不足以容纳一行子元素的时候, 会单独进行折行, 那么折行的行间距如何处理呢? 解决办法 通过在子Item上面设置margin-top可以模拟 ...
- 利用nodejs的require.context来实现不用写impor导入组件
先给你们看下目录结构 stuendt和teacharts还有util是同级 主要是componentRegister.js文件 function changStr(str) { return str. ...
- Stable Diffusion 解析:探寻 AI 绘画背后的科技神秘
AI 绘画发展史 在谈论 Stable Diffusion 之前,有必要先了解 AI 绘画的发展历程. 早在 2012 年,华人科学家吴恩达领导的团队训练出了当时世界上最大的深度学习网络.这个网络能够 ...
- 从pfx私钥证书中提取私钥
要准备openssl win 32 del /Q c:\mch_private2.pem c:\OpenSSL-Win32\bin\openssl.exe pkcs12 -in c:\mch_priv ...
- work07
day08作业: 必做题:============================================================ 第一题: 定义一个字符串s = "Hell ...
- 抖音验证签名和接口含中文签名,需要在发送端加上utf8编码
抖音验证签名和接口含中文签名,需要在发送端加上utf8编码 抖音验签和抖音异步通知回调验签解决:是对整个接收的字符串做验签,而不是部分数据做验签解决中文参数问题,否则中文乱码报验签错误 签名算法htt ...
- 这个vue3的后台管理系统虽然简洁但不简单
今天介绍一个新的Vue后台管理框架,相比其他后台功能丰富管理系统,这个后台管理系统可以用干净简洁来形容--Nova-admin Nova-admin Nova-admin 是一个基于Vue3.Vite ...
- 向Web服务器端上传文件
server.py import flaskapp = flask.Flask(__name__)@app.route('/upload', methods=['POST'])def uploadFi ...
- Linux中expr命令
Linux中expr命令 shell中不能简简单单的加减乘除,需要使用expr.expr只能用于整数值,一般格式为 expr arg1 operator arg2 注意: 1. 运算符左右都有空格,如 ...