Linux系统下,如何将运行程序的用户从root转到一般用户?

来源:互联网 发布:php截取字符串前几位 编辑:程序博客网 时间:2024/04/20 18:13

在开发的过程中,一般的后台的服务程序,在开发初期没有规划好使用什么用户去运行,也没有考虑这个用户需要哪些权限,这就导致了一个很普通的现象发生,那就是,使用root,一切都可以搞定。大家都知道,使用root意味着这个程序所作的事情就没有限制啦,一旦,程序或者系统有缺陷而且被攻破,那么就可能导致攻击者可以控制整个系统,而且可以做任何事情。不过,大部分人还是不以为然,认为这样的事情不会落到自己头上,一直到某一天,他的老板打电话责备他系统被攻击是怎么回事?


所以,与其后期后悔,倒不如在开发初期就规划好。


如果程序已经启用啦,而且是使用root用户运行的,该怎么办呢? 直接转到一般用户,又怕某些方面会出问题,导致服务不能提供,问题会更大。同时,一般地也没有人敢随便更换运行服务的用户,这可需要进行一整轮的Regression测试的,要不然很容易发生Regression bug。在产品需要尽快更新出新功能的今天,也没有人愿意做这个事情,除非产品被攻击而且服务器被控制的事情发生。


在这里,我总结了几个从root用户转到一般用户的几点注意事项,希望对有准备转换用户的朋友们做个参考:

第一,一般提供服务的程序都会侦听端口,在linux系统下,0~1024这个范围的端口,都属于知名端口,只有root权限的用户才可以侦听。例如,提供hTTP服务的80端口,提供HTTPS的443端口。如果侦听这些端口,则必须要root用户。 所以,对于自己写的程序需要侦听端口<1024的,可以临时提权到root用户,侦听端口,然后再收回权限。不过,现在一般都会有load-balance服务器,内部的服务器到不一定非要侦听在对外提供服务的端口。可以在内部侦听大于1024的端口,例如:7000端口,在Load-balance的服务器上,将80端口的请求转到该服务的7000端口上也可以实现。


第二,一般的程序都不需要直接调用系统调用的,不过,也不排除一些例外的情况发生。系统调用一般是内核提供的,用于用户程序和内核交互。这些系统调用也只能由root用户来调用。所以,如果想在用户的程序调用这些系统调用,则必须先提权,操作完之后,再收回权限。


第三,访问系统目录,例如:在代码里加载系统路径下的某些库。


最后一点,也是最重要的一点就是,了解运行目前的服务需要哪些权限?只要赋予最小权限,并且能够满足运行服务的需求即可。


如果有什么不正确的地方,还望大家能够指正。


原创粉丝点击