编程技术分享平台

网站首页 > 技术教程 正文

还在为Root用户启动程序的安全警告而烦恼吗?试试setcap

xnh888 2024-09-11 11:09:46 技术教程 27 ℃ 0 评论

场景概述

在一些有安全要求的公司中,经常有安全提醒你的应用使用了root权限启动,要求你使用其他用户启用;但是你的应用由于各种原因需要使用1024以下的网络端口,这个时候你setcap命令能帮你解决问题。

原因

在 Linux 系统中,默认情况下,非特权用户无法绑定到小于 1024 的端口(也称为特权端口),其原因主要有以下几点:

  1. 安全性考虑:小于 1024 的端口通常被认为是系统保留端口,用于系统服务和特权程序。如果非特权用户可以绑定到这些端口,那么可能会导致安全风险,例如非特权用户可能会监听特权端口并截取传输的数据。
  2. 避免误操作:小于 1024 的端口通常用于系统服务,如果允许非特权用户绑定到这些端口,可能会导致系统服务受到干扰或冲突。
  3. 控制访问权限:通过限制非特权用户对小于 1024 端口的访问权限,可以更好地控制系统中网络通信的安全性。只有特权用户才能绑定到小于 1024 端口,确保了只有经过认证的用户才能运行需要权限较高的服务。

使用SetCap为程序添加 CAP_NET_BIND_SERVICE 特权解决

如果确实需要让非特权用户绑定到小于 1024 的端口,可以通过修改相应的系统配置或者使用 setcap 命令为程序添加 CAP_NET_BIND_SERVICE 特权来实现。

CAP_NET_BIND_SERVICE是什么

CAP_NET_BIND_SERVICE 是 Linux 中的一种特权(capability),允许程序绑定到小于 1024 的端口,而无需使用 root 权限。具体来说,该特权允许非特权用户在绑定端口时不受端口限制(需要 root 权限的端口)的限制,即可以绑定到小于 1024 的特权端口上。

CAP_NET_BIND_SERVICE 的参数有以下几个:

  • +e 允许继承特权。这意味着当执行程序时,程序可以继承到该特权。
  • +p 让程序在 re-exec 时依然保留该特权。如果程序会在运行时进行重新执行(re-exec),例如通过系统调用 execve() 重新加载自己,那么此特权将被保留。

因此,CAP_NET_BIND_SERVICE 在一些需要程序绑定小于 1024 端口的情况下非常有用,同时避免了使用 root 权限来运行整个程序,提高了系统的安全性。

应用实战(Nginx非Root用户启动)

下面以Nginx使用非Root用户启动为例,具体说明如何使用setcap

  • 使用setcap 让非root用户运行nginx程序监听低于 1024 的端口
 sudo setcap cap_net_bind_service=+ep /usr/local/openresty/nginx/sbin/nginx
  • 修改nginx目录的用户权限为对应用户
sudo setfacl -m u:用户名A:rwx -R /usr/local/openresty
sudo setfacl -m g:用户名A:rwx -R /usr/local/openresty
  • 切换到用户A并启动
sudo su 用户名A
cd /usr/local/openresty
bin/openresty

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表