پیکربندی سیستم

این سند مراحل اولیه تنظیم Odoo در محیط تولید یا روی سروری که به اینترنت متصل است را توضیح می‌دهد. این مراحل پس از نصب دنبال می‌شوند و به طور کلی برای سیستم‌های توسعه‌ای که به اینترنت متصل نیستند، ضروری نیستند.

هشدار

اگر در حال راه‌اندازی یک سرور عمومی هستید، حتماً توصیه‌های امنیتی ما را بررسی کنید!

فیلتر پایگاه داده

اودو یک سیستم چند مستاجری است: یک سیستم اودو می‌تواند اجرا شده و به چندین نمونه پایگاه داده خدمات ارائه دهد. همچنین، این سیستم به شدت قابل سفارشی‌سازی است، به طوری که سفارشی‌سازی‌ها (از ماژول‌هایی که بارگذاری می‌شوند شروع می‌شود) به "پایگاه داده فعلی" بستگی دارند.

این موضوع هنگام کار با بخش پشتی (کلاینت وب) به‌عنوان یک کاربر شرکت وارد شده مشکلی ایجاد نمی‌کند: پایگاه داده می‌تواند هنگام ورود انتخاب شود و سفارشی‌سازی‌ها پس از آن بارگذاری شوند.

با این حال، این یک مشکل برای کاربران غیر وارد شده (پورتال، وب‌سایت) است که به یک پایگاه داده متصل نیستند: اودو باید بداند کدام پایگاه داده باید برای بارگذاری صفحه وب‌سایت یا انجام عملیات استفاده شود. اگر چند مستاجری استفاده نشود، این مشکلی نیست، زیرا فقط یک پایگاه داده برای استفاده وجود دارد، اما اگر چندین پایگاه داده قابل دسترسی باشد، اودو به یک قانون نیاز دارد تا بداند کدام یک را باید استفاده کند.

این یکی از اهداف --db-filter است: این گزینه مشخص می‌کند که چگونه باید پایگاه داده بر اساس نام میزبان (دامنه) درخواست‌شده انتخاب شود. مقدار آن یک عبارت منظم است که ممکن است شامل نام میزبان تزریق‌شده به صورت پویا (%h) یا اولین زیردامنه (%d) باشد که سیستم از طریق آن دسترسی پیدا می‌کند.

برای سرورهایی که میزبان چندین پایگاه داده در محیط تولید هستند، به‌ویژه اگر از website استفاده شود، تنظیم dbfilter ضروری است، در غیر این صورت تعدادی از ویژگی‌ها به‌درستی کار نخواهند کرد.

نمونه‌های پیکربندی

  • فقط پایگاه‌های داده‌ای را نشان بده که نام آن‌ها با 'mycompany' شروع می‌شود.

در فایل پیکربندی تنظیم کنید:

[options]
dbfilter = ^mycompany.*$
  • فقط پایگاه‌های داده‌ای را نشان دهید که با زیر دامنه اول بعد از www مطابقت دارند: به عنوان مثال، پایگاه داده "mycompany" نمایش داده می‌شود اگر درخواست ورودی به www.mycompany.com یا mycompany.co.uk ارسال شده باشد، اما برای www2.mycompany.com یا helpdesk.mycompany.com نمایش داده نمی‌شود.

در فایل پیکربندی تنظیم کنید:

[options]
dbfilter = ^%d$

توجه

تنظیم صحیح --db-filter بخش مهمی از ایمن‌سازی استقرار شما است. هنگامی که این گزینه به درستی کار می‌کند و تنها یک پایگاه داده را برای هر نام میزبان مطابقت می‌دهد، به شدت توصیه می‌شود که دسترسی به صفحه‌های مدیریت پایگاه داده را مسدود کنید و از پارامتر راه‌اندازی --no-database-list برای جلوگیری از نمایش لیست پایگاه‌های داده خود استفاده کنید و دسترسی به صفحه‌های مدیریت پایگاه داده را مسدود نمایید. همچنین به امنیت مراجعه کنید.

پستگرس‌کیوال

به صورت پیش‌فرض، PostgreSQL فقط اتصال از طریق سوکت‌های UNIX و اتصالات لوپ‌بک (از "localhost"، همان دستگاهی که سرور PostgreSQL روی آن نصب شده است) را مجاز می‌داند.

سوکت UNIX مناسب است اگر بخواهید Odoo و PostgreSQL روی یک ماشین اجرا شوند و این حالت پیش‌فرض است وقتی که هیچ میزبان مشخص نشده باشد، اما اگر بخواهید Odoo و PostgreSQL روی ماشین‌های مختلف اجرا شوند 1 نیاز خواهد بود که به رابط‌های شبکه گوش دهد 2، به یکی از روش‌های زیر:

  • تنها اتصالات لوپ‌بک را بپذیرید و از «تونل SSH»_ بین ماشینی که Odoo روی آن اجرا می‌شود و ماشینی که PostgreSQL روی آن اجرا می‌شود استفاده کنید، سپس Odoo را طوری پیکربندی کنید که به انتهای تونل متصل شود.

  • اتصالات به دستگاهی که Odoo روی آن نصب شده است را بپذیرید، احتمالاً از طریق SSL (برای جزئیات به تنظیمات اتصال PostgreSQL مراجعه کنید)، سپس Odoo را برای اتصال از طریق شبکه پیکربندی کنید.

