Linux云计算基础篇(5)

一、sudo是什么?

定义:sudo(SuperUserDO)是一个Linux/Unix系统命令,允许被授权的普通用户以另一个用户(通常是超级用户root)的身份执行命令。

核心目的:

1.最小权限原则:避免让用户长期拥有root权限或直接使用root账户登录,减少因误操作或恶意软件造成的系统破坏风险。

2.权限委派:精确控制哪些用户可以执行哪些特定的特权命令。

3.审计追踪:sudo默认会记录谁在什么时候执行了什么命令(通常记录在/var/log/auth.log或/var/log/secure),便于事后审计。

工作原理:

sudo本身是一个设置了SetUID(SUID)位的程序(通常位于/usr/bin/sudo,权限为-rwsr-xr-x)。

当普通用户执行sudocommand时:

1.系统检查该用户是否有权使用sudo以及是否有权执行command(依据/etc/sudoers文件)。

2.如果授权通过,系统会提示用户输入自己的密码(除非配置为免密码)。

3.密码验证通过后(或配置免密码),sudo进程会以root用户(或指定的其他用户)的身份启动command。

4.执行完成后,权限恢复为原用户。

二、sudo的基本使用规则

1.基本语法:

bash

sudo[选项]command[参数]

-uusername:以指定用户身份执行命令(默认为root)。例如:sudo-ualicetouchfile.txt(以用户alice身份创建文件)。

-l:列出当前用户被允许执行的sudo命令。

-v:刷新用户的sudo身份验证时间戳,延长免密码时间(通常默认5分钟)。

-k:立即终止用户的sudo身份验证时间戳,下次使用sudo需要重新输入密码。

-s:启动一个新的shell(通常是root的shell)。sudo-s

-i:模拟root登录环境(类似于su-或sudosu-)。sudo-i

2.典型使用场景:

安装软件:sudoaptinstallpackage_name(Debian/Ubuntu)/sudoyuminstallpackage_name(CentOS/RHEL)

管理系统服务:sudosystemctlrestartapache2

编辑系统配置文件:sudonano/etc/nginx/nginx.conf

查看系统日志:sudotail-f/var/log/syslog

管理用户/组:sudouseraddnewuser/sudousermod-aGgroupnameusername

挂载文件系统:sudomount/dev/sdb1/mnt/data

3.重要规则:

密码:默认情况下,用户需要输入自己的密码(不是root密码)来验证身份。输入密码时光标不会移动,也不会显示星号,这是正常现象。

时间戳:输入密码验证成功后,系统会记录一个时间戳(通常保存在/run/sudo/ts/或/var/run/sudo/ts)。在默认配置(通常是5分钟)内再次使用sudo通常不需要重新输入密码。

授权限制:用户只能执行/etc/sudoers文件中明确允许的命令。尝试执行未授权的命令会被拒绝并记录。

三、/etc/sudoers文件详解

文件位置:/etc/sudoers

重要性:这是sudo权限系统的核心配置文件。定义了哪些用户/组可以在哪些主机上以哪些用户的身份运行哪些命令,以及相关的选项(如是否免密码)。

编辑规则:

绝对不要使用普通文本编辑器(如nano,vim)直接编辑/etc/sudoers!

必须使用visudo命令编辑!

bash

sudovisudo

为什么必须用visudo?

1.语法检查:visudo在保存文件时会进行严格的语法检查。如果发现错误,它会警告你并询问如何处理(通常是恢复或重新编辑)。直接编辑如果写错语法,可能导致sudo完全失效,甚至无法用sudo修复,只能用root用户或单用户模式修复。

2.文件锁:visudo会锁定文件,防止多人同时编辑导致配置丢失。

3.安全:使用安全的环境编辑。

/etc/sudoers文件结构解析

文件通常包含以下部分(顺序可能略有不同):

1.Defaults(默认设置):

设置影响所有sudo操作的全局选项。

语法:Defaults后跟选项名,可以指定用户、主机、命令别名等目标。

常用Defaults选项:

Defaultsenv_reset:重置环境变量到一个安全的最小集(推荐)。防止用户通过环境变量影响特权命令。

Defaultsmail_always:每次用户使用sudo时都发送邮件通知。

Defaultsmail_badpass:当用户输入错误密码时发送邮件通知。

Defaultssecure_path:设置sudo执行命令时的PATH环境变量(非常重要!防止用户路径下的恶意程序被以root执行)。例如:Defaultssecure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

