Openvpn

關閉 systemd 服務時,openvpn 無法在“down”腳本中執行 sudo

  • October 5, 2019

作業系統: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 配置文件中刪除userandgroup指令以使程序root在整個執行過程中保持不變,那麼我不會收到錯誤消息,並且 iptables 呼叫按預期工作,即使在使用 systemd 服務啟動和停止時也是如此。

所以它聞起來像 systemd 阻止我sudo在關閉服務時使用升級權限。

關於如何克服這個困難,同時仍然降級為非特權使用者的任何想法?

顯然,在這種情況下Resource temporarily unavailable告訴我這os.fork是失敗的,因為非特權使用者已經達到了 openvpn 服務的 systemd 配置允許的最大程序數。

為了解決這個問題,我編輯/lib/systemd/system/openvpn@.service並進行了以下更改:

- LimitNPROC=10
+ LimitNPROC=100

隨後,即使使用非特權使用者並使用 sudo 提升權限,我的iptables鍊式拆除命令也會成功。

引用自:https://serverfault.com/questions/986686