AWS Spring boot Nginx - загрузка файла 1 КБ работает - 250 КБ завершается с ошибкой 403 Forbidden

У меня есть приложение весенней загрузки, работающее на AWS, которое загружает файл на S3, который отлично работает для текстового файла размером 1 КБ. Не удается получить текстовый файл размером 250 КБ с 403 Forbidden без каких-либо журналов в журналах доступа/ошибок nginx, запрос также не доходит до Tomcat. Я даже удалил сохранение на диск/S3, как показано ниже. Он сразу же терпит неудачу с 403 Forbidden.

Контроллер

    @GetMapping("/inputuploads") 
    public String listInputUploads(Model model) {
        logger.info("Renedering upload page");
        return "inputuploads";
    }
    
    @PostMapping("/inputuploads")
    public String saveFile(Model model, @RequestParam("file") MultipartFile file, RedirectAttributes ra) throws IOException {       
        logger.info("Saving file:"+file.getOriginalFilename());
        ra.addFlashAttribute("message","Uploaded file: "+ file.getOriginalFilename());      
        return "redirect:/inputuploads";
    }

шаблон

            <div th:if = "${message}">
                    <div th:text = "${message}">                    
                    </div>                              
            </div>
                       
            <div >
                <form method = "post" th:action = "@{/inputuploads}" enctype = "multipart/form-data" >
                                    
                    <div>                        
                        <input type = "file" name = "file" accept = ".xlsm" >                                          
                    </div>
                    
                    <div>
                        <button type = "submit" >Upload</button>
                    </div>
                    
                </form>                
            </div>
        

application.yml

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
      
server:
  port: 5000
  tomcat:
    max-swallow-size: -1 

.платформа/nginx/nginx.conf

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    32633;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        default     "upgrade";
    }

    server {
        listen 80;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl default_server;

        ssl_certificate certificates/localhost.crt;
        ssl_certificate_key certificates/localhost.key;
        

        access_log    /var/log/nginx/access.log main;
        
        client_header_timeout 1d;
        client_body_timeout   1d;
        client_max_body_size 100M;
        keepalive_timeout     1d;
        proxy_connect_timeout 1d;
        proxy_read_timeout 1d;
        proxy_send_timeout 1d;
        gzip                  off;
        gzip_comp_level       4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        include conf.d/elasticbeanstalk/*.conf;
    }
}

.platform/nginx/conf.d/client_max_body_size.conf

client_max_body_size 100M;

.platform/nginx/conf.d/elasticbeanstalk/00_application.conf

location / {
    proxy_pass http://127.0.0.1:5000;

    proxy_http_version  1.1;

    proxy_set_header    Connection          $connection_upgrade;
    proxy_set_header    Upgrade             $http_upgrade;
    proxy_set_header    Host                $host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
}

.ebextensions/00-set-timezone.config

commands:
  set_time_zone:
    command: ln -f -s /usr/share/zoneinfo/Asia/Kolkata /etc/localtime

Есть ли у вас перед этим AWS WAF? Похоже, что ошибка 403 может исходить от WAF, который по умолчанию проверяет до 8 КБ. Если это так, см., например, repost.aws/knowledge-center/waf-upload-blocked-files и docs.aws.amazon.com/waf/latest/developerguide/… и stackoverflow. com/questions/64853122/…

andresm53 11.07.2024 19:28

Я думаю, что это проблема: возможность загрузки до 7 КБ, 8 и 9 КБ выдает «Запрещено».

itsraja 12.07.2024 07:32

@ andresm53 andresm53 Пожалуйста, добавьте это как ответ, чтобы я мог отметить.

itsraja 14.07.2024 20:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
134
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку HTTP-запросы не получают nginx (за исключением небольших) и возникает ошибка 403 Forbidden, похоже, что AWS WAF (который можно подключить к используемому вами интерфейсу, т. е. AWS ALB) блокирует запросы. По умолчанию AWS WAF блокирует запросы, если размер тела HTTP превышает 8 КБ. Вы можете изменить это поведение, настроив Обработку кузова увеличенного размера.

Таким образом, в этом случае вы можете добавить правило в список управления доступом WAF, чтобы исключить URI, используемый для загрузки. Из Рекомендации по управлению слишком большими компонентами в веб-списке управления доступом:

Если вам нужно разрешить некоторые запросы с содержимым компонентов слишком большого размера, если возможно, добавьте правила, которые явно разрешают только эти запросы. Установите приоритет этих правил, чтобы они выполнялись перед любыми другими правилами в веб-списки управления доступом, которые проверяют одни и те же типы компонентов. При таком подходе вы не сможет использовать AWS WAF для проверки всего содержимого компоненты слишком большого размера, которые вы разрешаете передавать на защищенный ресурс.

Другие вопросы по теме