Konfigurasi sistem

Dokumen ini mendeskripsikan langkah-langkah dasar untuk setup Odoo di production atau server yang menggunakan internet. Ini mengikuti penginstalan, dan secara umum tidak diperlukan untuk sistem development yang tidak terhubung ke internet.

Peringatan

Bila Anda ingin setup server publik, pastikan Anda memeriksa rekomendasi Keamanan kami!

dbfilter

Odoo adalah sistem multi-tenant: satu sistem Odoo dapat berjalan dan melayani sejumlah instance database. Odoo juga sangat mudah dikustomisasi, dengan kustomisasi (dimulai dari modul yang dimuat) tergantung pada "database saat ini".

Ini tidak merupakan masalah saat bekerja dengan backend (web client) sebagai user perusahaan yang terlogin: database dapat dipilih saat login, dan kustomisasi dimuat setelahnya.

Namun ini menjadi masalah untuk user yang tidak-login (portal, website) yang tidak terikat ke database: Odoo harus tahu database mana yang akan digunakan untuk membuat halaman website atau melakukan operasi. Bila multi-pengguna tidak digunakan ini tidak merupakan masalah, hanya ada satu database untuk digunakan, tapi bila terdapat lebih dari satu database yang dapat diakses Odoo membutuhkan peraturan untuk mengetahui mana yang harus digunakan.

Inilah salah satu kegunaan dari --db-filter: dbfilter menentukan bagiamana database harus dipilih berdasarkan nama host (domain) yang diminta. Value adalah regular expression, biasanya termasuk nama host yang di-inject secara dinamis (%h) atau subdomain pertama (%d) melalui mana sistem akan diakses.

Untuk server yang hosting lebih dari satu database di production, terutama bila website digunakan, dbfilter harus ditetapkan, bila tidak sejumlah fitur tidak akan bekerja dengan tepat.

Sampel konfigurasi

  • Hanya tunjukkan database dengan nama yang diawali dengan 'mycompany'

di file konfigurasi tetapkan:

[options]
dbfilter = ^mycompany.*$
  • Tunjukkan hanya database yang subdomain pertama-nya cocok setelah www: contohnya database "mycompany" akan ditunjukkan bila permintaan yang masuk dikirim ke www.mycompany.com atau mycompany.co.uk, tapi tidak untuk www2.mycompany.com atau helpdesk.mycompany.com.

di file konfigurasi tetapkan:

[options]
dbfilter = ^%d$

Catatan

Menetapkan --db-filter yang benar adalah bagian penting dalam mengamankan deployment Anda. Setelah bekerja dengan tepat dan hanya mencocokkan satu database untuk setiap nama host, sangat direkomendasikan untuk memblokir akses ke layar database manager, dan untuk menggunakan parameter startup --no-database-list untuk mencegah menampilkan daftar database Anda, dan untuk memblokir akses ke layar manajemen database. Lihat juga keamanan.

PostgreSQL

Secara default, PostgreSQL hanya mengizinkan hubungan melalui koneksi UNIX socket dan loopback (dari "localhost", mesin yang sama dengan tempat server PostgreSQL diinstal).

UNIX socket dapat digunakan bila Anda ingin Odoo dan dan PostgreSQL untuk berjalan di mesin yang sama, dan merupakan default saat tidak ada host yang disediakan, tapi bila Anda ingin Odoo dan PostgreSQL untuk berjalan pada mesin yang berbeda 1 maka akan harus mendengarkan antarmuka jaringan 2, baik dengan:

  • Hanya menerima hubungan loopback dan gunakan SSH tunnel di antara mesin yang terdapat Odoo dan mesin yang terdapat PostgreSQL, kemudian atur Odoo untuk terhubung dengan tunnel

  • Terima hubungan ke mesin tempat Odoo diinstal, biasanya melalui ssl (lihat PostgreSQL connection settings untuk detail), kemudian atur Odoo untuk terhubung melalui jaringan

Sampel konfigurasi

  • Izinkan tcp connection pada localhost

  • Izinkan tcp connection dari 192.168.1.x network

di /etc/postgresql/<YOUR POSTGRESQL VERSION>/main/pg_hba.conf tetapkan:

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

di /etc/postgresql/<YOUR POSTGRESQL VERSION>/main/postgresql.conf tetapkan:

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

Mengonfigurasi Odoo

