
我有一個 java 程序,用於自動執行為客戶端建立 VPN 設定的過程。程式呼叫幾個 bash 腳本,創建並複製檔案。我必須在 root 用戶下運行它,因為整個 VPN 配置位於 /etc/openvpn 下。對於這個目錄我需要 root 權限。在同一台機器上,我有 Glassfish 應用程式伺服器,它將呼叫上述 Java 程式。 Glassfish 在非 root 使用者下運作。
如果我透過 sudo 運行程序,那麼以 root 使用者身分執行程式(當然無需輸入密碼)的最佳、最安全的方法是什麼?
答案1
最安全的選擇是找出 openvpn 所屬的群組並新增一個有權存取它的非特權使用者 -推薦的方法是建立一個 openvpn 用戶,並使用 sudo 授予其使用 openvpn 的權限。
將執行程式的使用者新增至群組(可能只具有讀取權限)以授予其存取 openvpn 的權限,並為其提供必要的 sudo 權限(運行 openvpn - 與 openvpn 使用者使用的設定相同)應該可以解決問題安全。
使用 root 是一種懶惰的方法;)
答案2
我發現,在不輸入密碼的情況下以 sudo 身份運行命令有兩種選擇:
- 回顯密碼| sudo -S 指令
將以下行加入 /etc/sudoers
使用者名稱 ALL=(ALL) NOPASSWD: 命令
請注意,此行必須位於所有群組定義之後。您可以使用 sudo 檢查您擁有哪些權限sudo -l
。對於這種情況,結果是:
(ALL) ALL
(ALL) NOPASSWD: COMMAND
這意味著除命令之外的所有命令都需要密碼。如果我們將其放在username ALL=(ALL) NOPASSWD: COMMAND
群組定義之前,sudo -l
則會產生:
(ALL) NOPASSWD: COMMAND
(ALL) ALL
這仍然需要命令的密碼,因為(ALL) ALL
在 NOPASSWD 行之後指定。