linux Capability中的CAP_NET_BIND_SERVICE

目录

  • [一. Capability简介](#一. Capability简介)
    • [1.1 为什么需要 capability](#1.1 为什么需要 capability)
    • [1.2 capability 的基本概念](#1.2 capability 的基本概念)
    • [1.3 capability 的存储位置](#1.3 capability 的存储位置)
  • [二. 实际应用场景](#二. 实际应用场景)
    • [2.1 让普通用户程序绑定低端口](#2.1 让普通用户程序绑定低端口)
    • [2.2 在caddy中的应用](#2.2 在caddy中的应用)

一. Capability简介

Linux 的 capability(能力)机制是一种比传统 UID/GID 更细粒度的权限控制方式。

1.1 为什么需要 capability

传统 Unix/Linux 权限模型下,进程只有两种状态:

  • 普通进程:权限受限于其 UID
  • 特权进程(root,UID=0):拥有所有权限

这种全有或全无的模式带来安全隐患:

  • 一个只需要绑定 80 端口的程序必须拥有 root 权限
  • 一旦该程序被攻破,攻击者就获得完整系统控制权

1.2 capability 的基本概念

Capability 将 root 的特权拆分成多个独立的、可单独授予或撤销的权限单元。例如:

  • CAP_NET_BIND_SERVICE:允许绑定 1024 以下的端口
  • CAP_NET_RAW:允许使用原始套接字
  • CAP_SYS_ADMIN:系统管理操作
  • CAP_KILL:允许向任意进程发送信号

1.3 capability 的存储位置

  • 每个进程有三组 capability 集合:
bash 复制代码
+------------------+
|  Effective (E)   |  进程当前实际拥有的权限
+------------------+
|  Permitted (P)   |  进程可以获得的权限上限
+------------------+
|  Inheritable (I) |  可以被继承的权限
+------------------+
  • 对于可执行文件,还有一个:
bash 复制代码
+------------------+
|  File caps       |  文件本身携带的 capability
+------------------+

二. 实际应用场景

2.1 让普通用户程序绑定低端口

🔷Linux默认规定root之外的用户不能直接绑定1024以下的端口

  • 需要使用root的传统方式
bash 复制代码
sudo python3 -m http.server 80
  • 使用 capability 方式
bash 复制代码
# 给 python3 这个可执行文件赋予绑定低端口的权限
sudo setcap cap_net_bind_service=+ep /usr/bin/python3
# 然后普通用户也可以绑定80端口了
python3 -m http.server 80

2.2 在caddy中的应用

  • caddy启动时默认需要绑定443端口,如果启动caddy的用户不是root用户的话,则会绑定443端口失败
  • 此时给/usr/bin/caddy添加绑定低端口的权限就可以了
bash 复制代码
[ec2-user@ip-172-31-25-58 ~]$ sudo setcap cap_net_bind_service=+ep /usr/bin/caddy
[ec2-user@ip-172-31-25-58 ~]$ 
[ec2-user@ip-172-31-25-58 ~]$ getcap /usr/bin/caddy
/usr/bin/caddy cap_net_bind_service=ep
[ec2-user@ip-172-31-25-58 ~]$

✅当然,实际在应用的时候,更好的做法是把绑定低端口的权限写到.service中,也就是说:

不是给 /usr/bin/caddy 这个文件权限,而是 systemd 在启动 Caddy 这个进程时给它 capability。

相关推荐
syagain_zsx20 分钟前
spdlog实战:日志分级、滚动与性能调优
linux·c++·日志库·二次开发日志库
GeW13 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
aningx15 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位16 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
对象存储与RustFS16 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
骑着蜗牛撵大象32718 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
众壹新能源科技18 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化
..Dauntless..18 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划18 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
QMCY_jason18 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器