Defaultstimestamp_timeout=分钟数:设置密码验证成功后sudo免密码的时间窗口(默认通常是5或15)。设置为0表示每次都需要密码,设置为负数(如-1)表示永不超时(危险!)。

Defaultspasswd_timeout=分钟数:设置输入密码提示的超时时间。

Defaults!lecture:首次使用sudo时不再显示警告信息("Wetrustyouhavereceivedtheusuallecture...")。

Defaultslogfile="/path/to/log":指定自定义的sudo日志文件路径。

Defaultslog_input,log_output:记录命令的输入(stdin)和输出(stdout/stderr),用于高级审计(谨慎使用,数据量大)。

Defaultstargetpw:要求输入目标用户(通常是root)的密码,而不是执行sudo用户的密码(非常不推荐,破坏了sudo的核心安全模型)。

Defaults!authenticate:允许特定用户/命令免密码执行sudo(通常结合具体的用户规则使用更安全)。

示例:

sudoers

全局设置

Defaultsenv_reset

Defaultsmail_badpass

Defaultssecure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

对管理员组免去首次使用警告

Defaults:%admin!lecture

设置超时为10分钟

Defaultstimestamp_timeout=10

2.UserAliases(用户别名):

定义一组用户的别名,方便在规则中引用。

语法:User_AliasALIAS_NAME=user1,user2,user3,%group1,%group2,...

%group表示系统用户组。

示例:

sudoers

User_AliasADMINS=jsmith,mjones,%sysadmin

User_AliasWEBMASTERS=bob,%webdev

3.HostAliases(主机别名):

定义一组主机的别名(在多主机环境中配置sudoers时有用)。

语法:Host_AliasALIAS_NAME=hostname1,hostname2,ip-address,...

示例:

sudoers

Host_AliasWEBSERVERS=www1,www2,192.168.1.10

Host_AliasDBSERVERS=db-primary,db-replica

4.RunasAliases(身份别名):

定义sudo可以切换到的目标用户的别名。

语法:Runas_AliasALIAS_NAME=user1,user2,%group1,...

示例:

sudoers

Runas_AliasDB_ADMINS=postgres,mysql

Runas_AliasSERVICE_ACCOUNTS=%service

5.CommandAliases(命令别名):

定义一组命令(或带路径的命令)的别名,是配置的核心。

语法:Cmnd_AliasALIAS_NAME=/path/to/command1,/path/to/command2,/path/to/command3args,...

关键点:

必须使用绝对路径指定命令!这是防止命令注入攻击的关键。

可以在命令后添加参数来限制使用方式(如/usr/bin/aptinstall只允许安装,不能删除)。

通配符:

:匹配任意字符序列(小心使用!/usr/bin/允许该目录下所有命令)。

?:匹配单个字符。

[]:字符集合。

!:取反(如!/usr/bin/passwdroot禁止修改root密码)。

示例:

sudoers

Cmnd_AliasSOFTWARE=/usr/bin/aptinstall,/usr/bin/aptremove,/usr/bin/aptupdate

Cmnd_AliasSHUTDOWN_CMDS=/sbin/shutdown,/sbin/reboot,/sbin/halt

Cmnd_AliasPROC_MGMT=/bin/kill,/usr/bin/killall,/bin/nice,/bin/renice

Cmnd_AliasNETWORKING=/sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net,/sbin/iptables

Cmnd_AliasSERVICES=/usr/bin/systemctlstart,/usr/bin/systemctlstop,/usr/bin/systemctlrestart,/usr/bin/systemctlstatus

允许不带参数执行updatedb

Cmnd_AliasLOCATE=/usr/bin/updatedb""

允许运行/usr/bin/less查看任何日志文件

Cmnd_AliasVIEW_LOGS=/usr/bin/less/var/log/.log,/usr/bin/less/var/log/syslog,/usr/bin/less/var/log/auth.log

禁止修改root密码

Cmnd_AliasNO_ROOT_PASSWD=!/usr/bin/passwdroot

6.用户规范(权限规则):

这是文件的核心部分,定义了实际的权限规则。

语法:

whowhere=(runas_user[:runas_group])[NOPASSWD:][TAG:]command_list

各字段解释:

who:哪些用户/组/别名可以使用这条规则。可以是:

用户名(e.g.,jsmith)

组名(前面加%,e.g.,%admin)

用户别名(e.g.,ADMINS)

系统保留字ALL

where:在哪些主机上这条规则有效。可以是:

主机名(e.g.,webserver1)

