Server Message Block

**Server Message Block** (**SMB**) は、主にWindowsを中心とした環境でLANを通じてファイル共有やプリンタ共有などに使用される通信プロトコルの総称。OSI参照モデルでは第7層アプリケーション層に該当する。認証つきプロセス間通信機構としても動作する。

下位層のプロトコルとしてNetBEUIを使用していた時代には、サブネットを越えるルーティングはできず、中大規模のネットワークには向かないとされたが、や、NetBIOSも必要としない**CIFS**（**Common Internet File System**）により、大規模ネットワークでも使用可能となっている。

## 歴史
### SMB/CIFS/SMB1
2015年現在では、SMB 1.0以前のものを明確には区別せずにダイアレクト（方言）として扱うことが一般的である。「SMB1/CIFS」などとまとめて表記することも多い。また、下記のSMB 1.0以前の説明は2015年現在のマイクロソフトの説明に従って記載しているが、マイクロソフトは過去には下記とは矛盾する説明をしていたこともあったため、注意が必要である。

#### 初期のSMB
SMBは1982年か1983年にIBMのBarry Feigenbaumが設計した。DOSのローカルファイルアクセス用「割り込み 33」(INT 21h) をネットワーク上のファイルシステム向けに変えることを目標としていた。IBMは1984年、PC-DOSにSMBを搭載した。

マイクロソフトは、1985年発売のMicrosoft Networks （MS-NET）にSMBを搭載し、1988年頃にはスリーコムと共同開発していた LAN Managerに搭載、1992年にはWindows for Workgroupsに搭載と、多くの製品に搭載し、普及していった。

#### CIFS
マイクロソフトは1996年にSMBをCommon Internet File System (CIFS) と改称し、Windows NT 3.51、Windows NT 4.0、Windows 98に搭載した。

クロスプラットフォームでトランスポートから独立したファイル共有プロトコルとして定義を整理し、TCP/IP上での実装方法として「NetBIOS Transport over TCP」と「TCP Transport」を例示するなど、NetBIOSに依存しない定義へと更新した。「TCP Transport」はこの時点ではまだ実験的な試みであり実際に搭載されなかったが、のちにSMB1.0で改善され、Windows 2000では「Microsoft Direct Hosting of SMB」として採用されている。

また、マイクロソフトはさらなる機能追加を行った。。

ダイアレクトは「NT LM 0.12」を使用する。

サン・マイクロシステムズがを発表したことに対抗するように、1997年、マイクロソフトは部分的仕様をいくつかを
インターネットドラフトとしてIETFに提出したが、いずれも1998年までに有効期限切れとなっている。

#### SMB 1.0
2000年、マイクロソフトは名称をSMBに戻し、SMB 1.0(SMB1)としてWindows 2000で導入した。Kerberos認証やActive Directoryに対応した。また、ダイレクトホスティングSMBと呼ばれるTCP上で直接動作させる機能も導入された（その場合サーバがTCPポート445番で待機）。ダイアレクトはCIFSと同じ「NT LM 0.12」を使用するため、技術的にはCIFSと区別されない。

#### 終焉
その後の技術の進化の結果、SMB1は暗号化強度の面や通信効率の面からも好ましくないとされるようになる。

2012年、マイクロソフトはStorage Developer ConferenceでSMB1を無効化することを技術者たちに提案した。

2013年、マイクロソフトはWindows Server 2012 R2以降のOSではSMB1を使用することを非推奨と定義し、速やかに新しい技術への移行を促した。

2014年、マイクロソフトは期限を明確にはしていないものの、将来のWindowsでは機能を削除する方針であることを公表した。

2016年、マイクロソフトは改めて速やかにSMB1の使用を停止するよう呼び掛けた。

2017年1月、アメリカ国土安全保障省の配下組織US-CERTは、セキュリティ対策のベストプラクティスとして、SMB1の無効化を呼び掛けた。

2017年9月5日、Linux kernel 4.13において既定のプロトコルをSMB3とし、SMB1を無効化した。

2017年9月、マイクロソフトはWindows 10 Version1709でSMB1を初期状態では無効とした。ただし、セキュリティ上推奨されていないものの、必要であれば設定を変更することで有効化できる。

2018年8月、FreeNAS 11.1-U6においてSMB1が初期状態では無効にした。

2019年9月、Samba 4.11においてSMB1が既定で無効化された。

### SMB2
再設計された新たなSMBである。SMB 2.0.0以降のバージョンがSMB2のダイアレクト（方言）として定義されている。SMB 3.xもSMB2のひとつである点は間違いやすく注意が必要である。