نمونه پیکربندی

  • اجازه اتصال TCP به لوکال هاست

  • اجازه اتصال TCP از شبکه 192.168.1.x

در /etc/postgresql/<نسخه PostgreSQL شما>/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

در فایل /etc/postgresql/<نسخه PostgreSQL شما>/main/postgresql.conf تنظیم کنید:

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

پیکربندی اودو

به صورت پیش‌فرض، اودو از طریق پورت 5432 به یک پایگاه داده محلی پستگرس از طریق سوکت UNIX متصل می‌شود. این تنظیمات می‌تواند با استفاده از گزینه‌های پایگاه داده تغییر یابد، زمانی که استقرار پستگرس شما محلی نباشد و/یا از تنظیمات پیش‌فرض نصب استفاده نکند.

نصب‌کننده‌های بسته‌بندی‌شده به‌صورت خودکار یک کاربر جدید («odoo») ایجاد کرده و آن را به‌عنوان کاربر پایگاه داده تنظیم می‌کنند.

  • صفحات مدیریت پایگاه داده توسط تنظیمات admin_passwd محافظت می‌شوند. این تنظیم تنها از طریق فایل‌های پیکربندی قابل تنظیم است و قبل از انجام تغییرات در پایگاه داده بررسی می‌شود. این مقدار باید به یک مقدار تصادفی تولید شده تنظیم شود تا اطمینان حاصل شود که اشخاص ثالث نمی‌توانند از این رابط استفاده کنند.

  • تمام عملیات پایگاه داده از گزینه‌های پایگاه داده استفاده می‌کنند، از جمله صفحه مدیریت پایگاه داده. برای عملکرد صفحه مدیریت پایگاه داده، لازم است که کاربر PostgreSQL دارای حق createdb باشد.

  • کاربران همیشه می‌توانند پایگاه‌های داده‌ای که مالک آن‌ها هستند را حذف کنند. برای اینکه صفحه مدیریت پایگاه داده کاملاً غیرفعال شود، کاربر PostgreSQL باید با گزینه «no-createdb» ایجاد شود و پایگاه داده باید متعلق به یک کاربر دیگر PostgreSQL باشد.

    هشدار

    کاربر PostgreSQL نباید یک کاربر ارشد (سوپریوزر) باشد

نمونه پیکربندی

  • اتصال به سرور PostgreSQL در 192.168.1.2

  • پورت ۵۴۳۲

  • با استفاده از حساب کاربری 'odoo'،

  • با 'pwd' به عنوان رمز عبور

  • فیلتر کردن فقط پایگاه‌های داده با نامی که با 'mycompany' شروع می‌شود

در فایل پیکربندی تنظیم کنید:

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

SSL بین Odoo و PostgreSQL

از نسخه ۱۱.۰ اودو، می‌توانید اتصال SSL بین اودو و PostgreSQL را اجباری کنید. در اودو، db_sslmode امنیت SSL اتصال را با مقادیر انتخابی از 'disable'، 'allow'، 'prefer'، 'require'، 'verify-ca' یا 'verify-full' کنترل می‌کند.

مستندات PostgreSQL

سرور داخلی

اودو شامل سرورهای داخلی HTTP، کرون و گفتگوی زنده است که از چندرشته‌ای یا چندپردازشی استفاده می‌کند.

سرور چند رشته‌ای یک سرور ساده‌تر است که عمدتاً برای توسعه، نمایش‌ها و سازگاری با سیستم‌عامل‌های مختلف (از جمله ویندوز) استفاده می‌شود. برای هر درخواست HTTP جدید، حتی برای اتصالات طولانی‌مدت مانند وب‌سوکت، یک رشته جدید ایجاد می‌شود. همچنین رشته‌های کرون اضافی به صورت دایمون ایجاد می‌شوند. به دلیل محدودیت پایتون (GIL)، این سرور بهترین استفاده را از سخت‌افزار نمی‌کند.

سرور چند رشته‌ای سرور پیش‌فرض است، همچنین برای کانتینرهای داکر. این سرور با حذف گزینه --workers یا تنظیم آن به 0 انتخاب می‌شود.

سرور چند پردازشی یک سرور کامل است که عمدتاً برای تولید استفاده می‌شود. این سرور تحت محدودیت‌های مشابه پایتون (GIL) در استفاده از منابع قرار ندارد و بنابراین بهترین استفاده را از سخت‌افزار می‌کند. یک مجموعه از کارگران هنگام راه‌اندازی سرور ایجاد می‌شود. درخواست‌های جدید HTTP توسط سیستم‌عامل صف‌بندی می‌شوند تا زمانی که کارگران آماده پردازش آن‌ها باشند. یک کارگر HTTP مبتنی بر رویداد اضافی برای گفتگوی زنده در یک پورت جایگزین ایجاد می‌شود. کارگران اضافی برای کرون نیز ایجاد می‌شوند. یک فرآیند نظارت قابل تنظیم، استفاده از منابع را کنترل می‌کند و می‌تواند کارگران خراب را متوقف یا مجدداً راه‌اندازی کند.

سرور چندپردازشی به صورت انتخابی فعال می‌شود. این گزینه با تنظیم گزینه --workers به یک عدد صحیح غیرصفر انتخاب می‌شود.

توجه

