CIFSとSMBのファイル共有プロトコル:その違いを解説
ネットワーク上でファイルを共有するためのプロトコルを選択する際、ソフトウェアのインターフェースやドキュメントで”SMB”や”CIFS”という用語をよく目にするでしょう。SMBとCIFSは同じものだと考えるユーザーもいますが、両者の違いを明確に区別するのは難しいかもしれません。しかし、なぜCIFSをSMBの同義語として扱えないのか、その理由を見ていきましょう。SMBとCIFSのプロトコルの違いや、これらの用語の正しい使い方を解説します。
SMBとは何ですか?
SMB(Server Message Block)は、OSI通信モデルのアプリケーション層で動作するネットワークプロトコルです。SMBは、ネットワークを介してリソースへの共有アクセスを提供するために使用されます。 SMBプロトコルは、ファイルサーバー上でのファイル共有、ユーザーコンピュータ間のファイル共有、およびコンピュータ間のファイルコピーに広く利用されています。
ファイルの操作に加え、SMBのその他の用途としては、メッセージングや印刷(汎用的なリモートトランザクション)のほか、ネットワーク内のコンピュータの閲覧などがあります。SMBは1983年にIBMによって開発され、それ以来、このプロトコルは何度も改良が加えられてきました。
SMBファイル共有とは何ですか?
SMB ファイル共有とは、SMB プロトコルを介して利用可能になる、リモートホスト上のディレクトリのことです。これらはファイルサーバー上で設定され、これらの共有に対する読み取りおよび書き込みアクセス権を設定することができます。1 台のファイルサーバーに複数の SMB 共有を設定することができます。
SMBの仕組み:SMBはどのような役割を果たすのか?
SMBは、クライアント・サーバー型のネットワーク原理に基づいて動作します。このプロトコルでは、クライアントから送信されるリクエストや、サーバーから送信される応答を含む一連のデータパケットが使用されます。クライアントは、IPアドレスまたはホスト名を使用してサーバーに接続できます。これらのSMBデータパケットは、次のように分類されます:
- ファイル共有への接続を確立・終了させるセッション制御パケット
- ファイルアクセスパケット。その名の通り、ファイル共有にアクセスしてファイルを操作するものです。
- 一般的なメッセージパケット
SMBは、接続を確立し、認証を完了した後にセッションを開きます。その後、このセッションを介してSMBメッセージを送信できるようになります。セッションを開始する際、SMBクライアントは自身の機能一覧を送信します(機能はクライアントのSMBバージョンによって異なります)。
SMBプロトコルは、以下の環境で動作します:
- ポート445を使用してTCP経由で直接接続する(NetBIOSを使用しない)――これが現代的なアプローチです。
- UDPポート137および138、ならびにTCPポート137および139を使用したNetBIOS API経由――これはWindows 2000まで採用されていた従来の方式です。SMBの初期バージョンでは、トランスポートプロトコルとしてNetBIOS over TCP/IPが使用されていました。
SMBプロトコルはバッチ処理、すなわち複数のメッセージをグループ化し、1回の送信でまとめて送信することでパフォーマンスを向上させる機能をサポートしています。
その他の機能としては、複数のユーザーが同じファイルを開いた際に共有ファイルを保護するためのファイルロック機構があります。ファイルをロックすることで、複数のユーザーによる同時書き込みを防ぎ、ファイル内のデータの不整合を回避することができます。
IPC(プロセス間通信)は、ヌルセッション接続とも呼ばれます。その IPC$ Windows によって作成されるこの共有は、クライアントとサーバー間の一時的な接続で使用されます。この隠し共有は、ファイルやディレクトリ、プリンターには分類できないデータ(たとえば、ユーザーや共有の一覧表示など)を共有するために作成されます。
Windows システムには、ネイティブの SMB クライアントとサーバーが組み込まれています。ただし、クライアント版の Windows では、ホストに接続できるユーザー数に制限がありますが、Windows Server 版にはそのような制限はありません。
- Windows XP および Vista – 同時接続数の上限は 10 接続
- Windows 7 および Windows 10 – 最大 20 の同時接続
Linux 上の SMB サーバーは、Linux 向けのフリーな SMB サーバー実装である Samba を設定することで構築されます。なお、Samba を使用すると、Linux を Active Directory ドメインに参加させたり、Linux をドメイン コントローラーとして動作させたりすることも可能です。SMB クライアントソフトウェアも、Linux やその他のオペレーティングシステムで(無料で)利用可能です。
CIFSとは何ですか?
CIFS(Common Internet File System)は、1996年にWindows 95のリリースを受けてマイクロソフトによって開発された、SMBの特定の実装、すなわち”方言”です。ここでいう”方言”とはバージョンのことであり、独立した別のプロトコルではありません。方言とは、ホスト間の通信のために送受信されるメッセージパケットの集合であり、特定のプロトコルバージョンを定義するものです。CIFSは、その名称が示唆する通りではありませんが、ファイルシステムそのものではありません。
CIFSプロトコルの仕様は、オリジナルのSMBプロトコルを基にしていますが、マイクロソフトによっていくつかの機能が追加されています。マイクロソフトは、TCP上のNetBIOS(初期のSMB 1実装で使用されていたもの)を使用せずに、TCPおよびポート445を介した直接接続を実装しました。CIFSはSMB 1の実装であり、独立したファイル共有プロトコルではありません。
SMBプロトコルの方言
マイクロソフトによるSMB1の実装について話す場合は、”CIFS”という用語を使用することができます。それ以外の場合、および一般的には、このネットワークプロトコルを指す正しい用語は”SMB”です。CIFSの後にリリースされたSMBの各バージョンを詳しく見て、CIFSとその他の(より新しい)SMBの方言(バージョン)との違いをより深く理解しましょう。
SMB 2.0
マイクロソフトは2006年、Windows Vistaのリリースに伴いSMB 2.0(またはSMB2)を公開しました。このSMBバージョンはSMB 1.0/CIFSよりも信頼性が高く、CIFSとは異なります。ファイル転送に必要なコマンド数は、100以上から20に削減されました。 パイプライン処理メカニズム、つまり前のリクエストに対する応答を受け取る前に次のリクエストを送信できる機能により、パフォーマンスが向上しています。複数のアクションを1つのリクエストにまとめることで、クライアントへのリクエスト数が減り、パフォーマンスが向上します。
SMB 2.1
SMB 2.1 は、SMB 2.0 と比較して、パフォーマンスやブロッキング機構においてわずかな改善をもたらします。このプロトコルバージョンは、Windows 7 および Windows Server 2008 R2 とともにリリースされました。
SMB 3.0
当初、このプロトコルバージョンはSMB 2.2と呼ばれていましたが、その後Windows 8のリリースに伴いSMB 3.0に名称が変更されました。SMB 3.0バージョン:
- SMB Direct(メモリへの直接アクセス)、SMBマルチチャネル、およびSMBトランスポートフェイルオーバーを追加しました
- セキュリティの強化
- エンドツーエンド暗号化のサポートを追加しました
- 遅延を低減することで、ネットワークの効率を向上させた
SMB 3.0.2
SMB 3.0.2 または 3.02 は、Windows 8.1 および Windows Server 2012 R2 以降で利用可能となっています。このバージョンでは、セキュリティを強化するために SMB 1.0 との互換性を無効にすることができます。
SMB 3.1.1
このバージョンは、Windows 10 および Windows Server 2016 以降で利用可能になりました。改善点としては、暗号化の強化(AES 128 GCM および AES 128 CCM)や、事前認証の整合性チェックにおける SHA-512 ハッシュの使用などが挙げられます。
Windows および Microsoft Server における SMB
SMBは、Windows 3.1(Windows for Workgroups)以降のWindowsで利用可能です。各WindowsバージョンにおけるSMBのバージョンと互換性については、以下の表で説明しています。
各列および行には、SMBクライアントまたはSMBサーバーを実行できるWindowsバージョンが記載されています(列と行は互換性があります)。各列と行の交点にあるセルには、それぞれのWindowsバージョン間の通信に使用されるSMBプロトコルのバージョンが表示されています。
| Windows 10、
、Server 2016 以降 |
Windows 8.1、
、Server 2012 R2 |
Windows 8、
、Server 2012 |
Windows 7、
、Server 2008 R2 |
Windows Vista、
、Server 2008 |
Windows XP、Server 2003 およびそれ以前のバージョン | |
| Windows 10、
、Server 2016 およびそれ以降のバージョン |
SMB 3.1.1 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 8.1、
、Server 2012 R2 |
SMB 3.02 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 8、
、Server 2012 |
SMB 3.0 | SMB 3.0 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 7、
、Server 2008 R2 |
SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows Vista、
、Server 2008 |
SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 1.0 |
| Windows XP、Server 2003 およびそれ以前のバージョン | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
CIFS 対 SMB:混乱の原因となりそうな点
例を挙げて、なぜユーザーの間でCIFSとSMBという用語が今でも混同されているのかを見てみましょう。そのために、SMB共有が設定されたファイルサーバーを使用していると仮定しましょう。 Windows Server 2019 また、SMBプロトコルを介してこのファイルサーバーに接続するLinuxマシンがあります。この例では、Ubuntu 20.04というLinuxディストリビューションを使用しています。なお、Ubuntu 22でも設定は同じです。
私たちの環境では、次のような設定になっています:
- Windows Server 2019: 192.168.101.209
- Linux Ubuntu 20.04: 192.168.101.210
- Windows Server での SMB 共有: 192.168.101.209share
Windows Server 2019 では、SMB 1.0/CIFS プロトコルはデフォルトで無効になっています。この設定を確認し、SMB 1.0/CIFS クライアントおよびサーバーを手動で有効または無効にするには、次の場所に移動します。 Server Manager > Add Roles and Features > Features.
当社の Windows Server 2019 サーバーでは、SMB 1.0/CIFS を無効にしています。つまり、デフォルトでは SMB 3 が使用されますが、SMB 2 バージョン(ダイアレクト)を使用するクライアントとの互換性を確保するために、SMB 2 に切り替えることも可能です。
Windows 10 などの最新の Windows バージョンでは、セキュリティ強化のため、CIFS プロトコルはデフォルトで無効になっています。必要に応じて手動で有効にすることができます。
注: 2017年、世界規模で大規模なランサムウェア攻撃が発生し(WannaCry そして NotPetya) は、SMB 1 の脆弱性を悪用するエクスプロイトを用いて実行されました。これらのエクスプロイトは、”EternalBlue”、”EternalRomance”、”EternalChampion”と名付けられました。マイクロソフトは、当時これらのOSが公式にサポート対象外であったにもかかわらず、Windows XPおよびWindows Server 2003以降のOS向けにセキュリティパッチをリリースしました。 マイクロソフトは、SMB 1.0/CIFSの代わりに、SMB 2およびSMB 3(事前認証の整合性をサポート)の使用を推奨した。
前述の通り、Linux用のSMBサーバーの名称はSambaである(サンバ (パッケージ名です)。ここでは Windows 上の SMB サーバーを使用します。そのため、この例では Samba は必要ありませんが、Ubuntu Linux 用の SMB クライアントが必要になります。
Linux 用の SMB クライアントは、Linux CIFS Utils に含まれています(cifs-utils (これがパッケージ名です)。ここに混乱の根源があります。Linux用クライアントの最初のバージョンは、SMB 1.0/CIFSが広く使われていた時代に作成されました。SMBプロトコルは更新され、SMBバージョン2および3がリリースされましたが、Linux用SMBクライアントの名前は変わらず、SMBクライアントを含むパッケージは今でも”CIFS Utils”と呼ばれています。このパッケージは cifs-utils は~の一部ではありません サンバ.
Linux上でCIFS Utilsを使用して、Windows Server 2019上のSMB共有に接続し、CIFSが依然として使用されているかどうかを確認します。CIFS Utilsをインストールするには、root権限で次のコマンドを実行してください:
sudo apt-get install cifs-utils
SMB 共有のマウントポイントとして使用するディレクトリを作成します:
mkdir /mnt/share
リモートの Windows ファイルサーバー上にある SMB ファイル共有に接続するには:
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator
この例では、説明のためにWindowsの管理者ユーザーアカウントを使用しています。
CIFS 対 SMB – 現在のセッションでファイルサーバーへの接続に使用されているのはどちらでしょうか?Windows Server 2019 の PowerShell コマンドを使用して、Windows Server 上の SMB 共有に接続しているクライアントの SMB バージョンを確認します:
Get-SmbSession | Select-Object -Property ClientComputerName,ClientUserName,Dialect
PowerShell の出力からわかるように、Ubuntu Linux からの接続には SMB 3.1.1 が使用されています。SMB 1.0/CIFS は、接続する際には使用されません。 cifs-utils そして、その mount.cifs Windows Server 2019 で構成されたファイルサーバーへのコマンド。
また、SMBプロトコルのバージョンは、以下の場所で確認することもできます。 /proc/mounts ~とともに cat /proc/mounts Linux のコマンド。以下のコマンドを使用すると、必要な結果のみを絞り込むことができます:
cat /proc/mounts | grep cifs
出力からわかるように、ファイル共有への接続に使用するプロトコルバージョンは次のように指定されています cifs、ですが、表示されているバージョンは 3.1.1 (vers=3.1.1)は、CIFSのバージョンではありません。これは、”SMB”と”CIFS”という用語が混同されやすいことを示す、もうひとつの例です。
実際、CIFSではなくSMB 3.1.1が使用されています。これについては、次の方法でもう1つ証明することができます。 nmap、これは分析やトラブルシューティングに使用される無料のネットワーク検出ツールです。
インストールするには nmap Ubuntu では、root 権限で次のコマンドを実行してください:
sudo apt-get install nmap
オンライン状態で、当社のネットワークに接続されているすべてのホストをスキャンするには、 192.168.101.0/24 ネットワークでは、次のコマンドを使用します:
nmap --script smb-protocols 192.168.101.0/24
ファイルサーバーとして動作している当社の Windows Server 2019 の IP アドレスである 192.168.101.209 の結果を確認したいと思います。Linux はこのサーバーのファイル共有に接続されています。 出力結果を見ると、当社のWindows ServerがサポートしているSMBプロトコルのダイアレクトは、2.02、2.10、3.00、3.02、および3.11であることがわかります。Linuxの設定ファイルやコマンドでは依然として”CIFS”という用語が使用されていますが、SMB 1.0/CIFSはサポートされていません。
次の設定を追加することで、手動でCIFSの使用を強制することができます。 vers=1.0 のパラメータ mount Linux(クライアント側)で、リモートサーバー上のファイル共有に接続する際に、SMB 1.0/CIFS プロトコルのみを使用するように設定するコマンド。
mount -t cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
または
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
結果は以下の通りです:
サーバーが突然接続を切断しました。これは、使用しようとしているSMBのバージョンがサーバーでサポートされていない場合に発生することがあります。SMBのデフォルトバージョンは、最近SMB1からSMB2.1以降に変更されました。.
この結果は、最新のオペレーティングシステムにおけるSMBとCIFSの比較調査で得られたこれまでの結果と一致しています。CIFSは使用されておらず、当社のWindows ServerではSMB 1.0/CIFSが無効化されています。
少なくともSMB 2.0を使用するように設定すれば、サーバーに接続できます(当社のWindows Server 2019がサポートするSMBダイアレクトの一覧は、 nmap):
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=2.0
Linux やその他のオペレーティングシステムでグラフィカルユーザーインターフェースを使用する場合は、 smb:// リモートサーバー上のファイル共有に接続するために使用するネットワークプロトコルを定義する際、アドレス欄には”
“と入力してください。SMBファイル共有へのアドレスを入力する際は、次のように指定してください:
smb://server-name/share-name
使用しないでください:
cifs://server-name/share-name
クライアントはSMB1.0/CIFSプロトコルを使用して接続を試みるためですが、サーバー側でこのプロトコルが無効になっている可能性があります(そもそもクライアントがそれをサポートしているとしても)。 cifs:// 構文)。
結論
CIFSプロトコルはすでに時代遅れとなっているため、ファイルサーバーやNAS上の共有ストレージに接続するために使用されるプロトコルの一つはSMBです(もう一つ一般的に使用されているのはNFSです)。共有ストレージは、データの破損やランサムウェア、ネットワークを介して容易に拡散するその他の脅威に対して特に脆弱であるため、データ損失を防ぐために、共有リソースに保存されているファイルやフォルダを必ずバックアップしてください。 共有ファイルへの書き込み権限を持つユーザーがたった1人でもコンピュータに感染すると、すべてのユーザーでデータ損失が発生する可能性があります。
NAKIVO Backup & Replication NASやWindows/Linuxファイルサーバー上に保存されているデータについて、SMBおよびNFS経由での増分バックアップをサポートするデータ保護ソリューションです。