Langsung siap pakai, Odoo akan terhubung ke postgres lokal melalui UNIX socket via port 5432. Ini dapat dikesampingkan menggunakan opsi database saat deployment Postgres Anda tidak lokal dan/atau tidak menggunakan penginstalan default.

Paket installer akan secara otomatis membuat user baru (odoo) dan menetapkannya sebagai user database.

  • Layar manajemen database dilindungi oleh pengaturan admin_passwd. Pengaturan ini hanya dapat ditetapkan menggunakan file konfigurasi, dan diperiksa sebelum melakukan perubahan database. Ini sebaiknya ditetapkan ke value yang secara acak dibuat untuk memastikan pihak ketiga tidak dapat menggunakan antarmuka ini.

  • Semua operasi database menggunakan opsi database, termasuk layar manajemen database. Agar layar manajemen database dapat bekerja, user PostgreSQL harus memilki hak createdb.

  • User dapat selalu men-drop database yang mereka miliki. Agar layar manajemen database sepenuhnya non-fungsional, user PostgreSQL harus dibuat dengan no-createdb dan database harus dimiliki oleh user PostgreSQL yang berbeda.

    Peringatan

    User PostgreSQL tidak boleh merupakan superuser

Sampel konfigurasi

  • terhubung ke server PostgreSQL pada 192.168.1.2

  • port 5432

  • menggunakan akun pengguna 'odoo'

  • dengan kata kunci 'pwd'

  • memfilter hanya db dengan nama yang dimulai dengan 'mycompany'

di file konfigurasi tetapkan:

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

SSL Di Antara Odoo dan PostgreSQL

Semenjak Odoo 11.0, Anda dapat memaksakan hubungan ssl antara Odoo dan PostgreSQL. Di Odoo db_sslmode mengendalikan ssl security hubungan dengan value yang dipilih antara 'disable', 'allow', 'prefer', 'require', 'verify-ca' atau 'verify-full'

PostgreSQL Doc

Builtin server

Odoo mengikutsertakan HTTP, cron, dan server live-chat bawaan, baik yang menggunakan multi-threading atau multi-processing.

Server multi-thread adalah server lebih sederhana yang secara utama digunakan untuk development, demonstrasi, dan karena kompatibilitanya dengan beragam sistem operasi (termasuk Windows). Thread baru dibuat untuk setiap permintaan HTTP baru, bahkan untuk hubungan yang bertahan lama seperti websocket. Daemonic cron threads ekstra juga dibuat. Oleh karena limitasi Python (GIL), mereka tidak menggunakan hardware sebaik mungkin.

Server multi-thread adalah server default, juga untuk docker container. Ini dipilih dengan tidak mengikutsertakan opsi --workers atau dengan menyetelnya ke 0.

Server multi-processing adalah server lengkap yang secara utama digunakan untuk production. Server ini tidak memiliki kekurangan limitasi Python limitation (GIL) yang sama pada penggunaan sumber daya dan oleh karena itu menggunakan hardware sebaik mungkin. Sekelompok worker dibuat pada startup server. Permintaan HTTP baru diurutkan berdasarkan OS sampai terdapat worker yang siap untuk memproses mereka. Event-driven HTTP worker ekstra dibuat untuk live chat pada port alternatif. Cron worker ekstra juga dibuat. Process reaper yang dapat dikonfigurasi memonitor penggunaan sumber daya dan dapat mematikan/me-restart worker yang gagal.

Server multi-processing bersifat opsional. Server ini dipilih dengan menyetel opsi --workers menjadi integer non null.

Catatan

Karena sangat dapat dikustomisasi untuk server Linux, server multi-processing tidak tersedia di Windows.

