ネットワーク上でファイルを共有するためのプロトコルを選択する際には、ソフトウェアのインターフェースやドキュメントでよくSMBとCIFSの用語に出会います。一部のユーザーは、SMBとCIFSが同じものだと考えていますが、その違いを明確に特定することは難しいかもしれません。しかし、CIFSをSMBの同義語として使用できない理由を見てみましょう。SMBとCIFSのプロトコルの違いや用語の使い方について学んでみましょう。
SMBとは何ですか?
SMB、またはServer Message Blockは、OSI通信モデルのアプリケーション層で動作するネットワークプロトコルです。SMBは、ネットワーク上でリソースへの共有アクセスを提供するために使用されます。SMBプロトコルは、ファイルサーバー上でファイルを共有したり、ユーザーコンピューター間でファイルを共有したり、コンピューター間でファイルをコピーしたりするために広く使用されています。
ファイルを操作する以外に、SMBのもう1つの使用例は、メッセージングと印刷(汎用リモートトランザクション)であり、また、ネットワーク内のコンピューターを参照することもあります。IBMが1983年にSMBを開発し、その後、プロトコルは複数回改良されています。
SMBファイル共有とは何ですか?
SMBファイル共有は、SMBプロトコルを介して利用可能になったリモートホスト上のディレクトリです。これらはファイルサーバーで構成され、これらの共有への読み取りと書き込みアクセスが構成されることがあります。1つのファイルサーバーに複数のSMB共有が存在する場合があります。
SMBの動作原理:SMBは何をするのか?
SMBはクライアントサーバーネットワークの原理に基づいて動作します。プロトコルは、クライアントが送信する要求またはサーバーが送信する応答を含むデータパケットのセットを使用します。クライアントは、IPアドレスまたはホスト名を使用してサーバーに接続できます。これらのSMBデータパケットは、以下のように分類できます:
- セッション制御パケットは、ファイル共有への接続を確立/停止します
- ファイルアクセスパケットは、その名前が示すように、ファイル共有にアクセスし、ファイルを操作します
- 一般的なメッセージパケット
SMBは、接続を確立し、認証を完了した後にセッションを開きます。その後、SMBメッセージをこのセッションを通じて送信できます。セッションを開始するとき、SMBクライアントは自分の機能のリストを送信します(機能はクライアントのSMBバージョンに依存します)
SMBプロトコルは次のように機能します:
- TCPを介して直接ポート445を使用して(NetBIOSなし) – これが現代のアプローチです
- UDPポート137と138およびTCPポート137と139を使用してNetBIOS APIを介して – これは、Windows 2000まで使用されたレガシーアプローチです。 SMBの最初のバージョンは、輸送用にTCP/IP上のNetBIOSを使用しました
SMBプロトコルは、パフォーマンスを向上させるために、複数のメッセージをグループ化してそれらを1つの送信に送信するバッチ処理をサポートしています
追加機能には、複数のユーザーが同じファイルを開いているときに共有ファイルを保護するためのファイルロックメカニズムが含まれます。ファイルをロックすることで、複数のユーザーが同時にデータを書き込むことを避け、ファイルのデータの不整合を引き起こすことができます
IPC(プロセス間接続)は、ヌルセッション接続としても知られています。 Windowsによって作成されたIPC$共有は、クライアントとサーバーの間の一時的な接続で使用されます。この非表示共有は、ファイル/ディレクトリやプリンターなどに分類できないデータを共有するために作成されます。 例えば、ユーザーと共有の列挙。
Windowsシステムには、ネイティブのSMBクライアントとサーバーが含まれています。ただし、クライアントのWindowsバージョンには、Windowsサーバーバージョンとは異なり、ホストに接続できるユーザー数に制限があります。
- 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、は、Microsoftによって開発されたSMBの特定の実装または方言であり、Windows 95のリリースに続いて1996年に開発されました。方言とは、別個の独立したプロトコルではなく、バージョンです。方言は、特定のプロトコルバージョンを定義するホスト間の通信のために送受信されるメッセージパケットのセットです。 CIFSは、名前が示唆するように、ファイルシステムではありません。
CIFSプロトコル仕様は、元のSMBプロトコルに基づいていますが、Microsoftによっていくつかの追加機能が追加されています。 Microsoftは、最初のSMB 1の実装で使用されていたNetBIOS over TCPを使用せずに、TCPおよびポート445を介した直接接続を実装しました。 CIFSは、SMB 1の実装であり、別個のファイル共有プロトコルではありません。
SMBプロトコル方言
マイクロソフトによるSMB1の実装について話すとき、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 Multichannel、およびSMB Transport Failover
- セキュリティの改善
- エンドツーエンドの暗号化のサポートの追加
- 遅延を減らすことによるネットワークの効率の向上
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
Windowsでは、Windows 3.1(Windows for Workgroups)から利用可能です。異なる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 |
Win 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 |
Win XP、Server 2003 およびそれ以前のバージョン | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
CIFS vs SMB: 混乱の原因
例を使って、なぜCIFSとSMB用語がまだユーザーに混乱を招いているのかを調べましょう。そのために、Windows Server 2019で構成されたSMB共有を使用してファイルサーバーを使用し、LinuxマシンがSMBプロトコルを介してこのファイルサーバーに接続しているとします。この例では、Ubuntu 20.04を使用しています。設定はUbuntu 22でも同じです。
環境には次の構成があります:
- Windows Server 2019: 192.168.101.209
- Linux Ubuntu 20.04: 192.168.101.210
- Windows ServerのSMB共有: \\192.168.101.209\share
Windows Server 2019では、SMB 1.0/CIFSプロトコルはデフォルトで無効になっています。この設定を確認してSMB1.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 と呼ばれました。Microsoft は、Windows XP および Windows Server 2003 からのセキュリティパッチをリリースしましたが、これらの OS は当時公式にサポートされていませんでした。Microsoft は、SMB 1.0/CIFS の代わりに SMB 2 および SMB 3(事前認証整合性をサポート)の使用を推奨しています。
前述のように、Linux での SMB サーバーの名前は Samba です(samba がパッケージ名です)。私たちは Windows 上で SMB サーバーを使用しています。したがって、この例では Samba は必要ありませんが、Ubuntu Linux 用の SMB クライアントが必要です。
Linux CIFS Utils(cifs-utilsがパッケージ名です)にはLinux用のSMBクライアントが含まれています。これが混乱の原因です。Linux用の最初のこのSMBクライアントは、SMB 1.0/CIFSが広く使用されていた時期に作成されました。SMBプロトコルが更新され、SMBバージョン2および3がリリースされましたが、LinuxのSMBクライアントの名前は同じままであり、SMBクライアントを含むパッケージは今でもCIFS Utilsと呼ばれています。パッケージcifs-utilsはsambaの一部ではありません。
私たちは、CIFS Utilsを使用してLinuxからWindows Server 2019にあるSMB共有に接続し、CIFSがまだ使用されているかどうかを調べます。CIFS Utilsをインストールするには、次のコマンドをルート権限で実行してください:
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バージョンを確認します:
Get-SmbSession | Select-Object -Property ClientComputerName,ClientUserName,Dialect
PowerShellの出力でわかるように、Ubuntu Linuxからの接続にはSMB 3.1.1が使用されています。 cifs-utilsおよびmount.cifsコマンドを使用してWindows Server 2019に構成されたファイルサーバに接続する場合、SMB 1.0/CIFSは使用されません。
また、Linuxで/proc/mounts内のSMBプロトコルバージョンを確認することができます。必要な結果のみをフィルタリングするために次のコマンドを使用できます:
cat /proc/mounts | grep cifs
出力でわかるように、ファイル共有に接続するためのプロトコルバージョンは
実際には、CIFSではなくSMB 3.1.1が使用されています。分析とトラブルシューティングに使用される無料のネットワーク発見ツールであるnmapを使用して、さらに1つの方法で証明できます。
Ubuntuにnmapをインストールするには、ルートとして次のコマンドを実行します:
sudo apt-get install nmap
オンラインで接続されているすべてのホストをスキャンするには、次のコマンドを使用します:
nmap --script smb-protocols 192.168.101.0/24
192.168.101.209は、ファイルサーバーとして機能しているWindows Server 2019のIPアドレスです。Linuxは、このサーバー上のファイル共有に接続されています。出力では、Windows ServerがサポートするSMBプロトコルの方言として、2.02、2.10、3.00、3.02、3.11がサポートされていることがわかります。Linuxの構成ファイルやコマンドでCIFS用語がまだ使用されているものの、SMB 1.0/CIFSはありません。
Linux(クライアント側)のmountコマンドにvers=1.0パラメータを追加することで、CIFSを手動で強制的に使用することができます。これにより、リモートサーバーのファイル共有に接続する際に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を使用するように設定すれば、サーバーに接続できます(nmapで表示されたWindows Server 2019がサポートするSMB方言のリストを覚えておいてください):
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プロトコルが時代遅れになった今、SMBはファイルサーバーやNAS上の共有ストレージに接続するために使用されるプロトコルの1つであり(もう1つ一般的に使用されるのはNFSです)、共有ストレージはデータの破損、ランサムウェア、ネットワーク全体に簡単に広がる他の脅威に特に脆弱ですので、データ損失を避けるために、共有リソースに保存されているファイルとフォルダーをバックアップすることを確認してください。共有ファイルに書き込み権限を持つユーザーのコンピューターが感染すると、すべてのユーザーのデータ損失が発生する可能性があります。
NAKIVO Backup & Replicationは、NASおよびWindows/Linuxファイルサーバーに存在するデータのSMBおよびNFSを介した増分バックアップをサポートするデータ保護ソリューションです。