Zammad: Réponses HTTP 401 provoquant des problèmes avec l'authentification de base

Créé le 24 mars 2020  ·  12Commentaires  ·  Source: zammad/zammad

Infos:

  • Version utilisée de Zammad: 3.2.0
  • Méthode d'installation (source, package, ..): Depuis la source en utilisant Ruby 2.5.5, derrière nginx rproxy.
  • Système d'exploitation: Ubuntu 18.04.4 LTS (bionic)
  • Base de données + version: postgres 9.5.21
  • Version d'Elasticsearch: 5.6.16
  • Navigateur + version: Google Chrome 80.0.3987.132

Comportement prévisible:

Zammad s'intègre en douceur avec une couche d' authentification de

Comportement réel:

Dans l'ensemble, Zammad n'a pas beaucoup de problèmes lorsqu'il est combiné avec l'authentification de base. Mais dans quelques cas, une demande reçoit une réponse avec un code d'état 401 et l'utilisateur actuel est obligé de saisir à nouveau ses informations d'authentification de base.

La base de code peut être recherchée facilement pour le statut 401 (ou unauthorized ):
https://github.com/zammad/zammad/search?l=Ruby&q=%3Aunauthorized

Étapes pour reproduire le comportement:

  • Configurer une instance Zammad et la placer derrière l'authentification de base

ENSUITE

  • Essayez de vous connecter avec de mauvaises informations d'identification
  • L'application affiche une page avec le code d'état 401 et vous oblige à ressaisir les informations d'authentification de base

OU ALORS

  • Créer un ticket attribué à un groupe auquel la personne 1 a accès
  • La personne 1 interagit avec ce ticket
  • Déplacer ce ticket vers un autre groupe qui n'est pas accessible pour la personne 1
  • La personne 1 verra toujours une demande 401 pour le ticket ci-dessus sur son aperçu Zammad, ce qui le déconnectera de l'authentification de base

Oui, je suis sûr que c'est un bogue et aucune demande de fonctionnalité ou une question générale.

API bug verified

Commentaire le plus utile

Salut les gars! Merci pour les précieuses informations et descriptions. J'ai lu la RFC et j'étais encore un peu confus sur les différences entre 401 et 403. Cependant, j'ai trouvé cette excellente explication sur StackOverflow. Citation:

Il y a un problème avec 401 Unauthorized, le code d'état HTTP pour les erreurs d'authentification. Et c'est juste cela: c'est pour l'authentification, pas pour l'autorisation.

Cela l'amène au fait. Zammad utilise 401 pour les erreurs authorization . Ceci est techniquement faux et donc un bug. Je rouvrirai le numéro.

Cependant, nous devons vérifier l'impact. Je suppose qu'il s'agit d'un changement radical en raison de toutes les implémentations et des consommateurs d'API disponibles.
Mon plan actuel est de déprécier 401 authorization avec Zammad 3.4, de le déprécier durement avec 3.5 (ou 3.6) et de passer à 403.
Nous devons en discuter davantage en interne.

D'autres réflexions à ce sujet, quelqu'un?

Tous les 12 commentaires

Veuillez mettre à jour votre premier article pour conserver vos informations d'installation exactes - "any" ne convient pas vraiment à ce stade - désolé. :)

Veuillez également fournir la configuration complète de votre serveur Web (et nous indiquer celui que vous utilisez). En ce moment, ça sent un peu comme une question technique, mais j'aimerais m'en assurer complètement. Cependant, pour cela, j'ai besoin de tout. ;)

Merci.

Re-bonjour,
J'ai mis à jour la description du problème - désolé pour le manque initial!
Meilleur

Merci pour la mise à jour. La configuration de votre serveur Web est-elle notre configuration par défaut étendue par l'authentification de base? Pourriez-vous également fournir cette configuration vhost? Juste pour être sûr de ne rien manquer.

Merci!

Oui, il s'agit essentiellement de la configuration Zammad Default + Basic Auth. Voici la configuration de vhost:

auth_basic 'Restricted: general basic auth';
auth_basic_user_file /etc/.htpasswd.d/zammad;
location /ws {
    proxy_pass  http://zammad_ws;
    proxy_redirect  off;
    proxy_hide_header X-Powered-By;
    proxy_set_header  Host              $host;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-Host  $host;
    proxy_set_header  X-Forwarded-Port  443;
    proxy_set_header CLIENT_IP $remote_addr;
    proxy_read_timeout 86400;
    proxy_http_version 1.1;
    proxy_set_header  Upgrade           $http_upgrade;
    proxy_set_header  Connection        "upgrade";
    proxy_max_temp_file_size  0;
    error_page 502 503 504 =503 @fallback;
}
location / { 
    try_files $uri @proxy;
}
location <strong i="6">@proxy</strong> { 
    proxy_pass  http://zammad;
    proxy_redirect  off;
    proxy_hide_header X-Powered-By;
    proxy_set_header  Host              $host;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto https;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-Host  $host;
    proxy_set_header  X-Forwarded-Port  $server_port;
    proxy_http_version 1.1;
    proxy_set_header  Upgrade           $http_upgrade;
    proxy_set_header  Connection        "upgrade";
    proxy_max_temp_file_size  0;
    proxy_set_header CLIENT_IP $remote_addr;
    error_page 502 503 504 =503 @fallback;
}

