当前位置: 首页 > 科技观察

不要离开运维,离开你的root权限

时间:2023-03-13 15:07:16 科技观察

作为一家互联网公司的后台程序员,我们知道线上服务器必须为用户提供稳定、可靠、快速的网络服务,所以公司一般将线上隔离server,设置防火墙,限制内网和办公网络对这些服务器的访问。公司限制在线服务器后,内外网只能访问这些服务器的对外服务端口,如http服务的80端口或REST服务的8080端口,其他端口将被防火墙屏蔽(ping端口除外)。我们不能通过ssh进入这些在线服务器修改配置、排查问题等。好在虽然办公网络不能直连在线服务器,但是公司还是提供了跳线供我们使用。毕竟,在线服务可能存在问题。如果出现问题,您必须连接到服务器进行故障排除。这个跳板机相当于办公网络和在线服务器之间的桥梁。办公电脑先连接跳板,然后跳板连接在线服务器。您在跳板上执行的操作将被记录下来。公司需要这种间接连接到服务器来监控你在服务器上的操作。我们用办公电脑连接跳板机,再连接服务器,这样问题好像解决了,可以去诊断问题了。等待!还发现我们的账号只是一个普通用户,没有root权限,很多事情还是做不了。例如,修改catalina.sh中的一些JVM选项需要root权限。所以需要申请root权限。关于root权限,每个公司都有自己的规定。不知道其他公司是怎么规定的。为了防止root密码泄露,我公司只提供sudo权限申请渠道,从不直接向程序员提供root密码。因为有了sudo权限,我们可以在不知道root密码的情况下切换到root状态(通过执行“sudosu”)。在我公司,后台程序员如果需要sudo权限,需要提交申请给运维,运维负责审批。而且申请的sudo权限是有时间限制的。结束时间一到,运维立马收回sudo权限,非常小气。但是我的运维好像极度不愿意给后台sudo权限,不想让你多用两天,就算你申请那种sudo权限的机器也不会可以访问在线流量并致力于调试。只要你申请稍微长一点的使用时间,他就不会批准,如图。为了工作,申请sudo/root权限被拒绝?郁闷。是因为sudo/root权限的申请时间有点长,运维不分配权限,有点过分了。所以只好把申请sudo权限的时间缩短到只申请3天,这次他直接批准了。这运维,何必呢!这次已经申请了sudo权限,但是这个sudo权限的结束时间到了之后,如果想使用root,就得重新去运维申请。我觉得这很麻烦。虽然从管理的角度来说,这是正确的做法,但我知道我不能做坏事。为了下次不去运维申请权限,我就在想,能不能把临时分配给我的root权限缓存3天,不设时限,让我慢慢用?这个需求能实现吗??想了想,显然是可以的。既然已经给了sudo权限,那我就是root了,没有什么不能做的。而且有很多方法。本文基于Linux基础知识,一次性梳理出3种方法,缓存root权限慢慢使用,方便自主开发,运维不用再看脸了(当然,你不能告诉运维)。同时,这些方法也让我深刻体会到root不能给不信任的人,一秒钟都不能给的道理(运维又懂了)。那么,让我们看看我是如何缓存root权限的。首先,直接修改root密码过于极端,容易暴露。不是本文要介绍的方法,也是做不到的。我们想要的是一种在sudo权限过期后不更改root密码且切换到root的方法。方法一:新建一个用户,将UID设置为0,这是最简单快速的方法。Linux系统不根据用户名来判断root用户,而是根据用户的UID是否等于0来判断root用户。既然我们不知道root密码,那我们再创建一个用户,设置UID为0,这样系统中就会多出一个我们知道密码的root用户。只是这个用户的用户名不是root。登录服务器shell,输入以下命令:上面的命令首先创建了一个普通用户joker,然后我们编辑/etc/passwd文件,将我们新建的joker用户的UID和GID修改为0。经过以上设置完成后,我们以后使用sujoker命令直接切换到root用户。一句话概括就是,利用临时的sudo权限在系统中植入一个未知的rootspy。这种方法的隐蔽性其实并不高。运维只需要查看passwd文件,找到这个奇怪的joker用户,将其删除,我们缓存中的root就会消失。尽管如此,对于不那么勤奋的操作人员来说,即使是像这样简单的事情也足够了。我创建了这个用户之后,根本就没有人看/etc/passwd,我的root用户已经常驻了很久。另外很多公司的服务器基本上都是容器或者虚拟机。如果删除了这个服务器实例,那么我们手动创建的用户自然也就消失了。但是线上发布war包等操作一般不会导致容器被删除,所以代码发布后,我们的joker(root)用户还在。方法二:在/etc/sudoers给自己分配一个权限既然运维是通过sudo来管理root权限,那么我们也从sudo入手,给自己一个永久免费的sudo权限。但是需要注意的是,我们配置的sudo配置文件不要被运维的sudo配置文件覆盖。另外,记得要谨慎。在Linux系统中,sudo配置文件包括/etc/sudoers文件和/etc/sudoers.d/目录下的所有文件。两地文件格式类似。如果你是普通用户,第一次执行sudo,会遇到如下提示。遇到这个提示的时候还以为是运维设置的,吓了一跳。后来才知道,每个linux系统都有上面的提示信息。执行sudo后,如果没有权限,提示如下:因此,我们在/etc/sudoers.d/目录下新建一个空白文件,比如joker,按如下格式编辑,授予一个sudo允许我们的用户。第一个字段是您自己的用户名;第二个字段标识允许远程登录的机器名,只写ALL;第三个字段是允许切换的用户名,写ALL表示允许切换到所有用户;四个字段是允许执行的命令,写ALL则允许执行所有命令。文件写入并保存后,权限自动启用。如果觉得输入密码麻烦,可以这样写:方法三:修改su的配置在Linux系统上,如果要切换到root,首先想到的就是su命令。Linux默认允许任何用户执行su,但需要知道目标用户的密码。有没有办法让普通用户不用输入密码就可以切换到root?分析su的man手册后发现,su是通过调用PAM模块获取用户身份的,而su调用PAM时,使用了一个策略配置文件。即/etc/pam.d/su。如果不修改这个配置文件(运维没接触过的话),按照默认配置,如果我们的用户属于admin用户组或者wheel用户组,那么不用进入就可以切换到root权限一个密码。因此,解决方案是将我们的用户添加到admin或wheel用户组。首先打开/etc/group,查看用户组是admin还是wheel。在我的系统上,用户组是wheel,所以运行加入wheel用户组后,我的用户可以su切换到root,不用输入密码。如前所述,默认情况下,PAM允许admin/wheel用户组的用户获得root用户身份。这是建立在/etc/pam.d/su文件没有被运维修改过的前提下。如果是狡猾的运维,把这个改了,那么添加admin/wheel的方法就不行了。上图是“狡猾”的运维,把那两行注释掉了。不过,由于还没有被删除,我们临时获得root权限,就可以直接恢复了。从此我就算不找运维也有root权限了。会不会被发现?结语:如果你的公司运维拒绝授予root权限,时不时的拒绝sudo申请,或者只允许你短时间使用sudo,你可以试试本文介绍的这3种方法。这些方法实现了只要运维允许你使用sudo一次,哪怕只允许执行一次,也会给你永久root。非常好。