自己电脑做网站用备案,什么网站发布找做效果图的,建设工程施工合同通用条款,上海网址一360导航文章目录 1 如何新增普通用户2 如何以普通用户权限运行服务3 普通用户如何访问root账户的ubus服务4 其他权限控制5 参考 Openwrt系统在默认情况下只提供一个
root账户#xff0c;所有的服务都是以
root权限运行的#xff0c;包括
WebUI也是通过root账户访问的#xff0c;… 文章目录 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 menuconfigBase 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 rootoption password $p$rootlist read *list write *# 增加如下代码 config loginoption username guestoption password $p$guestlist 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
START12USE_PROCD1
NAMEhelloworld
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/helloworld3 普通用户如何访问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
guestOpenWrt:~$ 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对象的board和info方法。 特别注意*.json 文件的权限必须是644ubusd会检查该文件权限是否符合要求。 增加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 5e41cdeeboard:{}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: r238614-447eef2063,target: mediatek/mt7622,description: OpenWrt 23.05-SNAPSHOT r238614-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
guestOpenWrt:/root$ ubus subscribe dnsmasq.dns如果需要添加多个订阅的对象接着dnsmasq.dns后面新增即可。
4 其他权限控制
限制普通用户可执行的命令例如限制普通用户执行reboot、shutdown、poweroff、mount等指令。 限制普通用户可访问/修改的文件例如禁止普通用户访问 /etc/config/system配置文件。 这些基本上都可以通过chmod指令来配置这部分就不再做详细介绍。
5 参考
为 OpenWrt 增加用户且开放访问 WebUI 权限 UBUS ACL Procd Service Parameters