Nous avons examiné cela à nouveau.
Notre hypothèse (comme Michael l'a écrit) serait de ne pas renvoyer un HTTP 401 (ce qui fait croire au navigateur que les informations d'authentification de base données sont incorrectes) mais de renvoyer HTTP 403 interdit.

Si je le voyais correctement, cela signifierait

app / controllers / application_controller / handles_errors.rb # L39
respond_to_exception(e, :unauthorized)

doit être remplacé par
respond_to_exception(e, :forbidden)

La RFC indique que les navigateurs doivent se comporter différemment (https://tools.ietf.org/html/rfc7231#section-6.5.3): "Si les informations d'authentification ont été fournies dans la demande, le serveur les considère insuffisantes pour accorder l'accès. Le client DEVRAIT NE PAS répéter automatiquement la demande avec les mêmes informations d'identification. "

Cependant, nous avons eu le même problème dans un autre projet la semaine dernière et 403 œuvres.
Si vous ne voyez pas d'autres problèmes pour renvoyer un 403, nous pouvons émettre un PR.

Meilleur

Désolé d'avoir été si long.
Veuillez noter que ce n'est pas un problème lié à Zammad (basé sur une application), mais un "problème de backend" sur votre nginx.

Les demandes d'authentification pour l'authentification de base n'atteignent jamais Zammad en tant qu'application mais se terminent déjà (et sont vérifiées par) votre nginx ou tout autre serveur Web que vous utiliseriez.

Ainsi, changer le code source ne résout pas du tout votre problème.
Techniquement, un 401 non autorisé est correct d'après ce que je peux dire (même si je comprends que vous voudriez un 403).

Voir également:
https://serverfault.com/questions/616770/nginx-auth-basic-401-htpasswd

D'ailleurs:
Juste pour vérifier, j'ai complètement commenté les parties du proxy Zammad pour m'assurer que le backend de Zammad ne peut pas répondre. Le résultat avec 401 est le même et donc la faute de nginx. :)

Clôture car ce n'est pas un bug mais une question technique.

Salut @MrGeneration ,
merci d'avoir examiné cela.

Bien que je comprenne que ce problème semble être hors de portée pour l'application Zammad, je pense toujours qu'il est causé par elle (et non par le Ngnix). Je vais essayer d'expliquer pourquoi:

Supposons que notre ngnix n'est pas configuré pour utiliser l'authentification de base. Dans ce cas, nous convenons tous les deux que l'application Zammad ("derrière" le ngnix) fonctionne très bien.

Maintenant, nous activons l'authentification de base en ajoutant la configuration indiquée ci-dessus à notre ngnix. Veuillez noter que même maintenant, presque tout fonctionne toujours comme prévu - y compris les authentifications (connexion de base et Zammad) et l'application Zammad elle-même.

Le problème que j'ai essayé de décrire plus tôt est parfois causé plus tard (par Zammad!) Lorsque l'application affiche une page avec le code d'état 401. Dans ce cas, _tout serveur Web_ avec l'authentification de base activée est obligé de vous déconnecter.

Je conviens que, sémantiquement parlant, 401 sonne «juste» dans ce cas. Techniquement parlant, cela pose des problèmes inévitables avec l'authentification de base et devrait être remplacé par 403.
Veuillez rouvrir ce problème car il peut également affecter l'UX de l'application Zammad pour de nombreux utilisateurs.

@thorsteneckel quelle est votre opinion à ce sujet?

Salut les gars! Merci pour les précieuses informations et descriptions. J'ai lu la RFC et j'étais encore un peu confus sur les différences entre 401 et 403. Cependant, j'ai trouvé cette excellente explication sur StackOverflow. Citation:

Il y a un problème avec 401 Unauthorized, le code d'état HTTP pour les erreurs d'authentification. Et c'est juste cela: c'est pour l'authentification, pas pour l'autorisation.

Cela l'amène au fait. Zammad utilise 401 pour les erreurs authorization . Ceci est techniquement faux et donc un bug. Je rouvrirai le numéro.

Cependant, nous devons vérifier l'impact. Je suppose qu'il s'agit d'un changement radical en raison de toutes les implémentations et des consommateurs d'API disponibles.
Mon plan actuel est de déprécier 401 authorization avec Zammad 3.4, de le déprécier durement avec 3.5 (ou 3.6) et de passer à 403.
Nous devons en discuter davantage en interne.

D'autres réflexions à ce sujet, quelqu'un?

Ce sont de bonnes nouvelles! Cela me semble bon.

Pour vous tenir au courant: nous allons l'implémenter avec la prochaine version 4.0.

À des fins de mise en œuvre interne: https://thoughtbot.com/blog/forbidden-kisses-http-fluency-in-clearance

Corrigé avec le commit ci-dessus. Nous avons pris le risque et amélioré certains des messages d'erreurs 401 , mais fondamentalement, la seule chose que nous avons changée était les erreurs de non-authentification en 403 Forbidden .

Vous pouvez tester cela avec le dernier package develop dans environ 30 minutes à partir de maintenant. Veuillez noter qu'il s'agit d'une branche fonctionnelle et non stable. Assurez-vous donc d'avoir une sauvegarde et attendez-vous au pire :) Au plaisir d'entendre vos commentaires!

Cette page vous a été utile?
0 / 5 - 0 notes