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

news2024/11/22 11:44:50

文章目录

    • 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 Utilities
		su 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 rpcd
        option socket /var/run/ubus/ubus.sock
        option timeout 30

config login
        option username 'root'
        option password '$p$root'
        list read '*'
        list write '*'
 
 # 增加如下代码  
 config login
        option 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=12

USE_PROCD=1
NAME=helloworld
PROG=/sbin/helloworld

start_service() {
	procd_open_instance
	procd_set_param command "$PROG" 
	procd_set_param respawn
	procd_set_param stdout 1   
    procd_set_param stderr 1   
    procd_set_param user guest # run service as user guest
	procd_close_instance
}

执行结果:

$ ps | grep helloworld
 1048 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  

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

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

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

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

# ps | grep ubusd
  716 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"
        }
}

4 其他权限控制

限制普通用户可执行的命令,例如限制普通用户执行reboot、shutdown、poweroff等指令。
限制普通用户可访问/修改的文件,例如禁止普通用户访问 /etc/config/system配置文件。

5 参考

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用EndNote添加参考文献,如何区分中英文文献的et al和等?

一、背景 我们在用EndNote添加参考文献时,如遇到超过3个作者,需列出前三位作者,其余用“et al”代替。 但中文文献用“et al”显示不合适,如下图所示,需要用“等”代替。 二、中文参考文献大于3个作者,用等…

5G数字化转型redcap助您“轻”装上阵

RedCap(Reduced Capability)技术,也称为NR-Light,是针对5G网络的一种轻量化技术规范,旨在为具有较低性能要求的设备提供5G连接。 RedCap技术特点 低成本 降低芯片组和设备成本:RedCap通过减少终端带宽、收…

【Playwright+Python】系列 Pytest 插件在Playwright中的使用

一、命令行使用详解 使用 Pytest 插件在Playwright 中来编写端到端的测试。 1、命令行执行测试 pytest --browser webkit --headed 2、使用 pytest.ini 文件配置 内容如下: [pytest] # Run firefox with UIaddopts --headed --browser firefox效果&#xff1…

STM32入门开发操作记录(三)——按键控制LED

目录 一、模块化二、LED交替闪烁1. LED.c2. LED.h3. 主函数 三、按键控制LED1. Key.c2. Key.h3. LED.c4. LED.h5. 主函数 一、模块化 前篇介绍了如何向项目添加模块,本篇将进一步介绍模块的编写与封装。随着模块的增加,需要用到Manage Project Items&…

多终端文件互传

LocalSend - 下载下载LocalSend适用于Windows、macOS、Linux、Android和iOS。https://localsend.org/zh-CN/download

C语言 ——— 输入两个正整数,求出最小公倍数

目录 何为最小公倍数 题目要求 代码实现 方法一:暴力求解法(不推荐) 方法二:递乘试摸法(推荐) 何为最小公倍数 最小公倍数是指两个或者多个正整数(除了0以外)的最小的公共倍数…

浅谈RLHF---人类反馈强化学习

浅谈RLHF(人类反馈强化学习) RLHF(Reinforcement Learning fromHuman Feedback)人类反馈强化学习 RLHF是[Reinforcement Learning from Human Feedback的缩写,即从人类反馈中进行强化学习。这是一种结合了机器学习中…

Android Toast

Toast Toast是Android常用的简单控件,主要用来进行简短的信息提示,如图1所示。 图1 Toast效果图 Toast的基本用法很简单,不需要设置layout,只需要在程序中调用即可。Toast调用makeText()方法设置需要显示的界面、显示的内容、显…

简洁实用的原创度检测工具AntiPlagiarism NET 4.132

AntiPlagiarism NET是一个适用于Windows的程序,它允许您检查文本的唯一性和从不同Internet来源借用的存在。使用AntiPlagiarism NET,您可以: 将程序用于不同的目的该程序适用于学生、教师、记者、文案作者和其他需要检查其文本或其他作者文本…

SpringBoot实战:多表联查

1. 保存和更新公寓信息 请求数据的结构 Schema(description "公寓信息") Data public class ApartmentSubmitVo extends ApartmentInfo {Schema(description"公寓配套id")private List<Long> facilityInfoIds;Schema(description"公寓标签i…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 游乐园门票 (200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 最新华为O…

4000厂商默认账号密码、默认登录凭证汇总.pdf

获取方式&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1F8ho42HTQhebKURWWVW1BQ?pwdy2u5 提取码&#xff1a;y2u5

C语言 ——— 调试的时候如何查看当前程序的变量信息

目录 调试前/后的调试窗口 ​编辑 调试窗口 --- 监视 调试窗口 --- 内存 调试窗口 --- 调用堆栈 调试前/后的调试窗口 调试前的调试窗口&#xff1a; 调试前的调试窗口是没有显示的&#xff0c;只有在调试的时候才会有相对应的调试窗口 调试后的调试窗口&#xff1a…

头歌资源库(31)象棋中马遍历棋盘的问题

一、 问题描述 二、算法思想 这是一个典型的深度优先搜索问题。 首先&#xff0c;我们创建一个mn的棋盘&#xff0c;并初始化所有的点为未访问状态。 然后&#xff0c;我们从(0, 0)位置开始进行深度优先搜索。 在每一步中&#xff0c;我们先标记当前位置为已访问&#xff0…

垃圾收集篇

文章目录 垃圾收集算法垃圾的概念对象存活的判断引用计数器法可达性分析算法 算法标记清除算法复制算法标记压缩算法 垃圾收集的相关概念STW安全点安全区域 垃圾收集器重要指标吞吐量停顿时间 垃圾收集器的分类Serial 收集器&#xff1a;串行回收ParNew 收集器&#xff1a;并行…

数据结构——查找(线性表的查找与树表的查找)

目录 1.查找 1.查找的基本概念 1.在哪里找&#xff1f; 2.什么查找&#xff1f; 3.查找成功与否&#xff1f; 4.查找的目的是什么&#xff1f; 5.查找表怎么分类&#xff1f; 6.如何评价查找算法&#xff1f; 7.查找的过程中我们要研究什么&#xff1f; 2.线性表…

【周末闲谈】Stable Diffusion会魔法的绘画师

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言Stable Diffusion介绍 使用ComfyUI 和 WebUIComfyUIWebUI 配置需求 Stable Diffusion资源分享吐司AiAUTOMATIC1111Civitai绘世整合包Nenly同学stability.ai 前言 在很早之前&…

2-33 基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化

基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化&#xff0c;根据需求设置斜齿轮对的相应参数&#xff0c;得到结果。程序已调通&#xff0c;可直接运行。 2-33 斜齿轮对啮合时接触线长度 齿轮参数 - 小红书 (xiaohongshu.com)

【笔记】nginx命令

查看 启动 通过./nginx启动nginx之后 可以在虚拟机中进入/usr/local/nginx/html 去查看cat index.html 也就是此页面的源代码 进入vim /etc/profile 配置完之后保存退出 source /etc/profile 手动重载资源 随后就可以在任意位置重载资源了 nginx -s reload 部署静态资源就把静…

【Linux】进程程序替换 + 模拟实现简易shell

前言 上一节我们介绍了 **进程终止**和 **进程等待**等一系列问题&#xff0c;并做了相应的验证&#xff0c;本章将继续对进程控制进行介绍&#xff0c;重点学习进程程序替换&#xff0c;并进行相应验证&#xff0c;在此基础上&#xff0c;自己模拟实现一个shell&#xff0c;该…