如何让 Linux 下非 root 用户程序使用小于 1024 端口

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

本文尝试给出一些方法: 

(题图来自: wordpress.com)

第一种方法:SetUID

给用户的应用程序在执行位设置用户 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 内核有了能力的概念,这使得普通用户也能够做只有超级用户才能完成的工作,这包括使用端口

获取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之前的并没有提供,因此你需要检查要使用此方法所在系统是否支持;

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

第三种方法:Port Forwarding

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


  1. # Enable the IP FORWARD kernel parameter.
  2. sysctl -w net.ipv4.ip_forward=1
  3. # Use iptables rules to redirect packets
  4. iptables -F -t nat
  5. 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. # or sysctl -p
  4. # default filename is /etc/sysctl.conf

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

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

第四种方式:RINETD

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

(原文转载,有细节修改)

原文发布时间为:2015-07-17




本文来自合作伙伴“Linux中国

时间: 2024-11-02 09:51:53

如何让 Linux 下非 root 用户程序使用小于 1024 端口的相关文章

linux的tomcat配置-linux下非root用户在MyEclipse2014配置tomcat无法启动的问题!!!

问题描述 linux下非root用户在MyEclipse2014配置tomcat无法启动的问题!!! 我在linux下的MyEcpLise配置类tomcat7,但是启动时却显示: 二月 21, 2015 12:38:08 下午 org.apache.catalina.startup.Catalina load 警告: Unable to load server configuration from [/opt/tomcat7.0/conf/server.xml] 二月 21, 2015 12:3

Solaris等操作系统下如何让非root用户启用小于1024号的端口

http://yulimin.javaeye.com/blog/33424 关键字: Linux   Solaris Linux AIX Unix 1024 root port      如何让非root用户启用小于1024号的端口? 以下是找到的Linux的资料,Solairs.AIX等应当有所不同,请跟进 参考网址:http://linux.org.mt/article/tomcat-ports 方法一:端口映射 1.iptables命令:iptables -t nat -A PREROUT

Linux下非交互式远程执行命令脚本

  Linux下非交互式远程执行命令脚本(比ssh更好的方式) openssh在每台机器上都有,ssh与scp经常出现在我们的生活中. 然而当要管理的机器规模越来越大时,ssh登陆到目标机器进行管理就变得不现实了. 虽然可以直接在ssh后面接命令的方式,进行命令的执行. 但是ssh的严格的权限认证使得我们不得不输入密码,或是建立信任关系,很难去自定义一个特定的认证方式. 基于ssh的这种不足.于是笔者就写了一个jetfire,这个工具.比ssh多的一个重要的功能就是可以自定义认证方式,顺便避免了

Linux下非交互式sshpass登录

摘要 在命令行 非交互的SSH登录的时候,一般我们可以借助于生成用户的公钥私钥对,然后把公钥添加到远程主机的authorized_keys文件,可以实现非交互无密码登录. 其实这里也可以有另外一种方式实现,即用sshpass命令. 这种情况比较适合Mac下用iterm2 SSH登录到远程主机的时候,长时间不操作导致 packet_write_wait: Connection to 192.168.xxx.xxx port 22: Broken pipe问题的解决办法 安装sshpass #!/u

多线程-linux 下c 程序,开了1024个线程 依次等待共同完成某个任务,程序异常退出,不出core

问题描述 linux 下c 程序,开了1024个线程 依次等待共同完成某个任务,程序异常退出,不出core 程序简单来说类似一个多线程下载器,开了1024个线程,然后并发去服务器读取一个大文件的某一块,读取完成后,文件合并要按照顺序写文件,所以我采用了pthread_join依次等待上一个线程写完成操作.测试时候发现程序偶尔会突然down掉,也不出core,并不是总down,也会有成功执行时候.机器配制足够高了,内存96G,24核cpu...希望大家帮忙分析下..谢谢,代码逻辑如下. void*

WAS6非root用户不能绑定80端口

问题描述 WAS6非root用户不能绑定80端口,提示80端口被占用,有哪位知道怎么解决的? 解决方案 解决方案二:可以查询一下那个程序正在使用80端口.如果是aix可以这样netstat-Aan|grep80查出sockaddrrmsocksockaddrtcpcb查出进程号.一般was和ihs(ibmhttp服务器)一起使用,是不是ihs占用了这个端口

两种Linux下非交互式命令的实现

一.概述 在Linux环境,有多种实现自动化的脚本语言,如Shell.Python.Perl.Tcl等.Shell语言因与Shell外壳结合紧密,是最常见的实现自动化的脚本语言. 同时,在Linux环境中存在大量功能单一的小工具--通常它们在指定输入后,立即就可获得输出,例如echo.cat等字符串/文本打印工具,又或者是如sed.awk等最常用的字符串编辑工具.通过编写Shell脚本,我们可以反复利用这些小工具来实现一些自动化的批处理. 在少数情况下,我们也需要用到一些交互式的工具,例如pas

Linux 下忘记root密码怎么办

这几天找工作,没有找到,心里真郁闷,大学生找工作原来是如此的困难,以前没有意识到,今天我们学校招聘会,去看了一下,有一个公司符合自己的胃口,但是别人已经满员了,所以郁闷回寝室看我的microcomputer了.想起以前安装的red hat linux 了,就像拿它来玩玩,但是发现自己居然忘记了root的密码.在网上搜索了一番,终于解决了. 方法:(Grub启动修改) 启动到grub时,按e键: 进入新的选项中,选择到:kernel /boot/vmlinuz-2.4.18-14 single r

Linux下修改root密码

  以root身份登陆,执行: # passwd 用户名 (修改密码) ubuntu修改root密码 修改密码 sudo passwd root 会提示你先输入你的登陆密码 然后修改