زیرا این سرور چندپردازشی به طور ویژه برای سرورهای لینوکس سفارشی‌سازی شده است، در ویندوز در دسترس نیست.

محاسبه شماره کارگر

  • قاعده کلی: (#CPU * 2) + 1

  • کارگران کرون به CPU نیاز دارند

  • ۱ کارگر ~= ۶ کاربر همزمان

محاسبه اندازه حافظه

  • ما ۲۰٪ از درخواست‌ها را درخواست‌های سنگین در نظر می‌گیریم، در حالی که ۸۰٪ درخواست‌ها ساده‌تر هستند.

  • یک کارگر سنگین، زمانی که تمام فیلدهای محاسباتی به خوبی طراحی شده باشند و درخواست‌های SQL به خوبی طراحی شده باشند، تخمین زده می‌شود که حدود ۱ گیگابایت رم مصرف کند.

  • یک کارگر سبک‌تر، در همان سناریو، تخمین زده می‌شود که حدود ۱۵۰ مگابایت رم مصرف کند.

رم مورد نیاز = تعداد کارگر * ((نسبت کارگر سبک * تخمین رم کارگر سبک) + (نسبت کارگر سنگین * تخمین رم کارگر سنگین))

گفتگوی زنده

در حالت چندپردازشی، یک کارگر اختصاصی LiveChat به‌طور خودکار راه‌اندازی می‌شود و به --gevent-port گوش می‌دهد. به‌صورت پیش‌فرض، درخواست‌های HTTP همچنان به کارگران معمولی HTTP دسترسی خواهند داشت و نه به کارگر LiveChat. شما باید یک پراکسی در جلوی Odoo مستقر کنید و درخواست‌های ورودی که مسیر آن‌ها با /websocket/ شروع می‌شود را به کارگر LiveChat هدایت کنید. همچنین باید Odoo را در حالت --proxy-mode راه‌اندازی کنید تا از هدرهای واقعی کلاینت (مانند نام میزبان، طرح و IP) به‌جای هدرهای پراکسی استفاده کند.

نمونه پیکربندی

  • سرور با ۴ پردازنده، ۸ رشته

  • ۶۰ کاربر همزمان

  • ۶۰ کاربر / ۶ = ۱۰ <- تعداد نظری کارگر مورد نیاز

  • (4 * 2) + 1 = 9 <- حداکثر تعداد نظری کارگر

  • ما از ۸ کارگر + ۱ برای کرون استفاده خواهیم کرد. همچنین از یک سیستم نظارت برای اندازه‌گیری بار پردازنده استفاده می‌کنیم و بررسی می‌کنیم که آیا بین ۷ و ۷.۵ است.

  • رم = ۹ * ((۰.۸*۱۵۰) + (۰.۲*۱۰۲۴)) ~= ۳ گیگابایت رم برای اودو

در فایل پیکربندی:

[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

چه از طریق وب‌سایت/کلاینت وب یا سرویس وب دسترسی پیدا شود، اودوو اطلاعات احراز هویت را به صورت متن ساده منتقل می‌کند. این بدان معناست که برای استقرار امن اودوو باید از HTTPS استفاده شود. خاتمه SSL می‌تواند از طریق تقریباً هر پروکسی خاتمه SSL پیاده‌سازی شود، اما نیاز به تنظیمات زیر دارد:

  • حالت پروکسی اودو را فعال کنید (proxy mode). این گزینه باید فقط زمانی فعال شود که اودو پشت یک پروکسی معکوس قرار داشته باشد.

  • راه‌اندازی پروکسی پایان SSL (نمونه پایان Nginx)

  • راه‌اندازی خود پروکسی (نمونه پروکسی Nginx)

  • پروکسی پایان SSL شما باید به طور خودکار اتصالات غیر امن را به پورت امن هدایت کند.

نمونه پیکربندی

  • هدایت درخواست‌های http به https

  • درخواست‌های پراکسی به اودوو

در فایل پیکربندی تنظیم کنید:

proxy_mode = True

در /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;
}

تقویت HTTPS

هدر Strict-Transport-Security را به تمام درخواست‌ها اضافه کنید تا از ارسال درخواست‌های HTTP ساده به این دامنه توسط مرورگرها جلوگیری شود. شما باید همیشه یک سرویس HTTPS فعال با گواهی معتبر بر روی این دامنه داشته باشید، در غیر این صورت کاربران شما هشدارهای امنیتی مشاهده خواهند کرد یا به طور کامل قادر به دسترسی به آن نخواهند بود.

اجبار اتصال‌های HTTPS به مدت یک سال برای هر بازدیدکننده در NGINX با خط:

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

پیکربندی‌های اضافی می‌توانند برای کوکی session_id تعریف شوند. پرچم Secure می‌تواند اضافه شود تا اطمینان حاصل شود که هرگز از طریق HTTP منتقل نمی‌شود و SameSite=Lax برای جلوگیری از حملات CSRF احراز هویت شده.

# requires nginx 1.19.8
proxy_cookie_flags session_id samesite=lax secure;

اودو به عنوان یک برنامه WSGI

همچنین امکان نصب اودو به عنوان یک برنامه استاندارد WSGI وجود دارد. اودو پایه‌ای برای یک اسکریپت راه‌انداز WSGI به نام odoo-wsgi.example.py ارائه می‌دهد. این اسکریپت باید سفارشی‌سازی شود (احتمالاً پس از کپی کردن آن از دایرکتوری تنظیمات) تا پیکربندی به‌طور مستقیم در odoo.tools.config تنظیم شود، به جای استفاده از خط فرمان یا یک فایل پیکربندی.

با این حال، سرور WSGI تنها نقطه پایانی اصلی HTTP را برای کلاینت وب، وب‌سایت و API وب‌سرویس ارائه خواهد داد. از آنجا که اودوو دیگر کنترلی بر ایجاد کارگران (workers) ندارد، نمی‌تواند کارگران کرون (cron) یا چت زنده (livechat) را تنظیم کند.

کارگران کرون

برای پردازش وظایف زمان‌بندی‌شده (کرون جاب‌ها)، لازم است یکی از سرورهای داخلی Odoo در کنار سرور WSGI راه‌اندازی شود. این سرور باید به گونه‌ای پیکربندی شود که فقط وظایف زمان‌بندی‌شده را پردازش کند و درخواست‌های HTTP را پردازش نکند. این کار با استفاده از گزینه خط فرمان --no-http یا تنظیم http_enable = False در فایل پیکربندی قابل انجام است.

در سیستم‌های مشابه لینوکس، استفاده از سرور چندپردازشی به جای سرور چندریسمانی توصیه می‌شود تا از استفاده بهتر از سخت‌افزار و پایداری بیشتر بهره‌مند شوید، به عنوان مثال با استفاده از گزینه‌های خط فرمان --workers=-1 و --max-cron-threads=n.

گفتگوی زنده

استفاده از یک سرور WSGI سازگار با gevent برای عملکرد صحیح ویژگی چت زنده ضروری است. این سرور باید بتواند تعداد زیادی اتصال طولانی‌مدت همزمان را مدیریت کند، اما به توان پردازشی زیادی نیاز ندارد. تمام درخواست‌هایی که مسیر آن‌ها با /websocket/ شروع می‌شود باید به این سرور هدایت شوند. برای سایر درخواست‌ها باید از یک سرور WSGI معمولی (مبتنی بر رشته/فرآیند) استفاده شود.

سرور کرون اودو می‌تواند برای پاسخگویی به درخواست‌های چت زنده نیز استفاده شود. کافی است گزینه خط فرمان --no-http را از سرور کرون حذف کنید و اطمینان حاصل کنید که درخواست‌هایی که مسیرشان با /websocket/ شروع می‌شود به این سرور هدایت شوند، یا بر روی --http-port (سرور چند رشته‌ای) یا بر روی --gevent-port (سرور چند پردازشی).

ارائه فایل‌های ثابت و پیوست‌ها

برای راحتی توسعه، Odoo به‌طور مستقیم تمام فایل‌های استاتیک و پیوست‌ها را در ماژول‌های خود ارائه می‌دهد. این ممکن است از نظر عملکرد ایده‌آل نباشد و فایل‌های استاتیک معمولاً باید توسط یک سرور HTTP استاتیک ارائه شوند.

ارائه فایل‌های ثابت

فایل‌های استاتیک Odoo در پوشه static/ هر ماژول قرار دارند، بنابراین فایل‌های استاتیک می‌توانند با رهگیری تمام درخواست‌ها به /MODULE/static/FILE ارائه شوند و ماژول (و فایل) مناسب در مسیرهای مختلف افزونه‌ها جستجو شود.

توصیه می‌شود که هدر Content-Security-Policy: default-src 'none' را برای تمامی تصاویر ارائه‌شده توسط وب سرور تنظیم کنید. این کار به‌طور کامل ضروری نیست، زیرا کاربران نمی‌توانند محتوا را در داخل پوشه static/ ماژول‌ها تغییر دهند یا تزریق کنند و تصاویر موجود نهایی هستند (آن‌ها به‌صورت خودکار منابع جدیدی را دریافت نمی‌کنند). با این حال، این یک روش خوب است.

با استفاده از پیکربندی NGINX (https) فوق، بلوک‌های map و location زیر باید اضافه شوند تا فایل‌های استاتیک از طریق 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;
    }
}

