CIFS werkt op basis van het SMB (service message block) protocol, een uitvinding van IBM, en een evolutie van IBM's NetBUEI (OS/2 LAN manager), en is de basis van Windows File Sharing.
Er spelen twee dingen.
Uitdaging nummer 1:
Een hele lange tijd was er maar 1 protocol versie, nu SMBv1 genoemd. SMBv2 is door Microsoft geintroduceerd met Windows Vista. SMBv2.1 is geintroduceerd met Windows 7, en SMBv3 met Windows 8. Samba, de linux implementatie, ondersteunt SMBv2 vanaf versie 3.6, SMBv3 vanaf versie 4.1.
SMBv1 is als protocol zo lek als een mandje, sinds begin vorig jaar staat het in Windows uit (zowel als client als als server), is de default van de Linux CIFS kernel driver verandert naar SMBv2, en hebben ook de meeste NAS fabrikanten SMBv1 uitgezet.
Het probleem waar wij tegenaan lopen is de volgende:
Windows client zal, als een connectie op een bepaalde SMB versie niet lukt, alle andere versies proberen. Dus als een server CIFS praat, dan kan Windows er wel mee verbinden.
Linux doet dit echter niet, als een server niet de versie praat die de Linux CIFS kernel driver praat, dan is een verbinding niet mogelijk. Nu maken wij software voor meer dan 70 verschillende boxen, en die komen allemaal met een andere kernel versie, varierend van 3.2 tot 5.2. Dat betekent dat we boxen hebben die alleen op SMBv1 kunnen verbinden (de pre 4.14 kernels), en boxen die alleen op SMBv2 kunnen verbinden (de post 4.13 kernels). En dat is een nachtmerrie om te ondersteunen.
Gegeven het feit dat SMBv1 een veiligheidsrisico is, en het toch overal uit staat (of hoort te staan), hebben wij besloten dat alle boxen standaard een verbinding maken met SMBv2. Dat impliceert dan mensen die nu een box hebben met een kernel ouder dan 4.14, en een NAS die SMBv1 spreekt, met OpenPLi 7.1 direct een verbinding kunnen maken, en met OpenPLi 7.2 niet meer. Om dat op te lossen moet je de connectie forceren op SMBv1.
Uitdaging nummer 2:
Naast verschillende SMB versies, bestaan er ook verschillende authenticatie protocollen. De meeste gebruikte zijn:
- ntlm: Use NTLM password hashing (default)
- ntlmv2: Use NTLMv2 password hashing
- ntlmssp: Use NTLMv2 password hashing encapsulated in Raw NTLMSSP
De Linux CIFS kernel driver gebruikte ntlm tot 3.8, ntlmssp in versies vanaf 3.8. Als de server dat niet snapt, er geen verbinding mogelijk is. En ook hier speelt dat de driver geen andere versies probeert, waar Windows dat wel doet.
Hier zitten we dus ook met twee verschillende authenticatie protocollen, en hebben we besloten om voor alle boxen ntlmssp te gebruiken.
Kortom, de procotol versies tot en met OpenPLi 7.1 zijn afhankelijk van de kernel versie van je box, vanaf OpenPLi 7.2 is dat SMBv2, NTLMssp, voor alle boxen.
Het gebruikersprobleem:
Zoals hierboven uitlegd, als de protocol versies die de box gebruikt afwijken wat van de server kant ondersteund, dan is er geen verbinding mogelijk, zonder bijkomende acties.
- Heb je een server die geen SMBv2 ondersteunt, dan kun je een connectie op SMBv1 op de box af dwingen door vers=1.0 aan de mount opties toe te voegen
- Heb je een server die geen NTLMssp ondersteunt, dan kun je dan veranderen door op de box sec=ntlmv2 of sec=ntlm aan de mount opties toe te voegen
Welke werkt is een kwestie van proberen, heb kan zelfs zijn dat je beide nodig hebt.