搜尋

首頁  >  問答  >  主體

运维 - 一台 Web 用途 Python 的Linux 服务器的目录结构、用户分组应该是怎样的?

R.T.
一台运行编译安装配置 CentOS 系统、用于处理 Web 请求的服务器应该怎样处理一下关系:

高洛峰高洛峰2824 天前813

全部回覆(2)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 11:49:48

    我在之前以及現在,在編寫一套虛擬主機面板,因此對權限控制略有想法。在這裡分享我設計的權限控制方案,應該算是比較嚴格的,當然,這可能不是主流方案。

    下文服務指的是資料庫這類軟體,應用是指自己寫的程式。

    所有資料都放在 /home, 例如 mysql 的資料放在 /home/mysql/data; 應用的檔案放在 /home/myapp/web, 每個應用程式用單獨的用戶,以隔離權限。因為資料都在 /home, 只單獨掛載 /home 就可以了。

    每個服務都用單獨的用戶來跑,各種服務不監聽本地端口,而是監聽 unix socket, 因為這樣可以用文件系統來進行更靈活的權限控制。

    大部分檔案都用 750 的權限,也就是自己有完整權限,同組使用者可以讀取和運行,其他使用者不可讀。當一個服務需要讀取另一個應用的檔案的時候,把服務的使用者加到被用到檔案的應用的群組。例如 nginx 需要讀取 myapp 的靜態文件,那就把 http 加到 myapp 群組裡。

    unix socket 略有不同,例如myapp(Python App) 監聽了一個unix socket 提供HTTP 服務,Nginx 需要反代這個服務,那麼這個unix socket 檔案的權限需要是770 才行,不然Nginx 沒法寫這個文件就沒辦法反代請求。

    在使用資料庫的時候,每個應用程式都要用不同的帳號,例如 MySQL 自帶的非常好的權限系統。
    而對於 memcached 這類沒有權限控制的服務,應該為每個應用程式跑一個單獨的實例,然後用 unix socket 做權限控制。

    至於原始碼的部署,我個人傾向於先將程式碼push 到一個單獨的原始碼伺服器(可以是Github 或自建的GitLab), 然後發佈時手動從伺服器pull. 這樣的好處是生產環境有獨立的歷史,源碼伺服器上不必包含一些如帳號密碼等敏感訊息,這些資訊只存在於生產環境的歷史中。

    SELinux 沒用過。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 11:49:48

    分享一下我的組織方法吧,感覺應用場景和題主的差不多。

    目錄結構與多個磁碟掛載點

    在根目錄建立一個 /data,將某個單獨的磁碟掛載在這裡。

    這個目錄裡麵包含諸多子目錄。

    /data
      |-- app/   # 网站程序
      |-- log/   # 各种日志
      |-- ftp/   # ftp 的根
      |-- db/  # 数据库的数据文件
      |-- op/    # op 专用的目录,放一些运维相关的脚本文档什么的
      |-- ...    # 更多的分类,根据需求添加
    

    如果有多塊磁碟也不要建立多個根,而是用軟鏈將 /data 下某個目錄連結到新的磁碟裡。例如上面的ftp/ 可以是一個軟鏈指向其他磁盤,這樣就不佔用/data 的空間了~至於其他磁碟掛在哪,這就無所謂了,你可以就放在/mnt 裡面,好找就行。

    系統程式我會把它正常的裝在/usr/local/* 裡面,設定放在系統常見的/etc/ 裡面,一些運行時的臨時檔案放在/var/run/* 裡面,但是程式log 一定要管理起來,我會放在/data/log/* 裡。

    例如 mysql,binary 放在 /usr/local/bin/mysql*,配置在 /etc/mysql/*,資料在 /data/db/mysql/3306/*,日誌放在 /data/log/mysql/3306/mysql_err.log。其中 binlog 屬於資料的一部分,所以放在 /data/db 裡。

    多用戶管理

    我一般為了安全會禁止系統預設帳號登錄,CentOSroot,同時停用密碼登錄,全部只能用 key 登錄,啟用 UsePAM yes。具體你可以看看 /etc/ssh/sshd_config,裡面有很詳細的註釋,不清楚的話可以上網找。

    可登入的用戶越少越好,我通常只有兩個,一個普通用戶,一個可以 sudo 的超級用戶,這兩個放在不同的 group 裡面。用 PAM 策略只允許這兩個 group 的用戶登錄,/etc/sudoers 裡也是對 group 授權,這樣以後萬一臨時要添加個帳號也方便,只需要放到對應的群組裡面就好。

    啟用應用程式一般就用 www-data,這是一個不允許登入的用戶,shell 設定成了 /sbin/nologin

    像 mysql 喜歡用 mysql 這個用戶,安裝的時候就會自動創建,所以也就隨它去吧。

    ftp 比較特別,一般使用者名稱就叫 ftp,home 就設在 ftp 的根,不放在 /home。如果需要有多個 ftp 帳號,可以考慮用 proftpd 的虛擬帳號,免得建立很多可以登入的帳號有安全性問題。不過我自己並沒有實際遇到這種需求,所以並不清楚虛擬帳號會有其他什麼問題。

    目錄權限

    目錄權限我覺得不用太糾結,畢竟不是在做一個很多人用 VPS,所以只要保證 owner/group 正確,並且盡量給正常的權限就好。

    例如放 web 程式碼的目錄的 owner 是 www-data,群組就是它的群組,目錄權限 0755。裡面的目錄依情況授權,一般就是 0644,需要可執行的給改成 07540755 都可以。一些需要對一般使用者保密的內容(密碼配置啊什麼的)設成 0600 就好了。

    /data/op 這個目錄特別點,因為運維腳本一般都很敏感,我傾向於設定成 owner 為 root 且權限為 0700。不過記得不要把 /data/op 裡面的目錄也設定成這樣的權限,沒必要而且難以管理,正常即可。

    SELinux

    停用掉,很煩人,不想用。

    回覆
    0
  • 取消回覆