web-dev-qa-db-fra.com

Pourquoi les ports inférieurs à 1024 sont-ils privilégiés?

J'ai entendu dire que c'était censé être une fonctionnalité de sécurité, mais cela semble souvent être un problème de sécurité. Si je veux écrire un serveur qui utilise un port privilégié, non seulement je dois me soucier de la sécurité de mon code, mais je dois surtout m'inquiéter de savoir si j'utilise setuid right et abandonne les privilèges.

54
num1

Vrai. Mais cela signifie également que toute personne qui vous parle sait que vous devez avoir des privilèges root pour exécuter ce serveur. Lorsque vous vous connectez à un serveur sur le port 22 (par exemple), vous savez que vous parlez à un processus qui a été exécuté par root (problèmes de sécurité mis à part), vous devez donc lui faire confiance avec votre mot de passe pour ce système, ou d'autres informations que vous pourriez ne faire confiance à personne disposant d'un compte utilisateur sur ce système.

Référence: http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html .

Modifiez pour développer le raisonnement: de nombreux services réseau les plus importants - telnet (oui, il est toujours utilisé - étonnamment souvent), SSH, de nombreux services HTTP, FTP, etc. - impliquent l'envoi de données importantes comme des mots de passe sur le câble. Dans une configuration sécurisée, une sorte de chiffrement, qu'il soit inhérent au protocole (SSH) ou enroulé autour (stunnel, IPSec), protège les données contre l'espionnage sur le câble, mais toutes ces protections se terminent au niveau du serveur.

Afin de protéger correctement vos données, vous devez vous assurer que vous parlez au "vrai" serveur. Aujourd'hui, les certificats sécurisés sont le moyen le plus important de le faire sur le Web (et ailleurs): vous supposez que seul le "vrai" serveur a accès au certificat, donc si vous vérifiez que le serveur auquel vous parlez possède ce certificat, vous Je vais lui faire confiance.

Les ports privilégiés fonctionnent de manière très similaire: seul root a accès aux ports privilégiés, donc si vous parlez à un port privilégié, vous savez que vous parlez à root. Ce n'est pas très utile sur le web moderne: ce qui compte, c'est l'identité du serveur, pas son IP. Dans d'autres types de réseaux, ce n'est pas le cas: dans un réseau universitaire, par exemple, les serveurs sont souvent physiquement contrôlés par du personnel de confiance dans des salles sécurisées, mais les étudiants et le personnel ont un accès assez libre en tant qu'utilisateurs. Dans cette situation, il est souvent sûr de supposer que vous pouvez toujours faire confiance à root, vous pouvez donc vous connecter et envoyer des données privées à un port privilégié en toute sécurité. Si les utilisateurs ordinaires pouvaient écouter sur tous les ports, vous auriez besoin d'une couche supplémentaire pour vérifier qu'un programme particulier a été approuvé avec certaines données.

57
jimw

Vous ne dites pas quelle plate-forme vous utilisez, mais sur Linux au moins, vous pouvez utiliser des capacités (spécifiquement CAP_NET_BIND_SERVICE) pour permettre à un processus non root d'écouter sur un port inférieur à 1024. Voir, par exemple, Est existe-t-il un moyen pour les processus non root de se lier aux ports "privilégiés" sous Linux?

Une autre alternative consiste à configurer des règles iptables pour transférer le trafic du port privilégié vers le port non privilégié (je l'ai utilisé en production, et c'est assez simple et fonctionne bien). Il est également décrit dans le lien ci-dessus.

8
Rich Drummond