第7回 ファイル共有プロトコルSMBの概要:Windowsネットワークの基礎
Windowsネットワークで最もよく使われるファイル共有機能。その基本プロトコルである「SMB」「CIFS」を複数回にわたって解説する。今回は、その長い歴史を踏まえつつ概要を説明しよう。
SMBの脆弱性「MS17-010」を悪用するような「ランサムウェア」については、「Tech Basics:ランサムウェアとは?」で解説しています。
前回と前々回では、Windowsネットワークを支えるトランスポート層プロトコルであるTCP/IPとNetBIOS(NetBEUI)プロトコルについて見てきた。今回はWindowsネットワークにおけるファイル共有プロトコルのSMB/CIFSの概要について見ていく。
Windowsネットワークにおけるファイル共有プロトコルの歴史
Windows OSにおけるファイル共有プロトコルは、正式には「SMB(Server Message Block)」もしくは「CIFS(Common Internet File System)」という(SMBとCIFSの違いについては後述)。歴史的な経緯によってSMBと呼ばれたり、CIFSと呼ばれたりしているが、現在ではSMBが正式な名称とされている。
SMBは、もともとはLAN ManagerというネットワークOS(OS/2ベースのファイルサーバーOS)などで動作していた、ファイル共有サービスのためのプロトコルであった。MS-DOSやWindowsにSMBのクライアントプログラムをインストールすることにより、LAN Managerベースのファイルサーバーにアクセスできた。その後、クライアントOSであるWindows 3.xや9xなどでもファイルサーバー機能が搭載されるようになり、「ピア・トゥ・ピア型ネットワーク」(第1回 参照)が一般的になった。
SMBの概要
SMBは仕様が公開されたオープンなプロトコルであり、以下で仕様が公開されている。
SMBの仕様にはいくつかバージョンがあり、その主な仕様は次の通りである。
プロトコル | 実装されているOS | 機能の概要 |
---|---|---|
SMB | MS-Networks/LAN Manager/Windows for Workgroups/Windows NT 3.xなど | ・一番基本的なファイル共有プロトコル |
CIFS | Windows 9x/Windows Me/Windows NT 4.x | ・初期のSMBをベースにオープン規格化されたもの ・現在ではCIFSは、SMB 1.0の中に含まれるダイアレクト(後述)の一つという扱い |
SMB 1.0 | Windows 2000/Windows XP/Windows Server 2003/Windows Server 2003 R2 | ・CIFSに対する拡張として定義されたプロトコル ・Kerberos認証やActive Directory対応 ・「以前のバージョン(シャドウコピー)」のファイルやフォルダーへのアクセス(「@GMT Token」機能) ・スパースファイルやリパースポイント、オフライン、圧縮、暗号化属性などのサポート ※Windows 8.1/Windows Server 2012 R2以降では、「SMB 1.0」機能を削除してセキュリティの向上や不要なコンポーネントの無効化が可能 |
SMB 2.0 | Windows Vista/Windows Server 2008 | ・複数のSMBコマンドの連結 ・切断時の透過的な再接続処理 ・バッファリングサイズの拡大 ・ファイルプロパティのキャッシュ ・スケーラビリティの拡大 ・シンボリックリンクサポート |
SMB 2.1 | Windows 7/Windows Server 2008 R2 | ・1MbytesのラージMTUのサポート(デフォルトMTUは64Kbytes) ・クライアントoplockリースモデル ・スリープモードのサポート ・ブランチキャッシュサポート |
SMB 3.0 | Windows 8/Windows Server 2012 | ・SMB透過フェイルオーバー ・SMBスケールアウト ・SMBマルチチャンネルによる高速な通信 ・SMBダイレクト(SMB 3.0 over RDMA) ・オフロードデータ転送(ODX) ・パフォーマンスの最適化 ・SMB暗号化 ・SMBリモートファイル記憶域 ・SMBファイル共有のVSS ・SMBディレクトリリース ・SMB PowerShellによる管理 ・ブランチキャッシュV2 |
SMB 3.02 | Windows 8.1/Windows Server 2012 R2 | ・アンバッファードの読み書き ・RDMA操作のリモートからのキャンセル ・スケールアウトファイルサーバークライアントの自動リバランシング ・スケールアウトファイルサーバー上のマルチプルSMBインスタンスサポート ・SMB上のHyper-Vライブマイグレーション |
SMB 3.11 | Windows 10/Windows Server 2016 | ・暗号化や整合性チェックアルゴリズムのネゴシエーション ・ネゴシエーションやセッション確立の拡張保護機能 ・指定したダイアレクトでの再接続 |
SMBプロトコルのバージョン SMBプロトコルのバージョン番号とサポートされているWindows OSおよび主な機能を記した。例えばSMB 2.0はSMB 1.0の機能を全て内包している。 |
SMBプロトコルの最新版はSMB 3.11
SMBプロトコルはWindows OSのバージョンアップと共に機能が強化されている。
SMB 3.0はWindows 8/Windows Server 2012でサポートされているSMBプロトコルである。その概要については以下を参照していただきたい。
- 「強化されたファイル共有プロトコルSMB 3.0の概要」(連載 Windows Server 2012クラウドジェネレーション)
- Updated Links on Windows Server 2012 File Server and SMB 3.0[英語](Jose Barreto's Blog)
Windows 8.1/Windows Server 2012 R2ではSMB 3.02がサポートされている。詳細については以下のリンクなどを参照していただきたい。
- Updated Links on Windows Server 2012 R2 File Server and SMB 3.02[英語](Jose Barreto's Blog)
Windows 10および次期Windows Server OSではSMB 3.11がサポートされる予定となっている。以下のリンクや[MS-SMB2]の仕様書を参照していただきたい。
- What’s new in SMB 3.1.1 in the Windows Server 2016 Technical Preview 2[英語](Jose Barreto's Blog)
SMBプロトコルでどのような機能が定義されているか、実際にどのようにしてファイルアクセスを行うのかなどについては、次回以降で解説する。
SMBバージョンのネゴシエーション
ファイル共有サービスを利用する際、サーバー側とクライアント側のサポートしているSMBのバージョンが異なる場合は、通信開始時に低い方のバージョンに合うようにネゴシエーションが行われ、利用できる機能が制限される。
SMBプロトコルのネゴシエーション
サーバーとクライアント間でサポートされているSMBプロトコルのバージョンが異なる場合、セッション開始時に低い方のバージョンに合うようにネゴシエーションが行われ、利用できる機能が制限される。
Windows 8.1/Windows 10/Windows Server 2012 R2/Windows Server 2016では、「SMB 1.0/CIFS」の機能を削除できるようになっている。もちろんSMB 2.x以上の機能は残るので、クライアントからまったくアクセスできなくなるわけではない。Windows XPやWindows Server 2003およびそれ以前のシステムがアクセスできなくても問題ない環境なら、セキュリティ向上や不要なコンポーネント数の削減のために、削除してもよいだろう。
SMB 1.0/CIFS機能の削除
Windows 8.1/Windows Server 2012 R2以降のWindows OSでは、SMB 1.0/CIFSによるファイルアクセス機能を削除できる。
(1)このチェックボックスをオフすると、SMB 1.0/CIFS機能を無効にできる。最近のシステムならSMB 2.x以上が利用できれば接続できるはず。
Windows Vista/Windows 7/Windows 8やWindows Server 2008/2008 R2/2012でSMB 1.0を無効化するには、レジストリの設定を変更後、システムを再起動する必要がある。詳細については以下のリンクを参照していただきたい。
- How to enable and disable SMBv1, SMBv2, and SMBv3 in Windows and Windows Server[英語](マイクロソフト サポート技術情報)
SMBとCIFSの違いは?
SMBと似たものとしてCIFS(Common Internet File System)という名前のプロトコルがあり、両者はほぼ同等に扱われていることがある。しかし、現在ではこの2つは異なるプロトコルであるとされているので、ここで補足しておく。
Windowsネットワークが開発された当初、そこでサポートされていたプロトコルはSMBと呼ばれていた。その後、いくらかのバージョンアップを経てこの仕様がオープンになり、Windows以外のさまざまなプラットフォームでも実装できるようになった(例:LinuxのSambaサービスなど)。この公開された仕様/プロトコルが「CIFS」である。CIFSの仕様は以下で参照できる。
この仕様書にあるように、CIFSはSMB 1.0のプロトコル仕様に含まれる「ダイアレクト」(後述)の一つであり、Windows 9x/Me/Windows NTにおけるファイル共有プロトコルの仕様をまとめたものである。CIFSの仕様は公開した時点のまま凍結されており、基本的には新機能の追加などは一切行われていない(ただし記述不足などに対しては訂正・追加されている)。
CIFS仕様の公開後もSMB 1.0は機能強化され続け、Windows 2000/Windows XP/Windows Server 2003/Windows Server 2003 R2まで対応している。CIFSとSMB 1.0の仕様を比較すると、SMB 1.0では例えばActive Directoryへの対応などが含まれている。
このように、厳密に言えばCIFSとSMB 1.0は別のものである。正確には「CIFSはSMB 1.0のダイアレクトの一つで、CIFSを拡張したのがSMB 1.0」とするべきだろうか、実用的にはほぼ同じと考えてもよいだろう(CIFSだけを単独で実装することはないし、現在ではより上位のSMB 2.xやSMB 3.xの実装も少なくない)。
SMBプロトコルの「ダイアレクト」
「ダイアレクト(dialect、方言)」とは、各システムごとのSMBプロトコルの実装や仕様の違いなどを吸収するためのネゴシエーション機能のことである。同じSMB 1.0プロトコルをサポートしたシステム同士であっても、どちらか一方しかサポートしていない機能があるかどうかを最初に確認し、お互いが利用(合意)できる最低限の機能だけを使うようにする、という機能だ(上のSMBのバージョンのネゴシエーションと同じ)。
ネゴシエーションは、SMBによる通信の開始時にダイアレクト文字列をお互いにやりとりすることによって行う。SMBプロトコルでは、次のようなダイアレクト文字列が定義されている。
ダイアレクト文字列 | 内容 |
---|---|
PC NETWORK PROGRAM 1.0 | 最初のIBM-PCのネットワーク機能で利用されていたプロトコル |
MICROSOFT NETWORKS 1.03 | MS-Networks 1.03で使用されていたプロトコル |
MICROSOFT NETWORKS 3.0 | MS-DOS用のLAN Manager 1.0プロトコル |
LANMAN1.0 | LAN Manager 1.0プロトコル。ユーザーレベルセキュリティが実装された |
Windows for Workgroups 3.1a | Windows 3.xに実装されたプロトコル |
LM1.2X002 | LAN Manager 2.0プロトコル |
LANMAN2.1 | LAN Manager 2.1プロトコル |
NT LM 0.12 | Windows NT/Windows 2000以降のプロトコル。現在のWindows OSは全てこれをサポートしている |
SMBプロトコルで利用されるダイアレクト文字列(主要なもののみ) 現在のSMBプロトコルで利用されているダイアレクト文字列。通信の開始時にこれらの文字列をやりとりして、お互いの持つ機能を確認する。基本的には、上にある方が機能レベルが低く、下にある方が機能レベルが高くなっている。現在のWindows OSは全て「NT LM 0.12」をサポートしているので、Windows NTやWindows 2000レベルの機能は全て備えているということになる。CIFSはSMB 1.0のダイアレクトの一つだが、CIFS用のダイアレクト文字列は定義されておらず、別の機能(フラグなど)を使ってネゴシエーションする。 |
NetBIOSを使わないファイル共有サービス
第5回「NetBIOSでルーティングを可能にするNBT」では、TCP/IP上に実装したNetBIOSサービスを使ってファイル共有サービスを利用する方法を解説した。一方で、SMBプロトコルでは、そもそもNetBIOSサービスを全く使わない「ダイレクトホスティングSMB」もしくは「SMB over TCP/IP」というプロトコルも定義されている。
- TCP/IP を介する SMB のダイレクト ホスト(マイクロソフトサポート技術情報)
どちらの方法を使っても最終的には同じファイル共有サービスを受けられるが、NBTとダイレクトホスティングSMBでは使用するTCP/IPのポート番号などが異なる。後者では利用するTCPのポートが1つだけなので、こちらの方がファイアウォールなどで制御しやすいという利点がある。
使用するサービス | プロトコル種別と使用ポート番号 |
---|---|
NBT―NetBIOS名前サービス | TCPおよびUDPの137番ポート |
NBT―NetBIOSデータグラムサービス | UDPの138番ポート |
NBT―NetBIOSセッションサービス | TCPの139番ポート |
ダイレクトホスティングSMB | TCPの445番ポート |
ファイル共有サービスで利用されるプロトコルとポート番号 ファイル共有サービスなどで利用される主要なポート番号。Windows OSでファイル共有サービスを有効にして、クライアントからのファイルアクセス要求を受け付けるためには、これらのTCPやUDPのポートを開けておく必要がある(他のホストから接続できるように、ファイアウォールで着信を許可しておく)。NBT(NetBIOS over TCP/IP)を使う場合は表の上側の3つ全部、ダイレクトホスティングSMBを使う場合は表の一番下の行のポートを開けておくこと。 |
なお、CIFSのプロトコル仕様にはこのダイレクトホスティングSMBは含まれない。ダイレクトホスティングSMBはWindows 2000以降でサポートされている機能だが、CIFSの仕様はWindows NTまでしかカバーしていないからだ。ダイレクトホスティングSMBはSMB 1.0の仕様に含まれる機能である。とはいえ、実際のSMBの(Windows OS以外の)実装では、ダイレクトホスティングSMBもサポートするのが一般的である。
今回はSMBプロトコルの概要についてみてきた。次回はSMBプロトコルの挙動を追ってみよう。
■更新履歴
【2017/05/15】Windows 8/Server 2012以前でSMB 1.0を無効化するためのマイクロソフト サポート技術情報へのリンクを追記しました。
【2015/07/02】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.