Comment configurer Nginx pour utiliser l'API REST de Dolibarr?

Bonjour,

J’essaie de configurer mon serveur Nginx pour utiliser l’API REST de dolibarr mais je fais face à des problèmes et des informations contradictoires.

I) Je suis la page wiki suivante

Il est indiqué la configuration suivante

        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
                return 404;
            }

            # Mitigate https://httpoxy.org/ vulnerabilities
            fastcgi_param HTTP_PROXY "";

            root           /usr/share/webapps/dolibarr/htdocs;
            fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            # Dolibarr Rest API path support
            fastcgi_param  PATH_INFO       $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_script_name;
        }

Le problème est que je rencontre deux problèmes avec cette configuration.

  • Lorsque j’active/désactive la compression

    J’ai des redirections dans les logs et la page n’aboutit pas
  • Lorsque je vais sur la page /api/index.php/explorer/ et entre ma clé, j’ai la doc de l’API ne s’affiche pas

II)
Si je remplace
fastcgi_param PATH_TRANSLATED **$document_root$fastcgi_script_name;**
par
fastcgi_param PATH_TRANSLATED **$document_root$fastcgi_path_info;**
tel qu’il est indiqué dans ce post

J’ai carrément un access denied

Avec dans les logs nginx
[error] 80822#0: *1 FastCGI sent in stderr: "Access to the script '/htdocs/applications/dolibarr-20.0.0/htdocs' has been denied (see security.limit_extensions)" while reading response header from upstream

Pourtant j’ai bien désactivé les extensions dans mon php_fpm.conf
security.limit_extensions =

Quelle configuration avec vous ?
De mon point de vue la configuration du wiki ne fonctionne pas.

Merci

Bonjour,

étant donné que la configuration du wiki contient une ligne pour corriger une faille de 2016 qui a été corrigée en 2016, je dirais que la configuration date un peu.

Une de mes configs qui fonctionne avec compression des réponses API activée

server {
                listen 0.0.0.0:443 ssl ;
                listen [::0]:443 ssl ;
                server_name *************** ;
                http2 on;
                ssl_certificate *******/fullchain.pem;
                ssl_certificate_key ************/key.pem;
                ssl_trusted_certificate***********/chain.pem;
                root /srv/www/dolibarr/achats/dol1805/htdocs;
                location ~ /\. {
                        deny all;
                }
                location ~ \.(log|tpl|twig|sass|yml)$ {
                        deny all;
                }
                location ~ ^(.+\.php)(.*)$ {
                        # socket
                        fastcgi_pass unix:/run/phpfpm/dolibarr-achats.sock;
                        fastcgi_split_path_info ^(.+\.php)(/.*)$;
                        if (!-f $document_root$fastcgi_script_name) {
                                return 404;
                        }
                        # Used by tcpdf
                        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
                        ## needed for dolibarr custom modules
                        fastcgi_param CONTEXT_DOCUMENT_ROOT $document_root;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        # Dolibarr Rest API path support
                        fastcgi_param PATH_INFO $fastcgi_path_info;
                        # nginx default fastcgi_params
                        include fastcgi_params;
                        ## TUNE buffers to avoid error ##
                        fastcgi_buffers 16 32k;
                        fastcgi_buffer_size 64k;
                        fastcgi_busy_buffers_size 64k;
                }
                index index.php;
                error_page 404 /index.php?controller=404;
        }

Ma bonne configuration ( à adapter) :