Kalkulasi jumlah worker

  • Peraturan praktis : (#CPU * 2) + 1

  • Cron worker membutuhkan CPU

  • 1 worker ~= 6 user bersamaan

Kalkulasi ukuran memori

  • Kami menghitung 20% permintaan adalah permintaan berat, sementara 80% adalah permintaan sederhana

  • Worker berat, saat semua computed field dirancang baik, permintaan SQL dirancang baik, ... diperkirakan mengonsumsi sekitar 1 GB RAM

  • Worker lebih ringan, di skenario yang sama, diperkirakan mengonsumsi sekitar 150MB RAM

RAM yang Dibutuhkan = #worker * ( (rasio_worker_ringan * estimasi_ram_worker_ringan) + (rasio_worker_berat * estimasi_ram_worker_berat) )

LiveChat

Di multi-processing, worker LiveChat khusus secara otomatis dinyalakan dan mendengarkan pada --gevent-port. Secara default, permintaan HTTP akan terus mengakses worker HTTP normal alih-alih worker LiveChat. Anda harus deploy sebuah proxy di depan Odoo dan mengalihkan ulang permintaan masuk yang mana path-nya dimulai dengan /websocket/ ke worker LiveChat. Anda juga harus memulai Odoo di --proxy-mode supaya Odoo menggunakan header asli klien (seperti hostname, scheme, dan IP) alih-alih milik proxy.

Sampel konfigurasi

  • Server dengan 4 CPU, 8 Thread

  • 60 user bersamaan

  • 60 user / 6 = 10 <- jumlah teoretis worker yang dibutuhkan

  • (4 * 2) + 1 = 9 <- jumlah teoretis maksimal worker

  • Kita gunakan 8 worker + 1 untuk cron. Kita juga akan menggunakan sistem monitoring untuk mengukur beban cpu, dan memerika apakah di antara 7 dan 7.5

  • RAM = 9 * ((0.8*150) + (0.2*1024)) ~= 3Go RAM untuk Odoo

di file konfigurasi:

[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

Baik diakses melalui website/web client atau web service, Odoo mengirimkan informasi autentikasi dalam cleartext. Ini berarti deployment aman dari Odoo harus menggunakan HTTPS3. SSL termination dapat diimplementasikan melalui hampir semua SSL termination proxy, tapi membutuhkan setup berikut:

  • Aktifkan proxy mode Odoo. Ini seharusnya hanya diaktifkan saat Odoo di belakang reverse proxy

  • Setup SSL termination proxy (contoh Nginx termination)

  • Setup proxy tersebut sendiri (contoh Nginx proxying)

  • SSL termination proxy Anda harus secara otomatis mengalihkan ulang hubungan yang tidak aman ke port yang aman

Sampel konfigurasi

  • Alihkan ulang permintaan http menjadi https

  • Permintaan proxy ke odoo

di file konfigurasi tetapkan:

proxy_mode = True

di /etc/nginx/sites-enabled/odoo.conf tetapkan:

#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 Hardening

Menambahkan header Strict-Transport-Security ke semua permintaan, untuk mencegah browser mengirimkan permintaan HTTP plain ke domain ini. Anda harus selalu menjaga layanan HTTPS yang bekerja dengan sertifikat valid pada domain ini, bila tidak, user-user Anda akan melihat peringatan keamanan atau tidak dapat mengaksesnya sama sekali.

Semua pengunjung yang masuk melalui NGINX diarahkan secara paksa untuk menggunakan koneksi HTTPS selama satu tahun:

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

Konfigurasi tambahan dapat didefinisikan untuk cookie session_id. Flag Secure juga dapat ditambahkan untuk memastikan mereka tidak pernah dikirim melalui HTTP dan SameSite=Lax untuk mencegah CSRF yang diautentikasi.

# requires nginx 1.19.8
proxy_cookie_flags session_id samesite=lax secure;

Odoo sebagai Aplikasi WSGI

Odoo juga dapat di-mount sebagai aplikasi standar WSGI. Odoo menyediakan dasar untuk script launcher WSGI sebagai odoo-wsgi.example.py. Script tersebut harus dikustomisasi (sebaiknya setelah menyalinnya langsung dari direktori setup) untuk dengan tepat mengonfigurasinya langsung di odoo.tools.config alih-alih melalui command-line atau file konfigurasi.

Namun server WSGI hanya akan mengekspos endpoint HTTP utama untuk web client, website dan webservice API. Karena Odoo tidak mengontrol pembuatan worker lagi Odoo tidak dapat setup cron atau livechat worker

Cron Worker

Anda harus memulai salah satu server bawaan Odoo disamping server WSGI untuk dapat memproses cron job. Server tersebut harus dikonfigurasi untuk hanya memproses cron dan bukan permintaan HTTP menggunakan cli option --no-http atau pengaturan file konfigurasi http_enable = False.

Pada sistem seperti Linux, disarankan untuk menggunakan server multi-processing alih-alih multi-threading agar dapat memanfaatkan penggunaan hardware yang lebih baik dan peningkatan stabilitas, misalnya, menggunakan cli option --workers=-1 dan --max-cron-threads=n.

LiveChat

Menggunakan server WSGI yang gevent-compatible dibutuhkan untuk pengoperasian fitur live chat yang tepat. Server tersebut harus dapat menangani banyak hubungan serentak yang berumur panjang tapi tidak membutuhkan banyak processing power. Semua permintaan yang mana path-nya dimulai dengan /websocket/ harus dialihkan ke server tersebut. Server WSGI reguler (berdasarkan thread/process) sebaiknya digunakan untuk permintaan-permintaan lainnya.

Cron server Odoo juga dapat digunakan untuk melayani permintaan live chat. Cukup drop cli option --no-http dari cron server dan pastikan permintaan yang path-nya dimulai dengan /websocket/ dialihkan ke server ini, baik pada --http-port (server multi-threading) atau pada --gevent-port (server multi-processing).

Menyajikan file statik dan lampiran

Untuk kemudahan development, Odoo secara langsung menyajikan semua file statik dan lampiran dalam modulnya. Ini mungkin tidak ideal bila mengenai performa, dan file statik harus secara umum disajikan oleh server HTTP static.

Melayani file statik

File statik Odoo berlokasi di setiap folder static/ module, maka file statik dapat disajikan dengan mencegat semua permintaan ke /MODULE/static/FILE, dan mencari modul (dan file) yang tepat di beragam addon path.

Disarankan untuk menetapkan header Content-Security-Policy: default-src 'none' pada semua gambar yang dikirim oleh web server. Ini tidak harus dilakukan karena user tidak dapat memodifikasi/inject konten di dalam folder static/ modul dan gambar yang ada bersifat final (mereka tidak mengambil sumber daya baru secara sendiri). Namun, ini tetap merupakan praktik yang baik.

Menggunakan konfigurasi NGINX (https) di atas, blok map dan location di atas harusnya ditambahkan untuk menyajikan file statik melalui 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;
    }
}

