Cấu hình hệ thông

Tài liệu này mô tả các bước cơ bản để thiết lập Odoo trong sản xuất hoặc trên máy chủ kết nối internet. Nó tuân theo installation và thường không cần thiết đối với một hệ thống phát triển không được hiển thị trên internet.

Cảnh báo

Nếu bạn đang thiết lập một máy chủ công cộng, hãy nhớ kiểm tra các đề xuất Bảo vệ của chúng tôi!

bộ lọc db

Odoo là một hệ thống có nhiều bên thuê: một hệ thống Odoo duy nhất có thể chạy và phục vụ một số phiên bản cơ sở dữ liệu. Nó cũng có khả năng tùy biến cao, với các tùy chỉnh (bắt đầu từ các mô-đun đang được tải) tùy thuộc vào "cơ sở dữ liệu hiện tại".

Đây không phải là vấn đề khi làm việc với chương trình phụ trợ (máy khách web) với tư cách là người dùng công ty đã đăng nhập: cơ sở dữ liệu có thể được chọn khi đăng nhập và các tùy chỉnh được tải sau đó.

Tuy nhiên, đây là một vấn đề đối với người dùng chưa đăng nhập (cổng thông tin, trang web) không bị ràng buộc với cơ sở dữ liệu: Odoo cần biết cơ sở dữ liệu nào sẽ được sử dụng để tải trang web hoặc thực hiện thao tác. Nếu không sử dụng nhiều cơ sở dữ liệu thì đó không phải là vấn đề thì chỉ có một cơ sở dữ liệu để sử dụng nhưng nếu có nhiều cơ sở dữ liệu có thể truy cập được thì Odoo cần có quy tắc để biết nên sử dụng cơ sở dữ liệu nào.

Đó là một trong những mục đích của --db-filter: nó chỉ định cách chọn cơ sở dữ liệu dựa trên tên máy chủ (miền) đang được yêu cầu. Giá trị là biểu thức chính quy, có thể bao gồm tên máy chủ được chèn động (%h) hoặc tên miền phụ đầu tiên (%d) mà hệ thống đang được truy cập thông qua đó.

Đối với các máy chủ lưu trữ nhiều cơ sở dữ liệu đang được sản xuất, đặc biệt nếu sử dụng trang web, dbfilter phải được đặt, nếu không một số tính năng sẽ không hoạt động chính xác.

Mẫu cấu hình

  • Chỉ hiển thị cơ sở dữ liệu có tên bắt đầu bằng 'mycompany'

trong tệp cấu hình được đặt:

[options]
dbfilter = ^mycompany.*$
  • Chỉ hiển thị cơ sở dữ liệu khớp với tên miền phụ đầu tiên sau www: ví dụ: cơ sở dữ liệu "mycompany" sẽ được hiển thị nếu yêu cầu đến được gửi đến www.mycompany.com hoặc mycompany.co.uk , nhưng không dành cho www2.mycompany.com hoặc helpdesk.mycompany.com.

trong tệp cấu hình được đặt:

[options]
dbfilter = ^%d$

Ghi chú

Việc đặt --db-filter thích hợp là một phần quan trọng để đảm bảo việc triển khai của bạn. Khi nó hoạt động chính xác và chỉ khớp với một cơ sở dữ liệu cho mỗi tên máy chủ, bạn nên chặn quyền truy cập vào màn hình trình quản lý cơ sở dữ liệu và sử dụng tham số khởi động --no-database-list để ngăn việc liệt kê cơ sở dữ liệu của bạn, và chặn quyền truy cập vào màn hình quản lý cơ sở dữ liệu. Xem thêm bảo mật.

PostgreSQL

Theo mặc định, PostgreSQL chỉ cho phép kết nối qua ổ cắm UNIX và kết nối loopback (từ "localhost", cùng một máy mà máy chủ PostgreSQL được cài đặt trên đó).

Ổ cắm UNIX phù hợp nếu bạn muốn Odoo và PostgreSQL thực thi trên cùng một máy và là mặc định khi không có máy chủ nào được cung cấp, nhưng nếu bạn muốn Odoo và PostgreSQL thực thi trên các máy khác nhau thì nó sẽ cần phải nghe giao diện mạng 2, hoặc:

  • Chỉ chấp nhận kết nối vòng lặp ngược và sử dụng đường hầm SSH giữa máy chạy Odoo và máy chạy PostgreSQL, sau đó định cấu hình Odoo để kết nối với cuối đường hầm

  • Chấp nhận kết nối với máy đã cài đặt Odoo, có thể qua ssl (xem Cài đặt kết nối PostgreSQL để biết chi tiết), sau đó định cấu hình Odoo để kết nối qua mạng

Mẫu cấu hình

  • Cho phép kết nối tcp trên localhost

  • Cho phép kết nối tcp từ mạng 192.168.1.x

trong bộ /etc/postgresql/<PHIÊN BẢN POSTGRESQL CỦA BẠN>/main/pg_hba.conf:

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.0/24          md5

trong bộ /etc/postgresql/<PHIÊN BẢN POSTGRESQL CỦA BẠN>/main/postgresql.conf:

listen_addresses = 'localhost,192.168.1.2'
port = 5432
max_connections = 80

Định cấu hình Odoo

