wordpress 的 Apache 所有權和權限
我的問題涉及 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”,並且 WordPress
convert 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
),並以使用者身份執行 WordPressfoo
。然後 WordPress 中的漏洞可以感染這些程序。如果您稍後使用 執行其中一個程序sudo
,那麼您就完蛋了——它將完全控制系統。如果您儲存任何密碼或私鑰並且foo
使用者可以讀取它,那麼入侵您的 WordPress 的破解者也將能夠讀取它。至於Apache執行的整體機制,這裡總結一下:
- 在您的 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())。系統呼叫是程序對其作業系統核心的請求。要閱讀有關係統呼叫的資訊,請使用 egman 2 socket
(這裡2
指的是手冊頁的第 2 部分 - 系統呼叫,請參閱man man
部分編號)。Passive
套接字不能真正傳輸數據。它唯一做的就是建立與客戶端的連接 - Mozilla 的選項卡。
- 客戶端(Mozilla 選項卡)想要與您的伺服器建立 TCP/IP 連接。它在 NON-WELL KNOWN 埠 14369 上創建一個套接字,該套接字不需要 root 權限。然後它通過伺服器電腦第 80 個埠上的被動套接字與 Apache 交換 3 條消息。這個過程(用 3 條消息建立 TCP/IP 連接)稱為 3 次握手,請參閱:
TCP/IP 連接建立成功後,Apache2(以 root 身份執行)呼叫
accept()
系統呼叫,Linux 核心在伺服器的第 80 埠創建一個active
套接字,對應與 Mozilla 的選項卡的連接。通過這個活動套接字,您的 WordPress 應用程序將與客戶端對話。Apache2(以 root 身份執行)派生出另一個 Apache2 實例來以較低權限執行 WordPress 程式碼。該實例將以
www-data
使用者身份執行您的 WordPress 程式碼。Mozilla 和 Apache2,執行 WordPress 程式碼,因為使用者開始通過已建立的連接交換 http 數據,通過系統呼叫
www-data
寫入和讀取各自的套接字。send()/recv()
基本上,WordPress 只是一個程序,它的輸出是一個 html 頁面,因此 Apache2 執行時
www-data
只是執行該程序並將其輸出(html 頁面)寫入活動套接字,客戶端的 Mozilla 接收該頁面並顯示它。