Ubuntu

wordpress 的 Apache 所有權和權限

  • August 21, 2018

我的問題涉及 Apache 以及它可以執行的不同方式。對於這台特定的機器,我是唯一的使用者,我將主要使用該機器在帶有 Ubuntu 12.04.3 LTS 的 LAMP Stack 上執行 WordPress。我安裝了 Apache,它以www-data使用者身份執行。出於本範例的目的,讓我們呼叫我的使用者foo

如果我只是設置了 WordPress 的基本配置,系統將無法寫入目錄,原因我仍然不太明白,因為www-data是 Apache 使用者,而不是foo文件的所有者.

據我了解,我不想讓我的文件歸自己所有,www-data因為這可能非常危險且不安全。但是,讓我的文件組可寫是否是個好主意,或者這也不是最好的選擇?

如果有人能對 Apache 的工作原理有所了解,那將意味著很多,以及將我的伺服器放入的最佳配置,以便我的使用者可以寫入文件,但可以通過 WordPress 等應用程序訪問。

Noel,www-data使用者是使用者,Apache 代表其執行您的 WordPress 程式碼(以及任何其他程式碼,為您的使用者生成網頁,例如 Django 程式碼 - python 網站引擎)。

www-data使用者被創建為具有盡可能少的權限,因為它可能執行惡意程式碼並儘可能多地控制您的系統,因為它被允許。假設 WordPress 引擎包含一個漏洞。比如說,它允許使用者通過從 Imagemagick執行將圖像文件轉換.jpg.gif格式。convert漏洞在於它不檢查文件名是否包含文件名而僅包含文件名。

如果惡意破解者提供“image.png; ldd image.png”,並且 WordPressconvert image.png; ldd image.png在 shell 中執行而沒有過濾掉"; ldd image.png"部分(這部分被破解者添加到文件名中以便在 shell 中執行),您的 apache 將執行ldd image.png除了轉換圖像。Ifimage.png實際上是一個名為 image.png 的執行檔,破解者提供給您(如果您允許其他人在您的網站上發布,使用 WordPress 引擎),ldd image.png可能會導致任意程式碼執行,使用描述的“ldd”漏洞這裡: http: //www.catonmat.net/blog/ldd-arbitrary-code-execution/

顯然,如果該程式碼以 root 使用者身份執行,它可以感染系統中的所有程序並完全控制它。然後你就完蛋了(你的虛擬主機可以開始發送垃圾郵件,試圖用病毒感染每個人,吃掉你所有的主機預算等等)。

因此,WordPress 應該以盡可能低的權限執行,以最大限度地減少潛在漏洞造成的損害。因此,任何www-data可以寫入的文件都應該被視為可能受到損害。

為什麼不以foo使用者身份執行 WordPress?假設,您有一個按使用者安裝的程序(例如 in /home/foo/bin),並以使用者身份執行 WordPress foo。然後 WordPress 中的漏洞可以感染這些程序。如果您稍後使用 執行其中一個程序sudo,那麼您就完蛋了——它將完全控制系統。如果您儲存任何密碼或私鑰並且foo使用者可以讀取它,那麼入侵您的 WordPress 的破解者也將能夠讀取它。


至於Apache執行的整體機制,這裡總結一下:

在此處輸入圖像描述

  1. 在您的 VPS 電腦上,有一個 Apache2 程序,它以 root 身份執行。它必須以 root 身份執行,因為它需要 root 權限才能要求 Linux 核心在 TCP 埠 80 上創建一個套接字。

Socket(參見Berkley Sockets)是一種作業系統程式抽象,現代作業系統 (OS) 核心使用它來表示與應用程序的網路連接。WordPress 開發人員可以將套接字視為文件。當 2 台不同電腦上的 2 個程序(客戶端和伺服器)使用 TCP/IP 協議通過網路相互通信時,作業系統核心自己處理 TCP/IP 細節,程序只是認為它們有一個類似文件的對象- 插座。當客戶端程序(例如 Mozilla)向其套接字寫入內容時,客戶端電腦作業系統的核心使用 TCP/IP 協議將該數據傳遞到伺服器電腦作業系統的核心。然後伺服器程序(Apache2 代表 WordPress)可以從其套接字中讀取這些數據。

客戶端如何找到伺服器,伺服器如何區分客戶端?伺服器和客戶端都由一對(IP 地址、TCP 埠號)標識。眾所周知的協議有眾所周知的埠,例如用於 http 的 80、用於 https 的 443、用於 ssh 的 22 等。伺服器電腦使用眾所周知的埠來預期它們上的連接。重要的是,只有 root 使用者可以在眾所周知的埠上創建套接字。這就是 Apache2 的第一個實例以 root 身份執行的原因。

passive當一個伺服器(Apache2)程序想要開始監聽一個埠時,它會在埠 80 上創建一個所謂的套接字,其中包含幾個system calls(socket()、bind()、listen() 和 accept())。系統呼叫是程序對其作業系統核心的請求。要閱讀有關係統呼叫的資訊,請使用 eg man 2 socket(這裡2指的是手冊頁的第 2 部分 - 系統呼叫,請參閱man man部分編號)。Passive套接字不能真正傳輸數據。它唯一做的就是建立與客戶端的連接 - Mozilla 的選項卡。

  1. 客戶端(Mozilla 選項卡)想要與您的伺服器建立 TCP/IP 連接。它在 NON-WELL KNOWN 埠 14369 上創建一個套接字,該套接字不需要 root 權限。然後它通過伺服器電腦第 80 個埠上的被動套接字與 Apache 交換 3 條消息。這個過程(用 3 條消息建立 TCP/IP 連接)稱為 3 次握手,請參閱:

在此處輸入圖像描述

  1. TCP/IP 連接建立成功後,Apache2(以 root 身份執行)呼叫accept()系統呼叫,Linux 核心在伺服器的第 80 埠創建一個active套接字,對應與 Mozilla 的選項卡的連接。通過這個活動套接字,您的 WordPress 應用程序將與客戶端對話。

  2. Apache2(以 root 身份執行)派生出另一個 Apache2 實例來以較低權限執行 WordPress 程式碼。該實例將以www-data使用者身份執行您的 WordPress 程式碼。

  3. Mozilla 和 Apache2,執行 WordPress 程式碼,因為使用者開始通過已建立的連接交換 http 數據,通過系統呼叫www-data寫入和讀取各自的套接字。send()/recv()

基本上,WordPress 只是一個程序,它的輸出是一個 html 頁面,因此 Apache2 執行時www-data只是執行該程序並將其輸出(html 頁面)寫入活動套接字,客戶端的 Mozilla 接收該頁面並顯示它。

引用自:https://unix.stackexchange.com/questions/106119