Ngay lập tức, Odoo kết nối với một postgres cục bộ qua ổ cắm UNIX qua cổng 5432. Điều này có thể được ghi đè bằng cách sử dụng the cơ sở dữ liệu các tùy chọn khi việc triển khai Postgres của bạn không cục bộ và/hoặc không sử dụng cài đặt mặc định.

trình cài đặt được đóng gói sẽ tự động tạo một người dùng mới (odoo) và đặt người dùng đó làm người dùng cơ sở dữ liệu.

  • Màn hình quản lý cơ sở dữ liệu được bảo vệ bởi cài đặt admin_passwd. Cài đặt này chỉ có thể được đặt bằng cách sử dụng tệp cấu hình và chỉ được kiểm tra trước khi thực hiện thay đổi cơ sở dữ liệu. Nó phải được đặt thành giá trị được tạo ngẫu nhiên để đảm bảo bên thứ ba không thể sử dụng giao diện này.

  • Tất cả các hoạt động cơ sở dữ liệu đều sử dụng database options, bao gồm cả màn hình quản lý cơ sở dữ liệu. Để màn hình quản lý cơ sở dữ liệu hoạt động yêu cầu người dùng PostgreSQL phải có quyền createdb.

  • Người dùng luôn có thể bỏ cơ sở dữ liệu mà họ sở hữu. Để màn hình quản lý cơ sở dữ liệu hoàn toàn không hoạt động, người dùng PostgreSQL cần được tạo bằng no-createdb và cơ sở dữ liệu phải thuộc sở hữu của một người dùng PostgreSQL khác.

    Cảnh báo

    người dùng PostgreSQL không được là siêu người dùng

Mẫu cấu hình

  • kết nối với máy chủ PostgreSQL trên 192.168.1.2

  • cổng 5432

  • sử dụng tài khoản người dùng 'odoo',

  • với 'pwd' làm mật khẩu

  • chỉ lọc db có tên bắt đầu bằng 'mycompany'

trong tệp cấu hình được đặt:

[options]
admin_passwd = mysupersecretpassword
db_host = 192.168.1.2
db_port = 5432
db_user = odoo
db_password = pwd
dbfilter = ^mycompany.*$

SSL giữa Odoo và PostgreSQL

Kể từ Odoo 11.0, bạn có thể thực thi kết nối ssl giữa Odoo và PostgreSQL. trong Odoo, db_sslmode kiểm soát tính bảo mật ssl của kết nối với giá trị được chọn ngoài 'vô hiệu hóa', 'cho phép', 'thích', 'yêu cầu', 'xác minh-ca' hoặc 'xác minh-đầy đủ'

Tài liệu PostgreSQL

Máy chủ tích hợp

Odoo bao gồm các máy chủ HTTP, cron và trò chuyện trực tiếp tích hợp, sử dụng đa luồng hoặc đa xử lý.

Máy chủ đa luồng là một máy chủ đơn giản hơn, chủ yếu được sử dụng để phát triển, trình diễn và tương thích với nhiều hệ điều hành khác nhau (bao gồm cả Windows). Một luồng mới được sinh ra cho mọi yêu cầu HTTP mới, ngay cả đối với các kết nối tồn tại lâu dài như websocket. Các chủ đề cron daemon bổ sung cũng được sinh ra. Do giới hạn của Python (GIL), nó không tận dụng được phần cứng một cách tốt nhất.

Máy chủ đa luồng là máy chủ mặc định, cũng dành cho các vùng chứa docker. Nó được chọn bằng cách bỏ tùy chọn --workers hoặc đặt nó thành 0.

Máy chủ đa xử lý là máy chủ toàn diện được sử dụng chủ yếu cho hoạt động sản xuất. Nó không chịu trách nhiệm về giới hạn Python (GIL) tương tự đối với việc sử dụng tài nguyên và do đó tận dụng phần cứng một cách tốt nhất. Một nhóm công nhân được tạo khi khởi động máy chủ. Các yêu cầu HTTP mới được hệ điều hành xếp hàng đợi cho đến khi có nhân viên sẵn sàng xử lý chúng. Một nhân viên HTTP theo sự kiện bổ sung dành cho cuộc trò chuyện trực tiếp sẽ được tạo ra trên một cổng thay thế. Công nhân cron bổ sung cũng được sinh ra. Trình thu thập quy trình có thể định cấu hình sẽ giám sát việc sử dụng tài nguyên và có thể loại bỏ/khởi động lại các công nhân bị lỗi.

Máy chủ đa xử lý được chọn tham gia. Nó được chọn bằng cách đặt tùy chọn --workers thành số nguyên không null.

Ghi chú

Vì nó được tùy biến cao cho các máy chủ Linux nên máy chủ đa xử lý không có sẵn trên Windows.