دستورات واقعی root و try_files به نصب شما وابسته هستند، به‌ویژه به گزینه --addons-path.

Example

فرض کنید اودو از طریق بسته‌های دبیان برای نسخه‌های کامیونیتی و اینترپرایز نصب شده است و گزینه --addons-path مقدار '/usr/lib/python3/dist-packages/odoo/addons' را دارد.

ریشه و try_files باید باشند:

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

ارائه پیوست‌ها

پیوست‌ها فایل‌هایی هستند که در ذخیره‌سازی فایل نگهداری می‌شوند و دسترسی به آن‌ها توسط اودو تنظیم می‌شود. این فایل‌ها نمی‌توانند به‌طور مستقیم از طریق یک وب سرور استاتیک دسترسی پیدا کنند، زیرا دسترسی به آن‌ها نیازمند جستجوهای متعدد در پایگاه داده است تا مشخص شود فایل‌ها کجا ذخیره شده‌اند و آیا کاربر فعلی می‌تواند به آن‌ها دسترسی داشته باشد یا خیر.

با این حال، پس از یافتن فایل و تأیید حقوق دسترسی توسط Odoo، بهتر است فایل را به جای Odoo از طریق سرور وب استاتیک ارائه دهید. برای اینکه Odoo ارائه فایل‌ها را به سرور وب استاتیک واگذار کند، افزونه‌های X-Sendfile (apache) یا X-Accel (nginx) باید بر روی سرور وب استاتیک فعال و پیکربندی شوند. پس از تنظیم، Odoo را با فلگ CLI --x-sendfile اجرا کنید (این فلگ منحصر به فرد برای هر دو X-Sendfile و X-Accel استفاده می‌شود).

