Linux系统中掩耳盗铃的sudo配置

今天在这里讨论Linux系统中一个非常滑稽的系统配置失误,就是sudo,为什么说是滑稽的配置呢,就是因为如果配置不当的话,普通用户非常容易就可以提权到root用户,而且没有一点技术含量,系统管理员自己以为已经做好了权限管理,其实如果配置不当,权限漏洞已经出现。

  很多公司Linux系统都会用到sudo来配置普通用户可以执行的超级用户权限,一是为了系统管理员更安全的操作系统,二是可以为研发人员提供可控的权限范围,下面就看一下我们在系统中常见的sudo配置文件。

代码如下:

admin ALL=(ALL) NOPASSWD: /app/nginx/sbin/nginx

  这一段配置文件显示admin用户可以通过sudo来调用root权限启动nginx,相信这也是经常使用sudo的功能之一,因为如果nginx启动的是80端口的话,普通用户是无法启动的,因为系统限制了1024以下的端口监听只有root权限才可以操作,问题大多出现在这个sbin目录下的nginx可执行文件上,因为我们既然要将nginx的管理权限交付给普通用户admin,那么大部分情况是nginx的所有文件权限所属用户及组也都为admin,就像下面显示的这样。

代码如下:

[admin@localhost sbin]$ ll
总用量 3004-rwxr-xr-x 1 admin admin 3066035 9月  10 2014 nginx

  但是如果sbin目录下的nginx文件权限也为admin用户,而此时该文件还在sudo权限配置中,那么问题就来了,admin用户可以将系统任意命令copy过来变成nginx文件,到这里大家应该知道潜在的风险是有多大了,只要是任何命令文件admin用户有只读权限,那么就可以把文件变成nginx,随意以root身份执行该命令,因为sudo只关心执行的文件名,而不关心文件内容本身,如果此时admin用户需要提权到root用户下也很简单,只要将系统的vi命令copy到sbin目录下并重命名为nginx,当文件替换后,此时的nginx文件就变成了系统的vi命令,如果admin用户此时运行sudo nginx时就是以root用户的权限来执行vi动作了,例如用户执行sudo nginx /etc/sudoers,他就可以用root身份来编辑这个文件,从而给自己开放一个NO PASSWORD ALL的权限,只要保存sudo配置文件,执行sudo su -就可以轻松切换到root权限中来了,而后再将被替换的nginx文件复原,此时用root权限就可以轻松留下系统后门,同时再清空操作记录,完成整个操作而不留痕迹,下面来总结一下admin提权需要的几步操作。

[admin@localhost ~]$ sudo -l用户 admin 可以在该主机上运行以下命令:

代码如下:

(ALL) NOPASSWD: /app/nginx/sbin/nginx
[admin@localhost ~]$ which vi
/bin/vi
[admin@localhost ~]$ cp /bin/vi /app/nginx/sbin/nginx
[admin@localhost ~]$ sudo /app/nginx/sbin/nginx /etc/sudoers   //注意此时已经是调用root权限vi编辑sudoers文件了
[admin@localhost ~]$ sudo -l用户 admin 可以在该主机上运行以下命令:
    (ALL) NOPASSWD: ALL
[admin@localhost ~]$ sudo su - root
[root@localhost ~]#   //用户成功切换到root权限

  避免这样的问题发生其实也很简单,就是将我们需要执行的文件所属权限都改为root即可,这样普通用户就没有办法用copy的方法来改写这个文件,因为他对于该文件已经没有操作权限了,从而也就规避了这种提权风险。

  最后提一下发现这个配置问题的过程,在很早刚开始负责运维工作时,那个时候还是在一家传统互联网企业,甲方对于权限的控制非常严格,对于系统操作人员只提供普通用户权限,如果普通用户需要操作apache或者是nginx等就需要配置sudo,由于申请root权限的流程非常繁琐,在一次非常紧急的系统故障处理中就发现了这个方法,而当时的sudo可执行文件就存在权限所属的问题,最终提权成功了,不过这种方法还是不鼓励大家去做哈,如果在生产系统中发现有这样的问题,应该及时更新修复,避免由于权限泄漏导致的更多问题。

