sudo 授权问题

sudo 表示 “superuser do”,它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而,大部分时候我们用它来提权运行命令,以替代直接使用 root 用户的操作。

sudo 命令与安全策略配合使用,安全策略可以通过文件 /etc/sudoers 来配置。其安全策略具有高度可拓展性,支持插件扩展。默认情况下 /etc/sudoers 是不能被任何人直接编辑的,因为它的权限是 440,虽然也可以对其赋予写权限后再编辑,但推荐使用 visudo 命令编辑该文件。

sudo 命令的工作流程

  • 使用sudo 命令时,sudo程序会读取和解析 /etc/sudoers 文件,查找调用sudo命令的用户(比如test用户)及其权限。
  • 然后提示调用该命令的用户(test用户)输入密码,或者也可以通过 NOPASSWD 标志来跳过密码验证。
  • 之后,sudo 创建一个子进程,调用 setuid() 来切换到目标用户(可能是root,也可能是其他用户)。
  • 最后,它会在上述子进程中执行参数给定的 shell 或命令。

sudo 命令授权配置

  • USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS
  • USER/GROUP: 表示需要被授权的用户或者组(谁有权限调用sudo命令,比如test);如果是组则需要以 % 开头
  • HOST: 表示允许从哪些主机登录的用户可以运行 sudo 命令;ALL 表示允许从任何终端、机器访问
  • (USER[:GROUP]): 表示使用 sudo 可切换的用户或者组(可以使用谁的权限,比如root),组可以不指定;ALL 表示可以切换到系统的所有用户
  • NOPASSWD: 如果指定,则该用户或组(比如test)使用 sudo 时不必输入密码
  • COMMANDS: 表示运行指定的命令;ALL 表示允许执行所有命令
# 允许 sudo 组执行所有命令
%sudo ALL=(ALL:ALL) ALL# 允许用户escape执行所有命令,且无需输入密码
escape ALL =(ALL) NOPASSWD: ALL# 仅允许用户escape执行 echo, ls 命令
escape ALL =(ALL) NOPASSWD: /bin/echo /bin/ls# 运行本机的用户escape执行关机命令
escape localhost=/sbin/shutdown -h now# 允许 users 用户组中的用户像 root 用户一样使用 mount、unmount、chrom 命令
%users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

 配置 Defaults 选项

# 指定用户尝试输入密码的次数,默认值为3
Defaults passwd_tries=5# 设置密码超时时间,默认为 5 分钟
Defaults passwd_timeout=2默认 sudo 询问用户自己的密码,添加 targetpw 或 rootpw 配置可以让 sudo 询问 root 密码
Defaults targetpw# 指定自定义日志文件
Defaults logfile="/var/log/sudo.log"# 要在自定义日志文件中记录主机名和四位数年份,可以加上 log_host 和 log_year 参数
Defaults log_host, log_year, logfile="/var/log/sudo.log"# 保持当前用户的环境变量
Defaults env_keep += "LANG LC_ADDRESS LC_CTYPE COLORS DISPLAY HOSTNAME EDITOR"
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"# 安置一个安全的 PATH 环境变量
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

 如何更加安全的授权服务器权限?

我们管理的服务器,开发或者其他人员需要登录该服务器,进行环境调试或者问题复现等情况。这时,就需要我们给对应的用户开通登录的访问权限。但是如果我们直接编辑 /etc/sudoers 文件的话,之后当对方使用完成之后我就还需要手动进行清理。如果我们忘记的话,该开发或者其他人员将一直可以登录该服务器,会有一定程度的安全问题。

不幸的是,对应临时授权的话,/etc/sudoers 文件中没有对应的配置,可以对某个用户或者用户组进行指定范围的时间授权。当用户到达指定时间点之后,将拒绝该用户再次进行登录了。对应此种情况,我们可以通过 crontab 定时任务与 /etc/sudoers.d 目录的机制可以完美的解决上述问题。

我们通过定时任务的定时执行目录,来定时刷掉 /etc/sudoers.d/ 目录下的用户或者用户组的授权配置文件。比如,我们需要定时每日刷掉今日临时授权的用户或者用户,可以在 /etc/cron.daily 目录下面创建用于删除 /etc/sudoers.d/ 目录的 rm -rf 命令,之后在固定的时间会自动删除。对应授权用户,我们使用在 /etc/sudoers.d/ 目录下创建单独的配置文件,而不是直接修改 /etc/sudoers 文件。

