WindowsのSSHリモートスキャンでファイルサーバに置かれたCabファイルを利用する方法: 閉域網のWindowsの脆弱性管理を効率化

構成図

Windowsの脆弱性管理入門:はじめに

こんにちは、FutureVulsチームの和田です。

FutureVulsでは、Windows環境のセキュリティスキャンに多様なアプローチを提供しています。これらの方法については、「Help > スキャン方法の選択肢と特徴 > Windowsをスキャン」に詳細情報がありますので、ぜひ参照してください。

特に、インターネットやWSUSサーバにアクセスできない環境でWindowsの脆弱性を検出する方法として、「Cabファイルを用いたスキャン」(以下、Cabスキャン)があります。これまで、Cabスキャンを利用する際は、各Windowsに個別にCabファイルを配置する必要がありました。

今回の記事では、脆弱性管理の効率化を一歩進める新しい方法をご紹介します。具体的には、Cabファイルを一か所に集約し、各スキャン対象のWindowにSSHを介したリモートスキャンを行うアプローチです。この手法により、複数のWindowsそれぞれにCabを配置することなく効率的にスキャンすることが可能になります。

なお、今回紹介する機能はv0.24.9以上のLinuxスキャナのみ対応しています。

Cabファイルの基礎知識:Windows更新ファイルの理解

Cabファイルは、Microsoftが提供するWindows Updateのデータを圧縮した形式です。具体的には、wsusscn2.cabというファイルにWindows Updateの履歴がまとめられており、FutureVulsのCabスキャンのスキャン処理ではこのファイルを使用して、Windowsの脆弱性を検知します。wsusscn2.cabファイルは、「Microsoftの公式ダウンロードセンター」から入手可能です。Cabファイルを使用することで、インターネット接続がない環境でもWindowsの最新の脆弱性情報をチェックできます。

WindowsのローカルスキャンでCabファイルを利用する方法の全体像

SSHによるリモートスキャンの前に、Cabファイルをスキャン対象Windows上に配置する「ローカルスキャン」について簡単に説明します。

全体の構成要素と処理フローを図にしました。

構成図

図中の番号の具体的な内容を以下に記載します。

  1. スキャン対象サーバのWindowsにMSのサイトからcabファイルをダウンロード、またはネットワーク内の他のマシンからコピーしておく
  2. WindowsのスケジューラによりVulsスキャナが起動される
  3. VulsスキャナがWindows Update APIを実行する。cabFileのパスとしてローカルのcabfileを指定する
  4. Windows Update APIは指定されたcabfileを用いて未適用なKBの情報を取得する
  5. Windows Update APIがVuls ScannerにKBのリストを返す
  6. FutureVulsに構成情報やKBをUploadする

WindowsのローカルスキャンでCabファイルを利用するための設定方法

まず、FutureVulsスキャナがインストールされたWindowsを用意します。FutureVulsスキャナのインストールについては「Help>Windowsスキャン」を参照してください。

FutureVulsの設定ファイルである、 C:\Program Files\vuls-saas\config.toml を編集し、Cabスキャンを行いたい対象の[server.localhost.Windows]テーブルの下に、

  • serverSelection=3
  • cabPath={Cabファイルのパス}

を指定します。

1
2
3
4
5
6
7
8
9
10
11
~ 略 ~
[servers]
[servers.localhost]
host = "localhost"
port = "local"
[servers.localhost.uuids]
localhost = "xxxx-xxxx-xxxx"
[servers.localhost.windows]
serverSelection = 3
cabPath = "C:\\wsusscn2.cab"
~ 略 ~

設定後、スキャンを実行するとconfig.tomlcabPathで指定したパスのCabファイルを用いてWindowsの脆弱性スキャンが行われます。
詳しい設定手順は「こちら」を参考にしてください。

それでは、いよいよファイルサーバにおかれたCabファイルを用いて、SSHによるリモートスキャンの場合の設定手順について解説します。

WindowsのSSHリモートスキャンでファイルサーバに置かれたCabファイルを利用する方法の全体像

構成要素と全体の処理フローを図にしました。

構成図

図中の番号の具体的な内容を以下に記載します。

  1. ファイルサーバ役のLinuxサーバ上にMSのサイトからcabファイルをダウンロードしておく
  2. LinuxサーバでCronでVulsスキャナが起動される
  3. config.tomlで指定されている複数のWindowsに対してSSH経由でVulsのリモートスキャンが実行され、内部でWindows Update APIが呼ばれる
  4. Windows Updateが実行される。cabFileのパスにファイルサーバ役のLinux上のパスが指定されているのでそのcabファイルを用いてKBの情報を取得する
  5. Windows Updat APIがVuls ScannerにKBのリストを返す
  6. FutureVulsに構成情報やKBをUploadする

WindowsのSSHリモートスキャンでファイルサーバに置かれたCabファイルを利用する方法の検証環境

今回はAWSのEC2インスタンスを利用します。Cabファイルを配置する外部サーバにはLinuxを採用し、「FutureVulsスキャナをセットアップ」します。さらに、スキャン対象のWindowsとのファイル共有のためにSambaを設定しています。この検証環境にて、LinuxからWindowsに対して、SSHを介したリモートCabスキャンの設定について解説します。

構築した環境の概要は次のとおりです。LinuxサーバのIPアドレスは192.0.2.1、WindowsのIPアドレスは192.0.2.2で、Windowsのホスト名はWindowsServerと設定しています。

