Linux非root用户程序使用小于1024端口

系统 Linux 系统运维
在Linux下,默认端口1024下的程序是要在root下才能使用的,在其他用户下,如果尝试使用将会报错。在有的时候,我们可能考虑程序运行在root帐户下,可能会给Linux系统带来安全风险。那如何能够让非root用户运行的程序能够对外启用小于1024的端口呢?

在Linux下,默认端口1024下的程序是要在root下才能使用的,在其他用户下,如果尝试使用将会报错。在有的时候,我们可能考虑程序运行在root帐户下,可能会给Linux系统带来安全风险。那如何能够让非root用户运行的程序能够对外启用小于1024的端口呢?本文尝试给出一些方法: 

[[140984]]

***种方法:

SetUID

为用户的应用程序在执行位设置user ID能够使程序可以有root权限来运行,这个方法让程序能够像在root下运行有同样的效果,不过需要非常小心,这种方法同样会带来安全风险,特别是当要执行的程序本身存在安全风险。使用的方法是:

  1. chown root.root /path/to/application 
  2. #使用SetUID 
  3. chmod u+s /path/to/application 

我们可以看到在系统下,/usr/bin/passwd这种文件,就使用了SetUID,使得每个系统的用户都能用passwd来修改密码——这是要修改/etc/passwd的文件(而这个只有root有权限)。

既然要使用非root用户运行程序,目的就是要降低程序本身给系统带来的安全风险,因此,本方法使用的时候需要特别谨慎。 

第二种方法:

CAP_NET_BIND_SERVICE

从2.1开始,Linux内核有了能力的概念,这使得普通用户也能够做只有超级用户才能完成的工作,这包括使用端口1

获取CAP_NET_BIND_SERVICE能力,即使服务程序运行在非root帐户下,也能够banding到低端口。使用的方法:

  1. #设置CAP_NET_BIND_SERVICE 
  2. setcap cap_net_bind_service =+ep /path/to/application 

Note:

1. 这个方法并不是所有Linux系统通适,内核在2.1之前的并没有提供,因此你需要检查要使用此方法所在系统是否支持(Linux must support capacity);

2. 另外需要注意的是,如果要运行的程序文件是一个脚本,这个方法是没有办法正常工作的(Script won't work)。 

第三种方法:

Port Forwarding

如果要运行的程序有权限监听其他端口,那么这个方法是可以使用的,首先让程序运行在非root帐户下,并绑定高于1024的端口,在确保能正常工作的时候,将低端口通过端口转发,将低端口转到高端口,从而实现非root运行的程序绑定低端口。要使用此方法可以使用下面的方式:

  1. # Enable the IP FORWARD kernel parameter. 
  2. sysctl -w net.ipv4.ip_forward=1 
  3.   
  4. # Use iptables rules to redirect packets 
  5. iptables -F -t nat 
  6. iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to:8088 

***步使用sysctl确保启用IP FORWARD功能(此功能在Red Hat/CentOS默认是被禁用的),注意,代码中使用的sysctl设置是临时性设置,重启之后将会被重置,如果要长久保存,需要在/etc/sysctl.conf文件内修改:

  1. Default value is 0, need change to 1. 
  2. # net.ipv4.ip_forward = 0 
  3. net.ipv4.ip_forward = 1 

然后从文件中加载新的配置

  1. load new sysctl.conf 
  2. sysctl -p /etc/sysctl.conf 
  3.   
  4. or sysctl -p 
  5. default filename is /etc/sysctl.conf 

第二步就是使用iptables的规则来实现端口转发到程序所在的端口,示例中我们要将80端口转发到8088。

此种方法能够比较好的达到我们的目的,我们的程序可以通过非root用户来运行,并能够对外提供低端口号的服务。 

第四种方法:

RINETD2

这种方法使用的也是端口转发,此工具可以将本地端口映射到远程端口,但此功能对于我们当前的功能来说,有点鸡肋,毕竟我们新增了一个额外的程序,这将可能会增加我们系统的风险性。在此不做推荐。 

参考说明:

1.  Linux capabilities文档,参见其中CAP_NET_BIND_SERVIC,文中的内核是否从2.1开始有这个功能并不完全确定,此信息来自网上。

2.  官网地址:RINETD

责任编辑:火凤凰 来源: Mitchell Chu博客
相关推荐

2018-10-26 16:20:27

PodmanrootLinux

2021-02-17 09:16:58

PodmanLinuxDocker

2011-04-19 16:09:35

LinuxpythonMySQLdb

2020-04-17 08:00:22

Docker命令普通用户

2010-03-03 14:17:02

Linux内核

2020-09-22 11:20:12

UbuntuLinuxroot

2009-12-25 11:40:29

Linux root

2009-10-23 08:41:14

Linux系统操作系统Grub

2021-07-14 14:20:22

root命令Linux

2010-01-06 09:35:55

2010-05-27 14:42:40

Linux查看端口

2014-08-27 11:22:46

LinuxSFTP

2010-02-23 15:57:49

CentOS Orac

2015-08-17 10:16:00

CentOSDocker命令root

2009-09-03 09:08:08

Linuxroot密码遗忘

2012-10-09 11:01:18

IBMdw

2022-12-14 17:26:43

2013-12-23 13:24:47

Linuxauthbind命令

2009-07-06 17:18:36

root帐号Linux邮件
点赞
收藏

51CTO技术栈公众号