توجه

  • افزونه X-Sendfile برای آپاچی (و سرورهای وب سازگار) نیازی به تنظیمات اضافی ندارد.

  • افزونه X-Accel برای NGINX نیازمند پیکربندی اضافی زیر است:

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

    در صورتی که مسیر ذخیره‌سازی فایل خود را نمی‌دانید، اودو را با گزینه --x-sendfile اجرا کنید و مستقیماً از طریق اودو به آدرس /web/filestore بروید (از طریق NGINX به این آدرس نروید). این کار یک هشدار ثبت می‌کند و پیام شامل تنظیماتی است که به آن نیاز دارید.

امنیت

برای شروع، به خاطر داشته باشید که ایمن‌سازی یک سیستم اطلاعاتی یک فرآیند مداوم است، نه یک عملیات یک‌باره. در هر لحظه، امنیت شما فقط به اندازه ضعیف‌ترین حلقه در محیطتان خواهد بود.

لطفاً این بخش را به‌عنوان فهرست نهایی اقدامات برای جلوگیری از تمامی مشکلات امنیتی در نظر نگیرید. این بخش تنها به‌عنوان خلاصه‌ای از اولین موارد مهمی است که باید در برنامه اقدام امنیتی خود لحاظ کنید. موارد دیگر از بهترین روش‌های امنیتی برای سیستم‌عامل و توزیع شما، بهترین روش‌ها در زمینه کاربران، گذرواژه‌ها و مدیریت کنترل دسترسی و غیره ناشی خواهند شد.

