Server Message Block
Server Message Block (SMB) は、主にWindowsを中心とした環境でLANを通じてファイル共有やプリンタ共有などに使用される通信プロトコルの総称。OSI参照モデルでは第7層アプリケーション層に該当する。認証つきプロセス間通信機構としても動作する。
下位層のプロトコルとしてNetBEUIを使用していた時代には、サブネットを越えるルーティングはできず、中大規模のネットワークには向かないとされたが、NetBIOS over TCP/IPや、NetBIOSも必要としないCIFS(Common Internet File System)により、大規模ネットワークでも使用可能となっている。
目次
歴史[編集]
SMB/CIFS/SMB1[編集]
初期のSMB[編集]
SMBは1982年にIBMのBarry Feigenbaumが設計した[1]。DOSのローカルファイルアクセス用「割り込み 33」(21h) をネットワーク上のファイルシステム向けに変えることを目標としていた。マイクロソフトはこれにかなりの機能追加や修正を施した。1990年ごろ、マイクロソフトはSMBプロトコルをスリーコムと共同開発していた LAN Manager製品に組み込んだ。さらにその後のWindows製品でもSMBプロトコルに機能を追加していった。
CIFS[編集]
マイクロソフトは1996年にSMBをCommon Internet File System (CIFS) と改称し[1]、Windows NT 3.51、Windows NT 4.0、Windows 98に搭載し[2]、さらなる機能追加を行った。例えば、シンボリックリンク、ハードリンク、より大きなファイルの操作、NetBIOSを使わずにTCPポート445番で直接接続する方式(実験的な試みであり、さらなる改良が必要だった)などへの対応である。また、認証プロトコルである NTLMv1(もともとのSMB仕様では、IBMのLAN Managerのパスワードを使うことになっていて、そこから生まれたプロトコル)ではDESを間違った形で使っていたため、NTLMv2を追加した。さらに、NT 4.0のドメインログイン用プロトコルでは、アメリカ合衆国以外では40ビットの暗号を使っている(128ビットの暗号は輸出規制されていたため)。
サン・マイクロシステムズがWebNFSを発表したころ、1997年、マイクロソフトは部分的仕様をいくつかインターネットドラフトとしてIETFに提出した[3]が、いずれも1998年までに有効期限切れとなっている。
SMB 1.0[編集]
2000年、マイクロソフトは名称をSMBに戻し[1]、SMB 1.0(SMB1)としてWindows 2000で導入した。Kerberos認証やActive Directoryに対応した[4]。また、ダイレクトホスティングSMBと呼ばれるTCP上で直接動作させる機能も導入された(その場合サーバがTCPポート445番で待機[4])。
2015年現在では、SMB 1.0以前のものを明確には区別せずに方言(Dialects)として扱うことが一般的である[4][5]。「SMB1/CIFS」などとまとめて表記することも多い。
終焉[編集]
その後の技術の進化の結果、SMB1は暗号化強度の面や通信効率の面からも好ましくないとされるようになり、マイクロソフトは2013年にリリースされたWindows Server 2012 R2以降のOSではSMB1を使用することを非推奨と定義し[6]、速やかに新しい技術への移行を促した。2014年には将来のWindowsでは機能を削除する方針であることを公表し、2016年には速やかにSMB1の使用を停止するよう呼び掛けた。2017年9月、Windows 10 Version1709からはSMB1は初期状態では非サポートとなった。[7]
SMB 2.0[編集]
マイクロソフトは2006年、SMBの新バージョン SMB 2.0 (SMB2) をWindows Vistaで導入した[8]。
SMB2では、コマンド/サブコマンドの種類が100以上あったものを19にまとめ、プロトコルのやりとりを集約した[9]。パイプライン化機構があり、前の要求への応答を受け取る前に次の要求を送信できる。
複雑な動作を1つの要求にまとめることができ、クライアントとサーバ間のやり取りの回数を劇的に減らすことができ、結果として性能が向上する[10]。従来のSMBプロトコルにも同様な機能がありAndXと呼ばれていたが、マイクロソフトのクライアントは滅多にAndXを使わなかった。
SMB2ではより大きなバッファをサポートしており、大きなファイルの転送や高速なネットワークでの性能向上が見込まれる[10]。
また、「永続性ファイルハンドル」と呼ばれるものを導入している。これは、ネットワーク接続が切れてもSMBサーバとのコネクションが継続できるようにするもので、無線LANなど接続が切れやすい環境で新たなセッションを構築する必要をなくす。
SMB2はシンボリックリンクもサポートしている。他にもファイル属性のキャッシング、HMAC SHA-256ハッシュアルゴリズムによるメッセージ署名強化、ユーザー数・共有ファイル数などが増加した際のスケーラビリティ強化などの拡張がなされている[11]。
従来のSMBプロトコルは16ビットで各種サイズを表していた。SMB2ではそれらの多くを32ビットや64ビットに拡張しており、ファイルハンドルの場合は16バイトとしている。
Windows Vistaとそれ以降のオペレーティングシステムでは、通信相手もWindows Vistaかそれ以降であれば、SMB2を使って通信する。SMB2をサポートしない従来のWindowsなどとの通信には引き続きSMB1が使われる。
SMB2はマイクロソフトにとって具体的に次のような利益をもたらした。
- 知的財産権の明確化。従来のSMBはIBMがもともと設計したもので、Windows以外にもXENIX、OS/2、VMS (Pathworks) などにも採用されている。X/Openが部分的に標準化したり、IETFにもインターネットドラフトとして提出された。このため、知的財産所有権の所在は曖昧だった[1]。SMB2.0以降はすべてMicrosoftが作成している。
- 過去の資産との決別。従来のSMBのコードは非常に様々なSMBクライアントやサーバに対応する必要があった。このためプロトコルにはオプション部分が多数存在する(長いファイル名を扱えるか否かなど)。また、コマンドの応答として様々なレベルの情報を扱う。さらにUnicode対応は後から追加されている。SMB2のコードは従来のものより大幅に単純化されている(例えば、Unicodeサポートが前提なので、Unicodeでない場合を扱うコードは不要)。そのため、SMB2は少なくともマイクロソフトによる互換性テストを大幅に削減した(当初はWindows Vistaのクライアントとサーバのみの評価で済んだ)。
SMB 2.1[編集]
Windows 7とWindows Server 2008 R2で搭載された。SMB 2.0と比べてさらにファイル転送の速度が向上、特に複数のクライアントから同時にアクセスされた際は約3.5倍の向上が図られている[12]。
SMB 3.0[編集]
Windows 8とWindows Server 2012で搭載された。SMB ダイレクト、SMB マルチチャネル、SMB 暗号化などの機能が追加された[13]。開発段階ではSMB2.2と呼ばれていた[14]。
SMB 3.0.2[編集]
Windows 8.1とWindows Server 2012 R2で搭載された。透過フェイルオーバー使用時の自動リバランス、SMB ダイレクトの性能向上などの更新にとどまる[15]。
SMB 3.1.1[編集]
Windows 10で搭載された。認証の耐タンパ性の向上とSMB暗号化使用時のAES-128-GCMの追加が含まれる。
構造[編集]
クライアント-サーバ方式[編集]
SMBはPeer to Peer方式の動作をし、クライアントが何らかの要求を送ると、サーバがそれに対応して応答する。SMBプロトコルの一部は特にファイルシステムへのアクセスを扱っており、クライアントはファイルサーバとの通信にその部分を使う。しかし、SMBプロトコルにはプロセス間通信 (IPC) に特化した部分もある。SMBプロトコルはローカルなサブネットでの使用に最適化したが、インターネット経由で他のサブネットとの間でSMBを使うこともできる。Windowsのファイル共有やプリンタ共有に関わるエクスプロイトは、そのような使用法を主なターゲットとしている。
SMBサーバはファイルシステムや他のリソースに、ネットワーク上のクライアントがアクセスできるようにする。クライアントはサーバ上の共有ファイルシステムやプリンタにアクセスする。このような用法・機能としてはSMBは最も有名で最も広く使われている。しかし、SMBのファイルサーバとしての面には、NTドメインを構成するプロトコル群が重要であり、それらによって少なくともNT式のドメインベースの認証を提供している。NTドメインプロトコルはSMBのIPCである名前付きパイプのためだけにMSRPCサービスを提供し、SMBサーバの実装のほとんどはリソースへのユーザーアクセスの妥当性を検証するのにNTドメインの認証を使う。
性能問題[編集]
SMBプロトコルでは、各クライアントが自身の存在を知らせるためにサブネット全体にブロードキャストするため、ネットワークの帯域幅を占有しすぎると思われている。しかし、実はSMB自体はブロードキャストを使わない。SMBと結び付けられているブロードキャスト問題は、実際にはNetBIOSのサービス・ロケーション・プロトコルのせいである。デフォルトでは、WindowsのサーバはNetBIOSを使ってサービスの告知と発見を行う。NetBIOSは特定ホスト上で利用可能なサービスを一定間隔でブロードキャストすることで機能する。ホストが20台以下のネットワークではそのような設定でも十分だが、それ以上にホスト台数が増えるとブロードキャストのトラフィックが問題を生じるようになる。NetBIOS Name Server (NBNS) を適切に実装すると、この問題を緩和できる。例えばWindows Internet Naming Service (WINS) はマイクロソフトのネットワーク環境では適切な解決策を提供する。WINSはサービス要求の集中管理と登録のためのシステムを提供するが、ネットワークの設計と保守がより複雑化する。マイクロソフトは、Active Directory環境でのダイナミックDNSの利用を推奨している。
ネットワークを設計する際には、SMBプロトコルの性能はレイテンシに大きく影響されることを考慮しなければならない。SMBを使ってディレクトリを渡り歩いてファイルを探すような操作をしたとき、このレイテンシの影響が見た目にも明らかになる。例えばインターネット経由のVPNコネクションではレイテンシが大きくなることが多く、そのような環境ではディレクトリの中身(ファイル一覧)がなかなか表示されないということになる。
実装[編集]
以下の一覧は、SMBクライアント、SMBサーバ、SMBプロトコルの各種拡張(Network Neighborhood スイートやNTドメインスイートなど)である。以下に示したのは主なもので、拡張版、再実装版、移植版などは省いている。
- Sambaは、SMBプロトコルとマイクロソフトの拡張をフリーソフトウェアとして再実装したもの。SMBサーバ機能とコマンドラインのSMBクライアント機能がある。
- Linuxカーネルには仮想ファイルシステム (VFS) を使ったSMBクライアントの実装が2つあり(smbfsとcifs)、SMBサーバ上のファイルに標準のファイルシステムAPI経由でアクセスできる。fuseカーネルモジュールとユーザー空間のfusesmbを使ってSMBクライアント機能を実現することもできる。
- NetWare version 6以降では、CIFSサーバ機能を実装している。
- FreeBSDにはVFSを使ったSMBクライアント実装としてsmbfsがある。
- NetBSDとmacOSにはそれぞれのVFSを使ったSMBクライアント実装としてsmbfsがある(元はFreeBSDのsmbfsを移植)。
- Solarisには、macOSのsmbfsを基にしたCIFS client for Solarisというプロジェクトがある。
- OpenSolarisは2007年10月、カーネル内にCIFSサーバ機能を実装した[16]
- 小型NASサーバFreeNASは、FreeBSDベースで、CIFS/Sambaもサポートしている。EMCコーポレーション、ネットアップといったストレージ企業各社もSMBサーバの実装を行っている。
- Advanced Server for Unix (AS/U) はUNIX向けにWindows NT 3.51のSMBサーバ機能を移植したもので、AT&Tがマイクロソフトからライセンス提供を受け、主なUNIXベンダーにライセンス提供した。サン・マイクロシステムズは、Advanced Server for UnixをSolarisに移植した Solaris PC NetLink(コード名 Cascade)を製品化している。
- コンテンツ管理システムAlfrescoには、SMBサーバのJavaによる実装JLANが含まれている。
- JCIFSはJavaによるSMBクライアント実装
- RTSMBは組み込みシステム用のCIFS/SMB実装。
- Visuality Systems NQ CIFSは組み込みシステム用のCIFS/SMB実装。SMB1.0/SMB2.0/SMB3.0対応。Linux、VxWorks、 Integrity、 iOS、 Androidといった多くのRTOSに移植されている。
- AzSmbは、組み込みシステム用の小型SMBサーバである。GPLもしくは商用ライセンスで提供されている。
- File System for SMB/CIFS/Windows(R)はChromeOS向けのSMBクライアント実装。JavaScriptで書かれている。
脚注・出典[編集]
- ^ a b c d SMB|CIFS NQ|製品情報|アイティアクセス株式会社
- ^ ファイル共有プロトコル、SMBとCIFSの違いを正しく理解できていますか?(前編):その知識、ホントに正しい? Windowsにまつわる都市伝説(23) - @IT
- ^ * Common Internet File System Protocol (CIFS/1.0)
- ^ a b c 第7回 ファイル共有プロトコルSMBの概要:Windowsネットワークの基礎 - @IT
- ^ “Microsoft SMB Protocol Dialects”. Microsoft Corp.. 2015年12月16日閲覧。
- ^ Features Removed or Deprecated in Windows Server 2012 R2 | Microsoft Docs
- ^ SMBv1 is not installed by default in Windows 10 version 1709 and Windows Server version 1709 and later versions
- ^ Navjot Virk and Prashanth Prahalad (2006年3月10日). “What's new in SMB in Windows Vista” (英語). Chk Your Dsks. MSDN. 2006年5月1日閲覧。
- ^ “Vistaの目指すネットワークの姿(2)- NetBIOSなしでWindowsネットを実現”. ITPro. 2010年3月30日閲覧。
- ^ a b マイクロソフト、VistaとServer 2008で実現するメリットを解説
- ^ SMB2, a complete redesign of the main remote file protocol for Windows
- ^ @IT 編集部. “「ファイルサーバー、小型NASは安いのを選べ」 本当にそれでいい?”. 2011年2月10日閲覧。
- ^ “サーバー メッセージ ブロックの概要”. 2013年8月8日閲覧。
- ^ “SMB 2.2 is now SMB 3.0”. 2013年8月8日閲覧。
- ^ “What's New in SMB in Windows Server 2012 R2”. 2014年7月2日閲覧。
- ^ Project CIFS Server - Introduction
関連項目[編集]
外部リンク[編集]
- Windows Protocols - マイクロソフトのMSDN Open Protocol Site
- [MS-CIFS]: Common Internet File System (CIFS) Protocol - draft-leach-cifs-v1-spec-02.txt の改訂版
- [MS-SMB]: Server Message Block (SMB) Protocol - MS-CIFSへのマイクロソフトによる拡張仕様
- [MS-SMB2]: Server Message Block (SMB) Protocol Versions 2 and 3 - SMB2/3プロトコルの仕様
- [MS-SMBD]: SMB2 Remote Direct Memory Access (RDMA) Transport Protocol - SMBダイレクトの仕様
- [MS-FSSO]: File Access Services System Overview - Windows File Access Services Systemの機能、ファイルサービスを必要とするシステムやアプリケーションとどのようにやり取りするか、設定や管理を行うシステムとどのようにやり取りするかを記述
- Download details: Common Internet File System (CIFS) File Access Protocol - マイクロソフトによる技術詳細
- Implementing CIFS
- Samba development information
- the NT LM 0.12 dialect of SMB
(DOC)
| ||||||||||||||||