這裡是 CentOS,但我認為這並不重要,因為這個應該是一個核心 Linux 問題(我認為)。當嘗試在 CentOS 機器上安裝和執行 Apache Kafka(一個 Java 執行檔)時,我想到了一個通常適用於 Linux 的問題。
當您執行 shell 腳本或本機可執行檔案(例如java
)時,腳本/可執行檔案是否指示它以哪個使用者身分執行,或者作業系統是否指示腳本/可執行檔案以哪個使用者身分執行(即哪個使用者正在執行腳本) /可執行檔)?
進程是否可能和/或典型地決定它們以哪個使用者身分執行?意義能腳本/應用程式指定它必須以 root 使用者身分執行,還是以其他特定類型的使用者身分執行?
不管怎樣,為什麼會有關於以 root 身分執行進程與以非特權使用者身分執行進程的一般警告?
答案1
簡短的回答:兩者都有。
更長(也更有用)的答案:預設情況下,程式將以啟動它的使用者身份運行。但是,如果編寫了程式並賦予了正確的權限,則程式可以取得 root 權限和/或返回「系統」使用者來運行自己。但是,必須透過打包和安裝程序或透過該電腦的管理員採取的操作來明確賦予程式這種能力。
之所以有一般警告,是因為 UNIX 和 Linux 的歷史經驗表明,使用不必要的提升(即 root)權限的程式常常會對系統造成不良影響。這可能是由於資料損壞、導致系統其餘部分無法使用/無回應的失控進程、以及無意中允許攻擊者以您不希望的方式存取您的系統的進程。
答案2
當執行「shell 腳本」時,它會以執行該腳本的使用者的權限執行。大多數使用套件管理器(yum、apt 等)安裝的服務(kafka、redis、nginx 等)都會安裝幫助程式腳本以方便控制這些服務,並創建與這些服務(apache、redis、nginx、等)幾乎所有這些幫助程序腳本最初都是以root 身分執行的,然後將權限授予指派給該服務的服務使用者。這確保了只有授權使用者(即被授權執行「sudo service kafka start」的使用者)才能有效地控制這些服務。這意味著系統管理員Sally 可以啟動、停止和重新啟動kafka 和nginx,而開發人員Jim 可能僅限於啟動和停止kafka(或類似的東西)。我所擁有的在實踐中,這與 ruby 用戶或 python 用戶不同。相反,服務所有權通常固定於與該特定服務相關的服務使用者。
某些程序依賴於以 root 身份運行(通常 ssh 伺服器守護程序以 root 身份運行。)其他進程將拒絕以 root 身份啟動(postgresql 就是其中之一。)
如果您在 /etc/init.d/someservice (或 /etc/init/someservice.conf)查看服務的幫助程序腳本,則導致權限升級或下降的實際腳本將在那裡編碼。或者,如果您以使用者 stephan 身份登錄,並執行類似 /usr/sbin/redis-server -c /etc/redis.conf 的內容,然後從另一個視窗檢查該進程,您將看到 redis 已被擁有由史蒂芬.
希望有幫助。