# Crontab有多种定时机制
# 下述分别表示每天、每时、每月、每周定时执行
$ ls -dl /etc/cron.* | grep -v cron.d$
drwxr-xr-x 2 root root 4096 May 15 06:18 /etc/cron.daily
drwxr-xr-x 2 root root 4096 Feb 14  2019 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 Feb 14  2019 /etc/cron.monthly
drwxr-xr-x 2 root root 4096 Jun 18 09:57 /etc/cron.weekly# 创建单独的授权配置文件
$ ls -lh /etc/sudoers.d/
-r--r----- 1 root root 666 Oct  6  2017 lisi
-r--r----- 1 root root 958 Jan 18  2018 zhangsan# 查看授权配置文件的内容
$ cat /etc/sudoers.d/zhangsan
ALL ALL = (root) NOPASSWD: zhangsan

如何解决 sudo 命令找不到环境变量?

我们日常在使用 sudo 命令的时候,常常会遇到,当切换用户之后,发现之前设置的环境变量怎么不见了呢?这是因为,我们执行 sudo 命令之后会切换用户,如果保留环境变量会有一定的安全问题,系统会默认重置环境变量为安全的环境变量。先前设置的变量都会失效,只有少数配置文件中指定的环境变量能够保存下来。

我们可以看一下 sudo 配置文件 /etc/sudoers 来找找作用原因。我们执行如下命令之后,可以看到如下输入(有可能和我这里的不一样)。其中 env_reset 表示默认会重置环境变量,因此我们自定义的变量会在 sudo 命令执行之后失效,也就不会正确获取变量值了。而 env_keep 则表示用于保留部分环境变量不被重置,需要保留的变量就写入双引号之中,可自行追加需要保留的变量。最后就是 secure_path 变量,其作用就是包含的路径将被当做 sudo 环境的 PATH 变量来使用。如果在 sudo 环境无法找到某些命令,那么可以将这些命令的路径加入该配置项之中。

$ sudo sed '/^#/d;/^$/d' /etc/sudoers
Defaults    env_reset
Defaults    env_keep =  "COLORS IDSPLAY HOSTNAME HISTSIZE LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS"
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

我们知道原因之后,就可以针对上述情况作出不用的处理方式,来解决 sudo 命令找不到环境变量的问题。

第一种解决方法,就是在使用的时候,使用 -E 参数。加上 -E 选项后,用户可以在 sudo 执行时保留当前用户已存在的环境变量,不会被 sudo 重置。另外,如果用户对于指定的环境变量没有权限,则会报错。需要注意的是,在内部测试机器中,安全性要求不高的情况下使用。

$ sudo sudo -E

第二种解决方法,就是修改 sudo 配置文件。可以通过修改 /etc/sudoers 文件的 env\_keep 和 secure\_path 配置项,来指定 sudo 环境中需要保留的环境变量和路径。当然,我们也可以把配置文件的变量 !env\_reset 给去掉,这样就不会有限制了。

$ sudo vim /etc/sudoers
Defaults !env_reset

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树知识

提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 二、二叉树初始知识 题目 源于做的一道牛课题 若一颗完全二叉树中某节点无左孩子,则该节点是 A、高度为1的节点 B、高度为2的节点…

Redis持久化和集群架构

目录 Redis持久化 RDB快照(snapshot) RDB优点 RDB缺点 RDB的触发机制 AOF持久化 AOF文件重写 AOF触发机制 混合模式 Redis主从架构 Redis哨兵高可用架构 Redis Cluster架构 槽位定位算法 跳转重定位 Redis集群节点间的通信机制 Redis持久化…

在 MATLAB 中注释多行

使用 MATLAB 中的注释块注释多行代码 要注释一行或两行代码,我们可以使用%字符来完成。但是,如果我们必须注释多行代码,则此方法将花费大量时间。我们可以使用注释块来注释多行代码,而不是使用%来注释多行代码。写在该块中的任何…

仿真机器人-深度学习CV和激光雷达感知(项目2)day6【数学基础-坐标变换】

文章目录 前言坐标变换的作用旋转与平移二维变换旋转平移推广到三维齐次坐标问题引入定义用法变换矩阵旋转的其他表示方法*前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫本文内容是我为复试准备的第二个项目 💫欢迎大家的关注,我的博客主要关注于考研408以及…

【数学建模】综合评价方法

文章目录 综合评价的基本理论和数据预处理综合评价的基本概念综合评价体系的构建综合指标的预处理方法评价指标预处理示例 常用的综合评价数学模型线性加权综合评价模型TOPSIS法灰色关联度分析熵值法秩和比(RSR)法综合评价示例 综合评价的基本理论和数据…

【学网攻】 第(3)节 -- 交换机配置聚合端口

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用 前言 网络已经成为了我们生活中不可或缺的一部分,它连接了世界各地的人们,让信息和资源得以自由流动。随着互联网的发展,我们可以通过网络学习、工作、娱乐…

【Apache PLC4X】工业物联网的通用协议适配器

