關閉 systemd 服務時,openvpn 無法在“down”腳本中執行 sudo
作業系統:Ubuntu 16.04.2 LTS
我的 VPN 配置有指令:
user ovpn group ovpn up "/path/to/my/script" down "/path/to/my/script"
我的 visudo 文件有指令:
%ovpn ALL=(ALL:ALL) NOPASSWD: /sbin/iptables
這允許 openvpn 從
root
非特權使用者降級ovpn
(出於安全原因),但仍用於iptables
啟動和關閉從數據庫載入的路由。如果我直接從 shell 呼叫 openvpn 程序,它就可以工作,即:$ sudo openvpn /etc/openvpn/vpn0.conf
然後用
CTRL
-殺死它C
。“它有效”是指根據需要添加和刪除 iptables 規則而不會出現任何錯誤。但是,如果我使用 vanilla Ubuntu systemd openvpn 服務啟動和停止 openvpn 程序。IE
$ sudo systemctl start openvpn $ sudo systemctl stop openvpn
然後“–down”腳本在執行“stop”命令期間失敗。當我檢查 syslog 時,我看到 –down 腳本在 shell 命令呼叫時失敗
sudo /sbin/iptables
,特別是在它試圖派生程序的地方。(關於錯誤消息,我的腳本是一個使用 . 的 python 腳本subprocess.call(['/usr/bin/sudo', '/sbin/iptables', ...])
。錯誤消息是:File "/usr/lib/python2.7/subprocess.py", line 523, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1235, in _execute_child self.pid = os.fork() OSError: [Errno 11] Resource temporarily unavailable
如果我從 openvpn 配置文件中刪除
user
andgroup
指令以使程序root
在整個執行過程中保持不變,那麼我不會收到錯誤消息,並且 iptables 呼叫按預期工作,即使在使用 systemd 服務啟動和停止時也是如此。所以它聞起來像 systemd 阻止我
sudo
在關閉服務時使用升級權限。關於如何克服這個困難,同時仍然降級為非特權使用者的任何想法?
顯然,在這種情況下
Resource temporarily unavailable
告訴我這os.fork
是失敗的,因為非特權使用者已經達到了 openvpn 服務的 systemd 配置允許的最大程序數。為了解決這個問題,我編輯
/lib/systemd/system/openvpn@.service
並進行了以下更改:- LimitNPROC=10 + LimitNPROC=100
隨後,即使使用非特權使用者並使用 sudo 提升權限,我的
iptables
鍊式拆除命令也會成功。