題 以無特權用戶身份運行新手工作


讓upstart作業更改其用戶ID並以非特權用戶身份運行腳本的規範方法是什麼?

顯然可以使用 su 要么 sudo,但這似乎是hacky(並且可以生成不必要的日誌行)。


139
2018-03-11 14:26


起源




答案:


隨著新貴v1.4, setuid的 和 setgid的 在配置文件中原生支持。


108
2017-09-09 11:26



有關詳細信息,請參閱食譜: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user - Jason Navarrete
換句話說,它在Precise(12.04)和更新版本中得到支持。 - Edward Anderson
換句話說,centos 6不支持 - socketpair
作為記錄, initctl --version 找到你當前版本的暴發戶。 - Mahn
令人討厭的是,AWS上的Amazon Linux發行版使用RHEL 6的新貴版本(0.6.5 !!!!),因此使用它的任何人都必須使用'su'解決方案。 - Asfand Qazi


在freenode上的#upstart頻道上詢問,官方對此事的看法是:

Upstart的未來版本將有   原生支持,但就目前而言,   你可以使用類似的東西:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

85
2018-01-18 01:41



這是唯一適用於Amazon Linue EC2的答案(我嘗試了sudo和su的所有變體,包括--session-command,-c,ad nauseum);沒有人允許這個過程一旦啟動就停止;非常感謝你。 - Kato
這是一些奇特的外殼魔法,+1。 - Steve Kehlet
這在CentOS 6(Upstart 0.6.5)上對我不起作用。發起了一系列的叉子(我認為是4深) su 這意味著 expect fork 乃至 expect daemon 不要抓住最終的PID。 - Mark Lakata
我在亞馬遜Linux(Upstart 0.6.5)上使用它來啟動一個Jenkins進程(謝天謝地,它沒有守護自己)並且它有效!我不得不改變一點,將標準輸出重定向到日誌文件並設置一些環境變量,但它有效!我的版本看起來像: exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...] - Asfand Qazi


使用start-stop-daemon怎麼樣?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

新貴食譜

Debian和Ubuntu系統的推薦方法是使用helper實用程序 start-stop-daemon。 [...] start-stop-daemon 不會對其啟動的過程施加PAM(“可插入驗證模塊”)限制。

注意: start-stop-daemon RHEL不支持。


17
2017-12-23 15:11



如果需要,您也可以使用該組。使用--chuid daemonuser:daemongroup - Evgeny


有幾種方法可以做到這一點,語義略有不同,特別是與組成員身份有關:

  • setuidgid 將把你放在你指定的組中。

    • 最初的daemontools' setuidgid 會把你 只要 在該組中,您將無法訪問屬於您所屬的其他組的文件。
    • setuidgid 來自daemontools-encore 和 setuidgid 來自nosh工具集 兩者都有 -s (亦稱 --supplementary)選項將把你放在那個組,並把你放在所有的 補充團體 對於您指定的用戶。
  • 運用 newgrp 一旦您成為權限較低的用戶,就會在組集中添加一個組,但也會創建一個新的子shell,這使得在腳本內部使用變得棘手。

  • start-stop-daemon 保留您的組成員資格,並且不僅僅是setuid / setgid。

  • chpst -u username:group1:group2:group3... commandname 將讓你準確指定要採用的組成員資格,但是(in Ubuntu的它只附帶了 runit 包,這是一個替代品 upstart

  • su -c commandname username 拿起所有用戶名的組成員資格,就像那樣 sudo -u username commandname所以他們可能是最不驚訝的路線。


13
2017-12-24 00:00





使用 setuidgid 從包中 daemontools

這裡的文件: http://cr.yp.to/daemontools/setuidgid.html


8
2018-03-11 15:50



daemontools不是暴發戶的先決條件,因此這似乎不是“規範”的答案 - Adam Nelson
此外,daemontools在宇宙中(ubuntu 10.04),而upstart在main中。 - jtimberman


在Amazon EC2上的Ubuntu 10.10實例上,我運氣好了 start-stop-daemon 命令。

我也與其他一些暴發戶掙扎 。我正在調用一個特定的python應用程序 virtualenv 和我執行的程序的一些參數。

以下是對我有用的東西。

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

PYTHONPATH 是從源代碼安裝一些軟件包 蟒蛇 此upstart作業運行時的模塊路徑。我必須在絕對路徑上做所有事情,因為 chdir 斯坦扎似乎沒有工作。


4
2018-01-06 19:52



我也有問題 ENV 用於的變量 exec start-stop-daemon。 - Thomas Bratt


我正在使用CentOS 6,我無法得到推薦的hack(Upstart 0.6.5)為我工作,也沒有得到'su'技巧,因為所涉及的分叉數量(我認為4)沒有被'expect fork'跟踪'或'期待守護進程'。

我最終剛剛做到了

chown user:group executable
chmod +s executable

(即設置setuid位並更改所有權)。

它可能不是最安全的方法,但對於內部研發項目,在我們的案例中並不重要。


3
2017-08-27 21:56



如果你要做一個 chmod 1700 或至少一個 chmod u+sx,go-x 在那里而不僅僅是 +s,它有資格作為“足夠安全”。 :) - dannysauer


第三種可能性取決於您要完成的任務。你或許可以 放鬆有問題的文件/設備上的訪問控制。這可以允許非特權用戶安裝或訪問他們通常不允許的項目。請確保在這個過程中你沒有洩露王國的鑰匙。

你也可以 更改sudo密碼緩存的超時。但我不推薦它,除非您的機器是物理安全的(即,您認為路人不太可能嘗試獲取sudo訪問權限)。

有一個很好的理由,很少有方法可以執行特權操作並執行它們 不必要  必要 日誌記錄。寬鬆的限制對您的系統來說是一個安全隱患,缺乏日誌記錄意味著無法知道您遭受入侵時發生了什麼。

如果 尺寸 您的日誌文件是一個問題,然後可能是錯誤的。在正常情況下,Sudo每次使用僅產生一條線。


0
2018-03-11 17:07