客观的

客观的

客观的

我想阻止数据库访问 URL,例如https://example.com/web/database/selector或者https://example.com/web/database/manager,在 Odoo 部署中,针对所有外部流量,但有几个特定的​​ IP。

为了避免鼓励人们通过“访问被拒绝”或“未经授权的访问”消息进行更深入的探索,我想使用 404 页面未找到错误消息来做到这一点,并且对于 404,使用 Odoo 的 404 错误模板而不是 Nginx 模板。

所需结果的屏幕截图

我尝试过并且知道的

我知道最简单的拒绝方式是添加这样的位置块:

# Odoo Server                                                                  #
upstream odoo {
    server 127.0.0.1:8069;
}

# HTTP Web Server
server {
    listen      80;
    listen [::]:80;
    server_name example.com www.example.com;

#   Block Database Manager/Selector Access via URL except for us
    location ~* /web/database/* {
        allow ###.###.###.###;
        deny all;
        proxy_pass http://odoo;
    }

#   Reverse Proxy Invocation for Odoo Server                                   #
    location / {
        proxy_pass  http://odoo;
    }

这个功能很完美,除了它会启动一个 Nginx 模板 403 禁止消息,而我的目标是一个 404 页面未找到错误消息,它也没有样式、格式或任何东西,所以它也不是 Odoo 404 模板。

我也尝试过以下位置块:

# Odoo Server                                                                  #
upstream odoo {
    server 127.0.0.1:8069;
}

# HTTP Web Server
server {
    listen      80;
    listen [::]:80;
    server_name example.com www.example.com;

#   Block Database Manager/Selector Access via URL except for us
    location ~* /web/database/* {
        if ($remote_addr != ###.###.###.###) {
        return 404;
        proxy_pass http://odoo;
        }
    }

#   Reverse Proxy Invocation for Odoo Server                                   #
    location / {
        proxy_pass  http://odoo;
    }

这个会给我 404 Page Not Found 错误消息,但是,它是 Nginx 模板,而不是 Odoo 的模板,并且限制不起作用,即使调用来自 IP ###.###.###.###,我也会收到 404 错误。

但是,如果我将 更改!=为 a =,并且为了测试也将返回更改为 444,它会识别 IP ###.###.###.###,因为我现在收到“ERR_EMPTY_RESPONSE”消息。

我已经阅读过关于使用IF在位置块内使用的内容,包括如果是邪恶的文章nginx.com但它应该能够在操作上顺利运行return

# Odoo Server                                                                  #
upstream odoo {
    server 127.0.0.1:8069;
}

# HTTP Web Server
server {
    listen      80;
    listen [::]:80;
    server_name example.com www.example.com;

#   Block Database Manager/Selector Access via URL except for us
    location ~* /web/database/* {
        if ($remote_addr = ###.###.###.###) {
        return 444;
        proxy_pass http://odoo;
        }
    }

#   Reverse Proxy Invocation for Odoo Server                                   #
    location / {
        proxy_pass  http://odoo;
    }

我研究过

似乎可以通过 Rewrite 来实现这一点,只需将其保存在 Web 应用程序和使用的 URL 中即可,我甚至找到了一个关于如何在 Apache 上实现它的示例,但是我尝试理解它或为 Nginx 设置它的所有尝试都失败了,它如下所示:

#Block database manager
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/web/database/manager [NC]
RewriteCond %{REMOTE_ADDR} !^##1\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##2\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##3\.###\.###\.###
RewriteRule ^ - [F]

#Block database selector
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/web/database/selector [NC]
RewriteCond %{REMOTE_ADDR} !^##1\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##2\.###\.###\.###
RewriteCond %{REMOTE_ADDR} !^##3\.###\.###\.###
RewriteRule ^ - [F]

我还发现这个部署有我想要实现的功能,试试这个关联

当前 Nginx 配置文件

这是我当前的 Nginx 配置文件,所有内容(包括应用程序的每个功能)目前均正常运行,但当不是来自 IP ###.###.###.### 时,我确实收到了不需要的 403 禁止访问 Nginx 模板消息

我正在使用 Ubuntu 20.04、Odoo V15 和 Nginx 版本 1.22.0

# ============================================================================ #
#              Web Server NGINX Configuration for Example.com                  #
# ============================================================================ #

# ============================================================================ #
# 1. Services                                                                  #
# ============================================================================ #
#                                                                              #
# Odoo Server                                                                  #
upstream odoo {
    server 127.0.0.1:8069;
}

# Longpolling Server (A must for Workers > 0 in the odoo.conf and for Chat)    #
upstream longpolling {
    server 127.0.0.1:8072;
}
# --------------------------------------------------------------- End Services #

# ============================================================================ #
# 2. HTTP Web Server                                                           #
# ============================================================================ #
#                                                                              #
server {
    listen      80;
    listen [::]:80;
    server_name example.com www.example.com;
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

#   Redirect to HTTPS                                                          #
    location / {
        return 301 https://example.com$request_uri;
    }
}
# ------------------------------------------------------------ End HTTP Server #

# ============================================================================ #
# 3. HTTPS Web Server                                                          #
# ============================================================================ #
#                                                                              #
server {
    listen      443 ssl http2 default_server;
    listen [::]:443;
    server_name example.com www.example.com;
    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    access_log /var/log/nginx/example.com.ssl.access.log;
    error_log /var/log/nginx/example.com.ssl.error.log;

#   Certificate and Key Path                                                   #
    ssl_certificate       /path/to/chained.crt;
    ssl_certificate_key   /path/to/private.key;

#   Proxy Performance Settings                                                 #
    proxy_buffers 16 64k;
    proxy_buffer_size 128k;

#   Proxy Security Settings                                                    #
    proxy_set_header      X-Forwarded-Host  $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_set_header      X-Odoo-dbfilter   "TEST";
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

#   Block Database Manager/Selector Access via URL except for us
    location ~* /web/database/* {
        allow ###.###.###.###;
        deny all;
        proxy_pass http://odoo;
    }

#   Reverse Proxy Invocation for Odoo Server                                   #
    location / {
        proxy_pass  http://odoo;
    }

#   Reverse Proxy Invocation for Longpolling                                   #
    location /longpolling {
        proxy_pass http://longpolling;
        proxy_redirect off;
    }

#   Reverse Proxy Invocation for Web Assets                                    #
    location ~* /web/static/ {
        proxy_cache_valid 200 60m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }

#   Reverse Proxy Invocation for Web Images                                    #
    location ~* /website/image/ir.attachment/ {
        proxy_cache_valid 200 60m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }

#   Access to Common gzip files                                                #
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

# ####################### End NGINX Configuration File ####################### #

我还设置了 default.conf 来防止直接通过 IP 访问:

# ============================================================================ #
#              Web Server NGINX Configuration for Defaukt                      #
# ============================================================================ #

# ============================================================================ #
# 1. HTTP and HTTPS Web Server to Block Access by IP                           #
# ============================================================================ #
#                                                                              #

server {
    listen      80 default_server;
    listen [::]:80 default_server;

    listen      443 ssl default_server;
    listen [::]:443 default_server;
    ssl_reject_handshake on;

    server_name _;
    return 444;
}

# ####################### End NGINX Configuration File ####################### #

我很高兴能得到正确的指导,或者告诉我遗漏了什么或者做错了什么。

谢谢。

答案1

解决了!

谢谢djdomi我解决了我遇到的问题,并得到了我需要的解决方案,回答他提到。

我所做的是在我的 default.conf 中添加自定义错误重定向:

error_page 403 /error/403;

由于allowdeny参数按预期工作但显示基本的 Nginx 403 错误,通过定义自定义错误重定向到它,现在显示 Odoo 404 错误模板并且用户使用的 URL 仍然存在,我认为这是因为example.com/error/403在应用程序中不存在,因此就此而言,请随意为 Odoo 使用一个您确定在您的部署中不存在的 URL 和一个您永远不会使用的 URL。

这是完整的 default.conf,以防有人需要它,它与我在问题中发布的 example.com.conf 完美配合:

# ============================================================================ #
#              Web Server NGINX Configuration for Default                      #
# ============================================================================ #

# ============================================================================ #
# 1. HTTP and HTTPS Web Server to Block Access by IP                           #
# ============================================================================ #
#                                                                              #

# Custom Error to replace Nginx Error
error_page 403 /error/403;

server {
    listen      80 default_server;
    listen [::]:80 default_server;

    listen      443 ssl default_server;
    listen [::]:443 default_server;
    ssl_reject_handshake on;

    server_name _;
    return 444;
}

# ####################### End NGINX Configuration File ####################### #

谢谢,希望这对其他人有帮助。

相关内容