文章目录
- 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
对象的board
和info
方法。
特别注意:*.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