Chroot隔离的OpenVPN服务搭配AppArmor启动失败:Operation not permitted
Chroot隔离的OpenVPN服务搭配AppArmor启动失败:Operation not permitted
我太懂你这个头疼的问题了——给带chroot jail的OpenVPN客户端配完AppArmor,启动就报chroot权限被拒,关掉AppArmor又一切正常。咱们一步步调整你的AppArmor配置,把这个问题解决掉。
首先得揪出当前配置里的核心遗漏:chroot操作本身需要专属的系统权限,但你的profile里没声明这个capability,这是导致报错的关键原因之一。另外还要确保chroot目录本身的访问权限、chroot后必要资源的路径都被正确授权。
调整后的完整AppArmor配置
下面是修改后的profile,我标注了关键调整点:
# vim:syntax=apparmor #include <tunables/global> #include if exists <tunables/chroot> # 先确保@{VPNCHROOT}在tunables/chroot中定义为"/.vpn-jail" profile openvpn /usr/sbin/openvpn flags=(chroot_attach, chroot_relative) { #include <abstractions/base> #include <abstractions/openssl> #include <abstractions/nameservice> # embedded, but more relaxed capability net_admin, capability setuid, capability setgid, capability chroot, # 新增:chroot操作的核心权限,没有它直接被拒 capability dac_override, # 可选:临时添加,若碰到文件权限问题时用 # 新增:允许访问chroot根目录及必要的底层目录结构 @{VPNCHROOT}/ r, @{VPNCHROOT}/etc/ r, @{VPNCHROOT}/etc/openvpn/ r, @{VPNCHROOT}/dev/ r, @{VPNCHROOT}/dev/net/ r, @{VPNCHROOT}/proc/ r, # 保留你原有的配置项 /etc/openvpn/client/*.conf r, # any.conf /etc/openvpn/client/credentials/decrypted_credentials.txt r, @{VPNCHROOT}/etc/openvpn/client/*.conf r, @{VPNCHROOT}/etc/openvpn/client/credentials/decrypted_credentials.txt r, # 同时授权宿主机和chroot内的tun设备访问 /dev/net/tun rw, @{VPNCHROOT}/dev/net/tun rw, # 临时放宽proc访问(后续可根据日志细化规则) @{PROC}/** r, /var/log/openvpn/openvpn-status.log rw, /var/log/openvpn/openvpn.log rw, /var/log/openvpn/ipp.txt rw, /{,var/}run/openvpn/server.pid rw, /{,var/}run/openvpn/client{,-*}.pid rw, /{,var/}run/openvpn/client{,-*}.status rw, /{,usr/}bin/ip Cx, profile ip /{,usr/}bin/ip { /{,usr/}bin/ip r, #include <abstractions/base> capability net_admin, /var/log/openvpn/openvpn.log w, } # #include <local/usr.sbin.openvpn> }
关键调整说明
- 新增
capability chroot,:这是chroot操作的核心权限,没有它AppArmor会直接拦截chroot系统调用,这是你之前报错的主要原因。 - 添加chroot目录的基础访问权限:AppArmor需要明确允许OpenVPN访问chroot根目录及其下的必要目录(
etc/、dev/、proc/),否则chroot时会因无法访问目标目录失败。 - 授权chroot内的tun设备:chroot后OpenVPN仍需访问
tun设备,必须单独配置chroot环境内的设备路径权限。 - 调整flags组合:
chroot_relative帮助AppArmor正确解析chroot后的相对路径,和chroot_attach配合使用更稳妥。 - 临时放宽proc访问:先放宽
@{PROC}/** r,快速验证,后续可以根据journalctl -xe | grep apparmor的日志输出,细化为更严格的proc路径规则。
后续验证步骤
- 确认
@{VPNCHROOT}变量:检查/etc/apparmor.d/tunables/chroot文件,添加VPNCHROOT="/.vpn-jail"(文件不存在则新建)。 - 重新加载profile:
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.openvpn - 重启服务:
sudo systemctl restart openvpn-client@vpn - 排查剩余问题:如果仍有报错,用
journalctl -u openvpn-client@vpn -f或dmesg | grep apparmor查看具体拒绝项,针对性添加规则即可。
备注:内容来源于stack exchange,提问作者PhönixGeist
相关产品推荐
相关产品推荐