(0)

相关推荐

  • Linux 下sudo网络权限详解

    Linux 下sudo网络权限详解 对于设置了网络代理的服务器,在当前用户下执行网络访问没有问题,但通过sudo执行命令时,就会出现"无网络连接"的错误. 背景 对于设置了网络代理的服务器,在当前用户下执行网络访问没有问题,但通过sudo执行命令时,就会出现"无网络连接"的错误. 普通权限下,wget成功. # wget https://github.com --2016-12-08 09:00:43-- https://github.com/ Connecting

  • linux sudo命令详解

    简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码. 严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令.当然,能做什么不能做什么都是通过安全策略来指定的.sudo 支持插件架构的安全策略,并能把输入输出写入日志.第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo 一起工作.默认的安全策略记录在 /etc/sudoers 文件中.而安全策略可能需要用户通过密

  • 详解Linux下的sudo及其配置文件/etc/sudoers的详细配置

    详解Linux下的sudo及其配置文件/etc/sudoers的详细配置 1.sudo介绍 sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等.这样不仅减少了root用户的登陆 和管理时间,同样也提高了安全性.Sudo不是对shell的一个代替,它是面向每个命令的. 它的特性主要有这样几点: § sudo能够限制用户只在某台主机上运行某些命令. § sudo提供了丰富的日志,详细地记录了每个用

  • Linux用户配置sudo权限(visudo)的方法

    sudo的工作过程如下: 1,当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限 2,确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认 3,若密码输入成功,则开始执行sudo后续的命令 4,root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则) 5,若欲切换的身份与执行者的身份相同,也不需要输入密码 visudo使用vi打开/etc/sudoers文件,但是在保存退出时,

  • java在linux系统下开机启动无法使用sudo命令的原因及解决办法

    操作系统:centos 5.2场景描述:我们有一个WEB工程,客户要求使用普通用户(例如chb)运行,然后在页面上有个按钮,点击之后可以关机 实现方式:1. JAVA代码: 复制代码 代码如下: public static boolean shutDownForLinux() {                try {                        Runtime.getRuntime().exec("sudo /sbin/poweroff");           

  • linux系统sudo命令详解

    比如:运行一些像mount,halt,su之类的命令,或者编辑一些系统配置文件,像/etc/mtab,/etc /samba/smb.conf等.这样以来,就不仅减少了root用户的登陆次数和管理时间,也提高了系统安全性. 一. sudo的特点 sudo扮演的角色注定了它要在安全方面格外谨慎,否则就会导致非法用户攫取root权限.同时,它还要兼顾易用性,让系统管理员能够更有效,更方便地使用它.sudo设计者的宗旨是:给用户尽可能少的权限但仍允许完成他们的工作.所以,sudo有以下特点: # 1.

  • Linux系统中掩耳盗铃的sudo配置

    今天在这里讨论Linux系统中一个非常滑稽的系统配置失误,就是sudo,为什么说是滑稽的配置呢,就是因为如果配置不当的话,普通用户非常容易就可以提权到root用户,而且没有一点技术含量,系统管理员自己以为已经做好了权限管理,其实如果配置不当,权限漏洞已经出现. 很多公司Linux系统都会用到sudo来配置普通用户可以执行的超级用户权限,一是为了系统管理员更安全的操作系统,二是可以为研发人员提供可控的权限范围,下面就看一下我们在系统中常见的sudo配置文件. 复制代码 代码如下: admin AL

  • Linux系统中sudo命令的十个技巧总结

    前言 在Linux和其他类Unix操作系统中,只有root用户可以运行所有命令并在系统上执行某些关键操作,如安装和更新,删除包,创建用户和组,修改重要的系统配置文件等. 然而,承担root用户角色的系统管理员可以允许其他正常系统用户在sudo命令和几个配置的帮助下运行某些命令以及执行包括上述的一些重要系统操作. sudo 表示 "superuser do". 它允许已验证的用户以其他用户的身份来运行命令.其他用户可以是普通用户或者超级用户.然而,大部分时候我们用它来以提升的权限来运行命

  • Linux系统中jdk环境配置方式

    目录 1.下载jdk安装包 3.上传jdk安装包到linux 4.解压jdk安装包 5.开始配置环境变量 6.验证是否配置jdk成功 总结 如下操作步骤为linux系统中部署jdk环境 1.下载jdk安装包 jdk官网下载地址 https://www.oracle.com/java/technologies/javase-downloads.html 2.新建安装jdk文件夹(/usr/local/java/jdk) cd /usr/local mkdir /usr/local/java loc

  • 解决Linux系统中python matplotlib画图的中文显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • 基于Linux系统中python matplotlib画图的中文显示问题的解决方法

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些初步的数据挖掘和分析. 在使用matplotlib画图时,横坐标为中文,但是画出的条形图横坐标总是显示"框框",就去查资料解决.感觉这应该是个比较常见的问题,网上的中文资料也确实很多,但是没有任何一个彻底解决了我遇到的问题.零零碎碎用了快3个小时的时间,才终于搞定.特此分享,希望能帮到有同

  • 在 Linux 系统中手动滚动日志的方法

    日志滚动log rotation在 Linux 系统上是再常见不过的一个功能了,它为系统监控和故障排查保留必要的日志内容,同时又防止过多的日志造成单个日志文件太大. 日志滚动的过程是这样的:在一组日志文件之中,编号最大的(最旧的)一个日志文件会被删除,其余的日志文件编号则依次增大并取代较旧的日志文件,而较新的文件则取代它作为当前的日志文件.这一个过程很容易就可以实现自动化,在细节上还能按需作出微调. 使用 logrotate 命令可以手动执行日志滚动的操作.本文将要介绍的就是手动进行日志滚动的方

  • linux系统中修改tomcat默认输入日志路径的方法

    1.修改catalina.sh 进入tomcat安装目录/bin,找到catalina.sh,先进行备份. 对本地的catalina.sh进行修改,这里是以将日志目录修改为/data/logs为例,即将$CATALINA_BASE/logs/catalina.out改为CATALINA_OUT=/data/logs. 2.修改logging.properties 进入tomcat安装目录/conf/,找到logging.properties,先进行备份. 对本地的logging.properti

  • linux系统 java环境变量的配置方法

    配置java环境变量 这里是将环境变量配置在etc/profile,即为所有用户配置JDK环境. sudo vi /etc/profile 配置环境变量(注意jdk位置) #set java env export JAVA_HOME=/usr/lib/jdk/jdk1.8.0_171 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOM

  • Linux系统中SSH服务基于key认证实践的过程

    众所周知ssh是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,它默认工作在tcp的22号端口,具体实现的软件有:openssh(centos默认安装的),dropbear.ssh协议目前有两个版本v1和v2,v1基于CRC-32做MAC,不安全.v2基于DH算法做密钥交换,基于RSA或DSA实现身份认证.所以目前大多流行的Linux都是使用的V2版本. 简单了解了下ssh,我们再来说说它的两种用户登录认证方式,第一种基于用户名口令的方式,这种认证方式想必大家都应该知道,就是我们要想

  • 解决linux系统中运行node进程却无法杀死进程的问题

    下面先给大家介绍下linux系统中运行node进程无法杀死进程,具体内容如下所示: events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE at errnoException (net.js:901:11) at Server._listen2 (net.js:1039:14) at listen (net.js:1061:10) at Server.listen (net.js:1127:5) a

随机推荐