2

It seems that out of the box ngx_http_core_module should log request_body if it's part of the log_format.

However, Im not seeing this working for anything that includes auth_request in location block. Im not entirely sure what causes it. It appears to work fine for location blocks that do not include auth_request directive.

Typical the generated location block would look like,

    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;
            
        }
   }

Is this achievable via a Lua script perhaps if we cannot achieve this out of the box ?

And how to go about logging the response body without having a custom template for ingress-nginx controller ?

Thanks in advance.

nixgadget
  • 6,983
  • 16
  • 70
  • 103

0 Answers0