主机别名(e.g.,WEBSERVERS)

ALL(所有主机)

(runas_user[:runas_group]):允许sudo切换到的目标用户(和可选的组)。可以是:

用户名(e.g.,root)

用户别名(e.g.,DB_ADMINS)

组名(前面加%,e.g.,%service)

ALL

省略括号和内容时,默认(root:root)

NOPASSWD:(可选):如果指定,执行command_list中的命令时不需要输入密码。这是可选的标记,放在command_list前面。PASSWD:是默认行为(需要密码)。

TAG:(可选):更精细地控制命令行为(较少用):

SETENV::允许用户在sudo环境中保留或设置环境变量(需谨慎)。

NOEXEC::阻止被执行的命令自身再exec其他程序(防止某些shell逃逸)。

command_list:允许执行的命令列表。可以是:

绝对路径的命令(e.g.,/usr/bin/apt)

命令别名(e.g.,SOFTWARE)

ALL(允许所有命令-极度危险!)

可以在命令或别名前加!表示禁止执行。

多个命令/别名用逗号,分隔。

规则示例与解释:

sudoers

1.用户jsmith在任何主机上可以以root身份运行任何命令(需要密码)-等同于给root权限(危险!)

jsmithALL=(ALL:ALL)ALL

2.用户webadmin在主机webserver1上可以以root身份运行/usr/bin/systemctl管理nginx和apache2(需要密码)

webadminwebserver1=(root)/usr/bin/systemctlstartnginx,/usr/bin/systemctlstopnginx,/usr/bin/systemctlrestartnginx,/usr/bin/systemctlstatusnginx,\

/usr/bin/systemctlstartapache2,/usr/bin/systemctlstopapache2,/usr/bin/systemctlrestartapache2,/usr/bin/systemctlstatusapache2

3.组admin的成员在任何主机上可以以任何用户身份运行任何命令(需要密码)

%adminALL=(ALL:ALL)ALL

4.用户deploy在任何主机上可以以用户www-data的身份运行/usr/bin/git(免密码)

deployALL=(www-data)NOPASSWD:/usr/bin/git

5.用户backup在任何主机上可以以root身份运行/usr/bin/rsync和/bin/tar(需要密码)

backupALL=(root)/usr/bin/rsync,/bin/tar

6.用户auditor在任何主机上可以以root身份只读查看所有日志文件(免密码)

auditorALL=(root)NOPASSWD:/usr/bin/less/var/log/,/usr/bin/tail/var/log/,/bin/cat/var/log/

7.用户dba在主机dbserver1上可以以用户postgres或mysql的身份运行数据库管理命令(需要密码)

dbadbserver1=(DB_ADMINS)/usr/bin/psql,/usr/bin/mysql,/opt/dbadmin/bin/

8.用户limited可以运行SOFTWARE别名中的命令(aptinstall/remove/update)和查看进程(PROC_MGMT),但禁止修改root密码(免密码)

limitedALL=(root)NOPASSWD:SOFTWARE,PROC_MGMT,NO_ROOT_PASSWD

9.用户helper可以重启网络服务(NETWORKING)和关机命令(SHUTDOWN_CMDS),但必须输入密码

helperALL=(root)NETWORKING,SHUTDOWN_CMDS

10.别名WEBMASTERS中的用户在主机WEBSERVERS上可以以root身份管理WEB_SERVICES别名中的服务(需要密码)

WEBMASTERSWEBSERVERS=(root)WEB_SERVICES

关键注意事项与最佳实践

1.visudo是唯一编辑方式:再强调一遍,永远使用sudovisudo编辑/etc/sudoers。

2.最小权限原则:只授予执行特定任务所必需的最小权限。避免使用ALL=(ALL:ALL)ALL这种宽泛规则,除非对特定管理用户且确有必要。

3.使用绝对路径:命令列表中必须使用命令的绝对路径。

4.善用别名:大量使用User_Alias,Host_Alias,Runas_Alias,Cmnd_Alias来组织规则,使文件更清晰、更易管理。

5.谨慎使用NOPASSWD:免密码虽然方便,但大大降低了安全性。仅在自动化脚本或非常信任且命令风险极低的情况下使用。

6.限制命令参数:在Cmnd_Alias中通过指定参数来限制命令的使用范围(如只允许aptinstall不允许aptremove)。

7.避免sudo运行Shell:规则如ALL=(ALL:ALL)/bin/bash或ALL=(ALL:ALL)/bin/sh等同于给予用户完全的rootshell访问权限,破坏了sudo的细粒度控制优势。尽量指定具体的命令。