Directive root dan try_files yang asli tergantung pada penginstalan Anda, terutama pada --addons-path Anda.

Example

Katakan Odoo telah diinstal melalui debian packages untuk Community dan Enterprise, dan --addons-path adalah '/usr/lib/python3/dist-packages/odoo/addons'.

root dan try_files harusnya adalah:

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

Menyajikan lampiran

Lampiran adalah file yang disimpan di filestore yang mana aksesnya diregulasi oleh Odoo. Mereka tidak dapat diakses langsung melalui web server statik karena mengakses mereka membutuhkan lebih dari satu lookup di database untuk menentukan di mana file disimpan dan apakah user saat ini dapat mengakses mereka atau tidak.

Kendati demikian, setelah file telah ditemukan dan hak akses diverifikasi oleh Odoo, merupakan ide baik untuk menyajikan file menggunakan web server statik alih-alih Odoo. Agar Odoo untuk mendelegasikan penyajian file ke web server statik, extension X-Sendfile (apache) atau X-Accel (nginx) harus diaktifkan dan dikonfigurasikan pada web server statik. Setelah di setup, jalankan Odoo dengan CLI flag --x-sendfile (flag unik ini digunakan untuk X-Sendfile dan X-Accel).

Catatan

  • Extension X-Sendfile untuk apache (dan web server yang kompatibel) tidak membutuhkan konfigurasi tambahan apapun.

  • Extension X-Accel untuk NGINX membutuhkan konfigurasi tambahan berikut:

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

    Apabila Anda tidak tahu path ke filestore Anda, nyalakan Odoo dengan opsi --x-sendfile dan navigasi ke URL /web/filestore langsung melalui Odoo (jangan menavigasi ke URL melalui NGINX). Ini akan mencatat peringatan, pesannya akan memiliki konfigurasi yang Anda butuhkan.

Keamanan

Untuk awal-awal, ingat bahwa mengamankan sistem informasi adalah proses yang berkelanjutan, bukan operasi yang sekali-selesai. Kapan pun juga, Anda hanya akan seaman rantai terlemah di environment Anda.

Jadi tolong jangan ambil bagian dari dokumentasi ini sebagai daftar termutakhir pengukuran keamanan yang akan mencegah semua masalah keamanan. Pedoman ini hanya ditujukan sebagai ringkasan dari hal-hal pertama yang harus Anda masukkan pada rencana keamanan Anda. Sisanya akan datang dengan praktek keamanan yang baik untuk OS dan distribusi Anda, praktek terbaik dalam hal user, password, dan manajemen kontrol akses, dsb.

