Using Samba

Using Samba

Robert Eckstein, David Collier-Brown, Peter Kelly
1st Edition November 1999
1-56592-449-5, Order Number: 4495
416 pages, $34.95

Buy the hardcopy

Inhaltsverzeichnis


Previous: 3.2 Windows NT 4.0-Computer einrichten Kapitel 3
Windows-Clients konfigurieren
Next: 4. Disk Shares
 

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

Figur 3.28

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:

  1. Eine virtuelle Verbindung einrichten.

  2. Die Protokoll-Variante zur Verständigung aushandeln.

  3. Sitzungs-Parameter setzen.

  4. Eine Tree-Connection zu einer Ressource herstellen.

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=0x82000000

3.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 der NT 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 00

3.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 Kommando 0x75, was Tree Connect und X-Befehl bedeutet. Die Meldung SMBtconX 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\PUBLIC

3.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:

  • "A" für eine Disk oder eine Datei

  • "LPT1" für eine 'gespoolte' Ausgabe

  • "COMM" für einen direkt angeschlossenen Drucker oder ein Modem

  • "IPC" für eine bezeichnete Pipe

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.


Previous: 3.2 Windows NT 4.0-Computer einrichten Next: 4. Disk Shares
3.2 Windows NT 4.0-Computer einrichten Buch-Index (engl.) 4. Disk Shares

O'Reilly Home | O'Reilly Bookstores | How to Order | O'Reilly Contacts
International | About O'Reilly | Affiliated Companies

© 1999, O'Reilly & Associates, Inc.