server {
  listen       *:443 ssl http2;
  listen       [::]:443 ssl http2 ;


  server_name  xxx.com;

  ssl_certificate           /etc/letsencrypt/live/xxx.com/fullchain.pem;
  ssl_certificate_key       /etc/letsencrypt/live/xxx.com/privkey.pem;
  ssl_trusted_certificate   /etc/letsencrypt/live/xxx.com/chain.pem;

  index  index.html index.htm index.php;
  access_log            /var/log/nginx/ssl-xxx.com_ssl.access.log;
  error_log             /var/log/nginx/ssl-xxx.com_ssl.error.log;


  root /var/www/users/dol/xxx.com/web/;
      add_header "X-Robots-Tag" "noindex";


  location ~ \.php(/|$) {
    include /etc/nginx/fastcgi_params;
    set $path_info $fastcgi_path_info;
    add_header "X-Robots-Tag" "noindex";

    fastcgi_pass  unix:/var/run/php8.2-fpm-dol.sock;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param PATH_INFO       $path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    try_files $fastcgi_script_name =404;
    fastcgi_buffer_size 32k;
    fastcgi_buffers 8 16k;
    fastcgi_busy_buffers_size 32k;
    fastcgi_intercept_errors on;
  }
}

Bonjour et merci pour vos réponses.

Aucune de vos configurations ne résout le problème chez moi.

@Beers La différence que je dois entre ta configuration et celle du wiki est:

fastcgi_param CONTEXT_DOCUMENT_ROOT $document_root;

Sinon ça me semble identique.

@libremaster Je vois que tu set $path_info

set $path_info $fastcgi_path_info;

Pour ensuite l’utiliser pour ton PATH_INFO

fastcgi_param PATH_INFO       $path_info;

Je ne comprends pas pourquoi tu fais cela car tu ne remanipules pas ta variable $path_info
Es-tu sûr que cette manipulation est vraiment nécéssaire ?
Je remarque que par rapport au Wiki et @Beers tu n’as pas

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
fastcgi_param CONTEXT_DOCUMENT_ROOT $document_root;

Mais dans les deux cas, pour vous deux.
Il se passe quoi lorsque vous activez/désactivez la compression en GUI (mon premier message) ?

ça c’est parce qu’il y a un try_files dans son block, c’est un vieux bug « connu » (enfin c’est plutôt du au fonctionnement de try_files, c’est pas réellement un bug) de nginx
voir ici pour les détails https://trac.nginx.org/nginx/ticket/321

Merci pour cette précision.

Par contre, parviens tu à activer/désactiver la compression en GUI ?

La compression GUI n’est pas activée chez moi.

Avec ou sans compression tout fonctionne chez moi.

La clé API correspond-elle à un utilisateur qui a des permissions suffisantes pour faire quelque chose ?

@Beers @libremaster Je pense que je me suis mal exprimé

Est-ce que cela fonctionne lorsque vous bougez le curseur ?

J’ai bien des droits sur mon utilisateur

Chez moi mon Nginx est chrooté, un script s’éxecutant par Nginx voit / alors qu’au niveau OS il est dans /var/www
Je pense à cette piste maintenant.

Bonjour,

Ouh là là !
C’était dur de trouver d’où venait le problème !!!

cgi.fix_pathinfo doit être positionné à 1 et non à 0

C’est vraiment dommage que cela ne soit pas documenté.

C’est une variable de configuration de php ça, pas de nginx. C’est bizarre qu’elle soit à 0, la valeur par défaut dans php c’est 1.

Oui tu as tout à fait raison, c’est une variable de PHP et dans le cas de NGinx la configuration PHP est déportée sur php_fpm.
Donc il n’était pas évident de distinguer les deux.

La recommandation en termes de sécurité est de positionné cette valeur à 0 et jusqu’à présent Dolibarr fonctionnait bien avec cette valeur à 0.
Je la positionne systématiquement à 0 dans toutes les applications que j’utilise sauf si j’ai connaissance qu’elle doit être à 1.

Idéalement, ce point devrait être précisé dans le Wiki.

Merci pour votre aide.

Oui si on veut, mais cela ne permet d’exploiter une faille que si on est permissif sur le reste de la config et d’exécuter par exemple un fichier vilain.png qui contiendrait du code php.

Il y a ça pour régler le problème, la config par défaut permet d’executer du .php et du .phar

security.limit_extensions = .php
1 « J'aime »