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系统的安全性、可管理性和审计能力。

相关推荐
weixin_3077791326 分钟前
Linux下Docker Compose里运行PostgreSQL数据库故障诊断Shell脚本
linux·运维·数据库·docker·postgresql
AI创界者34 分钟前
安全测试环境搭建:在 Kali Linux 中部署与配置开源 WebShell 管理工具 AntSword(蚁剑)
linux·运维·安全
猪头少年不会遇见算法学姐1 小时前
Makefile快速上手笔记
linux·学习
qiu_lovejun9981 小时前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq
运维大师1 小时前
【Linux运维极简教程】04-进程与服务管理
linux·运维
keke.shengfengpolang1 小时前
自动化考什么证书对就业有帮助?
运维·自动化
javajenius1 小时前
Masslynx 4.1安装包免费下载及详细安装教程
java·服务器·前端·其他
源码学社1 小时前
Spug 3.0 Ubuntu 22.04 Docker 部署文档
linux·ubuntu·docker·windows安装·spug
tebukaopu1481 小时前
ubuntu挂载nfs
linux·运维·ubuntu
雾沉川2 小时前
Netcatty 开源 SSH 客户端完整技术使用教程
运维·开源·ssh