Saat men-deploy server yang menggunakan internet, mohon pertimbangkan topik-topik terkait keamanan berikut:

  • Selalu tetapkan password admin super-admin yang kuat, dan batasi akses ke halaman-halaman manajemen database setelah sistem di-setup. Lihat Keamanan Database Manager.

  • Pilih login yang unik dan password yang kuat untuk semua akun administrator pada semua database. Jangan gunakan 'admin' sebagai login. Jangan gunakan login tersebut untuk operasi keseharian, hanya untuk mengontrol/menangani penginstalan. Jangan pernah menggunakan password default apapun seperti admin/admin, bahkan untuk database test/staging.

  • Jangan menginstal data demo pada server yang menggunakan internet. Database dengan data demo memiliki secara default login dan password yang dapat digunakan untuk memasuki sistem Anda dan menghasilkan masalah yang signifikan, bahkan pada sistem staging/dev.

  • Gunakan filter database yang sesuai ( --db-filter) untuk membatasi visibilitas database Anda sesuai dengan nama host. Lihat dbfilter. Anda juga mungkin ingin menggunakan -d untuk menyediakan daftar Anda sendiri untuk database yang tersedia (yang dipisahkan koma) untuk difilter, alih-alih membiarkan sistem mengambil mereka semua dari backend database.

  • Setelah db_name dan dbfilter Anda sudah dikonfigurasi dan hanya cocok dengan satu database per nama host, Anda sebaiknya menetapkan opsi konfigurasi list_db menjadi False, untuk mencegah listing database, dan untuk memblokir akses layar manajemen database (ini juga dapat dilakukan dengan opsi command-line --no-database-list)

  • Pastikan user PostgreSQL (--db_user) bukan super-user, dan bahwa database Anda dimiliki oleh user yang berbeda. Sebagai contoh mereka dapat dimiliki oleh super-user postgres bila mereka menggunakan db_user yang dedicated dan non-privileged. Lihat juga Mengonfigurasi Odoo.

  • Pastikan software diupdate dengan secara reguler menginstal build terkini, baik melalui GitHub atau dengan mengunduh versi terbaru dari https://www.odoo.com/page/download atau http://nightly.odoo.com

  • Konfigurasikan server Anda di mode multi-proses dengan limit yang sesuai yang cocok dengan penggunaan tipikal Anda (memori/CPU/timeout). Lihat juga Builtin server.

  • Jalankan Odoo di belakang web server yang menyediakan HTTPS termination dengan sertifikat SSL yang valid, untuk mencegah penyadapan komunikasi cleartext. Sertifikat SSP murah, dan banyak opsi yang gratis yang tersedia. Konfigurasikan proxy website untuk membatasi ukuran permintaan, tetapkan timeout yang sesuai, dan aktifkan opsi proxy mode. Lihat juga HTTPS.

  • Bila Anda harus mengizinkan akses SSH remote ke server Anda, pastikan Anda menyiapkan password yang kuat untuk semua akun, bukan hanya untuk root. Sangat disarankan untuk menonaktifkan autentikasi berdasarkan password, dan hanya mengizinkan autentikasi public key. Juga pertimbangkan untuk membatasi akses melalui VPN, sehingga hanya IP yang terpercaya yang dapat melewati firewall, dan/atau menjalankan sistem pendeteksi brute-force seperti fail2ban atau yang sepadan.

  • Pertimbangkan untuk menginstal pembatasan percobaan pada proxy atau firewall Anda, untuk mencegah penyerangan brute-force dan denial of service. Lihat juga Memblokir Serangan Brute Force untuk pengamanan lebih spesifik.

    Banyak penyedia jaringan yang menyediakan migrasi otomatis untuk serangan Distributed Denial of Service (DDOS), tapi ini seringkali merupakan layanan opsional, jadi Anda sebaiknya menanyakan hal tersebut ke mereka.

  • Kapanpun memungkinkan, host instance demo/test/staging Anda yang publik pada mesin-mesin yang berbeda dari production. Dan terapkan persiapan keamanan yang sama ke mereka dengan yang untuk production.

  • Bila server Odoo Anda yang publik memiliki akses ke sumber daya layanan jaringan internal atau layanan yang sensitif (misal melalui VLAN privat), implementasikan peraturan firewall yang sesuai untuk melindungi sumber daya internal tersebut. Ini akan memastikan server Odoo tidak dapat digunakan secara tidak sengaja (atau sebagai hasil tangan user jahat) untuk mengakses atau mengacaukan sumber daya internal tersebut. Biasanya ini dapat dilakukan dengan menerapkan peraturan outbound default DENY pada firewall, lalu hanya secara eksplisit mengotorisasikan akses ke sumber daya internal yang server Odoo harus akses. Systemd IP traffic access control juga dapat berguna untuk mengimplementasikan per-process network access control.

  • Bila server Odoo Anda yang publik sembunyi di belakang Web Application Firewall, load-balancer, layanan perlindungan DDoS yang transparan (seperti CloudFlare) atau perangkat level-jaringan yang serupa, ANda mungkin ingin menghindari akses langsung ke sistem Odoo. Secara umum susah untuk menjaga alamat endpoint IP server Odoo Anda agar tetap rahasia. Contohnya mereka dapat muncul di log server website saat meng-query sistem publik, atau di header email yang dipost dari Odoo. Dalam situasi seperti itu Anda mungkin ingin mengonfigurasi firewall Anda supaya endpoint-nya tidak dapat diakses secara publik kecuali dari alamat IP tertentu WAF, load-balancer, atau layanan proxy Anda. Penyedia layanan seperti CloudFlare biasanya memiliki daftar publik rentang alamat IP mereka untuk tujuan ini.

  • Bila Anda menghosting lebih dari satu pelanggan, pisahkan data dan file pelanggan dari pelanggan lainnya menggunakan container atau teknik "jail" yang sesuai.

  • Setup backup harian untuk database dan data filestore Anda, dan salin mereka ke server arsip remote yang tidak dapat diakses dari server itu sendiri.

  • Memasang Odoo pada Linux sangat teramat disarankan ketimbang Windows. Apabila Anda tetap memilih untuk memasang Odoo di platform Window, peninjauan penguatan pengamanan yang sangat menyeluruh untuk server harus dilakukan dan merupakan sesuatu yang di luar cakupan pedoman ini.

