非root用户使用1024以下端口

  • 一、问题背景
  • 二、解决方法
  • 1.进入root用户
  • 2.分配用户权限
  • 总结
  • 1、Capabilities介绍
  • 2、Capabilities其他功能名称
  • 3、Capabilities的使用方法
  • 手册资料链接:https://wiki.archlinux.org/index.php/Capabilities_(简体中文)




一、问题背景

  曾经的一个项目中用到需要Modbus TCP协议的502端口,但是我们使用的时候是非root用户,没有权限访问1024以下的端口。最简单的方法是将通讯的端口自定义为大于502的端口,但凑巧的是对方没有将自定义端口的功能调出来(就是懒的),就只能通过修改用户权限达到访问1024以下端口的目的。


二、解决方法

1.进入root用户

在命令终端中输入 su root

[test@localhost~]$ su root
密码:
[root@localhost test]#

2.分配用户权限

可以进入需要访问1024以内端口的程序所在的文件夹,输入以下指令,输入后该文件就可以调用1024以内端口了。

/*filename为可执行程序的文件名,path为文件路径*/
[root@localhost test]# setcap ‘cap_net_bind_service=+eip’ /path/filename

总结

  通过这次问题的解决,了解到了Linux Capabilities,在此记录一下防止下次出现类似的问题。

1、Capabilities介绍

  Capabilities是从 Linux2.2 内核之后开始引入的,旨在打破了系统中超级用户与普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作。
  Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
  在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。Capabilities 可以在进程执行时赋予,也可以直接从父进程继承。

2、Capabilities其他功能名称

capability 名称

capability 描述

CAP_AUDIT_CONTROL

启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则

CAP_AUDIT_READ

允许通过 multicast netlink 套接字读取审计日志

CAP_AUDIT_WRITE

将记录写入内核审计日志

CAP_BLOCK_SUSPEND

使用可以阻止系统挂起的特性

CAP_CHOWN

修改文件所有者的权限

CAP_DAC_OVERRIDE

忽略文件的 DAC 访问限制

CAP_DAC_READ_SEARCH

忽略文件读及目录搜索的 DAC 访问限制

CAP_FOWNER

忽略文件属主 ID 必须和进程用户 ID 相匹配的限制

CAP_FSETID

允许设置文件的 setuid 位

CAP_IPC_LOCK

允许锁定共享内存片段

CAP_IPC_OWNER

忽略 IPC 所有权检查

CAP_KILL

允许对不属于自己的进程发送信号

CAP_LEASE

允许修改文件锁的 FL_LEASE 标志

CAP_LINUX_IMMUTABLE

允许修改文件的 IMMUTABLE 和 APPEND 属性标志

CAP_MAC_ADMIN

允许 MAC 配置或状态更改

CAP_MAC_OVERRIDE

忽略文件的 DAC 访问限制

CAP_MKNOD

允许使用 mknod() 系统调用

CAP_NET_ADMIN

允许执行网络管理任务

CAP_NET_BIND_SERVICE

允许绑定到小于 1024 的端口

CAP_NET_BROADCAST

允许网络广播和多播访问

CAP_NET_RAW

允许使用原始套接字

CAP_SETGID

允许改变进程的 GID

CAP_SETFCAP

允许为文件设置任意的 capabilities

CAP_SETPCAP

参考 capabilities man page

CAP_SETUID

允许改变进程的 UID

CAP_SYS_ADMIN

允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等

CAP_SYS_BOOT

允许重新启动系统

CAP_SYS_CHROOT

允许使用 chroot() 系统调用

CAP_SYS_MODULE

允许插入和删除内核模块

CAP_SYS_NICE

允许提升优先级及设置其他进程的优先级

CAP_SYS_PACCT

允许执行进程的 BSD 式审计

CAP_SYS_PTRACE

允许跟踪任何进程

CAP_SYS_RAWIO

允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备

CAP_SYS_RESOURCE

忽略资源限制

CAP_SYS_TIME

允许改变系统时钟

CAP_SYS_TTY_CONFIG

允许配置 TTY 设备

CAP_SYSLOG

允许使用 syslog() 系统调用

CAP_WAKE_ALARM

允许触发一些能唤醒系统的东西(比如 CLOCK_BOOTTIME_ALARM 计时器)

3、Capabilities的使用方法

  getcap 命令和 setcap 命令分别用来查看和设置程序文件的 capabilities 属性。
  在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。Capabilities 可以在进程执行时赋予,也可以直接从父进程继承。

/*setcap设置文件capabilities属性*/
[root@localhost test]# setcap ‘cap_net_bind_service=+eip’ /path/filename
/*setcap撤销文件capabilities属性*/
[root@localhost test]# setcap 'cap_net_bind_service=-ep' /path/to/program
/*getcap查看文件capabilities属性*/
[root@localhost test]# getcap /path/to/program