Azure上のWindows ServerにSMB1.0を導入する

# AzureのWindows ServerイメージにはSMB1.0のモジュールがない
SMB1.0の機能を有効にするには「役割と機能」ウィザードから追加しますが、Azureで公開されているVMイメージはなんとインストールに必要なモジュールが入っていません。脆弱なSMB1.0を使わせないというMicrosoftの強い意思を感じます。

詳細はこちら
[Azure Marketplace から作成した Windows VM において SMB 1.0 が有効化できない事象について](https://jpaztech.github.io/blog/vm/marketplace-image-smb1/)

上記のページによるとローカル環境でSMB1.0を有効にしたWindows ServerのVMを用意し、Azure環境へ持っていくことでAzure上でSMB1.0を利用できるようになるようです。Azure環境に最適化するための設定を入れるなどの移行の前準備作業があるのでそれなりに大変ですね…。また既存のAzureVMに導入する方法ではないので、VMの新規作成時にしか使えない手段です。
一方で以下のような注釈も書いてあります。
> 補足
技術的には、SMB 1.0 のインストールを行おうとした際に表示される代替ソースパスの指定画面において、これに対応するパッケージや iso ファイルを指定すればインストールを行うことが可能です。
しかし Azure サポートでは、SMB 1.0 のパッケージの配布、iso ファイルの提供など、この有効化に関するサポートを提供しておりません。

技術的には可能ということなので、Azure上のVMに直接SMB1.0を導入できないか試してみました。

:::note warn
SMB1.0は脆弱なプロトコルです。どうしても使わざるをえない状況でない限り、別の手段を模索してください。
:::

# Azure VMに直接SMB1.0を導入する手順
:::note warn
試行錯誤した結果、SMB1.0のインストールには成功しましたが、公式な手順ではありません。
本手順を採用する際には自己責任でご利用ください。
:::

## 準備するもの
* SMB1.0を導入したいWindows Serverと同じバージョンの**英語版**OSインストールISO（評価版でも問題なし）
※ 日本語版インストールISOを利用したらインストールに失敗しました
* SMB1.0を導入したいWindows Serverに適用されている月例パッチのインストーラ

## SMB1.0導入の流れ
大まかな流れは以下のようになります。
1. 作業用VM（暫定でSMB1.0を導入するVM）をデプロイする
1. 作業用VMでOSのインストールISOを利用してSMB1.0を導入する
1. SMB1.0を導入したいWindows Serverに適用されている月例パッチを作業用VMに適用する
1. 作業用VMのSMB1.0モジュールが入っているシステムフォルダにファイル共有をかける
1. 導入対象のVMから作業用VMの共有フォルダを参照してSMB1.0を導入する

導入対象のWindows Serverに直接SMB1.0を導入する方法もあるにはあるようなのですが、より手順が複雑になりそうだったので見送りました。

## 検証で利用した環境
今回の手順検証で利用した環境は以下の通りです。
* 作業用VM　：Windows Server 2022 (OS Build 20348.587 - 何も月例パッチが当たっていないもの）
* 導入対象VM：Windows Server 2022 (OS Build 20348.1607 - 2023年3月の月例パッチが当たったもの）
* 用意したISO：英語版Windows Server 2022 評価版

## SMB1.0 導入手順詳細
### 作業用VMのデプロイ
まずはSMB1.0を一旦導入する作業用VMをデプロイします。ただ、普通にVMをデプロイしてはいけません。
インストールISOのOSビルド番号と作業用VMのOSビルド番号が一致している必要があります。
インストールISOはパッチが一切適用されていないビルドだと思われるので、初期ビルドのイメージを明示的に指定して作業用VMをデプロイします。
イメージバージョンを指定してデプロイする手順は以下を参考にしてください。作業領域がそれなりに必要になるので、[smalldisk]のイメージは使わないでください。
[【Azure】イメージバージョンを指定してVMをデプロイする](https://qiita.com/chappy7121/items/61d5165dfed2887e0737)

なお、ビルド番号が一致していない状態でSMB1.0インストールを試みると、ソースファイルのパスを指定しても以下のようなエラーが返ってきます。
~~~
Error: 0x800f081f

The source files could not be found.
Use the "Source" option to specify the location of the files that are required to restore the feature. For more information on specifying a source location, see https://go.microsoft.com/fwlink/?LinkId=243077.
~~~

ソースファイルのパスを正しく指定しているにも関わらずこのエラーメッセージが返ってきたらビルド番号が一致していないか、OSとインストールISOの言語が一致していない可能性が高いです。
Azure VMは英語版OSになっているので、インストールISOも英語版で用意する必要があります。日本語版ISOを使うと上のエラーが出続けました。
Azure VMを日本語化する設定をきちんとおこなえば、日本語ISOを使ってもインストールに成功する可能性はありますが今回は試していません。

## 作業用VMでOSのインストールISOを利用してSMB1.0を導入する
.net Framework 3.5を導入する時と同じように役割と機能で追加する際にソースパスを指定するだけの簡単な作業かと想像していましたが、全然違いました。

1. 用意したOSインストールISOを作業用VMに配置します。
1. ローカルディスクに作業用の一時フォルダを作成します。（例：C:\tempwim\mount）
1. 配置したISOをダブルクリックしてマウントします。
1. ISOのsourcesフォルダ内にある「install.wim」をローカルにコピーします。
![01-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/836809a2-58c5-c337-1490-0c1257472d23.png)

1. 以下のコマンドを実行し、install.wimをマウントします。パスは適宜読み替えてください。
index:4としている部分はDatacenter(GUI)の場合です。利用環境によって数値を変えてください。
（1 = Standard Core、2 = Standard、3 = Datacenter Core、4 = Datacenter）
    ~~~
    dism /mount-wim /wimfile:c:\tempwim\install.wim /index:4 /mountdir:c:\tempwim\mount /readonly
    ~~~
1. マウントに成功すれば「The operation completed successfully.」と表示されます。
1. 以下のコマンドでSMB1.0の機能を追加します。
    ~~~
    dism /online /Enable-Feature:SMB1Protocol /All /source:C:\tempwim\mount\Windows\WinSxS /limitaccess
    ~~~
1. インストールに成功すれば以下のメッセージが表示されます。再起動してください。
    ~~~
    Enabling feature(s)
    [==========================100.0%==========================]
    The operation completed successfully.
    Restart Windows to complete this operation.
    Do you want to restart the computer now? (Y/N)
    ~~~
1. 再起動後、マウントしていたinstall.wimをアンマウントします。
    ~~~
    dism /unmount-wim /mountdir:c:\tempwim\mount /discard
    ~~~
1. 役割と機能から確認すると確かにインストールできていることがわかります。
![01-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/861f909e-54e8-5dcf-6020-1c04d2ce8d5c.png)


なお、この手順を導入対象VM上で直接行いたい場合はinstall.wimをマウントした後、展開したものに対してdismコマンドを使って導入対象VMと同じ月例パッチを適用する必要があります。1回試したのですが、ローカルディスクの空き容量が途中で枯渇し失敗。リトライするもパッチ適用に1時間以上かかった挙句に別の理由で失敗。頑張ればできそうな感じはしましたが、時間かかりすぎるのであきらめました。また、導入にあたってはいろいろと試行錯誤することになるになるので、導入対象のVMが変な状態になりそうなリスクもあります。そのため、作業用VMで作業する手順の方が無難だと思います。作業用VMは最終的に破棄するので、どんな状態になろうと気にする必要はありません。

参考までにマウントしたinstall.wimにパッチを直接適用するコマンドを載せておきます。msuのファイル名・パスは読み替えてください。
~~~
dism /add-package /image:"C:\tempwim\mount" /PackagePath="C:\Patch\windows10.0-kb5023705-x64_0fb56f0bcf0bc7af1de5be522da4e522331ce553.msu"
~~~

### SMB1.0を導入したいWindows Serverに適用されている月例パッチを作業用VMに適用する
作業用VMにSMB1.0を導入できましたが、このままだと導入対象VM向けのインストールソースとして利用できません。
OSのビルド番号が一致していないといけないので、作業用VMに対して導入対象のVMと同じ月次パッチを適用してください。
導入対象の月次パッチが最新化されているのであれば、インターネット経由でWindows Updateを実行すればよいです。
そうでない場合はMicrosoft Update Catalogから必要なKBをダウンロードして手動適用してください。

### 作業用VMのSMB1.0モジュールが入っているシステムフォルダにファイル共有をかける
導入対象のVMから参照できるようにするため、作業用VMのSMB1.0モジュールが入っているフォルダに共有を設定します。
システムフォルダに共有をかけるという強引な方法です。運用で使うVMでは決して実施しないでください。

1. 「C:\Windows\Windows\WinSxS」のプロパティを開き、「Advanced Shareing」を選択します。
![02-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/8a1750d6-8bfe-a917-6e75-b8821cab6de3.png)
1. 「Share this Folder」を有効にし、EveryoneにRead権限を与えます。
![02-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/bbaf745d-04db-54bb-7cca-cf7735f411f3.png)

作業用VMでの操作はここまでです。

### 導入対象VMにSMB1.0を導入
下準備がようやく整ったので導入対象VMにSMB1.0を導入します。

1. 導入対象VMにログインします。

1. 導入対象VMから作業用VMの共有フォルダへアクセスします。エクスプローラで「\\\\<作業用VMのIPアドレス>」へアクセスすると認証画面が出てくるので作業用VMの管理者アカウントでログインします。問題なく認証が通れば設定した共有フォルダにアクセスできるはずです。SMB1.0の導入を実施する前に認証を通しておくことが目的なので、開いたエクスプローラはそのままにしておきます。

1. 以下のコマンドを実行してSMB1.0を導入します。作業用VMのIPアドレスは各自の環境に合わせて置き換えてください。
   ~~~
   dism /online /Enable-Feature /FeatureName:SMB1Protocol /All /source:\\<作業用VMのIPアドレス>\WinSxS /limitaccess
   ~~~
1. 導入に成功すれば再起動を求められますので、再起動してください。これでSMB1.0の導入は完了です。もし、ソースファイルがないといったエラーが出る場合は適用されているパッチが一致いない、言語が一致していないなどインストールの前提条件を満たしていないと思われます。

SMB1.0のインストールが完了すれば作業用VMは不要となりますので、削除して問題ありません。

# まとめ
Azure VMに直接SMB1.0を導入することはなんとかできました。しかしながら、結構な時間がかかりました。必要なファイルの準備やパッチ適用に時間がかかるので、順調にできても1時間以上はかかるでしょう。ローカルでVMを作って持ち込む方法と比べてどちらが楽かは微妙なところですね…。また今回の検証では日本語化せずに試したので、日本語化した時にも同じ手順でできるのか、日本語版ISOを使わないといけないのかは要検証です。