Tính số lượng công nhân

  • Nguyên tắc chung: (#CPU * 2) + 1

  • Công nhân Cron cần CPU

  • 1 nhân viên ~= 6 người dùng đồng thời

tính toán kích thước bộ nhớ

  • Chúng tôi coi 20% yêu cầu là những yêu cầu nặng nề, trong khi 80% là những yêu cầu đơn giản hơn

  • Một người làm việc nặng nhọc, khi tất cả trường tính toán đều được thiết kế tốt, các yêu cầu SQL cũng được thiết kế tốt,… ước tính sẽ tiêu tốn khoảng 1GB RAM

  • Một công nhân nhẹ hơn, trong cùng một kịch bản, ước tính sẽ tiêu thụ khoảng 150 MB RAM

Cần RAM = #worker * ( (light_worker_ratio * light_worker_ram_estimation) + (heavy_worker_ratio * Heavy_worker_ram_estimation) )

Trò chuyện trực tiếp

Trong đa xử lý, một nhân viên LiveChat chuyên dụng sẽ tự động khởi động và lắng nghe --gevent-port. Theo mặc định, các yêu cầu HTTP sẽ tiếp tục truy cập vào các nhân viên HTTP thông thường thay vì yêu cầu LiveChat. Bạn phải triển khai proxy trước Odoo và chuyển hướng các yêu cầu đến có đường dẫn bắt đầu bằng /websocket/ tới nhân viên LiveChat. Bạn cũng phải khởi động Odoo trong --proxy-mode để nó sử dụng các tiêu đề máy khách thực (chẳng hạn như tên máy chủ, sơ đồ và IP) thay vì các tiêu đề proxy.

Mẫu cấu hình

  • Máy chủ có 4 CPU, 8 Thread

  • 60 người dùng đồng thời

  • 60 người dùng / 6 = 10 <- số lượng công nhân cần thiết theo lý thuyết

  • (4 * 2) + 1 = 9 <- số lượng công nhân tối đa theo lý thuyết

  • Chúng tôi sẽ sử dụng 8 công nhân + 1 cho cron. Chúng tôi cũng sẽ sử dụng hệ thống giám sát để đo tải CPU và kiểm tra xem nó có nằm trong khoảng từ 7 đến 7,5 hay không.

  • RAM = 9 * ((0,8*150) + (0,2*1024)) ~= 3Go RAM cho Odoo

trong tệp cấu hình:

[options]
limit_memory_hard = 1677721600
limit_memory_soft = 629145600
limit_request = 8192
limit_time_cpu = 600
limit_time_real = 1200
max_cron_threads = 1
workers = 8

HTTPS

Cho dù được truy cập thông qua trang web/máy khách web hay dịch vụ web, Odoo đều truyền thông tin xác thực ở dạng văn bản rõ ràng. Điều này có nghĩa là việc triển khai Odoo an toàn phải sử dụng HTTPS3. Việc chấm dứt SSL có thể được triển khai thông qua bất kỳ proxy chấm dứt SSL nào, nhưng yêu cầu thiết lập sau:

  • Kích hoạt chế độ proxy của Odoo. Điều này chỉ nên được kích hoạt khi Odoo sử dụng proxy ngược

  • Thiết lập proxy chấm dứt SSL (Ví dụ chấm dứt Nginx)

  • Tự thiết lập proxy (Ví dụ về proxy Nginx)

  • Proxy chấm dứt SSL của bạn cũng sẽ tự động chuyển hướng các kết nối không an toàn đến cổng an toàn

Mẫu cấu hình

  • Chuyển hướng yêu cầu http sang https

  • Yêu cầu proxy tới odoo

trong tệp cấu hình được đặt:

proxy_mode = True

trong bộ /etc/nginx/sites-enabled/odoo.conf:

#odoo server
upstream odoo {
  server 127.0.0.1:8069;
}
upstream odoochat {
  server 127.0.0.1:8072;
}
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

# http -> https
server {
  listen 80;
  server_name odoo.mycompany.com;
  rewrite ^(.*) https://$host$1 permanent;
}

server {
  listen 443 ssl;
  server_name odoo.mycompany.com;
  proxy_read_timeout 720s;
  proxy_connect_timeout 720s;
  proxy_send_timeout 720s;

  # SSL parameters
  ssl_certificate /etc/ssl/nginx/server.crt;
  ssl_certificate_key /etc/ssl/nginx/server.key;
  ssl_session_timeout 30m;
  ssl_protocols TLSv1.2;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers off;

  # log
  access_log /var/log/nginx/odoo.access.log;
  error_log /var/log/nginx/odoo.error.log;

  # Redirect websocket requests to odoo gevent port
  location /websocket {
    proxy_pass http://odoochat;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    proxy_cookie_flags session_id samesite=lax secure;  # requires nginx 1.19.8
  }

  # Redirect requests to odoo backend server
  location / {
    # Add Headers for odoo proxy mode
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_redirect off;
    proxy_pass http://odoo;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    proxy_cookie_flags session_id samesite=lax secure;  # requires nginx 1.19.8
  }

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

Tăng cường HTTPS

Thêm tiêu đề Strict-Transport-Security vào tất cả các yêu cầu để ngăn trình duyệt gửi yêu cầu HTTP đơn giản đến miền này. Bạn sẽ cần phải duy trì dịch vụ HTTPS đang hoạt động với chứng chỉ hợp lệ trên miền này mọi lúc, nếu không người dùng của bạn sẽ thấy cảnh báo bảo mật hoặc hoàn toàn không thể truy cập vào nó.

Buộc kết nối HTTPS trong một năm đối với mọi khách truy cập trong NGINX bằng dòng:

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

Cấu hình bổ sung có thể được xác định cho cookie session_id. Cờ Secure có thể được thêm vào để đảm bảo nó không bao giờ được truyền qua HTTP và SameSite=Lax để ngăn chặn CSRF được xác thực.

# requires nginx 1.19.8
proxy_cookie_flags session_id samesite=lax secure;

Odoo dưới dạng ứng dụng WSGI

Cũng có thể gắn Odoo như một ứng dụng WSGI tiêu chuẩn. Odoo cung cấp cơ sở cho tập lệnh khởi chạy WSGI dưới dạng odoo-wsgi.example.py. Tập lệnh đó phải được tùy chỉnh (có thể sau khi sao chép nó từ thư mục thiết lập) để đặt cấu hình chính xác trực tiếp trong odoo.tools.config thay vì thông qua dòng lệnh hoặc tệp cấu hình.

Tuy nhiên, máy chủ WSGI sẽ chỉ hiển thị điểm cuối HTTP chính cho ứng dụng khách web, trang web và API dịch vụ web. Bởi vì Odoo không kiểm soát việc tạo các công nhân nữa nên nó không thể thiết lập các công nhân cron hoặc livechat

Công nhân định kỳ

Cần phải khởi động một trong các máy chủ Odoo tích hợp bên cạnh máy chủ WSGI để xử lý các công việc định kỳ. Máy chủ đó phải được định cấu hình để chỉ xử lý các crons chứ không phải các yêu cầu HTTP bằng cách sử dụng tùy chọn --no-http cli hoặc cài đặt tệp cấu hình http_enable = False.

Trên các hệ thống giống Linux, nên sử dụng máy chủ đa xử lý thay vì máy chủ đa luồng để hưởng lợi từ việc sử dụng phần cứng tốt hơn và tăng độ ổn định, tức là sử dụng --workers=-1--max-cron-threads=n tùy chọn cli.

Trò chuyện trực tiếp

Cần phải sử dụng máy chủ WSGI tương thích với gevent để tính năng trò chuyện trực tiếp hoạt động chính xác. Máy chủ đó có thể xử lý nhiều kết nối lâu dài đồng thời nhưng không cần nhiều sức mạnh xử lý. Tất cả các yêu cầu có đường dẫn bắt đầu bằng /websocket/ phải được chuyển hướng đến máy chủ đó. Nên sử dụng máy chủ WSGI thông thường (dựa trên luồng/quy trình) cho tất cả các yêu cầu khác.

Máy chủ cron của Odoo cũng có thể được sử dụng để phục vụ các yêu cầu trò chuyện trực tiếp. Chỉ cần thả tùy chọn --no-http cli khỏi máy chủ cron và đảm bảo các yêu cầu có đường dẫn bắt đầu bằng /websocket/ được chuyển hướng đến máy chủ này, trên --http-port (máy chủ đa luồng) hoặc trên --gevent-port (máy chủ đa xử lý).

Cung cấp các tệp tĩnh và tệp đính kèm

Để thuận tiện cho việc phát triển, Odoo phục vụ trực tiếp tất cả các tệp tĩnh và tệp đính kèm trong các mô-đun của nó. Điều này có thể không lý tưởng khi nói đến hiệu suất và các tệp tĩnh thường phải được phục vụ bởi máy chủ HTTP tĩnh.

Phục vụ các tập tin tĩnh

Các tệp tĩnh của Odoo được đặt trong thư mục static/ của mỗi mô-đun, vì vậy các tệp tĩnh có thể được cung cấp bằng cách chặn tất cả các yêu cầu tới /MODULE/static/FILE và tra cứu mô-đun phù hợp (và tệp) trong các đường dẫn bổ trợ khác nhau.

Bạn nên đặt tiêu đề Content-Security-Policy: default-src 'none' trên tất cả các hình ảnh được máy chủ web phân phối. Điều này không thực sự cần thiết vì người dùng không thể sửa đổi/đưa nội dung vào bên trong thư mục static/ của mô-đun và các hình ảnh hiện có là hình ảnh cuối cùng (chúng không tự tìm nạp tài nguyên mới). Tuy nhiên, đó là thực hành tốt.

Sử dụng cấu hình NGINX (https) ở trên, các khối maplocation sau đây sẽ được thêm vào để phân phát các tệp tĩnh thông qua NGINX.

map $sent_http_content_type $content_type_csp {
    default "";
    ~image/ "default-src 'none'";
}

server {
    # the rest of the configuration

    location @odoo {
        # copy-paste the content of the / location block
    }

    # Serve static files right away
    location ~ ^/[^/]+/static/.+$ {
        # root and try_files both depend on your addons paths
        root ...;
        try_files ... @odoo;
        expires 24h;
        add_header Content-Security-Policy $content_type_csp;
    }
}

Các lệnh roottry_files thực tế phụ thuộc vào cài đặt của bạn, cụ thể là vào --addons-path.

Example

Giả sử Odoo đã được cài đặt thông qua gói debian dành cho Cộng đồng và Doanh nghiệp và --addons-path'/usr/lib/ python3/dist-packages/odoo/addons'.

roottry_files phải là:

root /usr/lib/python3/dist-packages/odoo/addons;
try_files $uri @odoo;

Cung cấp tệp đính kèm

Tệp đính kèm là các tệp được lưu trữ trong kho tệp mà quyền truy cập được Odoo quy định. Chúng không thể được truy cập trực tiếp qua máy chủ web tĩnh vì việc truy cập chúng đòi hỏi phải tra cứu nhiều lần trong cơ sở dữ liệu để xác định nơi lưu trữ tệp và liệu người dùng hiện tại có thể truy cập chúng hay không.

Tuy nhiên, khi tệp đã được định vị và quyền truy cập được xác minh bởi Odoo, bạn nên phân phát tệp bằng máy chủ web tĩnh thay vì Odoo. Để Odoo ủy quyền cung cấp các tệp cho máy chủ web tĩnh, X-Sendfile (apache) hoặc X-Accel (nginx) tiện ích mở rộng phải được bật và định cấu hình trên máy chủ web tĩnh. Sau khi được thiết lập, hãy khởi động Odoo với cờ CLI --x-sendfile CLI (cờ duy nhất này được sử dụng cho cả X-Sendfile và X-Accel).

Ghi chú

  • Tiện ích mở rộng X-Sendfile cho apache (và các máy chủ web tương thích) không yêu cầu bất kỳ cấu hình bổ sung nào.

  • Tiện ích mở rộng X-Accel cho NGINX không yêu cầu cấu hình bổ sung sau:

    location /web/filestore {
        internal;
        alias /path/to/odoo/data-dir/filestore;
    }
    

    Trong trường hợp bạn không biết đường dẫn đến kho lưu trữ tệp của mình là gì, hãy khởi động Odoo với tùy chọn --x-sendfile và điều hướng đến ``/web/filestore `` URL trực tiếp qua Odoo (không điều hướng đến URL qua NGINX). Thao tác này sẽ ghi lại cảnh báo, thông báo chứa cấu hình bạn cần.

Bảo vệ

Đối với những người mới bắt đầu, hãy nhớ rằng việc bảo mật hệ thống thông tin là một quá trình liên tục chứ không phải là hoạt động một lần. Tại bất kỳ thời điểm nào, bạn sẽ chỉ được an toàn như mắt xích yếu nhất trong môi trường của mình.

Vì vậy, vui lòng không coi phần này là danh sách các biện pháp cuối cùng sẽ ngăn chặn mọi vấn đề bảo mật. Nó chỉ nhằm mục đích tóm tắt những điều quan trọng đầu tiên mà bạn nên chắc chắn đưa vào kế hoạch hành động bảo mật của mình. Phần còn lại sẽ đến từ các phương pháp bảo mật tốt nhất cho hệ điều hành và bản phân phối của bạn, các phương pháp hay nhất về người dùng, mật khẩu và quản lý kiểm soát truy cập, v.v.

Khi triển khai máy chủ kết nối internet, hãy đảm bảo xem xét các chủ đề liên quan đến bảo mật sau:

  • Luôn đặt mật khẩu quản trị viên siêu quản trị mạnh và hạn chế quyền truy cập vào các trang quản lý cơ sở dữ liệu ngay khi hệ thống được thiết lập. Xem Bảo mật quản lý cơ sở dữ liệu.

  • Chọn thông tin đăng nhập duy nhất và mật khẩu mạnh cho tất cả tài khoản quản trị viên trên tất cả cơ sở dữ liệu. Không sử dụng 'admin' làm thông tin đăng nhập. Không sử dụng những thông tin đăng nhập đó cho các hoạt động hàng ngày, chỉ để kiểm soát/quản lý quá trình cài đặt. Không bao giờ sử dụng bất kỳ mật khẩu mặc định nào như quản trị viên/quản trị viên, ngay cả đối với cơ sở dữ liệu thử nghiệm/tổ chức.

  • Không cài đặt dữ liệu demo trên các máy chủ kết nối Internet. Cơ sở dữ liệu có dữ liệu demo chứa thông tin đăng nhập và mật khẩu mặc định có thể được sử dụng để xâm nhập vào hệ thống của bạn và gây ra rắc rối đáng kể, ngay cả trên hệ thống dàn dựng/nhà phát triển.

  • Sử dụng các bộ lọc cơ sở dữ liệu thích hợp ( --db-filter) để hạn chế khả năng hiển thị cơ sở dữ liệu của bạn theo tên máy chủ. Xem bộ lọc db. Bạn cũng có thể sử dụng -d để cung cấp danh sách cơ sở dữ liệu có sẵn (được phân tách bằng dấu phẩy) của riêng bạn để lọc, thay vì để hệ thống tìm nạp tất cả chúng từ phần phụ trợ cơ sở dữ liệu.

  • Sau khi db_namedbfilter của bạn được định cấu hình và chỉ khớp với một cơ sở dữ liệu duy nhất cho mỗi tên máy chủ, bạn nên đặt tùy chọn cấu hình list_db thành False, để ngăn việc liệt kê hoàn toàn cơ sở dữ liệu và chặn truy cập vào màn hình quản lý cơ sở dữ liệu (điều này cũng được hiển thị dưới dạng tùy chọn dòng lệnh --no-database-list)

  • Đảm bảo người dùng PostgreSQL (--db_user) không là siêu người dùng và cơ sở dữ liệu của bạn thuộc sở hữu của một người dùng khác. Ví dụ: chúng có thể thuộc sở hữu của siêu người dùng postgres nếu bạn đang sử dụng db_user chuyên dụng không có đặc quyền. Xem thêm Định cấu hình Odoo.

  • Luôn cập nhật cài đặt bằng cách thường xuyên cài đặt các bản dựng mới nhất, qua GitHub hoặc bằng cách tải xuống phiên bản mới nhất từ ​​https://www.odoo.com/page/download hoặc http://nightly.odoo.com

  • Định cấu hình máy chủ của bạn ở chế độ đa quy trình với các giới hạn phù hợp phù hợp với mức sử dụng thông thường của bạn (bộ nhớ/CPU/thời gian chờ). Xem thêm buildin_server.

  • Chạy Odoo phía sau máy chủ web cung cấp tính năng chấm dứt HTTPS bằng chứng chỉ SSL hợp lệ để ngăn chặn việc nghe lén các thông tin liên lạc bằng văn bản rõ ràng. Chứng chỉ SSL có giá rẻ và có nhiều tùy chọn miễn phí. Định cấu hình proxy web để giới hạn kích thước yêu cầu, đặt thời gian chờ thích hợp, sau đó bật tùy chọn proxy mode. Xem thêm HTTPS.

  • Nếu bạn cần cho phép truy cập SSH từ xa vào máy chủ của mình, hãy đảm bảo đặt mật khẩu mạnh cho tất cả tài khoản, không chỉ root. Chúng tôi thực sự khuyên bạn nên tắt hoàn toàn xác thực dựa trên mật khẩu và chỉ cho phép xác thực khóa chung. Ngoài ra, hãy cân nhắc việc hạn chế quyền truy cập qua VPN, chỉ cho phép các IP đáng tin cậy trong tường lửa và/hoặc chạy hệ thống phát hiện bạo lực như fail2ban hoặc tương đương.

  • Hãy cân nhắc việc cài đặt giới hạn tốc độ thích hợp trên proxy hoặc tường lửa của bạn để ngăn chặn các cuộc tấn công bạo lực và tấn công từ chối dịch vụ. Xem thêm Chặn các cuộc tấn công Brute Force để biết các biện pháp cụ thể.

    Nhiều nhà cung cấp mạng cung cấp tính năng tự động giảm thiểu các cuộc tấn công từ chối dịch vụ phân tán (DDOS), nhưng đây thường là dịch vụ tùy chọn, vì vậy bạn nên tham khảo ý kiến ​​của họ.

  • Bất cứ khi nào có thể, hãy lưu trữ các phiên bản demo/thử nghiệm/dàn dựng công khai của bạn trên các máy khác với máy sản xuất. Và áp dụng các biện pháp phòng ngừa an ninh tương tự như đối với sản xuất.

  • Nếu máy chủ Odoo công khai của bạn có quyền truy cập vào các tài nguyên hoặc dịch vụ mạng nội bộ nhạy cảm (ví dụ: thông qua Vlan riêng), hãy triển khai các quy tắc tường lửa thích hợp để bảo vệ các tài nguyên nội bộ đó. Điều này sẽ đảm bảo rằng máy chủ Odoo không thể bị sử dụng một cách vô tình (hoặc do hành động độc hại của người dùng) để truy cập hoặc làm gián đoạn các tài nguyên nội bộ đó. Thông thường, điều này có thể được thực hiện bằng cách áp dụng quy tắc DENY mặc định gửi đi trên tường lửa, sau đó chỉ cho phép rõ ràng quyền truy cập vào các tài nguyên nội bộ mà máy chủ Odoo cần truy cập. Kiểm soát truy cập lưu lượng IP Systemd cũng có thể hữu ích để triển khai kiểm soát truy cập mạng theo quy trình.

  • Nếu máy chủ Odoo công khai của bạn nằm sau Tường lửa ứng dụng web, bộ cân bằng tải, dịch vụ bảo vệ DDoS minh bạch (như CloudFlare) hoặc một thiết bị cấp mạng tương tự, bạn có thể muốn tránh truy cập trực tiếp vào hệ thống Odoo. Nói chung, rất khó để giữ bí mật địa chỉ IP điểm cuối của máy chủ Odoo của bạn. Ví dụ: chúng có thể xuất hiện trong nhật ký máy chủ web khi truy vấn hệ thống công cộng hoặc trong tiêu đề email được đăng từ Odoo. Trong tình huống như vậy, bạn có thể muốn định cấu hình tường lửa của mình để các điểm cuối không thể truy cập công khai ngoại trừ từ các địa chỉ IP cụ thể của dịch vụ WAF, cân bằng tải hoặc proxy của bạn. Các nhà cung cấp dịch vụ như CloudFlare thường duy trì danh sách công khai các dải địa chỉ IP của họ cho mục đích này.

  • Nếu bạn đang lưu trữ nhiều khách hàng, hãy tách biệt dữ liệu và tệp khách hàng với nhau bằng cách sử dụng vùng chứa hoặc kỹ thuật "tù" thích hợp.

  • Thiết lập sao lưu hàng ngày cơ sở dữ liệu và dữ liệu kho tệp của bạn, đồng thời sao chép chúng vào máy chủ lưu trữ từ xa mà chính máy chủ đó không thể truy cập được.

  • Khuyến khích triển khai Odoo trên Linux trên Windows. Tuy nhiên, nếu bạn chọn triển khai trên nền tảng Windows, bạn nên tiến hành đánh giá tăng cường bảo mật kỹ lưỡng cho máy chủ và nằm ngoài phạm vi của hướng dẫn này.

Chặn các cuộc tấn công Brute Force

Đối với việc triển khai trên Internet, các cuộc tấn công bạo lực vào mật khẩu người dùng là rất phổ biến và không nên bỏ qua mối đe dọa này đối với các máy chủ Odoo. Odoo phát ra một mục nhật ký bất cứ khi nào nỗ lực đăng nhập được thực hiện và báo cáo kết quả: thành công hay thất bại, cùng với thông tin đăng nhập mục tiêu và IP nguồn.

Các mục nhật ký sẽ có dạng sau.

Đăng nhập không thành công:

2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login failed for db:db_name login:admin from 127.0.0.1

Đăng nhập thành công:

2018-07-05 14:56:31,506 24849 INFO db_name odoo.addons.base.res.res_users: Login successful for db:db_name login:admin from 127.0.0.1

Những nhật ký này có thể được phân tích dễ dàng bằng hệ thống ngăn chặn xâm nhập như fail2ban.

Ví dụ: định nghĩa bộ lọc failed2ban sau đây phải khớp với thông tin đăng nhập không thành công:

[Definition]
failregex = ^ \d+ INFO \S+ \S+ Login failed for db:\S+ login:\S+ from <HOST>
ignoreregex =

Điều này có thể được sử dụng với định nghĩa jail để chặn IP tấn công trên HTTP(S).

Đây là giao diện của việc chặn IP trong 15 phút khi phát hiện 10 lần đăng nhập thất bại từ cùng một IP trong vòng 1 phút:

[odoo-login]
enabled = true
port = http,https
bantime = 900  ; 15 min ban
maxretry = 10  ; if 10 attempts
findtime = 60  ; within 1 min  /!\ Should be adjusted with the TZ offset
logpath = /var/log/odoo.log  ;  set the actual odoo log path here

Bảo mật quản lý cơ sở dữ liệu

Định cấu hình Odoo đã đề cập đến admin_passwd khi chuyển qua.

Cài đặt này được sử dụng trên tất cả các màn hình quản lý cơ sở dữ liệu (để tạo, xóa, kết xuất hoặc khôi phục cơ sở dữ liệu).

Nếu hoàn toàn không thể truy cập được màn hình quản lý, bạn nên đặt tùy chọn cấu hình list_db thành False, để chặn quyền truy cập vào tất cả các màn hình quản lý và lựa chọn cơ sở dữ liệu.

Cảnh báo

Chúng tôi thực sự khuyên bạn nên tắt Trình quản lý cơ sở dữ liệu cho mọi hệ thống sử dụng Internet! Nó được coi như một công cụ phát triển/demo, giúp bạn dễ dàng tạo và quản lý cơ sở dữ liệu một cách nhanh chóng. Nó không được thiết kế để sử dụng trong sản xuất và thậm chí có thể tiết lộ các tính năng nguy hiểm cho kẻ tấn công. Nó cũng không được thiết kế để xử lý cơ sở dữ liệu lớn và có thể gây ra giới hạn bộ nhớ.

Trên các hệ thống sản xuất, quản trị viên hệ thống phải luôn thực hiện các hoạt động quản lý cơ sở dữ liệu, bao gồm việc cung cấp cơ sở dữ liệu mới và sao lưu tự động.

Đảm bảo thiết lập tham số db_name thích hợp (và cả dbfilter tùy chọn) để hệ thống có thể xác định cơ sở dữ liệu đích cho mỗi yêu cầu, nếu không người dùng sẽ bị chặn vì không được phép chọn chính cơ sở dữ liệu đó.

Nếu màn hình quản lý chỉ có thể truy cập được từ một nhóm máy đã chọn, hãy sử dụng các tính năng của máy chủ proxy để chặn quyền truy cập vào tất cả các tuyến bắt đầu bằng /web/database ngoại trừ (có thể) /web/database/selector hiển thị màn hình lựa chọn cơ sở dữ liệu.

Nếu màn hình quản lý cơ sở dữ liệu có thể truy cập được, thì cài đặt admin_passwd phải được thay đổi từ mặc định quản trị viên của nó: mật khẩu này được kiểm tra trước khi cho phép các hoạt động thay đổi cơ sở dữ liệu.

Nó phải được lưu trữ an toàn và phải được tạo ngẫu nhiên, ví dụ:

$ python3 -c 'import base64, os; print(base64.b64encode(os.urandom(24)))'

tạo ra một chuỗi có thể in giả ngẫu nhiên gồm 32 ký tự.

Đặt lại mật khẩu chính

Có thể có trường hợp mật khẩu chính bị thất lạc hoặc bị lộ và cần phải đặt lại. Quy trình sau đây dành cho quản trị viên hệ thống của cơ sở dữ liệu tại chỗ Odoo, nêu chi tiết cách đặt lại và mã hóa lại mật khẩu chính theo cách thủ công.

Xem thêm

Để biết thêm thông tin về cách thay đổi mật khẩu tài khoản Odoo.com, hãy xem tài liệu này: đổi mật khẩu tài khoản Odoo.com.

Khi tạo cơ sở dữ liệu tại chỗ mới, mật khẩu chính ngẫu nhiên sẽ được tạo. Odoo khuyên bạn nên sử dụng mật khẩu này để bảo mật cơ sở dữ liệu. Mật khẩu này được triển khai theo mặc định, do đó có một mật khẩu chính an toàn cho mọi hoạt động triển khai tại chỗ của Odoo.

Cảnh báo

Khi tạo cơ sở dữ liệu tại chỗ của Odoo, bất kỳ ai trên internet đều có thể truy cập cài đặt cho đến khi mật khẩu này được đặt để bảo mật cơ sở dữ liệu.

Mật khẩu chính được chỉ định trong tệp cấu hình Odoo (odoo.conf hoặc odoorc (tệp ẩn)). Cần có mật khẩu chính Odoo để sửa đổi, tạo hoặc xóa cơ sở dữ liệu thông qua giao diện người dùng đồ họa (GUI).

Xác định vị trí tập tin cấu hình

Đầu tiên, mở tệp cấu hình Odoo (odoo.conf hoặc odoorc (tệp ẩn)).

Tệp cấu hình được đặt tại: c:\ProgramFiles\Odoo{VERSION}\server\odoo.conf

Đổi mật khẩu cũ

Khi tệp thích hợp đã được mở, hãy tiến hành sửa đổi mật khẩu cũ trong tệp cấu hình thành mật khẩu tạm thời.

Sau khi định vị tệp cấu hình, hãy mở nó bằng (GUI). Điều này có thể đạt được bằng cách chỉ cần nhấp đúp vào tập tin. Sau đó, thiết bị phải có GUI mặc định để mở tệp.

Tiếp theo, sửa đổi dòng mật khẩu chính admin_passwd = $pbkdf2-sha… thành admin_passwd = newpassword1234 chẳng hạn. Mật khẩu này có thể là bất cứ thứ gì, miễn là nó được lưu tạm thời. Đảm bảo sửa đổi tất cả các ký tự sau =.

Example

Dòng này xuất hiện như sau: admin_passwd = $pbkdf2-sh39dji295.59mptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b573hji540mk/.3ek0lg%kvkol6k983mkf/40fjki79m

Dòng sửa đổi sẽ xuất hiện như sau: admin_passwd = newpassword1234

Quan trọng

Điều cần thiết là mật khẩu phải được thay đổi thành mật khẩu khác, thay vì kích hoạt đặt lại mật khẩu mới bằng cách thêm dấu chấm phẩy ; vào đầu dòng. Điều này đảm bảo cơ sở dữ liệu được an toàn trong toàn bộ quá trình đặt lại mật khẩu.

Khởi động lại máy chủ Odoo

Sau khi đặt mật khẩu tạm thời, việc khởi động lại máy chủ Odoo là bắt buộc.

Để khởi động lại máy chủ Odoo, trước tiên, hãy nhập services vào thanh Windows Search. Sau đó, chọn ứng dụng Services và cuộn xuống dịch vụ Odoo.

Tiếp theo, nhấp chuột phải vào Odoo và chọn Start hoặc Restart. Hành động này sẽ khởi động lại máy chủ Odoo theo cách thủ công.

Sử dụng giao diện web để mã hóa lại mật khẩu

Trước tiên, hãy điều hướng đến /web/database/manager hoặc http://server_ip:port/web/database/manager trong trình duyệt.

Ghi chú

Thay thế server_ip bằng địa chỉ IP của cơ sở dữ liệu. Thay thế port bằng cổng được đánh số mà cơ sở dữ liệu có thể truy cập được từ đó.

Tiếp theo, nhấp vào Đặt mật khẩu chính và nhập mật khẩu tạm thời đã chọn trước đó vào trường Mật khẩu chính. Thực hiện theo bước này, nhập Mật khẩu chính mới. Mật khẩu chính mới được băm (hoặc mã hóa), sau khi nhấp vào nút Tiếp tục.

Tại thời điểm này, mật khẩu đã được đặt lại thành công và phiên bản băm của mật khẩu mới hiện xuất hiện trong tệp cấu hình.

Xem thêm

Để biết thêm thông tin về bảo mật cơ sở dữ liệu Odoo, hãy xem tài liệu này: Bảo mật quản lý cơ sở dữ liệu.

Trình duyệt được hỗ trợ

Odoo hỗ trợ tất cả các trình duyệt di động và máy tính để bàn phổ biến hiện có trên thị trường, miễn là chúng được nhà xuất bản hỗ trợ.

Dưới đây là các trình duyệt được hỗ trợ:

  • Google Chrome

  • Mozilla Firefox

  • Microsoft Edge

  • Táo Safari

Cảnh báo

Vui lòng đảm bảo trình duyệt của bạn được cập nhật và vẫn được nhà xuất bản hỗ trợ trước khi gửi báo cáo lỗi.

Ghi chú

Kể từ Odoo 13.0, ES6 được hỗ trợ. Do đó, hỗ trợ IE bị loại bỏ.

1

để có nhiều bản cài đặt Odoo, hãy sử dụng cùng một cơ sở dữ liệu PostgreSQL hoặc để cung cấp thêm tài nguyên máy tính cho cả hai phần mềm.

2

về mặt kỹ thuật, một công cụ như socat có thể được sử dụng để ủy quyền các ổ cắm UNIX trên các mạng, nhưng công cụ đó chủ yếu dành cho phần mềm chỉ có thể được sử dụng trên các ổ cắm UNIX

3

hoặc chỉ có thể truy cập được qua mạng chuyển gói nội bộ, nhưng điều đó yêu cầu các thiết bị chuyển mạch bảo mật, các biện pháp bảo vệ chống lại giả mạo ARP và ngăn cản việc sử dụng WiFi. Ngay cả trên các mạng chuyển mạch gói an toàn, việc triển khai qua HTTPS vẫn được khuyến khích và chi phí có thể giảm xuống vì chứng chỉ "tự ký" dễ triển khai trên môi trường được kiểm soát hơn so với qua internet.