Регистрация тела POST (запрос и ответ) с ingress- nginx - PullRequest
1 голос
/ 04 августа 2020

Кажется, что из коробки ngx_http_core_module должен регистрировать request_body, если он является частью log_format.

Однако я не вижу, чтобы это работало ни для чего, что включает auth_request в location блок. Я не совсем уверен, чем это вызвано. Кажется, он отлично работает для блоков location, которые не включают директиву auth_request.

Типичный сгенерированный блок местоположения будет выглядеть следующим образом:

    server {
        server_name test-api.dummy.co ;
        
        listen 80  ;
        listen 443  ssl http2 ;
        
        set $proxy_upstream_name "-";
        
        ssl_certificate_by_lua_block {
            certificate.call()
        }
        
        proxy_pass_request_body on;
        
        access_log /var/log/nginx/access.log custom_api_log;

        location ~* "^/api/v2/management/customer/[a-zA-Z0-9-]+/" {
            
            set $namespace      "control";
            set $ingress_name   "apps-public-gateway-api-ig-auth";
            set $service_name   "istio-ingressgateway";
            set $service_port   "80";
            set $location_path  "/api/v2/management/customer/[a-zA-Z0-9-]+/";
            
            rewrite_by_lua_block {
                lua_ingress.rewrite({
                    force_ssl_redirect = true,
                    ssl_redirect = true,
                    force_no_ssl_redirect = false,
                    use_port_in_redirects = false,
                })
                balancer.rewrite()
                plugins.run()
            }
            
            # be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any
            # will always succeed when there's `access_by_lua_block` that does not have any lua code doing `ngx.exit(ngx.DECLINED)`
            # other authentication method such as basic auth or external auth useless - all requests will be allowed.
            #access_by_lua_block {
            #}
            
            header_filter_by_lua_block {
                lua_ingress.header()
                plugins.run()
            }
            
            body_filter_by_lua_block {
            }
            
            log_by_lua_block {
                balancer.log()
                
                monitor.call()
                
                plugins.run()
            }
            
            port_in_redirect off;
            
            set $balancer_ewma_score -1;
            set $proxy_upstream_name "control-istio-ingressgateway-80";
            set $proxy_host          $proxy_upstream_name;
            set $pass_access_scheme  $scheme;
            
            set $pass_server_port    $server_port;
            
            set $best_http_host      $http_host;
            set $pass_port           $pass_server_port;
            
            set $proxy_alternative_upstream_name "";
            
            # this location requires authentication
            auth_request        /_external-auth;
            auth_request_set    $auth_cookie $upstream_http_set_cookie;
            add_header          Set-Cookie $auth_cookie;
            auth_request_set $authHeader0 $upstream_http_authorization;
            proxy_set_header 'Authorization' $authHeader0;
            
            # Cors Preflight methods needs additional options and different Return Code
            if ($request_method = 'OPTIONS') {
                more_set_headers 'Access-Control-Allow-Origin: https://test-portal.dummy.co';
                more_set_headers 'Access-Control-Allow-Credentials: true'; 
                more_set_headers 'Access-Control-Allow-Methods: GET, PUT, POST, DELETE, PATCH, OPTIONS';
                more_set_headers 'Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
                more_set_headers 'Access-Control-Max-Age: 3600';
                more_set_headers 'Content-Type: text/plain charset=UTF-8';
                more_set_headers 'Content-Length: 0';
                return 204;
            }
            
            more_set_headers 'Access-Control-Allow-Origin: https://test-portal.dummy.co';
            more_set_headers 'Access-Control-Allow-Credentials: true'; 
            more_set_headers 'Access-Control-Allow-Methods: GET, PUT, POST, DELETE, PATCH, OPTIONS';
            more_set_headers 'Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
            
            client_max_body_size                    1m;
            
            proxy_set_header Host                   $best_http_host;
            
            # Pass the extracted client certificate to the backend
            
            # Allow websocket connections
            proxy_set_header                        Upgrade           $http_upgrade;
            
            proxy_set_header                        Connection        $connection_upgrade;
            
            proxy_set_header X-Request-ID           $req_id;
            proxy_set_header X-Real-IP              $remote_addr;
            
            proxy_set_header X-Forwarded-For        $remote_addr;
            
            proxy_set_header X-Forwarded-Proto      $full_x_forwarded_proto;
            
            proxy_set_header X-Forwarded-Host       $best_http_host;
            proxy_set_header X-Forwarded-Port       $pass_port;
            
            proxy_set_header X-Scheme               $pass_access_scheme;
            
            # Pass the original X-Forwarded-For
            proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;
            
            # mitigate HTTPoxy Vulnerability
            # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
            proxy_set_header Proxy                  "";
            
            # Custom headers to proxied server
            
            proxy_connect_timeout                   5s;
            proxy_send_timeout                      60s;
            proxy_read_timeout                      60s;
            
            proxy_buffering                         off;
            proxy_buffer_size                       4k;
            proxy_buffers                           4 4k;
            
            proxy_max_temp_file_size                1024m;
            
            proxy_request_buffering                 on;
            proxy_http_version                      1.1;
            
            proxy_cookie_domain                     off;
            proxy_cookie_path                       off;
            
            # In case of errors try the next upstream server before returning an error
            proxy_next_upstream                     error timeout;
            proxy_next_upstream_timeout             0;
            proxy_next_upstream_tries               3;
            
            proxy_pass http://upstream_balancer;
            
            proxy_redirect                          http://test-api.dummy.co https://test-api.dummy.co;
            
        }
   }

Возможно ли это с помощью Lua сценарий, возможно, если мы не сможем добиться этого из коробки?

А как go о регистрации тела ответа без специального шаблона для ingress-nginx контроллера?

Заранее спасибо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...