随着工业物联网的发展,越来越多的设备需要通过网络进行连接和通信。在工业领域,可编程逻辑控制器(PLC)是一种常见的设备,用于控制和管理工业生产过程。然而,不同的PLC设备可能使用不同的通信协议&#xff0…

精品基于Uniapp+springboot自习室预约系统App教室阅览室

《[含文档PPT源码等]精品基于Uniappspringboot自习室预约系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 开发语言:Java 后台框架:springboot、ssm 安…

在寻找潜在客户时,应该考虑哪些关键因素?

自我认知: 1.要知道自己是销售什么产品的,针对哪些客户群体? 2.先从上层筛选有必要购买的客户,再筛选有能力购买的角色:总经理、业务经理、市场经理、区域经理、业务代表等。 销售的主要目标就是挖掘潜在客户转化成合…

React底层原理分析(简单大白话版本)

一、React 最核心的四个包 react包react-dom包react-reconciler包scheduler包 二、 React 工作循环 三、启动过程 四、核心对象 Fiber对象 五、Fiber树 构建,对比,渲染 ---------------------------------------- 关于react底层使用到的算法 diff…

【数据库连接】连接sqlite3报错:go-sqlite3 requires cgo to work. This is a stub

报错信息 register db Ping default, Binary was compiled with ‘CGO_ENABLED0’, go-sqlite3 requires cgo to work. This is a stubWindows解决办法 新建环境变量 新报错 Failed to build the application: # runtime/cgo cgo: C compiler “gcc” not found: exec: “gc…

如何提升MySQL IO 性能瓶颈问题

针对提出的 MySQL IO 性能瓶颈问题,可以采用以下几种策略来尝试解决或缓解: 设置 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 参数: binlog_group_commit_sync_delay:这个参数允许二进制日志提交…

Go语言实现跳动的爱心(附带源码)

在 Go 语言中,你可以使用 github.com/fogleman/gg 包来实现动态的爱心效果。以下是一个简单的例子: package mainimport ("fmt""github.com/fogleman/gg""math""time" )const (width 800height 600 )// Dra…

脱机安装系统依赖

项目遇到离线安装系统依赖包的问题,通过查资料发现使用yum install --downloadonly --downloaddir的方法只能下载系统未安装的依赖,并不能下载全量,于是另辟蹊径。 查询依赖 yum search tkinter (CentOS) apt search tkinter (Ubuntu)全量下…

含有openpyxl库pyinstaller 打包exe出错python解决方案

解决方法: 在代码开头添加以下代码在打包。 # hook-openpyxl.py from PyInstaller.utils.hooks import collect_data_files datas collect_data_files(openpyxl) from openpyxl import load_workbook,Workbook如遇到错误, win32ctypes.pywin32.pywintyp…

IaC基础设施即代码:Terraform 连接 tencentcloud COS 实现多资源管理

目录 一、实验 1.环境 2.Terraform 连接 tencentcloud 腾讯云COS 3.申请VPC专有网络资源 4.申请安全组资源 5.申请CVM资源 6.申请CLB资源 7.申请DNS资源 8.销毁资源 二、问题 1. Terraform申请安全组资源失败 2.Terraform验证云主机资源报错 3. A记录和CNAME的区别 …

阿里云推出第八代企业级实例 g8i:AI 推理性能最高提升 7 倍、可支持 72B 大语言模型

云布道师 1 月 11 日,全球领先的云计算厂商阿里云宣布推出第八代企业级通用计算实例 ECS g8i,这也是国内首款搭载第五代英特尔至强可扩展处理器(代号 EMR)的云计算产品。依托阿里云自研的「飞天CIPU」架构体系,ECS g8…

十一、常用API——爬虫

目录 爬虫本地爬虫和网络爬虫贪婪爬取和非贪婪爬取正则表达式在字符串方法中的使用捕获分组和非捕获分组分组捕获分组非捕获分组 爬虫 本地爬虫和网络爬虫 有如下文本,请按照要求爬取数据。(本地爬虫) Java自从95年问世以来,经历…

记录一些多维数组的方法

文章目录 前言一、获取多维数组的数据二、多维数组自带的方法总结 前言 验证过程中,我们经常会用到多维数组存储数据,本文主要记录一下,如何去获取我们需要的数据,以及多维数组自带的一些方法。 一、获取多维数组的数据 获取多维…

排序-睡眠排序

睡眠排序 小故事: 在一个神奇的小村庄里,村长有一群活泼可爱的小动物们,它们分别是兔子、松鼠、乌龟和蜗牛。每天晚上,村长都会安排一场特殊的比赛,让大家各自按照自己的速度去完成一项任务。有一天,村长决定让他们按…