هنگام راه‌اندازی یک سرور متصل به اینترنت، لطفاً موارد زیر را که به امنیت مربوط می‌شوند در نظر بگیرید:

  • همیشه یک رمز عبور قوی برای مدیر ارشد (سوپر ادمین) تنظیم کنید و به محض راه‌اندازی سیستم، دسترسی به صفحات مدیریت پایگاه داده را محدود کنید. به مدیریت امنیت پایگاه داده مراجعه کنید.

  • برای تمامی حساب‌های کاربری مدیر در تمامی پایگاه‌های داده، نام کاربری منحصربه‌فرد و رمز عبور قوی انتخاب کنید. از نام کاربری 'admin' استفاده نکنید. از این حساب‌ها فقط برای کنترل/مدیریت نصب استفاده کنید و نه برای عملیات روزمره. هرگز از رمزهای عبور پیش‌فرض مانند admin/admin استفاده نکنید، حتی برای پایگاه‌های داده آزمایشی/مرحله‌ای.

  • داده‌های نمایشی را روی سرورهای متصل به اینترنت نصب نکنید. پایگاه‌های داده‌ای که شامل داده‌های نمایشی هستند، دارای نام کاربری و رمز عبور پیش‌فرض می‌باشند که می‌توانند برای دسترسی به سیستم‌های شما و ایجاد مشکلات جدی، حتی در سیستم‌های آزمایشی/توسعه، مورد استفاده قرار گیرند.

  • از فیلترهای مناسب پایگاه داده (--db-filter) برای محدود کردن نمایش پایگاه‌های داده بر اساس نام میزبان استفاده کنید. به فیلتر پایگاه داده مراجعه کنید. همچنین می‌توانید از -d برای ارائه لیست پایگاه‌های داده موجود (به صورت جدا شده با کاما) جهت فیلتر کردن استفاده کنید، به جای اینکه سیستم همه آنها را از پایگاه داده اصلی دریافت کند.

  • هنگامی که db_name و dbfilter شما تنظیم شده و فقط با یک پایگاه داده در هر نام میزبان مطابقت دارند، باید گزینه پیکربندی list_db را به False تنظیم کنید تا از نمایش کامل لیست پایگاه‌های داده جلوگیری شود و دسترسی به صفحه‌های مدیریت پایگاه داده مسدود شود (این گزینه همچنین به صورت --no-database-list در خط فرمان قابل استفاده است).

  • اطمینان حاصل کنید که کاربر PostgreSQL (--db_user) سوپرکاربر نباشد و دیتابیس‌های شما توسط یک کاربر دیگر مدیریت شوند. به عنوان مثال، اگر از یک db_user غیرممتاز و اختصاصی استفاده می‌کنید، دیتابیس‌ها می‌توانند تحت مالکیت سوپرکاربر postgres باشند. همچنین به پیکربندی اودو مراجعه کنید.

  • نصب‌ها را با به‌روزرسانی منظم آخرین نسخه‌ها، از طریق GitHub یا با دانلود آخرین نسخه از https://www.odoo.com/page/download یا http://nightly.odoo.com به‌روز نگه دارید.

  • سرور خود را در حالت چند‌پردازشی با محدودیت‌های مناسب مطابق با استفاده معمولی خود (حافظه/پردازنده/زمان‌بندی‌ها) پیکربندی کنید. همچنین به سرور داخلی مراجعه کنید.

  • اجرای Odoo پشت یک وب سرور که ارائه‌دهنده خاتمه HTTPS با یک گواهی SSL معتبر باشد، به منظور جلوگیری از شنود ارتباطات متن ساده. گواهی‌های SSL ارزان هستند و گزینه‌های رایگان زیادی وجود دارند. وب پراکسی را پیکربندی کنید تا اندازه درخواست‌ها محدود شود، زمان‌های مناسب تنظیم شود، و سپس گزینه حالت پراکسی را فعال کنید. همچنین به HTTPS مراجعه کنید.

  • اگر نیاز دارید که دسترسی SSH از راه دور به سرورهای خود را فعال کنید، مطمئن شوید که برای تمامی حساب‌ها، نه فقط root، یک رمز عبور قوی تنظیم کرده‌اید. به شدت توصیه می‌شود که احراز هویت مبتنی بر رمز عبور را به طور کامل غیرفعال کرده و تنها احراز هویت با کلید عمومی را مجاز کنید. همچنین در نظر بگیرید که دسترسی را از طریق یک VPN محدود کنید، تنها به آی‌پی‌های مورد اعتماد در فایروال اجازه دهید و/یا از یک سیستم تشخیص حملات جستجوی بی‌رحمانه مانند fail2ban یا معادل آن استفاده کنید.

  • در نظر داشته باشید که محدودیت نرخ مناسب را بر روی پروکسی یا فایروال خود نصب کنید تا از حملات جستجوی بی‌رحمانه و حملات انکار سرویس جلوگیری شود. همچنین به مسدود کردن حملات بی‌رحمانه (Brute Force) برای اقدامات خاص مراجعه کنید.

    بسیاری از ارائه‌دهندگان شبکه کاهش خودکار حملات انکار سرویس توزیع‌شده (DDOS) را ارائه می‌دهند، اما این معمولاً یک سرویس اختیاری است، بنابراین باید با آن‌ها مشورت کنید.

  • هر زمان که ممکن باشد، نمونه‌های نمایشی/آزمایشی/مرحله‌ای عمومی خود را روی ماشین‌های متفاوت از ماشین‌های تولیدی میزبانی کنید. و همان اقدامات امنیتی را که برای تولید اعمال می‌شود، اجرا کنید.

  • اگر سرور عمومی Odoo شما به منابع یا خدمات حساس شبکه داخلی (مانند یک VLAN خصوصی) دسترسی دارد، قوانین مناسب فایروال را برای حفاظت از آن منابع داخلی پیاده‌سازی کنید. این کار اطمینان حاصل می‌کند که سرور Odoo به صورت تصادفی (یا به دلیل اقدامات مخرب کاربران) برای دسترسی یا اختلال در آن منابع داخلی استفاده نشود. معمولاً این کار با اعمال یک قانون پیش‌فرض DENY برای ترافیک خروجی روی فایروال انجام می‌شود و سپس فقط دسترسی به منابع داخلی که سرور Odoo نیاز به دسترسی به آنها دارد به صورت صریح مجاز می‌شود. کنترل دسترسی ترافیک IP با Systemd نیز ممکن است برای پیاده‌سازی کنترل دسترسی شبکه به ازای هر فرآیند مفید باشد.

  • اگر سرور اودوی شما که به صورت عمومی در دسترس است، پشت یک فایروال برنامه وب، یک لود بالانسر، یک سرویس محافظت شفاف در برابر حملات DDoS (مانند CloudFlare) یا دستگاهی مشابه در سطح شبکه قرار دارد، ممکن است بخواهید از دسترسی مستقیم به سیستم اودو جلوگیری کنید. به طور کلی، پنهان نگه داشتن آدرس‌های IP نقطه پایانی سرورهای اودو دشوار است. به عنوان مثال، این آدرس‌ها ممکن است در لاگ‌های سرور وب هنگام پرس‌وجو از سیستم‌های عمومی یا در هدر ایمیل‌هایی که از اودو ارسال می‌شوند، ظاهر شوند. در چنین شرایطی، ممکن است بخواهید فایروال خود را طوری پیکربندی کنید که نقاط پایانی به صورت عمومی در دسترس نباشند، مگر از طریق آدرس‌های IP مشخص مربوط به فایروال برنامه وب، لود بالانسر یا سرویس پروکسی شما. ارائه‌دهندگان خدماتی مانند CloudFlare معمولاً یک لیست عمومی از محدوده آدرس‌های IP خود برای این منظور ارائه می‌دهند.

  • اگر میزبان چندین مشتری هستید، داده‌ها و فایل‌های مشتریان را با استفاده از کانتینرها یا تکنیک‌های مناسب "جداسازی" از یکدیگر جدا کنید.

  • پشتیبان‌گیری روزانه از پایگاه‌های داده و داده‌های فایل‌استور خود را تنظیم کنید و آنها را به یک سرور بایگانی راه دور که از خود سرور قابل دسترسی نیست، کپی کنید.

  • توصیه می‌شود که اودو را بر روی لینوکس اجرا کنید تا ویندوز. با این حال، اگر تصمیم به اجرای آن بر روی پلتفرم ویندوز بگیرید، باید یک بررسی کامل از سخت‌سازی امنیتی سرور انجام شود که خارج از محدوده این راهنما است.