SMB2では、コマンド/サブコマンドの種類が100以上あったものを19にまとめ、プロトコルのやりとりを集約した。

パイプライン化機構があり、前の要求への応答を受け取る前に次の要求を送信できる。複雑な動作を1つの要求にまとめることができ、クライアントとサーバ間のやり取りの回数を劇的に減らすことができ、結果として性能が向上する。従来のSMB1プロトコルにも同様な機能がありAndXと呼ばれていたが、マイクロソフト製のクライアントはほとんどAndXを使っていなかった。

また、SMB2ではより大きなバッファをサポートしており、大きなファイルの転送や高速なネットワークでの性能向上が見込まれる。

また、「永続性ファイルハンドル」と呼ばれるものを導入している。これは、ネットワーク接続が切れてもSMBサーバとのコネクションが継続できるようにするもので、無線LANなど接続が切れやすい環境で新たなセッションを構築する必要をなくす。

SMB2はシンボリックリンクもサポートしている。他にもファイル属性のキャッシング、HMAC SHA-256ハッシュアルゴリズムによるメッセージ署名強化、ユーザー数・共有ファイル数などが増加した際のスケーラビリティ強化などの拡張がなされている。

従来のSMBプロトコルは16ビットで各種サイズを表していた。SMB2ではそれらの多くを32ビットや64ビットに拡張しており、ファイルハンドルの場合は16バイトとしている。

SMB2はマイクロソフトにとって具体的に次のような利益をもたらした。
# 知的財産権の明確化。従来のSMBはIBMがもともと設計したもので、Windows以外にもXENIX、OS/2、VMS (Pathworks) などにも採用されている。X/Openが部分的に標準化したり、IETFにもインターネットドラフトとして提出された。このため、知的財産所有権の所在は曖昧だった。SMB2.0以降はすべてMicrosoftが作成している。
# 過去の資産との決別。従来のSMBのコードは非常に様々なSMBクライアントやサーバに対応する必要があった。このためプロトコルにはオプション部分が多数存在する（長いファイル名を扱えるか否かなど）。また、コマンドの応答として様々なレベルの情報を扱う。さらにUnicode対応は後から追加されている。SMB2のコードは従来のものより大幅に単純化されている（例えば、Unicodeサポートが前提なので、Unicodeでない場合を扱うコードは不要）。

#### SMB 2.0.0
2006年、SMBの新バージョン SMB 2.0.0をWindows Vistaで導入した。しかし相互運用性に問題があり、後述の2.0.2に置き換えて廃止された。

#### SMB 2.0.2
Windows Vista SP1とWindows Server 2008で搭載された。2.0.0の相互運用性に問題を解消したものである。

#### SMB 2.1
Windows 7とWindows Server 2008 R2で搭載された。SMB 2.0.2と比べてさらにファイル転送の速度が向上、特に複数のクライアントから同時にアクセスされた際は約3.5倍の向上が図られている。

#### SMB 3.0
Windows 8とWindows Server 2012で搭載された。SMB ダイレクト、SMB マルチチャネル、SMB 暗号化などの機能が追加された。開発段階ではSMB2.2と呼ばれていた。

#### SMB 3.0.2
Windows 8.1とWindows Server 2012 R2で搭載された。透過フェイルオーバー使用時の自動リバランス、SMB ダイレクトの性能向上などの更新にとどまる。

#### SMB 3.1.1
Windows 10で搭載された。認証の耐タンパー性能の向上とSMB暗号化使用時のAES-128-GCMの追加が含まれる。

ダイアレクトは3.1.1のまま、その後いくつかの機能追加が行われている。

## 構造

### クライアント-サーバ方式
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サーバ機能を実装した
* 小型NASサーバTrueNASは、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で書かれている。

## 脚注・出典

## 関連項目
* ファイル共有
** AppleTalk
**NetBEUI
** Network File System (NFS)
** Samba
* WannaCry

## 外部リンク
*Windows Protocols - マイクロソフトのMSDN Open Protocol Site
*: Common Internet File System (CIFS) Protocol - draft-leach-cifs-v1-spec-02.txt の改訂版
*: Server Message Block (SMB) Protocol - MS-CIFSへのマイクロソフトによる拡張仕様
*: Server Message Block (SMB) Protocol Versions 2 and 3 - SMB2/3プロトコルの仕様
*: SMB2 Remote Direct Memory Access (RDMA) Transport Protocol - SMBダイレクトの仕様
*: 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
*