-
OpenSSH avec Séparation des Privilèges
Nous utilisons un processus fils sans privilège pour contenir et restreindre
les effets des erreurs de programmation. Un bogue dans le processus fils non
privilégié ne résulte pas en la compromission du système. En d'autres mots,
le but est la séparation complète des privilèges dans
OpenSSH.
La séparation des privilèges utilise deux processus : le processus père
privilégié contrôle les progrès du processus fils non privilégié. Le
processus fils est non privilégié. Ceci est atteint en changeant ses uid/gid
vers un utilisateur non utilisé et en restreignant ses accès au système de
fichiers via chroot() à /var/empty. C'est le seul processus qui
traite des données réseau. Le père privilégié peut être modélisé par une
très petite machine d'états finis donc il est facile de raisonner à propos
du code qui est exécuté avec des privilèges.
Une interface bien définie entre le père privilégié et le fils non
privilégié permet au fils de déléguer les opérations qui requièrent des
privilèges au père. La réussite de l'authentification est déterminée par le
processus père.
La communication entre les processus privilégié et non privilégié est
accomplie par des tubes. La mémoire partagée stocke l'état qui ne peut être
exporté autrement. Le fils doit demander au père privilégié de déterminer si
l'authentification était réussie ou non.
|
|
|
Si le processus fils est corrompu et croit que l'utilisateur distant a été
authentifié, l'accès ne sera pas autorisé à moins que le père soit parvenu à
la même décision.
Auparavant toute corruption de sshd pouvait conduire à une
compromission root distante immédiate si elle se produisait avant
l'authentification, et à une compromission root locale si elle se passait
après l'authentification.
La séparation des privilèges rendra une telle
compromission très difficile si non impossible.
Statut du Projet
- 2002-03-18: OpenSSH avec Séparation des Privilèges
a été intégré dans le dépôt cvs de OpenBSD.
- 2002-03-16: Une réaction d'un utilisateur a identifié quelques petits
problèmes qui sont en cours de résolution maintenant.
- 2002-03-15: Version finalisée. À la recherche de
retours.
- 2002-03-14: Fixations de bogues mineurs. Plutôt stable, s'exécute sur
tous mes systèmes de bureau.
- 2002-03-13: SSHv1 est avec la séparation des
privilèges, aussi. BSD-auth est supporté et d'autres systèmes
d'authentification devraient opérer sous séparation des privilèges bientôt.
- 2002-03-12: Tout OpenSSH est complètement avec séparation des
privilèges. Afin d'avoir la séparation des privilèges après
l'authentification, le système d'exploitation a besoin de supporter le
passage de descripteurs de fichiers. Si aucun passage de descripteurs de
fichiers n'est accessible, la séparation des privilèges s'arrêtera après que
l'authentification aura réussie.
- SSH v2 seulement:
À présent la séparation des privilèges fonctionne
seulement pour le protocole v2. Le protocole SSH
v1 est actuellement à l'étude.
- 2002-03-11: La pré-authentification est complètement avec séparation des
privilèges. Après que l'authentification a été réussie le fils non
privilégié exporte ses états de la cryptographie et de la compression au
père privilégié qui continue alors.
-
État de la Cryptographie:
OpenSSH a besoin de garder trace de l'IV courant, et pour les
chiffrements de flux l'état de la clé en entier. Actuellement,
j'obtiens le contexte depuis la structure EVP_CIPHER_CONTEXT.
-
Exportation de l'État de la Compression:
Je devais créer deux segments de mémoire partagée. Passer
outre les fonctions d'allocation de zlib pour allouer les
entrées depuis le second segment de mémoire. Quand le
processus existe vous avez toutes les structures de contrôle
depuis le premier segment de mémoire stocké dans le second
segment de mémoire et pouvez utiliser l'information dans le
second segment pour synchroniser complètement l'état pour le
premier segment d'un processus à l'autre.
Ceci est complètement transparent
puisque la bibliothèque zlib fournit des "hooks" pour des
mécanismes privés d'allocation.
Références
Code source
Le code source est accessible depuis le dépôt CVS d'OpenBSD.
Remerciements
Markus Friedl
a aidé à l'écriture du code pour la séparation des privilèges et ses
suggestions ont amélioré ses qualités de façon significative.
Portabilité
Maintenir la portabilité est une haute priorité. L'interface à la mémoire
partagée est très bien abstraite et devrait être facile à remettre en
oeuvre sur des systèmes d'exploitation qui ne supportent pas les segments de
mémoire anonyme.
La version portable de OpenSSH supporte la Séparation des Privilèges.
Quelques problèmes avec quelques systèmes d'exploitation sont toujours à
l'étude.
|
|