8.组管理优先:尽量将权限赋予组(%groupname),然后通过管理用户组成员来管理权限,比单独管理每个用户更方便。

9.定期审计:定期检查/var/log/auth.log(或/var/log/secure)中的sudo日志,以及使用sudo-l查看用户权限。

10.测试规则:添加新规则后,切换到相应用户(su-username)并使用sudo-l验证规则是否按预期生效,再测试执行具体命令。

总结

sudo是实现安全、可控的特权命令执行的核心工具。

/etc/sudoers文件是配置sudo权限的核心,必须通过visudo安全编辑。

配置的核心在于定义谁(who),在哪里(where),可以以谁的身份((runas_user)),是否需要密码(NOPASSWD:),运行哪些命令(command_list)。

充分利用别名(User_Alias,Host_Alias,Runas_Alias,Cmnd_Alias)组织复杂配置。

严格遵守最小权限原则和使用绝对路径的要求。

谨慎授予ALL权限和NOPASSWD选项。

通过合理配置/etc/sudoers,可以极大地增强Linux系统的安全性、可管理性和审计能力。

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

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

相关文章

Postgresql通过pgpool进行高可用部署主从,灾备(单机版)

1、bitnami/postgresql-repmgr:15 (镜像名) Bitnami 的 PostgreSQL-Repmgr 镜像是一个预配置的 Docker 镜像,集成了 PostgreSQL 数据库和 repmgr(Replication Manager)工具,用于快速搭建高可用&#xff08…

Flink-1.19.0源码详解-番外补充3-StreamGraph图

1.StreamGraph图: StreamGraph是Flink流处理作业的第一个计算调度流图,它是从用户编写的 DataStream API程序转换而来的逻辑图。StreamGraph由StreamNode与StreamEdge组成,StreamNode为记录数据处理的节点,StreamEdge为连接两个StreamNode的边…

linux系统---Nginx反向代理与缓存功能

目录 正向代理和反向代理 正向代理的作用 反向代理可实现的功能 反向代理客户端ip透传 1.初始访问192.168.235.139 结果 2.编辑代理服务器的配置文件 3、重载nginx服务 4、访问代理服务器 实现反向代理负载均衡 1.先启用已用另一台服务端 2.使用192.168.235.140 …

U+平台配置免密登录、安装Hadoop配置集群、Spark配置

文章目录 1、免密登录2、安装hadoop3、Spark配置 具体详细报告见资源部分,全部实验内容已经上传,如有需要请自行下载。 1、免密登录 使用的配置命令: cd ~/.ssh/ssh-keygen -t rsaEnter键回车y回车回车出现如上所示 cat ./id_rsa.pub >…

GitHub vs GitLab 全面对比报告(2025版)

从技术架构到金融估值,深度解析两大代码托管平台的差异化竞争策略 一、技术架构对比 维度GitHub (Microsoft旗下)GitLab (独立上市公司)关键差异核心架构- 分布式Git仓库 Issues/Projects- 全栈DevSecOps平台GitLab集成CI/CD、安全、监控部署模式- SaaS为主 - Git…

Python 数据分析与可视化 Day 14 - 建模复盘 + 多模型评估对比(逻辑回归 vs 决策树)

✅ 今日目标 回顾整个本周数据分析 & 建模流程学会训练第二种模型:决策树(Decision Tree)掌握多模型对比评估的方法与实践输出综合对比报告:准确率、精确率、召回率、F1 等指标为后续模型调优与扩展打下基础 🪜 一…

本周大模型新动向:KV缓存混合精度量化、个体时空行为生成、个性化问答

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 KVmix: Gradient-Based Layer Importance-Aware Mixed-Precision Quantization for KV Cache 大型语言模型(LLMs)在推理过程中,键值(KV)缓存的高内…

在 Spring Boot 中使用 WebMvcConfigurer

WebMvcConfigurer 是 Spring MVC 提供的一个扩展接口,用于配置 Spring MVC 的各种功能。在 Spring Boot 应用中,通过实现 WebMvcConfigurer 接口,可以定制和扩展默认的 Spring MVC 配置。以下是对 WebMvcConfigurer 的详细解析及其常见用法。…

w-笔记:uni-app的H5平台和非H5平台的拍照识别功能:

uni-app的H5平台和非H5平台的拍照识别功能&#xff1a; <template><view class"humanVehicleBinding"><view v-if"warn" class"shadow"></view><view class"header"><uni-nav-bar left-icon"l…