مسدود کردن حملات بی‌رحمانه (Brute Force)

برای استقرارهایی که به اینترنت متصل هستند، حملات جستجوی فراگیر بر روی رمزهای عبور کاربران بسیار رایج است و این تهدید نباید برای سرورهای Odoo نادیده گرفته شود. Odoo هنگام انجام تلاش برای ورود به سیستم، یک ورودی در گزارش ثبت می‌کند و نتیجه را گزارش می‌دهد: موفقیت یا شکست، همراه با نام کاربری هدف و آدرس IP منبع.

ورودی‌های گزارش به شکل زیر خواهند بود.

ورود ناموفق:

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

ورود موفقیت‌آمیز:

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

این گزارش‌ها به‌راحتی می‌توانند توسط یک سیستم پیشگیری از نفوذ مانند fail2ban تحلیل شوند.

به عنوان مثال، تعریف فیلتر fail2ban زیر باید با یک ورود ناموفق مطابقت داشته باشد:

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

این می‌تواند با تعریف یک زندان استفاده شود تا IP مهاجم را در HTTP(S) مسدود کند.

این چیزی است که می‌تواند برای مسدود کردن IP به مدت ۱۵ دقیقه زمانی که ۱۰ تلاش ناموفق برای ورود از همان IP در عرض ۱ دقیقه شناسایی شود، به نظر برسد:

