当前位置: 首页 > 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个软考中级科目。 信息系统包括:系统集成项目管理工程师、信息系统监理师、信息安全工程师、数据库系统工程师、信息系统管…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...