Nginx не соблюдает конфигурацию

У меня есть развертывание kubernetes, которое требует следующей конфигурации:

  • POST должен быть разрешен из любого источника.
  • GET, HEAD, LIST должен быть ограничен интранетом.

Я придумал:

include modules/*.conf;    
worker_processes  1;

error_log  /dev/stdout info;

events {
    worker_connections  1024;}

http {
        include       mime.types;
        default_type  application/octet-stream;
        log_format    main '$http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
        access_log    /dev/stdout main;
        sendfile      on;
        keepalive_timeout  65;

    server {
        listen       8080;
        server_name  localhost;
        port_in_redirect off;

        location / {
            root   html;
            index  index.html;
        }

        error_page  403 /403.html;
        error_page  404 /404.html;
        error_page  500 /500.html;
        error_page  502 /502.html;
        error_page  503 /503.html;
        error_page  504 /504.html;
    }
}

if ($request_method != POST) { 
    limit_except GET DELETE PUT{
         allow 10.0.0.0/8;
         deny all; 
    } 
}

Но я все еще могу получить из внешней сети

2 ответа

Я бы не стал использовать "если" из-за производительности и других причин.

Примерно так может быть лучше, если вы можете разделить свои URL таким образом. Ключ является limit_except. Есть вероятность, что у меня есть параметры в обратном направлении (поменяйте местами GET с POST), и, возможно, потребуется пересмотреть "deny all", но эта общая идея должна помочь решить проблему. Я буду обновлять ответ на основе любых комментариев.

location /post/service {
  root html;
  index  index.html;
  // OR proxy_pass http://whatever;

  // ALLOW POST
  limit_except GET {
    deny all;
  }
}

location / {
  root html;
  index  index.html;
  // OR proxy_pass http://whatever;

  // ALLOW GET
  limit_except POST {
    deny all;
  }
}

Единственный действительный контекст для limit_except директива - это местоположение, и смысл этой директивы - ограничить использование методов HTTP, которые явно не исключаются.

Вы хотите строфу, как это:

    location / {
        root   /usr/share/nginx/html;
        index  index.html;

        limit_except POST {
             allow 10.0.0.0/8;
             deny all; 
        } 
    }
Другие вопросы по тегам