iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Odoo

Odoo 部署策略系列 第 19

探索 odoo.conf 模板:如何使用 dbfilter 與 list_db 保護資料庫

  • 分享至 

  • xImage
  •  

今天開始的幾篇文章,我會繼續介紹幾個與 odoo.conf反向代理 相關的主題。其實這些內容也非常重要,應該在中場休息之前就寫,只是當時還沒讀完資料,也還沒做完實驗XXD。


odoo.conf 模板

首先,再分享一次我整理的 odoo.conf 範本。由於 odoo.conf 的設定一直以來都跟迷霧一般,網路上也難以找到詳細說明各項參數的資料,因此我將說明和範例直接寫在註解中,讓大家能更直觀地使用。

範本裡的各項設定名稱,是我從官方提供的 odoo/debian/odoo.confdocker/17.0/odoo.conf,再加上網路上許多未提及的設定參數名稱拼湊而成。不過,其中可能包含已被淘汰或錯誤的資訊。所以如果發現有寫錯或新的資訊,歡迎大家發 PR 或是 fork 進行整理。

附註:在這份範本中,對於非官方文件提到的參數名稱,我都標記了 [TODO] Verify if 'xxxxx' option is still valid in Odoo 17. 或是放在 odoo-unconfirmed.conf,如果有人測試過這些參數,也可以將標記移除。


list_db

首先要介紹的設定是 list_db。從下圖可以看到,右側的登入介面多了一個 Manage Databases 的功能,這其實是 odoo 的預設設定。我們在《odoo.conf 內的敏感資訊:分離與保護的策略》中提到過的,直接在網址輸入 /web/database/manager 就能進入的資料庫管理頁面。

Odoo 資料庫管理頁面

如果將 list_db 設為 false,就不會再列出所有資料庫,並且資料庫管理頁面會提示 "The database manager has been disabled by the administrator"。

官方強烈建議對任何向網際網路開放的 odoo 都禁用資料庫管理器,它的設計初衷是為了在開發或測試環境中方便快速地創建和管理資料庫,並不適合在生產環境中使用,這會向攻擊者暴露危險的功能。此外,它也不適合處理大型資料庫,可能會觸發記憶體限制。在生產環境中,資料庫管理操作應該始終由系統管理員執行,包括新資料庫的設定和自動備份。

另外,也可以在啟動參數中加入 --no-database-list,也能達到相同的效果,這我之前還被 GPT 騙過。


dbfilter

odoo 是一個支援多租戶的系統:單一的 Odoo 實例可以運行並服務多個資料庫。而且,odoo 的高度客製化特性,可以讓不同的資料庫可以有不同的模組和設定。

當使用後台(web 客戶端)並以已登入的 user 操作時,這並不會構成問題,因為使用者可以在登入時選擇資料庫,系統也會根據所選的資料庫載入相應的自訂內容;然而,對於未登入的使用者(例如訪問 portal 或 website 的用戶),這可能會產生問題,因為他們沒有與特定的資料庫綁定,odoo 需要知道應該使用哪個資料庫來加載網站頁面或執行相關操作。如果系統中僅有一個資料庫,這就不是問題;但當存在多個可訪問的資料庫時,odoo 需要一個規則來確定應該使用哪一個。

這就是 dbfilter 的作用:它可以根據請求的主機名稱(域名)來指定應該使用的資料庫。該值是一個正則表達式,可以包含動態插入的主機名稱(%h)或系統訪問的第一個子域名(%d)。

設定範例 - 僅選擇名稱以 "example" 開頭的資料庫:

dbfilter = ^example.*$

這個正則表達式 ^example.*$ 的意思如下:

  1. ^:這是錨點,表示行的開始。確保匹配從行的最開頭開始。
  2. example:字串匹配,表示這部分正則式會精確匹配字串 "example"。
  3. .*:代表可以匹配任意長度的字元(包括空字串)。
    • .:匹配任意單個字元(除了換行字元)。
    • *:表示零個或多個前面的字元(即任意字元可以出現零次或多次)。
  4. $:這是錨點,表示行的結尾。確保匹配到行的最末尾。

綜合來看這個 re 可以匹配:

  • example
  • example123
  • example anything goes
    但不能匹配 this is an example(因為這個字串並不是從 "example" 開頭)。

設定範例 - 僅選擇與 www 之後的第一個子域名匹配的資料庫:

例如,如果請求來自 www.example.comexample.co.uk,則會顯示資料庫 "example";但如果來自 www2.example.comhelpdesk.example.com,則不會顯示該資料庫。

dbfilter = ^%d$

在生產環境中使用多個資料庫的伺服器,尤其是使用網站功能時,必須設置 dbfilter,否則許多功能將無法正常運作。

對於正則表達式不熟的人,也可以使用一些線上的測試器來驗證自己寫的正則表達式。

備註:因為我並未在同一個 odoo 實例上使用多個資料庫,因此沒有實際測試過 dbfilter 的設定,只是這看起來很重要,寫在這邊給大家參考,請小心服用。


上一篇
整合 pgAdmin 容器:提升 odoo 開發除錯體驗
下一篇
提升效能:odoo.conf 的多行程伺服器設定介紹
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言