Pourquoi le VPN PPTP de Lion Server ne marche-t-il pas ? Comment s’en sortir ?

Si vous ne l’aviez pas lu à l’époque, sachez qu’à un moment Apple avait publier un article dans sa KB expliquant les quelques commandes à taper pour activer le service VPN PPTP sur Lion Server. Ceux qui s’y sont essayés savent que la documentation donnait sur quelque chose de non fonctionnel, le serveur donnait le légendaire « MPPE required, but keys are not available.  Possible plugin problem? », voici pourquoi…

Commençons par rappeler quelques bases sur le VPN de type PPTP. Ce type de VPN est multiprotocoles et permet différentes options de compressions et chiffrements, dont la plus répandue, MPPC / MPPE qui offre à la fois compression et chiffrement. Cette option créée par Microsoft est la plus répandue pour le VPN PPTP et c’est celle implémentée par défaut sur OS X Server.

Passons sur les détails de fonctionnement, ce qu’il faut retenir c’est que MPPE coté client et coté serveur génère différentes clefs de chiffrement à partir du mot de passe utilisateur sous forme MSCHAPv2. Si les mots de passe sont identiques, les clefs le sont aussi et la communication se fait. Je résume, mais grossièrement c’est ça.

Pour que ça fonctionne, il faut donc que le serveur puisse avoir accès à l’empreinte MSCHAPv2 du mot de passe de l’utilisateur qui cherche à se connecter. Cette empreinte est disponible dans le serveur de mot de passe dont le comportement standard est de vérifié une empreinte qu’on lui passe en paramètre vis-a-vis de celle qu’il a en mémoire. Si on souhaite lire le contenu stocké dans le serveur de mot de passe il faut être soit administrateur, soit utiliser un compte de service qui a été spécialement créé pour cet usage. C’est justement le type de compte créé normalement pour le service VPN. Un petit tour sur un Snow Leopard Server nous permet de voir ceci :

% pwpolicy -u vpn_985b073d217b -getpolicy
Getting policy for vpn_985b073d217b
 
isDisabled=0 isAdminUser=0 newPasswordRequired=0 usingHistory=0 canModifyPasswordforSelf=1
usingExpirationDate=0 usingHardExpirationDate=0 requiresAlpha=0 requiresNumeric=0 expirationDateGMT=12/31/69
hardExpireDateGMT=12/31/69 maxMinutesUntilChangePassword=0 maxMinutesUntilDisabled=0 maxMinutesOfNonUse=0
maxFailedLoginAttempts=0 minChars=0 maxChars=0 passwordCannotBeName=0 requiresMixedCase=0 requiresSymbol=0
notGuessablePattern=0 isSessionKeyAgent=1 isComputerAccount=0 adminClass=0 adminNoChangePasswords=0
adminNoSetPolicies=0 adminNoCreate=0 adminNoDelete=0 adminNoClearState=0 adminNoPromoteAdmins=0

Le passage important est la clef isSessionKeyAgent. Une petite recherche dans les sources libres d’OS X nous amène ici.

La lecture des premières lignes donnant les réponses nécessaires à la compréhension du tout :

    int requiresAlpha:1;					// TRUE == password must have one char in [A-Z], [a-z]
    int usingHardExpirationDate:1;			// TRUE == look at hardExpirationDateGMT
    int usingExpirationDate:1;				// TRUE == look at expirationDateGMT
    int canModifyPasswordforSelf:1;			// TRUE == user can modify their own password
    int usingHistory:1;						// TRUE == user has a password history file
    int newPasswordRequired:1;				// TRUE == user is required to change the password at next login
    int isAdminUser:1;						// TRUE == can modify other slots in the db
    int isDisabled:1;						// TRUE == cannot log in
    int isSessionKeyAgent:1;					// the user can retrieve (MPPE) session keys
	unsigned int historyCount:4;
	int passwordCannotBeName:1;
	int passwordIsHash:1;
    int requiresNumeric:1;

