当前位置: 首页 > news >正文

【openwrt】Openwrt系统新增普通用户指南

文章目录

    • 1 如何新增普通用户
    • 2 如何以普通用户权限运行服务
    • 3 普通用户如何访问root账户的ubus服务
    • 4 其他权限控制
    • 5 参考

Openwrt系统在默认情况下只提供一个 root账户,所有的服务都是以 root权限运行的,包括 WebUI也是通过root账户访问的,如果你的Openwrt设备支持 WAN口访问WebUI,那么这里就有极大的安全风险,为了尽可能的降低这种风险,新增一个普通用户可能是一个比较合理的方案。

Openwrt系统实际上是支持多用户的,只不过我们需要进行一些必要的配置,本文接下来就会介绍Openwrt系统如何新增普通用户,以及如何控制普通用户访问权限相关知识。

本文所有内容均是基于 Openwrt23.05 + linux 5.15 版本介绍的。

1 如何新增普通用户

新增普通用户需要系统增加如下工具的支持

 # 必要工具
su adduser deluser passwd addgroup delgroup# 可选工具
sudo

如果是手动编译的Openwrt源码,可以使用make menuconfig手动选择编译这些工具,这些工具在menuconfig中的位置如下。当然直接使用opkg直接安装也是可以的,大家按照自己方便的方式安装就行。

make menuconfig
> Base system > Login/Password Management Utilitiessu adduser deuser passwd addgroup delgroup	-> Administration sudo

安装好工具后,下一步就可以在控制台(必须是root权限)新增用户了,这里以新增guest用户为例:

$ mkdir -p /home/guest
$ addgroup guest_g  # 创建一个guest_g用户组# 新增guest用户,home目录为/home/guest,默认shell为/bin/ash
# -D 表示默认不分配密码,后续可以使用passwd命令给guest 用户设置密码
# -G guest_g 将guest加入guest_g用户组
$ adduser -h /home/guest -s /bin/sh -D -G guest_g  guest# 给guest 用户设置密码 
$ passwd guest  # 需要连续输入2次密码

登录/登出guest 用户

$ su guest  # 由root账户切换到guest账户
$ exit   # 切换到guest用户后,可以直接使用exit命令返回root账户

这时候guest账户可以在控制台进行登陆了,但是WebUI还不能使用guest账户进行登录,还需要进行如下配置

# cat /etc/config/rpcd 
config rpcdoption socket /var/run/ubus/ubus.sockoption timeout 30config loginoption username 'root'option password '$p$root'list read '*'list write '*'# 增加如下代码  config loginoption username 'guest'option password '$p$guest'list read '*'list write '*'

修改完上述配置后,需要执行reload_config让配置生效,之后webUI就可以使用guest账户进行登录了。
在这里插入图片描述

至此,openwrt添加普通用户的部分就已经讲完了,接下来继续介绍普通用户的一些权限控制问题。

2 如何以普通用户权限运行服务

当支持多用户之后,我们可能会有一些服务并不想(也没有必要)以root权限运行,所以我们需要以普通用户权限运行这些服务,这也是Openwrt系统支持的。
以普通用户权限运行服务配置方法也比较简单,在服务的启动脚本中新增一条命令即可

procd_set_param user guest # run service as user guest

完整示例如下:

#!/bin/sh /etc/rc.common
START=12USE_PROCD=1
NAME=helloworld
PROG=/sbin/helloworldstart_service() {procd_open_instanceprocd_set_param command "$PROG" procd_set_param respawnprocd_set_param stdout 1   procd_set_param stderr 1   procd_set_param user guest # run service as user guestprocd_close_instance
}

执行结果:

$ ps | grep helloworld1048 guest     1700 S    /sbin/helloworld

3 普通用户如何访问root账户的ubus服务

有时候,有些重要的服务程序必须要以root权限运行,而且这些服务可能会对外提供一些ubus method,如果希望以普通权限运行的服务也能访问这些ubus method,那么就需要使用openwrt 提供的ACL(Access Control List)机制。

拿openwrt自带的系统服务为例,当我们以root账户登录并执行ubus list时,可以看到当前系统中所有的ubus method,示例如下:

# ubus list   # root账户执行,可以list出当前系统所有的ubus 对象
dhcp
dnsmasq
dnsmasq.dns
file
hostapd
hotplug.dhcp
hotplug.ieee80211
hotplug.iface
hotplug.neigh
hotplug.net
hotplug.ntp
hotplug.tftp
iwinfo
log
luci
luci-rpc
network
network.device
network.interface
network.interface.lan
network.interface.loopback
network.interface.wan
network.interface.wan6
network.rrdns
network.wireless
rc
service
session
system
uci

如果我们再切换到guest账户再次执行ubus list

guest@OpenWrt:~$ ubus list  
dnsmasq.dns

可以看到执行完ubus list后只出现了一个dnsmasq.dns,其他什么信息也没有,这是因为ubusd服务是以root权限运行的,ubusd会检查client是否有权限访问ubus总线,这也称为ACL检查,显然guest用户暂时没有权限访问ubus总线,所以也就看不到注册到ubus总线上面的method了。