構成図

Cabファイル配置のためのファイルサーバのセットアップ手順

今回はAWS Systems Managerのセッションマネージャーを介した接続の容易さを考慮し、SSM AgentがプリインストールされているAmazon Linuxイメージを選択しました。SSM AgentがプリインストールされたAMIについての詳細は、AWS公式ドキュメントをご参照ください。また、SSM Agentがインストールされていないイメージを使用する場合は、こちらのガイドに従うことで、手動でのインストールが可能です。

画像

さらに、Sambaサービスが利用する445番ポートを開放するためのAWSセキュリティグループを設定しました。重要なのは、スキャン対象となるWindowsマシンからのアクセスを許可することです。

画像

これらの準備を経て、外部サーバ役のEC2インスタンスを起動しセッションマネージャーを使用してLinuxに接続しました。接続後には以下のコマンドを実行してSambaをインストールします。

1
sudo yum install samba

次に、Sambaで共有するディレクトリを作成します。このディレクトリにwsusscn2.cabを配置します。

1
2
mkdir -p /samba/share
chmod 777 /samba/share

Sambaの設定は/etc/samba/smb.confで設定するため、ファイルの末尾に設定を追加します。

1
2
3
4
5
6
[global]
hosts allow = 192.0.2.2
[share]
path = /samba/share
read only = no
guest ok = yes

設定に問題がないかをtestparmコマンドで確認します。

1
2
3
4
5
6
$ testparm

Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

ここまででSambaの設定は完了したので、設定を有効化するためにsambaを再起動します。

1
2
sudo service smb restart
sudo service nmb restart

WindowsにSSH接続可能にするための設定方法

Windowsのインスタンスを作成し、sshdをインストールして起動します。
一連の設定手順は「こちら」で確認できるため、ここでは割愛します。

FutureVulsスキャナのインストール方法

Linuxサーバに「FutureVulsスキャナをインストール」し、/opt/vuls-saas/config.tomlを編集してスキャン時にWindowsからLinuxファイルサーバ上のwsusscn2.cabを参照するようにします。

設定したSSH接続のための設定を書き込んだ後、
[server.WindowsServer.windows]テーブルの下に、

  • serverSelection=3 # cabファイルスキャンを指定
  • cabPath={wsusscn2.cabのパス} # sambaで公開されたcabファイルパス(Windosから見たパス)

を追加します。

1
2
3
4
5
6
7
8
9
10
~ 略 ~
[servers]
[servers.WindowsServer]
host = "192.0.2.2"
port = "22"
keyPath = "{SSH接続に必要な鍵のパス}"
[servers.WindowsServer.windows]
serverSelection = 3
cabPath = "\\192.0.2.1\share\wsusscn2.cab"
~ 略 ~

config.tomlに指定するcabPath=wsusscn2.cabのパスは、Linux側から参照できるパスではなく、Windows側からSambaを通して参照できるファイルサーバ上のパスであることに注意してください。

以上で必要な設定は完了しました。

スキャンを実行する

Linux上で/opt/vuls-saas/vuls-saas.shを実行してスキャンを行います。
検証のため、スキャン時のログを詳細に確認したい場合は./vuls scan --debugを実行してください。
cabファイルの転送時間やWindows Updateの実行に時間がかかるため、今回の検証環境ではスキャン処理時間はおよそ15分ほどかかりました。

なお、スキャン対象であるWindowsがインターネットに接続されていると、設定ミスなどの問題でconfig.tomlに定義したwsusscn2.cabがWindowsから参照できなかった場合にインターネット上のWindows Updateに接続してしまい、実際にはsambaのCabファイルを参照したスキャンになっていないことがあることにご注意ください。スキャンがすぐに終了した場合は正常なCabスキャンが行われていない可能性があります。

Windowsの脆弱性スキャン時の重要な注意点

Cabスキャンを実行した際にLinuxサーバからWindowsに向けて、wsusscn2.cabがネットワーク転送され、Windows上のディスク領域へ保存されます。
wsusscn2.cabのサイズは小さくないため(01/22時点でおよそ600MB)、スキャン対象のWindowsが増えるとCabファイルの転送に伴うネットワーク帯域への負荷が高まることにご注意ください。
wsusscn2.cabは各Windows上のC:\Windows\SoftwareDistribution\ScanFile\に展開されますが、FutureVulsのスキャン終了時にWindowsから自動で削除されるため、ディスク容量に関してスキャン時に600MB程度が確保されていればディスク容量面では問題ありません。

画像

閉域網内Windowsの脆弱性管理を改善するまとめ

今回は、wsusscn2.cabをスキャン対象のとは別のファイルサーバに配置してスキャンする方法について解説しました。
今回の方法を使うと、wsusscn2.cabを1つのファイルサーバに配置するだけで、インターネットに直接つながらない閉域網に存在する複数のWindowsに対してSSH経由でCabスキャンできるようになります。

また、今回はKBで管理されるソフトウェアの脆弱性についての内容でしたが、FutureVulsには、サードパーティー製ソフトウェアの脆弱性も楽に管理できます。
詳細については「FutureVuls BLog>新機能:FutureVuls、Windowsのサードパーティソフトウェアの脆弱性検知がより楽に」を参照ください。

本記事が閉域網に存在するWindowsの効率的な脆弱性管理に役立てていただけると幸いです。