Memblokir Serangan Brute Force

Untuk deployment yang menggunakan internet, serangan brute force pada password user sangat umum, dan ancaman ini tidak boleh diabaikan untuk server Odoo. Odoo mengeluarkan log entri kapanpun percobaan login dilakukan, dan melaporkan hasilnya: sukses atau gagal, beserta login target dan sumber IP.

Log entri akan memiliki bentuk berikut.

Login gagal:

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

Login berhasil:

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

Log-log ini dapat dengan mudah dianalisis oleh sistem pencegah intrusi seperti fail2ban.

Contohnya, definisi filter fail2ban berikut seharusnya cocok dengan login gagal:

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

Ini dapat digunakan dengan definisi jail untuk memblokir penyerangan IP pada HTTP(S).

Berikut contoh memblokir IP selama 15 menit saat 10 percobaan login gagal dideteksi dari IP yang sama dalam waktu 1 menit:

[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

Keamanan Database Manager

Mengonfigurasi Odoo menyebut admin_passwd secara singkat.

Pengaturan ini digunakan di semua layar manajemen database (untuk membuat, menghapus, dump atau memulihkan database).

Bila layar manajemen tidak boleh diakses sama sekali, Anda harus mengatur opsi konfigurasi list_db menjadi False, untuk memblokir akses ke semua pilihan database dan layar manajemen.

Peringatan

Sangat disarankan untuk menonaktifkan Database Manager untuk sistem apapun yang menggunakan internet! Ini berfungsi sebagai alat development/demo, agar gampang membuat dan mengelola database. Ini tidak dirancang untuk digunakan di production, dan bahkan dapat menampakkan fitur-fitur berbahaya ke penyerang. Ini juga tidak dirancang untuk menangani database-database yang besar, dan dapat memicu limit memori.

Pada sistem production, operasi manajemen database harus selalu dilakukan oleh admin sistem, termasuk penyediaan database baru dan backup otomatis.

Jangan lupa setup parameter db_name yang sesuai (dan secara opsional, dbfilter) supaya sistem dapat menentukan database target untuk setiap permintaan, bila tidak user akan diblokir karena mereka tidak akan diizinkan untuk memilih databse.

Bila layar manajemen hanya dapat diakses oleh kelompok mesin yang terpilih, gunakan fitur proxy server untuk memblokir akses ke semua rute yang dimulai dengan /web/database kecuali (mungkin) /web/database/selector yang menampilkan layar pemilihan-database.

Bila layar manajemen-database dibiarkan agar dapat diakses, pengaturan admin_passwd harus diubah dari default admin: password ini diperiksa sebelum mengizinkan operasi yang mengubah database.

Password harus disimpan dengan aman, dan sebaiknya dibuat secara acak contoh

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

which generates a 32-character pseudorandom printable string.

Reset the master password

There may be instances where the master password is misplaced, or compromised, and needs to be reset. The following process is for system administrators of an Odoo on-premise database detailing how to manually reset and re-encrypt the master password.

Lihat juga

For more information about changing an Odoo.com account password, see this documentation: Mengubah password akun Odoo.com.

When creating a new on-premise database, a random master password is generated. Odoo recommends using this password to secure the database. This password is implemented by default, so there is a secure master password for any Odoo on-premise deployment.

Peringatan

When creating an Odoo on-premise database the installation is accessible to anyone on the internet, until this password is set to secure the database.

The master password is specified in the Odoo configuration file (odoo.conf or odoorc (hidden file)). The Odoo master password is needed to modify, create, or delete a database through the graphical user interface (GUI).

Locate configuration file

First, open the Odoo configuration file (odoo.conf or odoorc (hidden file)).

The configuration file is located at: c:\ProgramFiles\Odoo{VERSION}\server\odoo.conf

Change old password

Once the appropriate file has been opened, proceed to modify the old password in the configuration file to a temporary password.

After locating the configuration file, open it using a (GUI). This can be achieved by simply double clicking on the file. Then, the device should have a default GUI to open the file with.

Next, modify the master password line admin_passwd = $pbkdf2-sha… to admin_passwd = newpassword1234, for example. This password can be anything, as long as it is saved temporarily. Make sure to modify all characters after the =.

Example

The line appears like this: admin_passwd = $pbkdf2-sh39dji295.59mptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b573hji540mk/.3ek0lg%kvkol6k983mkf/40fjki79m

The modified line appears like this: admin_passwd = newpassword1234

Penting

It is essential that the password is changed to something else, rather than triggering a new password reset by adding a semicolon ; at the beginning of the line. This ensures the database is secure throughout the entire password reset process.

Restart Odoo server

After setting the temporary password, a restart of the Odoo server is required.

To restart the Odoo server, first, type services into the Windows Search bar. Then, select the Services application, and scroll down to the Odoo service.

Next, right click on Odoo, and select Start or Restart. This action manually restarts the Odoo server.

Use web interface to re-encrypt password

First, navigate to /web/database/manager or http://server_ip:port/web/database/manager in a browser.

Catatan

Replace server_ip with the IP address of the database. Replace port with the numbered port the database is accessible from.

Next, click Set Master Password, and type in the previously-selected temporary password into the Master Password field. Following this step, type in a New Master Password. The New Master Password is hashed (or encrypted), once the Continue button is clicked.

At this point, the password has been successfully reset, and a hashed version of the new password now appears in the configuration file.

Lihat juga

For more information on Odoo database security, see this documentation: Keamanan Database Manager.

Browser yang Didukung

Odoo mendukung penggunaan semua browser baik desktop atau mobile yang umum tersedia di pasar, selama mereka didukung oleh publisher mereka.

Berikut adalah browser yang didukung:

  • Google Chrome

  • Mozilla Firefox

  • Microsoft Edge

  • Apple Safari

Peringatan

Pastikan browser Anda up-to-date dan masih didukung oleh publisher mereka sebelum melaporkan bug.

Catatan

Setelah Odoo 13.0, ES6 sudah didukung penggunaannya. Oleh karena itu, IE tidak lagi digunakan.

1

untuk memiliki lebih dari satu penginstalan Odoo gunakan database PostgreSQL yang sama, atau sediakan lebih banyak sumber daya komputasi untuk masing-masing software.

2

secara teknis alat seperti socat dapat digunakan sebagai proxy soket UNIX di jaringan, tapi ini umumnya untuk software yang hanya dapat digunakan di soket UNIX

3

atau dapat diakses hanya melalui internal packet-switched network, tapi yang memerlukan switch yang aman, perlindungan terhadap ARP spoofing dan tidak dapat menggunakan WiFi. Bahkan melebihi secure packet-switched network, deployment lebih disarankan dibanding HTTPS, dan kemungkinan biaya akan dikurangi karena sertifikat yang "self-signed" lebih mudah untuk di-deploy pada controlled environment dibandingkan di internet.