那为什么这里会有一个dnsmasq.dns呢?这个放在最后解释。

不过openwrt也给出了相应的解决办法——ACL,我们可以加一条我们自己的ACL规则,让ubusd允许普通用户能够访问特定的ubus对象,示例如下:

# cat /usr/share/acl.d/system_acl.json 
{"user": "guest","access": {"system": {"methods": [ "board", "info" ]}}
}

ACL规则文件统一放在 /usr/share/acl.d/目录下,它们是用json文件描述(需要注意json的语法格式),上述配置的作用是:允许guest用户访问system对象的boardinfo方法。
特别注意*.json 文件的权限必须是644,ubusd会检查该文件权限是否符合要求。
增加ACL规则后,可以执行如下命令让ubusd重新加载ACL文件(也可以直接reboot重启)

$ ps | grep ubusd716 ubus      1368 S    /sbin/ubusd
$ kill -1 716  # 给ubusd发送 SIGHUP(1)信号触发ubusd重启加载ACL文件

ubusd重新加载system_acl.json后,再次执行ubus list

$ ubus -v list  # 可以看到system对象的board 和 info 2个method了
'system' @5e41cdee"board":{}"info":{}$ ubus call system 'board' # 调用 system->board method也是正常的 
{"kernel": "5.15.155","hostname": "OpenWrt","system": "ARMv8 Processor rev 4","model": "Bananapi BPI-R64","board_name": "bananapi,bpi-r64","rootfs_type": "squashfs","release": {"distribution": "OpenWrt","version": "23.05-SNAPSHOT","revision": "r23861+4-447eef2063","target": "mediatek/mt7622","description": "OpenWrt 23.05-SNAPSHOT r23861+4-447eef2063"}
}

如果需要同时添加多个method的访问权限,也可以一次性新增多个:

{"user": "guest","access": {"system": {"methods": [ "board", "info" ]},"log": {"methods": ["read"]},"network":{"methods":["restart","reload"]},"network.device":{"methods":["status"]}}
}

最后,就回到刚开始dnsmasq.dns的问题了,首先这个dnsmasq.dns并不是一个ubus method,它是一个ubus subscribe,也就是订阅服务,其他client 如果对此事件感兴趣,可以订阅它,当对应的事件发生时,client就会收到通知消息。
为什么guest用户没有添加任何ACL规则,就可以看到它呢?因为所见不一定所得,看到不一定可用。

$ ubus list
dnsmasq.dns
$ ubus subscribe dnsmasq.dns   # 尝试订阅这个服务
Error while registering for event 'dnsmasq.dns': Not found  

尝试订阅这个服务,却提示Not found ,其本质原因还是权限问题,解决这个问题的方法还是添加ACL规则,可以继续添加到之前的json中:

{"user": "guest","access": {"system": {"methods": [ "board", "info" ]},"log": {"methods": ["read"]},"network":{"methods":["restart","reload"]},"network.device":{"methods":["status"]}},"subscribe":["dnsmasq.dns",]
}

添加subscribe的规则后,触发ubusd重载ACL文件,然后再次订阅,一切正常。

$ ubus list
dnsmas
q.dns
log
network
network.device
system
guest@OpenWrt:/root$ ubus subscribe dnsmasq.dns

如果需要添加多个订阅的对象,接着"dnsmasq.dns"后面新增即可。

4 其他权限控制

限制普通用户可执行的命令,例如限制普通用户执行reboot、shutdown、poweroff、mount等指令。
限制普通用户可访问/修改的文件,例如禁止普通用户访问 /etc/config/system配置文件。
这些基本上都可以通过chmod指令来配置,这部分就不再做详细介绍。

5 参考

为 OpenWrt 增加用户且开放访问 WebUI 权限
UBUS ACL
Procd Service Parameters

相关文章:

【openwrt】Openwrt系统新增普通用户指南

文章目录 1 如何新增普通用户2 如何以普通用户权限运行服务3 普通用户如何访问root账户的ubus服务4 其他权限控制5 参考 Openwrt系统在默认情况下只提供一个 root账户,所有的服务都是以 root权限运行的,包括 WebUI也是通过root账户访问的,…...

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器,它是用来监测硬件或软件的故障的;它的工作原理大概就是开启后内部定时器会按照设置的频率更新,在程序运行过程中我们需不断地重装载看门狗,以使它不溢出;如果硬件或软件发生…...

详解曼达拉升级:如何用网络拓扑结构扩容BSV区块链

​​发表时间:2024年5月24日 BSV曼达拉升级是对BSV基础设施的战略性重塑,意在显著增强其性能,运行效率和可扩容。该概念于2018年提出,其战略落地将使BSV区块链顺利过渡,从现有的基于单一集成功能组件的网络拓扑结构&am…...

编译打包自己的云手机(redroid)镜像

前言 香橙派上跑云手机可以看之前的文章: 香橙派5plus上跑云手机方案一 redroid(带硬件加速)香橙派5plus上跑云手机方案二 waydroid 还有一个cuttlefish方案没说,后面再研究,cuttlefish的优势在于可以自定义内核且selinux是开启的&#xf…...