C’est donc bel et bien cette option qu’il nous faut avoir à 1 pour que l’agent du VPN puisse accéder aux clef de chiffrement. Voyons voir ce que cela donne sous OS X Lion Server…

# pwpolicy -u vpn_c9952f0277eb -getpolicy
Getting policy for vpn_c9952f0277eb /LDAPv3/127.0.0.1
 
isDisabled=0 isAdminUser=1 newPasswordRequired=0 usingHistory=0 canModifyPasswordforSelf=1
usingExpirationDate=0 usingHardExpirationDate=0 requiresAlpha=0 requiresNumeric=0 expirationDateGMT=12/31/69
hardExpireDateGMT=12/31/69 maxMinutesUntilChangePassword=0 maxMinutesUntilDisabled=0 maxMinutesOfNonUse=0
maxFailedLoginAttempts=0 minChars=0 maxChars=0 passwordCannotBeName=0 validAfter=01/01/70 requiresMixedCase=0
requiresSymbol=0 notGuessablePattern=0 isSessionKeyAgent=0 isComputerAccount=0 adminClass=0
adminNoChangePasswords=0 adminNoSetPolicies=0 adminNoCreate=0 adminNoDelete=0 adminNoClearState=0
adminNoPromoteAdmins=0

Et là, c’est le drame… Le compte de service VPN est mal configuré, il n’a pas les droits pour accéder aux clefs MSCHAPv2. Le problème est bien plus profond qu’une simple mauvaise configuration de base. Il faut croire que des capacités ont été oublié dans la migration de DirectoryService vers opendirectoryd, la ligne de commande pwpolicy qui permettait d’éditer cette option sous Snow ne fonctionne plus sous Lion. Impossible de corriger ce droit d’accès à l’heure actuelle…

Mais comment faire du coup ? Se passer du PPTP ? C’est une option pas toujours acceptable, essayez donc de faire de l’IPSec sous Windows XP… Ce qu’il faut bien comprendre ici c’est que ce n’est pas le serveur VPN qui pose problème, mais bien le fait qu’il ne peut pas accéder aux clefs de chiffrement. Il reste donc une possibilité, et ce n’est pas de gaieté de cœur que je vous la donne, désactiver le chiffrement MPPE.

En effet, si vous coupez le service de chiffrement, plus besoin des clefs, votre VPN fonctionne.

Voici donc les commandes permettant d’activer le VPN PPTP sous Lion Server :

bash-3.2# serveradmin settings
vpn:Servers:com.apple.ppp.pptp:DNS:OfferedSearchDomains:_array_index:0 = "search domain"
vpn:Servers:com.apple.ppp.pptp:DNS:OfferedServerAddresses:_array_index:0 = "dns server"
vpn:Servers:com.apple.ppp.pptp:enabled = yes
vpn:Servers:com.apple.ppp.pptp:PPP:AuthenticatorEAPPlugins:_array_index:0 = "EAP-RSA"
vpn:Servers:com.apple.ppp.pptp:PPP:AuthenticatorACLPlugins:_array_index:0 = "DSACL"
vpn:Servers:com.apple.ppp.pptp:PPP:CCPEnabled = 0
vpn:Servers:com.apple.ppp.pptp:PPP:AuthenticatorProtocol:_array_index:0 = "MSCHAP2"
vpn:Servers:com.apple.ppp.pptp:PPP:AuthenticatorPlugins:_array_index:0 = "DSAuth"
vpn:Servers:com.apple.ppp.pptp:IPv4:ConfigMethod = "Manual"
vpn:Servers:com.apple.ppp.pptp:IPv4:DestAddressRanges:_array_index:0 = "start ip address"
vpn:Servers:com.apple.ppp.pptp:IPv4:DestAddressRanges:_array_index:1 = "end ip address"

Faites bien attention à remplacer ce qui doit l’être. La partie permettant de couper le chiffrement est CCPEnabled = 0. Cela entend que vos clients soient configurés pour ne demander aucun chiffrement.

Attention. Se passer de chiffrement pour une connexion VPN peut être dangereux ! N’utiliser cette procédure qu’en connaissance de cause !

Laisser un commentaire