Using SambaRobert Eckstein, David Collier-Brown, Peter Kelly1st Edition November 1999 1-56592-449-5, Order Number: 4495 416 pages, $34.95 |
3.3 Eine Einführung zu SMB/CIFS
Wir beenden dieses Kapitel mit einer kurzen Anleitung zu SMB/CIFS. SMB/CIFS ist das Protokoll, das Windows 95/98 und NT-Maschinen zur Kommunikation mit dem Sambaserver verwenden und umgekehrt. Trotz seines hohen Niveaus ist die SMB-Protokollsuite relativ einfach. Sie umfasst Kommandos für alle Datei- und Druckeraktivitäten, die du auf einer lokalen Platte oder einem Drucker durchführen könntest, das sind:
Jede dieser Operationen kann in eine SMB-Meldung verschlüsselt werden und zum und vom Server übertragen werden. Der ursprüngliche Name SMB kommt von deren Datenformat: das sind Versionen der DOS System-Call-Datenstrukturen oder Server Message Blocks, neu entworfen für die Übertragung zu einer anderen Maschine über ein Netzwerk.
3.3.1 SMB-Format
Richard Sharpe vom Sambateam definiert SMB als ein "request-response (Frage-Antwort)" -Protokoll.[4] In der Tat bedeutet das, dass ein Client einen SMB-Request an einen Server sendet, und der Server sendet einen SMB-Response zurück zum Client. Selten sendet ein Server eine Nachricht, die keine Antwort an einen Client darstellt.
[4] Siehe http://anu.samba.org/cifs/docs/what-is-smb.html über Richards ausgezeichnete Zusammenfassung von SMB.
Eine SMB-Message ist nicht so kompliziert wie du dir vielleicht vorstellst. Werfen wir doch einen näheren Blick auf die innere Struktur einer solchen Meldung. Sie kann in zwei Teile zerlegt werden: der Header, der eine fixe Größe ist, und der Command String, dessen Größe auf Grund der Inhalte der Message dramatisch schwanken kann.
3.3.1.1 SMB Header-Format
Tabelle 3.1 zeigt das Format eines SMB-Headers. SMB-Commandos sind nicht erforderlich, um alle Felder im SMB-Header zu verwenden. Wenn z.B. ein Client zuerst versucht, eine Verbindung zu einem Server herzustellen, hat er noch keinen Tree-Identifier (TID) -Wert - er bekommt nach der erfolgreichen Verbindung einen zugewiesen - daher wird ein Null-TID (0xFFFF) in seinem Headerfeld abgelegt. Andere nicht verwendete Felder könnten mit Nullen gefüllt sein.
Die Felder des SMB-Headers werden in Tabelle 3.1 aufgelistet.
Tabelle 3.1: Felder des SMB-Headers Feld
Größe (Bytes)
Beschreibung
0xFF 'SMB'
1
Protokoll-Kennzeichen
COM
1
Commando-Code, von 0x00 bis 0xFF
RCLS
1
Fehler-Klasse
REH
1
Reserviert
ERR
2
Fehler-Code
REB
1
Reserviert
RES
14
Reserviert
TID
2
Tree-Identifier; eine unverwechselbare ID für eine vom Client benutzte Ressource
PID
2
Caller Process-ID
UID
2
User-Kennzeichen
MID
2
Multiplex-Kennzeichen, verwendet, um Requests innerhalb eines Prozesses zu routen
3.3.1.2 SMB-Kommandoformat
Unmittelbar nach dem Header steht eine unterschiedliche Zahl von Bytes, die ein SMB-Kommando oder eine Antwort darstellen. Jedes Kommando wie Open File (COM Feldkennung:
SMBopen
) oder Get Print Queue (SMBsplretq
) hat seinen eigenen Satz von Parametern und Daten. Wie die SMB Header-Felder, müssen nicht alle Kommandofelder gefüllt werden, das hängt vom einzelnen Kommando ab. Das Kommando Get Server Attributes (SMBdskattr
) z.B. setzt das WCT- und das BCC-Feld auf Null. Die Felder des Kommando-Abschnitts siehst du in Tabelle 3.2.
Tabelle 3.2: SMB Kommando-Inhalte Feld
Größe in Bytes
Beschreibung
WCT
1
Wortzähler
VWV
Variable
Parameter-Worte (Größe von WCT bestimmt)
BCC
2
Parameter Byte-Zähler
DATA
Variable
Daten (Größe von BCC bestimmt)
Gräm dich nicht, wenn du nicht jedes dieser Felder verstehst, sie sind für die Benutzung von Samba auf Administrator-Niveau nicht notwendig. Wie auch immer, sie kommen gelegen, wenn du System-Meldungen untersuchst. Wir werden dir später in diesem Abschnitt einige der gebräuchlichsten SMB-Meldungen zeigen, die Clients und Server senden, indem wir eine veränderte Version von tcpdump verwenden. (Wenn du gerne einen SMB-Sniffer mit einer grafischen Oberfläche hättest, versuch "ethereal", welcher die GTK-Bibliotheken benützt; schau auf der Samba-Homepage für mehr Information über dieses Tool nach.)
Wenn du gerne mehr Information über jedes Kommando des SMB-Protokolls hättest, schau dir die SMB/CIFS-Dokumentation an bei ftp://ftp.microsoft.com/developr/drg/CIFS/.
3.3.1.3 SMB-Variationen
Das SMB-Protokoll wurde einige Male seit seiner Einführung mit neuen Kommandos erweitert. Jede neue Version ist abwärtskompatibel zu den früheren Versionen. Dies macht es sehr geeignet für ein LAN, verschiedene Clients und Server mit verschiedenen Versionen des SMB-Protokolls zugleich zu besitzen.
Tabelle 3.3 umreißt die Haupt-Versionen des SMB-Protokolls. Innerhalb jedes "Dialekts" von SMB gibt es viele Unterversionen, die Kommandos umfassen, welche besondere Versionen von wichtigen Betriebssystemen unterstützen. Der ID-String wird von Clients und Servern benützt, um zu bestimmen, mit welcher Protokoll-Stufe sie sich miteinander unterhalten.
Tabelle 3.3: SMB Protokoll-Dialekte Protokollname
ID String
Verwendet von
Core
PC NETWORK PROGRAM 1.0
Core Plus
MICROSOFT NETWORKS 1.03
LAN Manager 1.0
LANMAN1.0
LAN Manager 2.0
LM1.2X002
LAN Manager 2.1
LANMAN2.1
NT LAN Manager 1.0
NT LM 0.12
Windows NT 4.0
Samba's NT LM 0.12
Samba
Samba
Common Internet File System
CIFS 1.0
Windows 2000
Samba wendet die
NT
LM
0.12
-Spezifikation für NT LAN Manager 1.0 an. Sie ist abwärtskompatibel mit allen anderen SMB-Varianten. Die CIFS-Spezifikation ist in Wirklichkeit LAN Manager 0.12 mit ein paar besonderen Zusätzen.3.3.2 SMB-Clients und -Server
Wie vorher erwähnt, ist SMB ein Client/Server-Protokoll. Das bedeutet im engsten Sinn, dass ein Client eine Anfrage an einen Server sendet, der auf die Anfrage ragiert und eine Antwort retourniert. Trotzdem können die Client/Server-Rollen oft vertauscht werden, manchmal innerhalb des Kontexts einer Single-SMB-Sitzung. Betrachten wir z.B. die beiden Windows 95/98-Computer in Figur 3.28. Der Computer namens WIZZIN stellt einen Drucker auf dem Netzwerk zur Verfügung, und der Computer namens ESCRIME offeriert ein Plattenverzeichnis. WIZZIN ist in der Rolle des Clients, wenn er auf ESCRIME's Netzlaufwerk zugreift, und in der Serverrolle, wenn er einen Job für ESCRIME druckt.
Figur 3.28: Zwei Computer, die beide Ressourcen zu vergeben haben
Das zeigt einen wichtigen Punkt in der Samba-Terminologie auf:
Ein Server ist eine Maschine mit einer Ressource zum Vergeben.
Ein Client ist eine Maschine, die diese Ressource zu verwenden wünscht.
Ein Server kann zu jeder gegebenen Zeit ein Client (auf der Ressource eines anderen Computers) sein.
Beachte, dass nicht die Menge an Ressourcen einen Server ausmacht oder ob er viel Plattenspeicher oder einen schnellen Prozessor hat. Ein Server kann ein alter 486 mit einem angebundenen Drucker sein, oder er könnte eine UltraSparc-Station mit einer 10 GB-Platte sein.
Microsoft Windows-Produkte haben SMB-Client und -Server in das Betriebssystem eingebaut. Windows NT 4.0 verwendet ein neueres SMB-Protokoll als Windows für Workgroups, und es bietet eine erweiterte Form von Netzwerksicherheit, was in Kapitel 6 diskutiert wird. Zusätzlich gibt es eine große Zahl von kommerziellen SMB-Serverprodukten von Sun, Compaq, SCO, Hewlett-Packard, Syntax, und IBM. Unglücklicherweise gibt es auf der Clientseite weit weniger Angebote, beschränkt hauptsächlich auf Digital Equipment's Pathworks-Produkt und natürlich Samba.
3.3.3 Eine einfache SMB-Verbindung
Bevor wir dieses Kapitel schließen, wollen wir einen Blick auf eine einfache SMB-Verbindung werfen. Das ist eine ziemlich technische Sache - die nicht wirklich zur Administration von Samba notwendig ist - also kannst du sie überspringen, wenn du willst. Wir stellen diese Information größtenteils als einen Weg vor, der helfen soll, dich vertraut zu machen, wie das SMB-Protokoll Verbindungen mit anderen Computern im Netzwerk behandelt.
Es gibt da vier Schritte, die Client und Server der Reihe nach vollziehen müssen, um eine Verbindung zu einer Ressource einzurichten:
Wir werden jeden dieser Schritte durch die Augen eines praktischen Werkzeugs überprüfen, das wir vorher schon erwähnt hatten: das modifizierte tcpdump, das auf der Samba Webseite zur Verfügung steht.
Du kannst dieses Programm von samba.org im Verzeichnis samba/ftp/tcpdump-smb herunterladen, die letzte Version (als dies geschrieben wurde) ist 3.4-5. Verwende dieses Programm so, als würdest du die Standard-Applikation tcpdump gebrauchen, füg jedoch den
-s 1500
-Schalter dazu, damit du sicherstellst, das ganze Paket bekommst und nicht gerade die ersten paar Bytes.3.3.3.1 Eine virtuelle Verbindung einrichten
Wenn ein User zuerst eine Anfrage stellt, um auf ein Netzlaufwerk zuzugreifen oder einen Druckjob an einen Remote-Printer zu senden, sorgt NetBIOS für die Einrichtung einer Verbindung auf der Sitzungs-Ebene. Das Ergebnis ist ein bidirektionaler virtueller Kanal zwischen Client und Server. In Wirklichkeit existieren nur zwei Meldungen, die Client und Server zum Einrichten dieser Verbindung brauchen. Das wird in der folgenden Beispiels-Sitzung Anfrage und Antwort gezeigt, wie sie von tcpdump aufgezeichnet wurde:
>>> NBT Packet NBT Session Request Flags=0x81000044 Destination=ESCRIME NameType=0x20 (Server) Source=WIZZIN NameType=0x00 (Workstation) >>> NBT Packet NBT Session Granted Flags=0x820000003.3.4 Die Protokoll-Variante aushandeln
An dieser Stelle existiert ein offener Kanal zwischen Client und Server. Als Nächstes sendet der Client eine Meldung an den Server, um ein SMB-Protokoll auszuhandeln. Wie früher erwähnt, setzt der Client sein Tree-Identifier (TID) -Feld auf Null, solange er noch nicht weiß, was TID verwendet. Ein tree identifier ist eine Zahl, die eine Verbindung zu einer Share auf einem Server darstellt.
Das Kommando in der Meldung ist
SMBnegprot
, eine Anfrage zum Aushandeln einer Protokoll-Variante, die für die ganze Sitzung gebraucht wird. Beachte, dass der Client dem Server eine Liste aller von ihm verstandenen Varianten sendet, nicht umgekehrt.Der Server antwortet auf die
SMBnegprot
-Anfrage mit einem Index in der Liste der Varianten, die der Client anbietet, beginnend mit Index 0 oder mit dem Wert 0xFF, wenn keine der Protokoll-Variablen akzeptabel ist. In der Fortsetzung dieses Beispiels antwortet der Server mit dem Wert 5, der anzeigt, dass derNT
LM
0.12
-Dialekt für den Rest der Sitzung verwendet wird:>>> NBT Packet NBT Session Packet Flags=0x0 Length=154 SMB PACKET: SMBnegprot (REQUEST) SMB Command = 0x72 Error class = 0x0 Error code = 0 Flags1 = 0x0 Flags2 = 0x0 Tree ID = 0 Proc ID = 5371 UID = 0 MID = 385 Word Count = 0 Dialect=PC NETWORK PROGRAM 1.0 Dialect=MICROSOFT NETWORKS 3.0 Dialect=DOS LM1.2X002 Dialect=DOS LANMAN2.1 Dialect=Windows for Workgroups 3.1a Dialect=NT LM 0.12 >>> NBT Packet NBT Session Packet Flags=0x0 Length=69 SMB PACKET: SMBnegprot (REPLY) SMB Command = 0x72 Error class = 0x0 Error code = 0 Flags1 = 0x0 Flags2 = 0x1 Tree ID = 0 Proc ID = 5371 UID = 0 MID = 385 Word Count = 02 [000] 05 003.3.5 Sitzungs- und Login-Parameter setzen
Der nächste Schritt ist, Sitzungs- und Login-Parameter für die Sitzung zu übertragen. Das beinhaltet den Benutzernamen und das Passwort (wenn es eines gibt), den Namen der Arbeitsgruppe, die maximale Datengröße, die übermittelt werden kann, und die Zahl der anhängigen Anfragen, die in jedem einzelnen Zeitabschnitt in der Warteschlange sein können.
Im folgenden Beispiel berücksichtigt das vorgestellte Sitzungs-Setup-Kommando einen zusätzlichen SMB-Befehl, der auf ihm huckepack getragen wird. Der Buchstabe X am Ende der Befehlsbezeichnung deutet das an, und der Hex-Code des zweiten Befehls wird im
Com2
-Feld bestimmt. In diesem Fall lautet das Kommando0x75
, was Tree Connect und X-Befehl bedeutet. Die MeldungSMBtconX
sucht den Namen der Ressource im smb_buf -Puffer. (Das ist das letzte aufgelistete Feld in der folgenden Anfrage.) In diesem Beispiel enthält smb_buf den Text\\ESCRIME\PUBLIC
, welches der volle Pfadname eines angebotenen Verzeichnisses auf dem Knoten ESCRIME ist. Die Verwendung der "and X" -Befehle wie dieser beschleunigt jede Transaktion, da der Server nicht auf den Client zu warten braucht, um eine zweite Anfrage zu stellen.Beachte, dass der TID noch Null ist. Der Server wird dem Client einen TID zuteilen, sobald die Sitzung eingerichtet und eine Verbindung zur angeforderten Ressource hergestellt wurde. Beachte außerdem, dass das Passwort ungeschützt gesendet wird. Wir können das später ändern, indem wir verschlüsselte Passwörter verwenden:
>>> NBT Packet NBT Session Packet Flags=0x0 Length=139 SMB PACKET: SMBsesssetupX (REQUEST) SMB Command = 0x73 Error class = 0x0 Error code = 0 Flags1 = 0x10 Flags2 = 0x0 Tree ID = 0 Proc ID = 5371 UID = 1 MID = 385 Word Count = 13 Com2=0x75 Res1=0x0 Off2=106 MaxBuffer=2920 MaxMpx=2 VcNumber=0 SessionKey=0x1FF2 CaseInsensitivePasswordLength=1 CaseSensitivePasswordLength=1 Res=0x0 Capabilities=0x1 Pass1&Pass2&Account&Domain&OS&LanMan= KRISTIN PARKSTR Windows 4.0 Windows 4.0 PassLen=2 Passwd&Path&Device= smb_bcc=22 smb_buf[]=\\ESCRIME\PUBLIC3.3.6 Eine Verbindung zu einer Ressource herstellen
Im letzen Schritt retourniert der Server dem Client einen TID, vorausgesetzt, der User konnte sich authentifizieren und die Ressource ist zur Verwendung bereit. Außerdem setzt er das Feld ServiceType auf "A", um anzuzeigen, dass dies ein Dateiservice ist. Verwendbare Servicetypen sind:
Die Ausgabe ist:
>>> NBT Packet NBT Session Packet Flags=0x0 Length=78 SMB PACKET: SMBsesssetupX (REPLY) SMB Command = 0x73 Error class = 0x0 Error code = 0 Flags1 = 0x80 Flags2 = 0x1 Tree ID = 121 Proc ID = 5371 UID = 1 MID = 385 Word Count = 3 Com2=0x75 Off2=68 Action=0x1 [000] Unix Samba 1.9.1 [010] PARKSTR SMB PACKET: SMBtconX (REPLY) (CHAINED) smbvwv[]= Com2=0xFF Off2=78 smbbuf[]= ServiceType=A:Da nun ein TID zugewiesen wurde, kann der Client jede Art von Befehl erteilen, den er auf einem lokalen Laufwerk verwenden würde. Er kann Dateien öffnen, lesen und in sie schreiben, sie löschen, neue Dateien anlegen, Dateinamen suchen und so weiter.
© 1999, O'Reilly & Associates, Inc.