Linux给予特定程序非root用户情况下绑定特权端口权限:修订间差异
来自三线的随记
小 (→authbind) |
小 (Admin移动页面Linux给予特定程序绑定特权端口权限至Linux给予特定程序非root用户情况下绑定特权端口权限,不留重定向) |
||
(未显示同一用户的5个中间版本) | |||
第1行: | 第1行: | ||
= bind privileged ports = | |||
linux对于非root权限用户不能使用1024以下的端口,对于一些服务,过高的权限,会带来一定的风险。 | |||
=== authbind === | 那么对于低权限的用户可以通过以下方法使用1024以下的端口 | ||
===authbind=== | |||
百度谷歌知乎你猜 | 百度谷歌知乎你猜 | ||
=== 文件系统能力 === | ===文件系统能力=== | ||
从 2.6.24 内核开始, linux-privs 又支持了基于文件系统的能力功能,能够给文件系统里特定的可执行程序指定一个能力,详见 [FCAP]_ 。简而言之执行 | 从 2.6.24 内核开始, linux-privs 又支持了基于文件系统的能力功能,能够给文件系统里特定的可执行程序指定一个能力,详见 [FCAP]_ 。简而言之执行 | ||
<pre> | |||
$ sudo setcap cap_net_bind_service=ep /usr/sbin/httpd | |||
$ sudo getcap /usr/sbin/httpd | |||
</pre> | |||
之后,任何用户(当然前提是对 <code>/usr/bin/httpd</code> 有 <code>x</code> 权限)都可以启动 apache 监听 80 端口而不需要特权身份。 | 之后,任何用户(当然前提是对 <code>/usr/bin/httpd</code> 有 <code>x</code> 权限)都可以启动 apache 监听 80 端口而不需要特权身份。 | ||
如果把命令里的 <code>ep</code> 改成 <code>ei</code> ,那么就只有在 <code>/etc/security/capability.conf</code> 里设定好的用户才可以了,其它用户无效——这里 <code>i</code> 表示的是继承(inheritance),也就是程序执行时继承用户的对应能力,而非像 <code>p</code> 那样不管用户是否有对应能力都直接设定。也就是说,如果需要为特定用户设置特定程序的特定能力,需要对用户和程序都做对应设置,缺一不可。 | 如果把命令里的 <code>ep</code> 改成 <code>ei</code> ,那么就只有在 <code>/etc/security/capability.conf</code> 里设定好的用户才可以了,其它用户无效——这里 <code>i</code> 表示的是继承(inheritance),也就是程序执行时继承用户的对应能力,而非像 <code>p</code> 那样不管用户是否有对应能力都直接设定。也就是说,如果需要为特定用户设置特定程序的特定能力,需要对用户和程序都做对应设置,缺一不可。 | ||
=== setuid === | <pre> | ||
??????? | |||
$ sudo setcap cap_net_bind_service=+ep | |||
$ sudo setcap cap_net_bind_service=+eip | |||
</pre> | |||
===setuid=== | |||
进程仍然以root身份运行,不安全 | 进程仍然以root身份运行,不安全 | ||
__FORCETOC__ | <br /> | ||
===基于service启动的服务需要在service文件中设置(ubuntu >= 18.04 and others )=== | |||
# If you want to bind Gitea to a port below 1024, uncomment | |||
# the two values below, or use socket activation to pass Gitea its ports as above | |||
### | |||
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE | |||
#AmbientCapabilities=CAP_NET_BIND_SERVICE | |||
__FORCETOC__ | |||
{{DEFAULTSORT:bind privileged ports}} | {{DEFAULTSORT:bind privileged ports}} | ||
[[category:Linux]] | [[category:Linux]] |
2020年12月13日 (日) 02:40的最新版本
bind privileged ports
linux对于非root权限用户不能使用1024以下的端口,对于一些服务,过高的权限,会带来一定的风险。
那么对于低权限的用户可以通过以下方法使用1024以下的端口
authbind
百度谷歌知乎你猜
文件系统能力
从 2.6.24 内核开始, linux-privs 又支持了基于文件系统的能力功能,能够给文件系统里特定的可执行程序指定一个能力,详见 [FCAP]_ 。简而言之执行
$ sudo setcap cap_net_bind_service=ep /usr/sbin/httpd $ sudo getcap /usr/sbin/httpd
之后,任何用户(当然前提是对 /usr/bin/httpd
有 x
权限)都可以启动 apache 监听 80 端口而不需要特权身份。
如果把命令里的 ep
改成 ei
,那么就只有在 /etc/security/capability.conf
里设定好的用户才可以了,其它用户无效——这里 i
表示的是继承(inheritance),也就是程序执行时继承用户的对应能力,而非像 p
那样不管用户是否有对应能力都直接设定。也就是说,如果需要为特定用户设置特定程序的特定能力,需要对用户和程序都做对应设置,缺一不可。
??????? $ sudo setcap cap_net_bind_service=+ep $ sudo setcap cap_net_bind_service=+eip
setuid
进程仍然以root身份运行,不安全
基于service启动的服务需要在service文件中设置(ubuntu >= 18.04 and others )
# If you want to bind Gitea to a port below 1024, uncomment # the two values below, or use socket activation to pass Gitea its ports as above ### #CapabilityBoundingSet=CAP_NET_BIND_SERVICE #AmbientCapabilities=CAP_NET_BIND_SERVICE