首页 新闻

运维别走,留下你的root权限

作为互联网公司的后台程序员,我们知道,线上服务器要给用户提供稳定、可靠、快速的Web服务,所以公司一般都会把线上服务器隔离,设置防火墙,限制内网及办公网络对这些服务器的访问。

公司对线上服务器做限制之后,内外网都只能访问这些服务器的对外服务端口,例如http服务的80端口或REST服务的8080端口,而其他所有端口一律都会被防火墙拦截(ping端口除外)。我们无法ssh登录到这些线上服务器从而修改配置、排查问题等。

幸运的是,虽然办公网络不能直接连接到线上服务器,但是公司还是提供了跳板机(jumper)来供我们使用。毕竟线上服务是可能出问题的,如果出问题,必然需要连接到服务器排查。这个跳板机相当于办公网络与线上服务器之间的一座桥梁。办公电脑先连接到跳板机,然后再让跳板机连接线上服务器,你在跳板机上执行的操作都会被记录,公司要求这样间接连到服务器,从而监控你在服务器上的操作。

我们用办公电脑连接到跳板机,然后再连接服务器,这样问题貌似都解决了、可以去诊断问题了。且慢!我们还发现自己的账号只是普通用户,没有root权限,很多事情依然做不了。例如,需要使用root权限才能修改catalina.sh中的某些JVM选项。所以需申请root权限。

关于root权限,每家公司都有自己的规定。不知道其他公司是怎么规定的,我所在的公司为了不让root密码泄露出去,只提供sudo权限的申请渠道,绝不直接提供root密码给程序员。因为有sudo权限之后,我们可以不用知道root密码就切换到root身份(通过执行"sudo su")。在我所在的公司,后台程序员如果需要sudo权限,那么需要提申请给运维,运维负责审批。而且,申请到的sudo权限有时间限制,等结束时间一到,运维就会立即收回sudo权限,非常的抠门。

但是我的这个运维好像极不愿意把sudo权限给后台,完全不愿让你多用两天,即使你申请的是那种没有接入线上流量、专用于调试的机器的sudo权限。只要你申请的使用时间稍微长一点,他就不批准。

为了工作,申请sudo/root权限还被拒了?郁闷。就是因为sudo/root权限的使用时间申请得长了一点,运维就不分配权限,有点过分。于是我只好缩短sudo权限的申请时间,改为只申请3天,这次他直接就批了。这个运维,这又是何必呢!

这次sudo权限算是申请下来了,但是等这次的sudo权限的结束时间到了以后,要用root 还要再去找运维申请,我觉得这很麻烦。虽然从管理的角度看,这是很正确的事,但是我知道自己不会干坏事啊。为了不想下次再去找运维申请权限,我就在想了,可不可以把临时分配给我用3天的root权限缓存下来,不设置时间限制,让我慢慢用?这个需求可以实现吗?

稍微一想,显然可以啊。既然都把sudo 权限给我了,那我不就是root了吗,还有啥干不了的事情。而且方法有很多呢。本文根据Linux的基础知识,一下子就整理出3种方法,把root权限缓存下来慢慢用,方便自己开发,再也不用看运维脸色啦(当然,不能告诉运维)。同时,这些方法也让我深刻明白一个道理,root千万不能给不受信任的人,一秒钟都不行(我又能理解运维了)

那么,看我是怎么缓存root权限的吧。首先,直接把root密码改掉这种事情太绝了,而且容易暴露,不是本文要介绍的方法,不能这么干。我们要的是不修改root密码并且等sudo权限过期之后,还可以切换到root的方法。

方法一:创建一个新用户,把UID设为0

这是最简单、最快的方法。Linux系统不是根据用户名来判断root用户,而是根据用户的UID是不是等于0来判断root用户的。既然我们不知道root密码,那我们就再建立一个用户,把UID设为0,这样系统里面就多出来一个我们知道密码的root用户啦。只不过这个用户的用户名不是root。登录服务器shell,首先新建了一个普通用户joker,然后我们编辑/etc/passwd这个文件,把我们新创建的joker用户的UIDGID都改为0即可。

以上设置完成之后,我们以后就用su joker命令直接切换到root用户啦。总结起来就一句话,用临时sudo权限在系统里面安插一个不知名的root间谍。这种方法的隐蔽性其实不高。运维只要多看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的方法呢?

分析suman手册之后,我发现su是通过调用PAM模块来取得用户身份的,并且su调用PAM的时候使用了一个策略配置文件,即/etc/pam.d/su。如果不修改这个配置文件(运维也没有动过的话),根据默认配置,如果我们的用户属于admin用户组或者wheel用户组,那么就可以不输入密码就可以切换到root的权限。因此,解决方案来了,即把我们的用户加入adminwheel用户组。

先打开/etc/group,看一下用户组是admin还是wheel

在我的系统上,用户组是wheel,于是运行

加入了wheel用户组之后,我这个用户不用输入密码也能su切换到root啦。前面说过,默认情况下,PAM允许admin/wheel用户组的用户取得root用户身份。这是建立在 /etc/pam.d/su 这个文件没有被运维修改的前提之上的。假如是个狡猾的运维,把这里改掉了,那么加入admin/wheel的方法就行不通了。

从此以后,我不找运维也有root权限了,会不会被人发现?

结束语:假如你们公司的运维也不肯给root权限,而且还时不时拒绝sudo申请,又或者是只允许你使用sudo很短的一段时间,那么可以尝试本文介绍的这3个方法。这些方法实现了只要运维给你用一次sudo,即使只允许执行一次,那也就是给你永久root。非常不错。