[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

مدیریت امنیت پایگاه داده

پیکربندی اودو به صورت گذرا به admin_passwd اشاره کرده است.

این تنظیم در تمام صفحه‌های مدیریت پایگاه داده استفاده می‌شود (برای ایجاد، حذف، پشتیبان‌گیری یا بازیابی پایگاه داده‌ها).

اگر نباید صفحات مدیریت به هیچ وجه قابل دسترسی باشند، باید گزینه پیکربندی list_db را روی False تنظیم کنید تا دسترسی به تمام صفحات انتخاب و مدیریت پایگاه داده مسدود شود.

هشدار

توصیه می‌شود که مدیر پایگاه داده را برای هر سیستم متصل به اینترنت غیرفعال کنید! این ابزار به عنوان یک ابزار توسعه/نمایشی طراحی شده است تا ایجاد و مدیریت پایگاه‌های داده را به‌سرعت و به‌سادگی امکان‌پذیر کند. این ابزار برای استفاده در محیط تولید طراحی نشده است و ممکن است ویژگی‌های خطرناکی را برای مهاجمان آشکار کند. همچنین برای مدیریت پایگاه‌های داده بزرگ طراحی نشده است و ممکن است محدودیت‌های حافظه را فعال کند.

در سیستم‌های تولیدی، عملیات مدیریت پایگاه داده باید همیشه توسط مدیر سیستم انجام شود، از جمله تأمین پایگاه‌های داده جدید و پشتیبان‌گیری‌های خودکار.

اطمینان حاصل کنید که پارامتر مناسب db_name (و در صورت نیاز، dbfilter نیز) تنظیم شده باشد تا سیستم بتواند پایگاه داده هدف را برای هر درخواست تعیین کند، در غیر این صورت کاربران مسدود خواهند شد زیرا اجازه انتخاب پایگاه داده توسط خودشان را نخواهند داشت.

اگر صفحه‌های مدیریت باید فقط از یک مجموعه انتخاب‌شده از دستگاه‌ها قابل دسترسی باشند، از ویژگی‌های سرور پروکسی استفاده کنید تا دسترسی به تمام مسیرهایی که با /web/database شروع می‌شوند را مسدود کنید، به‌جز (شاید) /web/database/selector که صفحه انتخاب پایگاه داده را نمایش می‌دهد.

اگر صفحه مدیریت پایگاه داده باید قابل دسترسی باقی بماند، تنظیمات admin_passwd باید از مقدار پیش‌فرض admin تغییر کند: این رمز عبور قبل از اجازه دادن به عملیات تغییر پایگاه داده بررسی می‌شود.

باید به صورت ایمن ذخیره شود و به صورت تصادفی تولید شود، مانند.

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

که یک رشته تصادفی شبه ۳۲ کاراکتری قابل چاپ تولید می‌کند.

بازنشانی رمز عبور اصلی

ممکن است مواردی پیش بیاید که رمز عبور اصلی گم شود یا به خطر بیفتد و نیاز به بازنشانی داشته باشد. فرآیند زیر برای مدیران سیستم یک پایگاه داده Odoo در محل است که نحوه بازنشانی و رمزگذاری مجدد رمز عبور اصلی را به صورت دستی توضیح می‌دهد.

همچنین ببینید

برای اطلاعات بیشتر درباره تغییر رمز عبور حساب Odoo.com، به این مستندات مراجعه کنید: تغییر رمز عبور حساب Odoo.com.

هنگام ایجاد یک پایگاه داده جدید در محل، یک رمز عبور اصلی تصادفی تولید می‌شود. اودو توصیه می‌کند از این رمز عبور برای ایمن‌سازی پایگاه داده استفاده کنید. این رمز عبور به صورت پیش‌فرض اعمال می‌شود، بنابراین برای هر استقرار اودو در محل یک رمز عبور اصلی امن وجود دارد.

هشدار

هنگام ایجاد یک پایگاه داده Odoo در محل، نصب برای هر کسی در اینترنت قابل دسترسی است تا زمانی که این رمز عبور برای ایمن‌سازی پایگاه داده تنظیم شود.

رمز عبور اصلی در فایل تنظیمات Odoo (odoo.conf یا odoorc (فایل مخفی)) مشخص شده است. رمز عبور اصلی Odoo برای تغییر، ایجاد یا حذف یک پایگاه داده از طریق رابط کاربری گرافیکی (GUI) مورد نیاز است.

یافتن فایل پیکربندی

ابتدا فایل تنظیمات Odoo (odoo.conf یا odoorc (فایل مخفی)) را باز کنید.

فایل پیکربندی در مسیر زیر قرار دارد: c:\ProgramFiles\Odoo{VERSION}\server\odoo.conf

تغییر رمز عبور قدیمی

پس از باز کردن فایل مناسب، رمز عبور قدیمی را در فایل تنظیمات به یک رمز عبور موقت تغییر دهید.

پس از پیدا کردن فایل پیکربندی، آن را با استفاده از (GUI) باز کنید. این کار با دوبار کلیک روی فایل به‌سادگی انجام می‌شود. سپس، دستگاه باید به‌طور پیش‌فرض یک GUI برای باز کردن فایل داشته باشد.

سپس خط رمز عبور اصلی admin_passwd = $pbkdf2-sha… را به admin_passwd = newpassword1234 تغییر دهید، به عنوان مثال. این رمز عبور می‌تواند هر چیزی باشد، به شرطی که به طور موقت ذخیره شود. مطمئن شوید که تمام کاراکترهای بعد از = را تغییر دهید.

Example

خط به این صورت ظاهر می‌شود: admin_passwd = $pbkdf2-sh39dji295.59mptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b573hji540mk/.3ek0lg%kvkol6k983mkf/40fjki79m

خط اصلاح‌شده به این صورت است: admin_passwd = newpassword1234

مهم

ضروری است که رمز عبور به چیزی دیگر تغییر یابد، به جای اینکه با افزودن یک نقطه ویرگول ; در ابتدای خط، یک بازنشانی رمز عبور جدید فعال شود. این کار امنیت پایگاه داده را در طول فرآیند بازنشانی رمز عبور تضمین می‌کند.

راه‌اندازی مجدد سرور Odoo

پس از تنظیم رمز عبور موقت، راه‌اندازی مجدد سرور Odoo ضروری است.

برای راه‌اندازی مجدد سرور Odoo، ابتدا عبارت services را در نوار جستجو ویندوز تایپ کنید. سپس برنامه Services را انتخاب کرده و به پایین اسکرول کنید تا به سرویس Odoo برسید.

سپس روی Odoo کلیک راست کرده و گزینه Start یا Restart را انتخاب کنید. این عمل سرور Odoo را به صورت دستی راه‌اندازی مجدد می‌کند.

استفاده از رابط وب برای رمزنگاری مجدد گذرواژه

ابتدا به مسیر /web/database/manager یا http://server_ip:port/web/database/manager در مرورگر مراجعه کنید.

توجه

server_ip را با آدرس IP پایگاه داده جایگزین کنید. port را با شماره پورتی که پایگاه داده از آن قابل دسترسی است جایگزین کنید.

سپس روی تنظیم رمز عبور اصلی کلیک کنید و رمز عبور موقت انتخاب‌شده قبلی را در قسمت رمز عبور اصلی وارد کنید. پس از این مرحله، یک رمز عبور اصلی جدید وارد کنید. رمز عبور اصلی جدید پس از کلیک بر روی دکمه ادامه هش (یا رمزگذاری) می‌شود.

در این مرحله، رمز عبور با موفقیت بازنشانی شده است و نسخه هش شده رمز عبور جدید اکنون در فایل پیکربندی ظاهر می‌شود.

همچنین ببینید

برای اطلاعات بیشتر در مورد امنیت پایگاه داده Odoo، به این مستندات مراجعه کنید: مدیریت امنیت پایگاه داده.

مرورگرهای پشتیبانی‌شده

اودو از آخرین نسخه مرورگرهای زیر پشتیبانی می‌کند.

  • گوگل کروم

  • موزیلا فایرفاکس

  • مایکروسافت اج

  • اپل سافاری

1

برای اینکه چندین نصب اودو از یک پایگاه داده PostgreSQL مشترک استفاده کنند، یا منابع محاسباتی بیشتری به هر دو نرم‌افزار اختصاص داده شود.

2

از نظر فنی، ابزاری مانند socat می‌تواند برای پراکسی کردن سوکت‌های UNIX در شبکه‌ها استفاده شود، اما این بیشتر برای نرم‌افزارهایی است که فقط می‌توانند از طریق سوکت‌های UNIX استفاده شوند.

3

یا فقط از طریق یک شبکه داخلی بسته‌ای سوئیچ‌شده قابل دسترسی باشد، اما این نیازمند سوئیچ‌های امن، محافظت در برابر ARP spoofing و جلوگیری از استفاده از WiFi است. حتی در شبکه‌های امن بسته‌ای سوئیچ‌شده، استقرار از طریق HTTPS توصیه می‌شود و هزینه‌های احتمالی کاهش می‌یابد زیرا گواهی‌های "خودامضا" در یک محیط کنترل‌شده نسبت به اینترنت آسان‌تر مستقر می‌شوند.