linux下ls -al查看文件,用戶名爲65534,導致應用寫文件失敗

今天上了一個xxx系統,通過tomcat和apache發佈上線,提供對外訪問能力。

首先,通過root用戶啓動apache和tomcat,同時系統掛載了文件服務器的一個目錄upload,發現文件上傳時,不能在服務器端正常創建目錄,寫文件,說權限不夠。


嘗試修改upload的權限:chmod 777 upload

發現xxx系統可以在服務端正常寫文件了。問題是root用戶啓動的xxx系統,權限最大,但爲什麼不能寫文件呢?


先看看http://linux.chinaunix.net/techdoc/system/2007/03/26/953339.shtml以下爲摘要

NFS(Network File System)是一種分佈式文件系統,允許網絡中的安裝不同操作系統的計算機間共享文件和外設,所以它的通訊協定設計與主機及操作系統無關. 它是由SUN公司於1984年推出,使得可以本地機一樣的使用另一臺聯網計算機的文件和外設。NFS在文件傳送或信息傳送過程中依賴於RPC協議。

圖一、NFS 主機分享目錄與 Client 掛載示意圖
  就如同上面的圖示一般,當我們的NFS Server設定好共享出來的/home/sharefile這個目錄後,其他的NFS Client端就可以將這個目錄掛載到自己系統上面的某個掛載點(掛載點可以自定義),例如前面圖示中的NFS client 1與NFS client 2掛載的目錄就不相同。我只要在 NFS client 1系統中進入/home/data/sharefile內,就可以看到 NFS Server系統內的/home/sharefile目錄下的所有資料了 (當然,權限要足夠)。這個 /home/data/sharefile 就好像 NFS client 1自己機器裏面的一個 partition。只要權限對了,那麼您可以使用 cp, cd, mv, rm... 等等磁盤或文件相關的命令。
  好的,既然NFS是通過網絡來進行文件的傳輸,那麼經由socket pair的概念你會知道NFS應該會使用一些port吧?那麼NFS使用哪個 port來進行傳輸呢?答案是....不知道?因爲NFS用來傳輸的port是隨機選擇小於1024以下的端口來使用的。那客戶端怎麼知道你服務器端使用那個port呢?此時就得要遠程過程調用(Remote Procedure Call, RPC)的協議來輔助,下面我們就來談談什麼是 RPC?
2.2 什麼是 RPC (Remote Procedure Call)
  RPC, 遠程過程調用 (remote procedure call)是能使客戶端執行其他系統中程序的一種機制。由於使用 RPC 的程序不必瞭解支持通信的網絡協議的情況,因此 RPC 提高了程序的互操作性。常用於分佈式客戶端/服務器模型,發出請求的程序是客戶程序,而提供服務的程序是服務器。
  因爲NFS支持的功能相當的多,而不同的功能都會使用不同的程序來啓動,每啓動一個功能就會啓用一些 port 來傳輸文件,因此, NFS 的功能所對應的 port 纔沒有固定, 而是採用隨機取用一些未被使用的小於 1024 的端口來作爲傳輸之用。但如此一來又造成客戶端想要連上服務器時的困攏, 因爲客戶端得要知道服務器端的相關端口才能夠連接!
  此時我們就得需要遠程過程調用(RPC) 的服務,RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且返回給客戶端,讓客戶端可以連結到正確的端口上去。 那 RPC 又是如何知道每個 NFS 的端口呢?這是因爲當服務器在啓動 NFS 時會隨機取用數個端口,並主動的向 RPC 註冊,因此 RPC 可以知道每個端口對應的 NFS 功能,然後 RPC 又是固定使用 port 111 來監聽客戶端的需求並返回客戶端正確的端口。
  注:在啓動 NFS 之前,RPC 就要先啓動了,否則NFS會無法向 RPC 註冊。 另外,RPC若重新啓動時,原來註冊的資料會不見,因此RPC重新啓動後,它管理的所有程序都需要重新啓動以重新向RPC註冊。

圖二、NFS 與 RPC 服務及文件系統操作的相關性
            
  如上圖所示,當客戶端有NFS文件存取需求時,它會如何向服務器端請求文件呢?
  1)、客戶端會向服務器端的RPC(port 111)發出NFS檔案存取功能的詢問要求;
  2)、服務器端找到對應的已註冊的NFS daemon端口後,會返回給客戶端;
  3)、客戶端了解正確的端口後,就可以直接與NFS daemon來建立連接;
  由於 NFS 的各項功能都必須要向RPC來註冊,如此一來RPC就能瞭解NFS這個服務的各項功能之port number, PID, NFS 在主機所監聽的IP等等,而客戶端才能夠通過RPC的詢問找到正確對應的端口。 也就是說,NFS 必須要有RPC存在時才能成功的提供服務,因此我們稱NFS爲RPC server的一種。事實上,有很多這樣的服務器都是向RPC註冊的,舉例來說,NIS (Network Information Service)也是RPC server 的一種。 此外,由圖二你也會知道,不論是客戶端還是服務器端,要使用 NFS 時,兩者都需要啓動 RPC 才行。
  更多的 NFS 相關協議信息你可以參考下面網頁:
     http://www.faqs.org/rfcs/rfc1094.html
     http://www.tldp.org/HOWTO/NFS-HOWTO/index.html


所以,root用戶的權限在嘗試修改文件服務器上的文件時,文件系統將其識別爲65534,匿名用戶,限制了其寫文件的權限。並且0~1024端口系統是保留做文件傳輸用的。

所以我們嘗試換個用戶啓動xxx系統,但發現啓動apache的httpd時,80端口沒有權限使用。所以需要修改apache的目錄的屬性,設置setid

先看看http://www.cnblogs.com/qlwy/archive/2011/06/26/2121919.html以下爲摘要

衆所周知,Linux的文件權限如: 777;666等,其實只要在相應的文件上加上UID的權限,就可以用到加權限人的身份去運行這個文件。所以我們只需要將bash複製出來到另一個地方,然後用root加上UID權限,只要用戶運行此Shell就可以用用root的身份來執行任何文件了

一個文件都有一個所有者, 表示該文件是誰創建的. 同時, 該文件還有一個組編號, 表示該文件所屬的組, 一般爲文件所有者所屬的組.

如果是一個可執行文件, 那麼在執行時, 一般該文件只擁有調用該文件的用戶具有的權限. 而setuid, setgid 可以來改變這種設置. 

setuid:該位是讓普通用戶可以以root用戶的角色運行只有root帳號才能運行的程序或命令。比如我們用普通用戶運行passwd命令來更改自己的口令,實際上最終更改的是/etc/passwd文件我們知道/etc/passwd文件是用戶管理的配置文件,只有root權限的用戶才能更改

  [root@localhost ~]# ls -l /etc/passwd

  -rw-r--r-- 1 root root 2379 04-21 13:18 /etc/passwd

  作爲普通用戶如果修改自己的口令通過修改/etc/passwd肯定是不可完成的任務,但是不是可以通過一個命令來修改呢答案是肯定的,作爲普通用戶可以通過passwd 來修改自己的口令這歸功於passwd命令的權限我們來看一下;

  [root@localhost ~]# ls -l /usr/bin/passwd

  -r-s--x--x 1 root root 21944 02-12 16:15 /usr/bin/passwd

  因爲/usr/bin/passwd 文件已經設置了setuid 權限位(也就是r-s--x--x中的s),所以普通用戶能臨時變成root,間接的修改/etc/passwd,以達到修改自己口令的權限

修改了apache的安裝目錄的屬性爲“drswxr-xr-x”,再啓動應用系統,就OK了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章