オフラインWSUSの半自動自動運用について

## 目的

インターネットに接続できないオフライン開発環境において、WSUSによる定義ファイルや更新パッチの配信を半自動化するため作成した仕組みについてまとめる。

- WSUSのインストールや運用等について、基本的なことは分かっているとの前提でポイントのみまとめる。
  - WSUSは、Windows Server Update Servicesの略。マイクロソフト製品に関する更新プログラムを集中管理するソフトウェア。
- 実際の細部処理には、WindowsのタスクスケジューラやJenkinsなどでPowerShellを使っているが、今回は触れない。

## 環境等

- 外部／内部共にWSUSは、Windows Server 2022 standardにて構築。
- オフライン開発環境内には、Windows 10、Windows Server 2019及び2022、CentOSなどが15台程度。Serverは大半がVMWare上の仮想マシン。
- 以下は参考。
  - Jenkins、RocketChatなどはDockerで運用。
  - 外部WSUSから内部WSUSへのデータの移動にはUSB切替器（ATEN社 US221A）を用い、USB接続SSDを時間により自動的に切り替えて使うこととした。（日中は内部WSUS側に接続し、夜間一定の時間のみ外部WSUS側に接続）

## オフラインWSUSの運用の基本

細部は省略し、以後の理解に必要となるであろう基本的なポイントのみ記述する。

1. インターネットに接続した外部WSUSと、インターネットに接続しない内部WSUSを用意する。
   - 両者のバージョンや、設定は原則として同じとする。
1. 外部WSUSに対して必要な定義ファイルやパッチファイルの承認を行うと、ネットから取り込みが行われる。（下図①②）
1. 外部WSUSの内部情報とネットから取り込まれたファイルの実体を、何らかの手段で内部WSUSに持ち込み同期させる。(下図③)
   - 内部情報は、外部WSUSからwsusutilコマンドを使いexportし、内部WSUSにimportする。
   - ファイルの実体は、単純にWsusContentフォルダを同期させる。
1. 内部WSUSに対して外部WSUSと同様に承認を行うと、端末に対し配信が行われる。（下図④⑤）
   - 外部WSUSに承認したのと同じ定義ファイルやパッチファイルを間違いなく承認する必要がある。

```mermaid
sequenceDiagram
participant PC as 開発端末
participant iw as 内部WSUS
participant ow as 外部WSUS
participant i as インターネット
autonumber
  ow->>ow: 承認
  i->>ow: ネットから取込
  ow-->>iw: 何らかの手段で同期
  iw->>iw: 承認
  iw->>PC: 配信
```

## 基本の夜間自動処理

上記の運用の基本を踏まえ、Windows Defenderの最新定義ファイルを毎日配信する処理を自動化した。

1. 外部WSUSにて定義ファイルのみ自動承認する。（下図①）
   - 承認された定義ファイルが、ネットから取り込まれる。（下図②）
1. USB切替器を自動操作し、外部WSUSからアクセスできるようにする。（下図③開始前）
1. 外部WSUSの情報を、外付SSDに書き出す。（下図③）
   - 外部WSUSのWsusContentフォルダを、ROBOCOPYコマンドで外部SSDにミラーする。
   - 外部WSUSで、wsusutil exportを実行し、外部SSDにmetadata.xml.gzファイルをコピーする。
1. USB切替器を自動操作し、内部WSUSからアクセスできるようにする。（下図④開始前）
1. 外付SSDの情報を、内部WSUSに取り込む。（下図④）
   - 外付SSDのWsusContentフォルダを、ROBOCOPYコマンドで内部WSUSにミラーする。
   - 内部部WSUSで、wsusutil importを実行し、外部SSDのmetadata.xml.gzファイルを取り込む。
1. 内部WSUSにて定義ファイルのみ自動承認する。（下図⑤）
   - 承認された定義ファイルが、端末に配信される。（下図⑥）
1. 実行確認のため、各種情報を開発環境のChatに配信する。（下図⑦）
   - 配信している最新の定義ファイルの日時とバージョン情報。
   - 内部WSUSにて、開発環境に新たに配信が必要と判断されたパッチのタイトルと、内部IDの一覧。

```mermaid
sequenceDiagram
participant PC as 開発端末
participant iw as 内部WSUS
participant s as 外付SSD
participant ow as 外部WSUS
participant i as インターネット
autonumber
  note over ow: 定義ファイルを自動承認
  ow->>ow: 自動承認
  note over ow, i: 承認された定義ファイルをダウンロード
  i->>ow: ネットから取込
  ow->>s: 情報書出
  s->>iw: 情報取込
  iw->>iw: 自動承認
  iw->>PC: 配信
  note over iw: 動作状態や新規パッチ有無を確認
  iw->>PC: Chatで通知
```

## パッチ設定時

上記処理の最後⑦にて新たなパッチが検出された場合Chatに情報が流れるため、開発環境に適用しても問題ないかネットで情報収集を行う。

問題ないと確認できた場合、承認を指示すれば自動的にパッチを取り込み、翌日朝から配信するよう上記処理に仕組みを加えた。（加えたのは下図①～③、及び④の部分であり、それ以外は上記処理のまま）

1. Chatのメッセージから承認するパッチのID一覧をコピーし、Jenkinsのビルドに張り付け実行する。（下図①）
1. 張り付けられたIDを元に、内部WSUSにてパッチを承認する。（下図②）
1. 張り付けられたIDを決められたファイルに記録し、外付SSDに配置する。（下図③）
1. 外付SSDの決められたファイルに記録されたIDを参照し、外部WSUSにてパッチを承認する。（下図④）
   - 承認された定義ファイルが、ネットから取り込まれる。（下図⑤）
1. 以後は定義ファイルを毎日配信する処理に承認されたパッチが含まれ、端末への配信等が行われる。（下図⑥以降）

```mermaid
sequenceDiagram
participant PC as 開発端末
participant j as Jenkins
participant iw as 内部WSUS
participant s as 外付SSD
participant ow as 外部WSUS
participant i as インターネット
autonumber
alt 日中の処理
  PC->>j: パッチ承認指示
  j->>iw: パッチ承認
  j->>s: パッチのID書出
end
alt 夜間の自動処理
  s->>ow: IDで月例パッチ承認
  note over ow, i: 承認されたパッチの実体をダウンロード
  i->>ow: ネットから取込
  ow->>s: 情報書出
  s->>iw: 情報取込
  iw->>PC: 配信
  iw->>PC: Chatで通知
end
```

## まとめ

本記事では運用例としてポイントだけまとめたが、この仕組みにより毎日の定義ファイル配布は完全自動化できた。また、毎月のセキュリティパッチ適用もほとんど自動化でき、労力が軽減した。

ただし、WSUSサーバ及びこれらの仕組みを安定動作させるためには、細かなノウハウやポイントが存在する。

次回以降、いくつか説明したい。

## 参考

色々なサイトなどを参考としたが、普段から主に参考にしているサイトを以下に示す。

https://jpmem.github.io/blog/tags/WSUS/

https://jpmem.github.io/blog/wsus/2022-05-09_01/

https://learn.microsoft.com/ja-jp/windows-server/administration/windows-server-update-services/get-started/windows-server-update-services-wsus