SMB プロトコルは、Windows が当初からファイル、プリンター、名前付きパイプ、その他のネットワーク リソースを共有するために使用してきたクライアント/サーバー通信プロトコルです。SMB は「サーバー メッセージ ブロック」の略です。通常のリソース共有とは別に、SMB はメールスロットなどのプロセス間通信 (IPC) にも役立ちます。
CLOSE目次
SMB プロトコルの方言
SMB プロトコルは時間の経過とともに進化しており、そのさまざまなバージョンは一般に 方言と呼ばれます。Microsoft は、Windows の新しいバージョンごとに SMB を改善するために熱心に取り組み続けています。次の表は、さまざまな Windows バージョンで使用される SMB 言語を示しています。
中小企業の方言 | 年 | オペレーティング·システム | キーポイント |
SMB1.0 | 1984年 | Windows XP、2003 以前 | 非常におしゃべり、暗号化なし、安全ではない |
CIFS | 1996年 | Windows 95、Windows NT 4.0 | より大きなファイル、TCP/IP 経由の直接トランスポートを サポート シンボリックリンクとハードリンクをサポート |
SMB2.0 | 2006年 | Windows Vista、サーバー2008 | プロトコルのおしゃべり性を軽減、パイプラインメカニズムをサポート |
SMB2.1 | 2010年 | Windows 7、サーバー2008 R2 | マイナーなパフォーマンスの改善、便宜的なロック、大幅な MTU サポート |
SMB3.0 | 2012年 | Windows 8、サーバー2012 | エンドツーエンド暗号化、SMB 透過的フェイルオーバー、SMB ダイレクト、SMB マルチチャネル、SMB スケールアウト |
SMB3.02 | 2014年 | Windows 8.1、サーバー 2012 R2 | パフォーマンスの向上、セキュリティを強化するために CIFS/SMB 1.0 を無効にする機能 |
SMB 3.1.1 | 2015年 | Windows 10、サーバー 2016、サーバー 2019 | AES-128-GCM および AES-128-CCM 暗号化をサポート、ディレクトリ キャッシュをサポート、MITM 攻撃を軽減するための事前認証整合性チェックをサポート |
SMB 3.1.1* | 2021年 | Windows 11、サーバー 2022 | AES-256-GCM および AES-256-CCM 暗号化をサポート、暗号化を使用した SMB ダイレクト、SMB over QUIC をサポート |
表からわかるように、Windows 11 と Windows Server 2022 では、新機能やセキュリティ強化がほとんどない SMB 3.1.1 方言が依然として使用されています。
SMB プロトコル サービスを理解する
クライアント/サーバー プロトコルとして、SMB にはサーバー サービス ( LanmanServer ) とクライアント サービス ( LanmanWorkstation ) が必要です。すべての Windows コンピューターには、サーバー OS (Server 2016 や Server 2019 など) を実行しているか、クライアント OS (Windows 10 や Windows 11 など) を実行しているかに関係なく、LanmanServer サービスと LanmanWorkstation サービスの両方 が あり ます 。Get-Service Lanman* PowerShell コマンドを使用して、両方のサービスの状態を確認できます 。
悪名高い WannaCry、Petya、または同様の攻撃の後、人々はこれらのサービスを無効にするように言われました。まずはこれらのサービスについて理解しましょう。
Lanmanサーバーサービス
コンピューターがクライアント OS を実行している場合でも、 LanmanServer サービスはコンピューターが SMB 共有をホストするサーバーとして機能できることを確認します 。自分でフォルダーを共有していない場合でも、管理目的で重要なデフォルトの共有 (admin$、C$、IPC$ など) が存在します。これらすべての共有は LanmanServer サービスに依存します。Get-SmbShare PowerShell コマンドを使用すると、 コンピューター上のすべての共有を表示できます。
LanmanServer サービスに関する情報は、次のレジストリの場所に保存されます。
コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer
Lanman サーバー サービスを無効にしても安全ですか?
上で説明したように、コンピューターが SMB 共有をホストできるようにするには、LanmanServer サービスが重要です。このサービスを停止すると、すべての共有が機能しなくなり、他のコンピューターはコンピューター上で共有しているリソース (フォルダー、プリンター、デフォルトの管理共有を含む) にアクセスできなくなります。これにより、特に Active Directory 内のファイル サーバーまたはドメイン コントローラーにとって、LanmanServer サービスが実際にどれほど重要であるかがわかります (sysvol および netlogon 共有 のため )。
ホーム ユーザーの場合、ファイル共有サービスやプリンター共有サービスを使用していない場合は、サービスを安全に無効にすることができます。実際に無効にする前に、次のコマンドを使用して、それに依存するサービスがあるかどうかを確認します。
Get-Service LanmanServer -DependentServices
私のコンピューターのDocker デスクトップ サービスが LanmanServer サービスに依存していることがわかります 。LanmanServer を無効にすると、Docker サービスを開始できなくなります。コンピューター上に重要な依存サービスが表示されない場合は、次の PowerShell コマンドを使用して LanmanServer サービスを安全に無効にすることができます。
Set-Service LanmanServer -StartupType Disabled -PassThru | サービス停止 - 強制
このコマンドの実行後にコンピュータを再起動すると、ポート 445 がリッスンしなくなっていることがわかります 。このサービスを無効にしても、インターネットの使用には影響しません。
Lanman ワークステーション サービス
同様に、コンピュータ上の LanmanWorkstation サービスは、リモート コンピュータまたはサーバーから SMB 共有と共有プリンタを利用できるようにします。このサービスに関する情報は、次のレジストリの場所に保存されます。
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation
Lanman ワークステーション サービスを無効にしても安全ですか?
LanmanWorkstationサービスを停止する ということは、リモート SMB 共有を使用するコンピュータの機能を実質的に停止することを意味します。Get-Service LanmanWorkstation -DependentServicesコマンドを実行すると 、LanmanWorkstation サービスに依存する 2 つのサービス (Netlogon およびリモート デスクトップ構成) が表示されます。名前が示すように、netlogon はネットワーク ログオンと認証のための重要なサービスです。これを無効にすると、コンピュータは他のネットワーク デバイスと正しく通信できなくなります。
繰り返しますが、いかなる種類のネットワーク サービスも使用しないホーム ユーザーは、このサービスを無効にすることができます。これを無効にしても、インターネット、ローカル プリンター (USB 経由で接続)、さらにはネットワーク プリンター (TCP/IP サポートが組み込まれている) の使用には影響しません。自分のコンピュータはリモート コンピュータ上の共有リソースにアクセスできなくなり、他のコンピュータも自分のコンピュータにアクセスできなくなることに注意してください。通常の家庭用コンピュータの場合、このサービスを無効にすることはセキュリティの観点から良いことである可能性があります。LanmanWorkstation サービスを無効にするには、次のコマンドを使用します。
Set-Service LanmanWorkstation -StartupType Disabled -PassThru | サービス停止 - 強制
コンピューター上で LanmanWorkstation サービスが停止している場合、ネットワークからそのコンピューターにアクセスしようとすると、 次のスクリーンショットに示すように、「指定されたネットワーク名は使用できなくなりました」というエラーが表示されます。
ドメインまたはワークグループ環境でこのエラーが発生した場合は、接続しようとしているリモート コンピューター上で LanmanWorkstation サービスが実行されていることを確認してください。このサービスを開始したら、依存する netlogon サービスも忘れずに開始してください。そうしないと、次のエラーが発生する可能性があります。
ネットワークコンピュータに関する重要な注意事項
コンピュータがワークグループまたはドメイン ネットワークの一部である場合は、 LanmanServerサービス と LanmanWorkstation サービスの両方を有効のままにすることを強くお勧めします。それらを無効にしても何の役にも立ちません。むしろ、管理者にとっては非常に頭の痛い問題です。これらを無効にする代わりに、関連するポート (TCP 139 および 445)の信頼されたネットワークへのアクセスを適切に制限することで、 十分なセキュリティ対策になります。
さまざまなSMBプロトコルの実装
SMB プロトコルは、ネットワーク上でファイルとリソースを共有するための最も一般的なプロトコルの 1 つです。Windows だけでなく、Linux/Unix や macOS などの他のオペレーティング システムでも広く採用されています。以下は、SMB プロトコルの最も一般的な実装の一部です。
- CIFS - Common Internet File System (CIFS) は、Microsoft による SMB プロトコルの実装です。
- Samba - Linux/Unix および macOS で非常に人気のあるオープン ソースの SMB 実装。
- NQ (YNQ、jNQ、NQ ストレージ) - これは、Visuality Systems によって開発されたもう 1 つの SMB 実装です。
- Fusion File Share - 以前は Tuxera SMB として知られていた、これは Tuxera Inc によって開発された Samba の独自実装です。
SMB プロトコルは Windows だけのものではないことに注意してください。SMB の人気について大まかに説明すると、JFileServer (Java ベース)、pySMB と impacket (Python ベース)、MoSMB (mojo ベース) など、さまざまなプログラミング言語で他にも多数の SMB 実装が存在します。
SMB プロトコルのセキュリティに関する考慮事項
悪名高い WannaCry 攻撃と Petya 攻撃、そして EternalBlue のエクスプロイトを覚えていますか? これらはすべて、何らかの形で SMB 1.0 の脆弱性につながります。したがって、ネットワーク内の SMB 通信を保護するために使用できるいくつかの SMB 機能をカバーすることが重要です。
SMB 通信を保護するための次のベスト プラクティスについて説明します。
- ネットワーク内の廃止された SMB ダイアレクト (特に SMB 1.0) と NBT を明示的に無効にします。
- SMB ポートのアクセスを信頼できるネットワークとクライアントに制限します 。
- 可能な限り常に最新の SMB ダイアレクト (SMB 3.1.1) を使用し、セキュリティ機能を有効にしてください。
SMB 1.0の無効化
すでに説明したように、SMB 1.0 はもはや安全とは見なされません。これは非効率であり、暗号化をサポートしておらず、過去にも悪用されています。推奨されるベスト プラクティスは、ネットワークで明示的に無効にすることです。これを行うには複数の方法がありますが、考えられるすべての方法を網羅することはこの記事の範囲を超えています。
ネットワーク内にまだ多数のレガシー クライアント (古いプリンター、Windows XP コンピューター、または非常に古いファームウェアを実行しているその他のデバイスなど) が存在する場合は、問題や潜在的な問題が発生する可能性があるため、すぐに SMB 1.0 サポートを無効にしないでください。生産性の損失。まず、監査ログを有効にし、ログを監視して、まだ SMB 1.0 を使用しているデバイスを特定する必要があります。このような古いクライアントの数を判断することで、ネットワーク内で SMB 1.0 サポートを無効にした場合の全体的な影響を評価できます。監査ログを有効にするには、すべての SMB 共有がホストされているファイル サーバーで次の PowerShell コマンドを実行します。
Set-SmbServerConfiguration -AuditSmb1Access $True -Force
このコマンドを実行した後、数日間待ってから、イベント ビューアーでアクセス ログを確認してください。ログ ファイルの場所は次のとおりです。
アプリケーションとサービス ログ > Microsoft > Windows > SMBServer > 監査
次のスクリーンショットは、SMB 1.0 アクセス イベント ログがどのようなものかを示しています。
このようなイベントは、イベント ID: 3000 および ソース: SMBServerでログに記録されます 。クライアント IP アドレスを記録してそのようなデバイスを特定することも、次の PowerShell コマンドを使用してこれらのイベントを確認することもできます。
Get-WinEvent -LogName Microsoft-Windows-SMBServer/Audit | Get-WinEvent -LogName アウトグリッドビュー
そのようなデバイスを特定したら、それらを更新したり、ネットワークの残りの部分から適切に隔離するための特定の措置を講じて、セキュリティ リスクを軽減したりできます。
SMB 1.0 サポートを無効にする準備ができたら、次の手順に従います。
SMB 1.0 が有効かどうかを確認するには、次のコマンドを使用します。
Get-SmbServerConfiguration | 「SMB1プロトコルを有効にする」を選択します
EnableSMB1Protocol列 の下に True と表示されている場合は 、サーバーがまだ SMB 1.0 をサポートしていることを意味します。
サーバー上で SMB 1.0 サポートを無効にするには、次のコマンドを実行します。
Set-SmbServerConfiguration -EnableSMB1Protocol $False -Force
ネットワークが最新のデバイスを完全に実行しており、レガシー クライアントがない場合は、SMB 2.0 サポートを無効にして、すべてのデバイスに、より安全な SMB 3.0 ダイアレクトの使用を強制できます。SMB 2.0 を無効にするには、次のコマンドを使用します。
Set-SmbServerConfiguration -EnableSMB2Protocol $False -Force
ファイル サーバーの観点から、ネットワーク内でほとんどのクライアント コンピューターがどの SMB 言語を使用しているかを知るには、ファイル サーバーで次のコマンドを使用できます。
取得-SmbSession | クライアントコンピュータ名、クライアントユーザー名、NumOpens、方言を選択します
ここで、 Get-SmbSessionコマンドは 、ファイル サーバー上のLanmanServerサービス によってホストされている SMB 共有と通信するためにさまざまなクライアントが使用する SMB ダイアレクトを示しています 。
上のスクリーンショットは、まだ SMB 3.0.2 を使用している 1 つのクライアント (オレンジ色のマーク) を除いて、ネットワーク内のほとんどのクライアント デバイスが SMB 3.1.1 を使用していることを示しています。これは、Windows Server 2012 R2 デバイスであり、Server 2019 に更新する必要があるためです。
同様に、クライアント コンピュータで次のコマンドを使用すると、SMB 共有へのアクセスにどの SMB ダイアレクトが使用されているかを確認できます。
Get-SmbConnection
ここで、 Get-SmbConnectionコマンドは 、ローカル コンピューター上のLanmanWorkstationサービス を利用してリモート SMB 共有にアクセスするために使用される SMB ダイアレクトを示しています 。
SMB トラフィックを信頼できるネットワークに制限する
SMB トラフィックを信頼されたネットワークのみに制限するには、VLAN の実装、IPsec ポリシーの利用、制限的なファイアウォール ルールの単純な作成など、さまざまな手法を使用できます。
すべてのシステムで Windows Defender ファイアウォールを構成して、 プライベートプロファイル または ドメインプロファイルのみ に対して ファイルとプリンターの共有を有効にすることができます 。これを行うには、PowerShell で次のコマンドを使用します。
Set-NetFirewallRule -DisplayGroup "ファイルとプリンターの共有" -Enabled True -Profile Private
パブリックプロファイルに対してこのルールを有効にしないでください 。UI を使用してこれを行うには、Windows Defender ファイアウォールを開き、 左隅にある [ Windows Defender ファイアウォールを介したアプリまたは機能を許可する]リンクをクリックします。ここで、 [ドメイン] または [パブリックのみ] の下の [ファイルとプリンターの共有]チェックボックスをオンにします 。[パブリック]の下のボックスはチェックしないでください 。参考として、次のスクリーンショットを参照してください。
もちろん、 セキュリティが強化された Windows Defender ファイアウォールを使用して、ファイルと プリンターの 共有に対するより 制限的で詳細なルールを定義する こともできます。
もう 1 つ強調しておきたいのは、SMB トラフィックがネットワークから出ないようにするために、境界ファイアウォールの TCP 445 ポートと 139 ポートを明示的に無効にすることです。これらのポートをインターネットに公開したままにすると、セキュリティ上の大きなリスクが生じます。
SMB 3.x でのセキュリティ機能の有効化
Microsoft は、セキュリティとパフォーマンスを向上させるために、SMB 3.0 にいくつかの大きな変更を加えました。可能な限り、常に最新の SMB ダイアレクト (執筆時点では SMB 3.1.1 が最新です) を実行することを強くお勧めします。SMB 3.x は、言及する価値のある次のセキュリティ機能を提供します。
- SMB暗号化
- SMB署名
- SMB 事前認証の整合性
- SMB 認証レート リミッター (次期サーバー バージョンのみ)
SMB暗号化
エンドツーエンド暗号化は、各 SMB 共有で個別に有効にすることも、ファイル サーバー全体で有効にすることもできます。SMB 暗号化は、両方の SMB サーバーのEncryptDataプロパティによって制御されます 。特定の共有 (プロジェクトなど) で暗号化を有効にするには、次の PowerShell コマンドを使用します。
Set-SmbShare -プロジェクトに名前を付ける$ -EncryptData $True -Force
ファイル サーバー全体で暗号化を有効にするには、次の PowerShell コマンドを使用します。
Set-SmbServerConfiguration –EncryptData $True -Force
SMB 共有で暗号化を有効にすると、暗号化をサポートしていないクライアントはアクセスできなくなります。
現在、SMB 共有で暗号化を有効にする必要があるが、まだ暗号化をサポートしていない古いクライアントを許可したい状況 (古いクライアントのアップグレード中の移行期間など) が発生する可能性があります。この状況では、次の PowerShell コマンドを実行できます。
Set-SmbServerConfiguration -RejectUnencryptedAccess $False -Force
これは、そもそも暗号化を有効にする目的が損なわれるため推奨されませんが、レガシー クライアントが完全にアップグレードされるまで許可する場合には役立ちます。
SMBプロトコル署名
SMB 署名またはセキュリティ署名は、SMB 通信中のデータの改ざんを防止する SMB プロトコルのセキュリティ機能です。これは、SMB ヘッダーの署名フィールド内にメッセージ全体のハッシュを追加することで実現されます。誰かが転送中にデータを変更すると、ハッシュが一致しなくなり、SMB はデータが改ざんされたことを認識します。SMB 署名は SMB 1.0 から存在していますが、現代のセキュリティ ニーズを満たすために時間の経過とともに進化してきました。SMB 1.0 は MD5 ベースのメッセージ署名をサポートし、SMB 3.1.1 は AES CMAC ベースの署名をサポートします。
署名は暗号化と同じではないことに注意してください。暗号化により、盗聴者が通信上のデータを読み取ることが困難になりますが、署名はデータの整合性を検証する役割を果たします。 SMB 署名は、SMB サーバーとクライアントの両方のRequireSecuritySignatureプロパティによって制御されます 。サーバー上で SMB 署名を有効にするには、次のコマンドを使用します。
Set-SmbServerConfiguration -RequireSecuritySignature $True -Force
EnableSecuritySignatureという名前の別のプロパティがあります 。 これは SMB 1.0 でのみ使用されます。SMB 2.0 以降では、この設定は無視され、何の効果もありません。SMB サーバーとクライアントの両方のグループ ポリシーを使用して、ドメイン環境での SMB 署名を制御することもできます。
次の表は、SMB 通信中に署名が行われる場合と行われない場合を示しています。
SMB サーバー RequireSecuritySignature = 0 |
SMB サーバー RequireSecuritySignature = 1 |
|
SMB クライアント RequireSecuritySignature = 0 |
署名されていません | 署名済み |
SMB クライアント RequireSecuritySignature = 1 |
署名済み | 署名済み |
SMB クライアント と SMB サーバーの両方でEnableSecuritySignature が Falseに設定されている 場合 にのみ、SMB 署名が行われないことがわかります 。それ以外の場合はすべて、署名が行われます。
SMB 事前認証の整合性
事前認証の整合性は、SMB 署名を補完するために導入されました。SMB 署名の問題は、SMB セッションのセットアップ後にデータの整合性を保護できることでした。ただし、SMB の最初の交渉段階で誰かが仲介者になった場合、データが改ざんされる可能性があります。認証前の整合性により、この問題は解決されました。これは、SMB 3.1.1 で導入された必須のセキュリティ機能であり、SHA-512 ハッシュを使用して、最初の接続確立段階でもデータ整合性検証を向上させます。これは、攻撃者が SMB 3.1.1 暗号化接続を SMB 2.x プロトコルにダウングレードして、暗号化されていない接続を生成するプロトコル ダウングレード攻撃から保護します。必須の機能として、SMB 3.1.1 ではデフォルトで有効になっています。
上記で説明したすべての SMB サーバー セキュリティ機能は、次の PowerShell コマンドを使用して表示できます。
Get-SmbServerConfiguration | EnableSMB1Protocol、EncryptData、RejectUnencryptedAccess、EnableSecuritySignature、RequireSecuritySignature を選択します
これらの機能はすべてブール値を受け入れます。したがって、機能を有効または無効にするには、 Set-SmbServerConfigurationコマンドレットとともにパラメーター名を指定し、 $true または $false を入力して 機能設定を切り替えるだけです 。次の PowerShell コマンドは、ファイル サーバー上で SMB 1.0 を無効にし、すべての SMB セキュリティ ポリシーを同時に有効にします。
Set-SmbServerConfiguration -EnableSMB1Protocol $false -EncryptData $true -EnableSecuritySignature $true -RequireSecuritySignature $true -Force
SMB 認証レート リミッター (Server vNext プレビューでのみ利用可能)
レインボー テーブル攻撃やブルート フォース攻撃は、インターネット上では珍しいことではありません。SMB にはそのような攻撃を遅らせる機能が組み込まれていないため、SMB ポートをインターネット上に公開することは非常に悪い考えです。最新のコンピューティング能力を備えた通常の PC は、1 秒あたり数千のパスワードを試行できます。
Microsoft は、まだプレビュー段階にある次期バージョンの Windows Server vNext で、 このようなブルート フォース攻撃を遅らせるための新しい SMB 機能を導入しました。この機能は SMB 認証レート リミッター (略して SMB レート リミッター) として知られており、 Set-SmbServerConfigurationコマンドレット の -InvalidAuthenticationDelayTimeInMsパラメーターによって制御できます 。現在の設定を表示するには、次のコマンドを使用します。
Get-SmbServerConfiguration | InvalidAuthenticationDelayTimeInMs を選択します
デフォルトの無効な認証遅延時間は 2 秒 (2000 ミリ秒) ですが、最大 10,000 ミリ秒 (10 秒) に設定できます。10 秒の遅延がブルート フォース攻撃の速度を低下させるのにどれだけの違いをもたらすかを想像してみてください。PowerShell を使用してレート リミッターを設定するには、次のコマンドを使用します。
Set-SmbServerConfiguration -InvalidAuthenticationDelayTimeInMs 10000 -Force
このコマンドは、無効な認証遅延を 、サポートされている最大遅延である10秒に設定します。値を 0に設定すると 、この機能が無効になります。この機能は、Windows Server vNext Insider Preview (ビルド 25075 以降) でのみ利用できることに注意してください。
結論
この記事を読んで、SMB プロトコルの仕組みと、ネットワーク内で SMB 通信を保護するさまざまな方法をよく理解していただければ幸いです。これは包括的なセキュリティ チェックリストではありませんが、いくつかの中小企業のセキュリティ対策について十分なアイデアを提供します。
次回の投稿では、 SMB ポート番号に関するいくつかの混乱を解消します 。