TCP 半连接队列和全连接队列(结合 Linux 2.6.32 内核源码分析)

文章目录 一、什么是 TCP 半连接队列和全连接队列二、TCP 全连接队列1、如何查看进程的 TCP 全连接队列大小&#xff1f;注意 2、TCP 全连接队列溢出问题注意 3、TCP 全连接队列最大长度 三、TCP 半连接队列1、TCP 半连接队列溢出问题2、TCP 半连接队列最大长度3、引申问题 一、…

linux下fabric环境搭建

参考教程&#xff1a; https://devpress.csdn.net/cloudnative/66d58e702045de334a569db3.html?dp_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MjA2MzY4NywiZXhwIjoxNzQwMzY4MDc0LCJpYXQiOjE3Mzk3NjMyNzQsInVzZXJuYW1lIjoiaHVhbmd0dXBpIn0.oh8e4F6Sw_A4SV2ODQ5W0pYK0…

Redis Pipeline介绍:提高操作Redis数据库的执行效率

Redis Pipeline是一种用于提高Redis执行效率的技术&#xff0c;通过减少客户端与服务器之间的通信开销&#xff0c;显著提升批量操作的性能。本文将详细介绍Redis Pipeline的概念、使用场景、实现方式及其优势。 一、Redis Pipeline的概念 Redis Pipeline是一种批处理机制&am…

linux长时间锁屏无法唤醒

是的&#xff0c;您这么理解很直接&#xff0c;抓住了要点。 简单来说&#xff0c;就是这样&#xff1a; 电脑睡觉有两种方式&#xff1a; 打个盹&#xff08;挂起/Suspend&#xff09;&#xff1a; 把工作状态保存在内存里。这个一般和 Swap 分区没关系。睡死过去&#xff…

STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader

导言 想象一下&#xff0c;我们的单片机 App 正在稳定地运行着&#xff0c;突然我们想给它升级一下&#xff0c;添加个新功能。我们该如何安全地通知它&#xff1a;“嘿&#xff0c;准备好接收新固件了” ? 这就需要 App 和 Bootloader 之间建立一个可靠的"秘密握手"…

Explain解释

参考官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/explain-output.html explain关键字可以分析你的查询语句的结构和性能。 explain select查询&#xff0c; 执行会返回执行计划的信息。 注意&#xff1a;如果from中有子查询&#xff0c;仍然会执行该子查询…

选择 PDF 转 HTML 转换器的 5 个关键特性

市面上有很多 PDF 转 HTML 的转换器&#xff0c;每一款产品都有不同的功能组合。要理清并理解每个功能可能会让人感到困惑。那么&#xff0c;真正重要的是什么呢&#xff1f; 这篇文章将介绍我们认为在选择最佳 PDF 转 HTML 转换器时最重要的 5 个关键特性&#xff1a; 1. 转换…

使用堡塔在服务器上部署宝塔面板-linux版

使用堡塔在服务器上部署宝塔面板-linux版 使用堡塔多机管理登录服务器 进入宝塔官网&#xff0c;获取安装脚本 wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec3. 在堡塔多机管理中&#xff0c;…

【Unity高级】Unity多界面游戏场景管理方案详解

引言&#xff1a;游戏界面管理的挑战 在Unity游戏开发中&#xff0c;尤其是包含多个功能界面&#xff08;如主菜单、关卡选择、游戏页面、设置和商城&#xff09;的游戏&#xff0c;如何高效管理场景与界面是架构设计的核心挑战。本文将深入探讨三种主流实现方案&#xff1a;单…

WINDOWS最快布署WEB服务器:apache2

安装JDK下载 https://tomcat.apache.org/ Index of /dist/tomcat/tomcat-9 安装测试 http://localhost:8080/ 替换自己的文件 把自己的文件复制到&#xff1a; C:\Program Files\Apache Software Foundation\Tomcat 9.0\webapps\ROOT

Microsoft Edge 打开无反应、打开后显示兼容性问题、卸载重装 解决方案。一键卸载Microsoft Edge 。

背景&#xff1a;网络上的浏览器修复、重装、恢复默认应用测试后无用&#xff0c;以下卸载重装方案经实测可以正常使用Microsoft Edg。 卸载软件在资源里&#xff0c;请自取。 一、卸载软件&#xff1a;Remove-Edge_GUI.exe 双击卸载等待即可。 二、在微软商店重新安装Micro…