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

Linux非root用户程序使用不到1024端口_0

时间:2023-03-11 22:40:17 科技观察

在Linux下,默认1024端口下的程序只能在root下使用。在其他用户下,尝试使用会报错。有时,我们可能会认为程序是在root账户下运行的,这可能会给Linux系统带来安全隐患。那么非root用户运行的程序如何对外启用小于1024的端口呢?本文尝试给出一些方法:第一种方法:SetUID在用户应用程序的执行位中设置用户ID,使程序以root权限运行。这种方法可以让程序达到和在root下运行一样的效果。但是要非常小心,这种方式也带来了安全隐患,尤其是当要执行的程序本身就存在安全隐患时。使用的方法是:chownroot.root/path/to/application#UsingSetUIDchmodu+s/path/to/application我们可以看到在系统中,/usr/bin/passwd这个文件使用了SetUID,这样每一个Users的所有系统可以使用passwd来更改它们的密码——这是修改/etc/passwd文件(并且只有root有权限)。既然要使用非root用户来运行程序,目的就是为了降低程序本身给系统带来的安全风险。因此,使用此方法时需要特别小心。方法二:CAP_NET_BIND_SERVICE从2.1开始,Linux内核有了capabilities的概念,让普通用户可以做只有超级用户才能做的工作,包括使用端口1。获得CAP_NET_BIND_SERVICE能力,即使服务程序运行在非root账号,也可以绑定到低端口。使用的方法:#SetCAP_NET_BIND_SERVICEsetcapcap_net_bind_service=+ep/path/to/application注意:1.此方法并不适用于所有的linux系统,2.1之前的内核是没有提供的,所以需要查看你要的系统是否是使用此方法支持它(Linux必须支持容量);2、另外需要注意的是,如果要运行的程序文件是脚本,则此方法不能正常工作(Scriptwon'twork)。第三种方法:PortForwarding如果要运行的程序有权限监听其他端口,那么就可以使用这种方法。首先,让程序在非root账户下运行,并绑定一个高于1024的端口,保证其可以正常工作。同时通过端口转发低端口,将低端口转发给高端口,这样就可以将非root运行的程序绑定到低端口。要使用这个方法,可以使用下面的方法:#EnabletheIPFORWARDkernelparameter.sysctl-wnet.ipv4.ip_forward=1#Useiptablesrulestoredirectpacketsiptables-F-tnatiptables-tnat-APREROUTING-ptcp--dport80-jDNAT--to:8088***使用sysctl确保启用IPFORWARD功能(该功能在RedHat/CentOS中默认关闭)。注意,代码中使用的sysctl设置是临时设置,重启后会重置。如果想长期保存,需要在/etc中设置,在/sysctl.conf文件中修改:#Defaultvalueis0,needchangeto1.#net.ipv4.ip_forward=0net.ipv4.ip_forward=1然后加载新的从文件中配置#loadnewsysctl.confsysctl-p/etc/sysctl.conf#orsysctl-p#defaultfilenameis/etc/sysctl.conf第二步是使用iptables规则将端口转发到程序所在的端口。例子中我们想将80端口转发到8088,这种方式可以更好的达到我们的目的。我们的程序可以被非root用户运行,可以对外提供低端口号的服务。第四种方法:RINETD2这种方法也是用到了端口转发。这个工具可以将本地端口映射到远程端口,但是这个功能对于我们现在的功能来说有点鸡肋。毕竟,我们已经添加了一个额外的程序。这可能会增加我们系统的风险。这里不做任何推荐。参考说明:1、linuxcapabilities文档,参见CAP_NET_BIND_SERVIC,不能完全确定文章中的内核是否从2.1开始有此功能,此信息来源于网络。2.官网地址:RINETD