iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Odoo

Odoo 部署策略系列 第 26

又又又是 odoo 安全與效能:X-Sendfile、X-Accel、HSTS、Cookie 安全標記、Gzip 壓縮

  • 分享至 

  • xImage
  •  

今天的內容又又又再次圍繞在反向代理與 odoo 設定的效能改善與安全強化,包括透過 X-Sendfile 和 X-Accel 來處理 odoo 附件的傳輸,並且介紹了三個常見的 nginx 設定:HSTS、Cookie 安全標記與 Gzip 壓縮。


什麼是 odoo 的附件?

在 odoo 中,附件是儲存在 filestore 中的檔案,通常是圖片、PDF 或其他大型檔案。如果將這些附件放在資料庫中,會造成資料庫負擔過重,增加儲存空間需求,並可能導致資料庫鎖定問題,降低資料庫的效能;將附件存放在檔案系統中,有助於減少資料庫的負擔,同時提升檔案的讀寫效率。此外,這種方式簡化了附件的管理,如版本控制和備份。

最後一個優勢是,odoo 將附件儲存在檔案系統中,允許像 NGINX 這樣的靜態伺服器使用 X-Accel 這類委派檔案服務來處理檔案傳輸,進一步減少 odoo 伺服器的負擔。


什麼是委派檔案服務

附件的存取權限由 odoo 嚴格控制,確保只有授權的使用者才能訪問相關檔案。因為附件的存取需要多次資料庫查詢,以確定檔案的存放位置和當前使用者的存取權限,所以這些檔案無法直接透過靜態網路伺服器訪問。為了解決這個問題,當使用者提出需求後,odoo 會驗證權限並找到檔案的位置,然後告訴 NGINX 要去哪裡找到檔案,再由 NGINX 從檔案系統中找到檔案傳送給使用者。


設定 X-Sendfile 與 X-Accel

1. 設定 odoo.conf

首先,確定我們的 data_dir 有指定資料目錄(如果不設定的話,預設會設在 ~/.local/share/odoo):

data_dir = /var/lib/odoo

設置 x-sendfile 選項為 True

# x-sendfile:
# Enable X-Sendfile support to delegate file serving to a web server like NGINX.
x-sendfile = True

要再次確認 filestore 的路徑,可以啟動 odoo,然後直接訪問 /web/filestore URL,odoo 將會記錄相關的警告訊息,我們就可以檢查到它的位置。

2024-10-10 17:27:24 FileNotFoundError: [Errno 2] No such file or directory: '/var/lib/odoo/filestore/odoo/23/23fe89f51c8121f053a697a3dd79106f25aeeb52'

2. docker-compose 掛載設定

確定 odoo 容器有掛載 volume 到我們的 data_dir 位置:

- odoo-dev-data:/var/lib/odoo  # Persistent volume for data and attachments

在 reverse-proxy 容器也掛上這個 volume,並且設定成 readonly:

# Mount odoo filestore for attachments (for serving attachments via X-Accel)
- odoo-dev-data:/opt/odoo-dev/filestore:ro

3. 檔案服務委派

在 NGINX nginx_odoo.confodoo-dev server block 中,添加以下設定透過 X-Accel 服務附件:

# Serve attachments via X-Accel after odoo verifies access
location /web/filestore {
    internal;
    alias /opt/odoo-dev/filestore;
}

HSTS: 強制 HTTPS 使用

nginx_odoo.conf

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

HSTS(HTTP Strict Transport Security) 是一種安全功能,強制瀏覽器在訪問網站時只能使用 HTTPS,而不允許降級為不安全的 HTTP。透過設定 Strict-Transport-Security 標頭,可以告訴瀏覽器未來一段時間內(由 max-age 指定)都應該僅透過 HTTPS 訪問該網站。

  • max-age=31536000:設置 HSTS 的有效期為一年(31536000 秒)。
  • includeSubDomains:此參數指示瀏覽器,除了主域名外,所有子域名也必須強制使用 HTTPS。

Cookie 安全標記: SameSite 與 Secure

nginx_odoo.conf

proxy_cookie_flags session_id samesite=lax secure;  # requires nginx 1.19.8

此設定用來強化 Cookie 的安全性,防止跨站請求偽造(CSRF)攻擊和不安全的 Cookie 傳輸。samesitesecure 是兩個重要的 Cookie 標記:

  • SameSite=Lax:此標記限制瀏覽器只在同一個網站內部(同源)發送 Cookie,而跨站請求則無法使用該 Cookie。這可以減少 CSRF 攻擊的風險。
  • Secure:當 Cookie 被標記為 secure 時,瀏覽器僅會在使用 HTTPS 加密的情況下發送 Cookie,防止 Cookie 在不安全的 HTTP 請求中被竊取。

這個設定尤其適用於處理用戶身份驗證的 Cookie(例如 session_id),能顯著提升網站的安全性。


Gzip 壓縮: 提升效能

nginx.conf

gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
gzip on;

Gzip 壓縮是一種常見的效能優化技術,用來減少傳輸的數據量,從而加快網站的載入速度。透過啟用 Gzip,NGINX 可以壓縮指定類型的檔案,讓這些檔案在傳輸過程中佔用更少的頻寬,提升網頁的載入速度,改善使用者體驗。

  • gzip_types:此參數指定哪些 MIME 類型的檔案應該被壓縮。常見的壓縮類型包括:
    • text/css:樣式表文件
    • text/scss:Sass 样式表
    • text/plain:純文字文件
    • application/json:JSON 文件
    • application/javascript:JavaScript 文件

透過設定 X-Sendfile 或 X-Accel,我們可以在確保安全性的前提下,提升附件服務的效率。不過,這個設定完成後,我一直找不到方法驗證是否有成功,我在 odoo 中進行各種操作,但從日誌中沒看到相關的線索,可能需要等到自己寫一個模組,知道哪個部分會用到這個功能再回來驗證。

另外三個設定,則可以從瀏覽器的開發者選項觀察到:
https://ithelp.ithome.com.tw/upload/images/20241012/20168935FJToGfZmZc.png
https://ithelp.ithome.com.tw/upload/images/20241012/201689351mB2V3f6PF.png


終於是...把反向代理搞定了...吧


上一篇
將 odoo 靜態資源交給反向代理:效能與 XSS 防護的雙重提升
下一篇
docker volume 備份方案:volumerize 讓 odoo 備份更簡單
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言