1. 首页 > 数码

为什么安卓用1024以下端口要root?

为什么安卓用1024以下端口要root?

如何使用非Root用户启动Apache 80和1024以下端口

检查apache_error.log日志文件,发现有以下内容报错:

ls: /home/xxxx/output/jk.shm*: 没有那个文件或目录

(13)Permission denied: make_sock: could not bind to address [::]:80

no listening sockets available, shutting down

Unable to open logs

httpd not running, trying to start

linux中默认非root用户不能使用80或1024以下端口,因此会有此错误。只需把httpd加上suid权限即可,

测试环境是安装时统一处理的,应该不会有错误。

但是检查后发现确实是这个问题,chmod u+s /httpd/bin/httpd 执行命令添加suid权限即可。

附录:suid和sgid

SUID 是 Set User ID, SGID 是 Set Group ID的意思。

如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:

1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置

2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置

3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置

4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被设置

给文件加SUID和SUID的命令如下:

chmod u+s filename 设置SUID位

chmod u-s filename 去掉SUID设置

chmod g+s filename 设置SGID位

chmod g-s filename 去掉SGID设置

由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。

首先讲普通文件的SUID和SGID的作用。例子:

如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示如下:

除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源62616964757a686964616fe59b9ee7ad9431333330356238的访问权限。

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为 200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。

SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

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

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

第一种方法:

SetUID

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

chown root.root /path/to/application #使用SetUID 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到低端口。使用的方法:

#设置CAP_NET_BIND_SERVICE 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运行的程序绑定低端口。要使用此方法可以使用下面的方式:

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

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

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

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

# load new sysctl.conf sysctl -p /etc/sysctl.conf # or sysctl -p # default filename is /etc/sysctl.conf

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

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

第四种方法:

RINETD2

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

如何绑定到Android的一个端口小于1024

Android底层使用Linux实现,linux中规定,0-1024称之为特权端口,只有root用户才能够绑定,如果要绑定这个范围的端口号,可以有两种选择:

切换到root用户运行该程序(简单,但有风险)

改变程序的属主为root,然后添加用户设置位(set-user-bit),程序中绑定端口之后,马上使用seteuid()类似的函数改变有效身份为普通用户。

chown -R root:root app

chmod 4755 app

安卓手机为什么要ROOT 手机ROOT五大理由

这个是手机root的好处和不足来衡量的;

1,root,是有好处的;例如;可以卸载手机自带的软件,还可以安装很多没有权限不能安装的软件,可以直接安装,可以删除手机安卓系统里面收费的软件等等。

2,,root了也有一定的害处;可能会破坏手机原来的系统,破坏手机的系统,导致手机不安全,安卓系统的病毒,更加厉害,需要安装个更好的安全软件才可以的。

3,权衡利弊,要是想root,必须选择个安全的市场,庞大的市场,可以保证成功的市场,例如应用宝,谷歌等等。