自动驾驶的规划控制简介

自动驾驶的规划控制是自动驾驶系统中的核心组成部分,它负责生成安全、合理且高效的行驶轨迹,并控制车辆按照这个轨迹行驶。规划控制分为几个层次,通常包括行为决策(Behavior Planning)、轨迹规划(Trajector…...

java配置nginx网络安全,防止国外ip访问,自动添加黑名单,需手动重新加载nginx

通过访问日志自动添加国外ip黑名单 创建一个类,自己添加一个main启动类即可测试 import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONArray; import org.json.JSONObject; import org.sp…...

ARP协议

计算机网络资料下载:CSDN ARP协议 APR(address resolution protocol):地址解析协议,用于实现从IP地址到MAC地址的映射,即访问目标ip地址的mac地址。 网络层及以上采用的ip地址来标记网络接口,但是以太数据帧的传输,…...

Qt程序图标更改以及程序打包

Qt程序图标更改以及程序打包 1 windows1.1 cmake1.1.1 修改.exe程序图标1.1.2 修改显示页面左上角图标 1.2 qmake1.2.1 修改.exe程序图标1.2.2 修改显示页面左上角图标 2 程序打包2.1 MinGW2.2 Visual Studio 3 参考链接 QT6 6.7.2 1 windows 1.1 cmake 1.1.1 修改.exe程序图…...

普通人还有必要学习 Python 之类的编程语言吗?

在开始前分享一些编程的资料需要的同学评论888即可拿走 是我根据网友给的问题精心整理的对于编程的重要性,这里就不详谈了。 未来,我们和机器的交流会越来越多,编程可以简单看作是和机器对话并分发给机器任务。机器不仅越来越强大&#xff0…...

「Python」基于Gunicorn、Flask和Docker的高并发部署

目标预期 使用Gunicorn作为WSGI HTTP服务器,提供高效的Python应用服务。使用Flask作为轻量级Web应用框架,快速开发Web应用。利用Docker容器化技术,确保应用的可移植性和一致性。实现高并发处理,提高应用的响应速度和稳定性。过程 环境准备:安装Docker和Docker Compose。编…...

在攻防演练中遇到的一个“有马蜂的蜜罐”

在攻防演练中遇到的一个“有马蜂的蜜罐” 有趣的结论,请一路看到文章结尾 在前几天的攻防演练中,我跟队友的气氛氛围都很好,有说有笑,恐怕也是全场话最多、笑最多的队伍了。 也是因为我们遇到了许多相当有趣的事情,其…...

一文了解MySQL的表级锁

文章目录 ☃️概述☃️表级锁❄️❄️介绍❄️❄️表锁❄️❄️元数据锁❄️❄️意向锁⛷️⛷️⛷️ 介绍 ☃️概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外&#xff0…...

LVS+Keepalive高可用

1、keepalive 调度器的高可用 vip地址主备之间的切换,主在工作时,vip地址只在主上,vip漂移到备服务器。 在主备的优先级不变的情况下,主恢复工作,vip会飘回到住服务器 1、配优先级 2、配置vip和真实服务器 3、主…...

网络安全防御【防火墙安全策略用户认证综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤 1、打开ensp防火墙的web服务(带内管理的工作模式) 2、在FW1的web网页中网络相关配置 3、交换机LSW6(总公司)的相关配置: 4、路由器相关接口配置&a…...

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题: ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭,但是苹果这个默认开启,而且大部分客户也不会去自己关闭。 2、欺骗苹果手机,代码实现。 先说解决思路&#xf…...

AWS CDN新增用户ip 地区 城市 响应头

1.需要自定义cdn缓存策略 这里的策略也是先复制之前的cdn策略哈 最后复制完了 全部新增这两条标头key CloudFront-Viewer-Country CloudFront-Viewer-City 2.然后新增cdn函数,应用你写的这个函数 function handler(event) {var request event.request;var respon…...

Elasticsearch基础概念

Elasticsearch 是一款开源的,ESTful风格的 分布式搜索、存储、分析引擎; 常见的使用场景 网站搜索,代码搜索等日志管理与分析,应用系统性能分析,安全指标监控等数据库同步,将数据库某个表的数据同步到elasticsearch上然后提供搜索服务 ES基本概念 文档 我们向elasticsearch存…...

Redis 7.x 系列【24】哨兵模式配置项

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 配置项2.1 protected-mode2.2 port2.3 daemonize2.4 pidfile2.5 loglevel2.…...

SpringBoot+Vue实现简单的文件上传(策略模式)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1,Vue 2,ElementUI 2 问题 前两篇文章,我们上传了txt、Excel文件,其实文件类型有很多种,如果我们的upload组件没有上传文件类型的限制,那么同一个…...

软考中级科目包含哪些?应该考哪个?

软考中级包含5个专业方向,分别是:计算机软件、计算机网络、计算机应用技术、信息系统、信息服务。这5个方向又对应15个软考中级科目。 信息系统包括:系统集成项目管理工程师、信息系统监理师、信息安全工程师、数据库系统工程师、信息系统管…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...