PC起動時にNAS接続できない事象の対処

自宅PCのユーザーフォルダ各種(デスクトップなど)はNASに置いています。
ネットワーク周りをいじった後でPCを再起動したところ、「ネットワーク接続の復元」ダイアログが表示されNASへのアクセスができない事象が発生しました。備忘録として対処法を書き残しておきます。

事象

・起動後ログインすると、以下のダイアログが表示される。

ネットワーク接続の復元
[ドライブ文字] を次に接続しようとしてエラーが発生しました
\\hoge\fuga
Microsoft Windows Network: ローカル デバイス名は既に使用されています。

この接続は復元されませんでした

・[OK] を押下して数秒待てばNASに接続されるものの、毎度上記ダイアログが表示される状態。

対処法

・ネットワーク設定を、パブリックネットワークからプライベートネットワークへ変更する

今回は意図的に変えていないのですが、ネットワーク周り(WAN側)の変更を起因としてか自動的にプライベート → パブリック の変更がされていたようでした。

BitLocker適用下のWOL (2) – ロック解除機構を読み解く

ロック解除フロー

ネットワークロック解除機能のエミュレートに先立ち、まずはメッセージフローを理解するところから始めます。一通りのロック解除の流れは、以下のようになります。
なお、文中の用語は下部にまとめておきます。

  1. クライアントは、以下の情報を含むNKPU要求パケットをブロードキャストします。
    ・キープロテクター(KP)
    ・KPの暗号化に使用したX.509証明書の拇印
  2. サーバは、当該要求を処理してよいか、以下の観点で確認します。
    ・(オプション)クライアントIPが、許可IPリストに掲載されているものと一致するか
    ・要求で使用された公開鍵に対応する秘密鍵にアクセス可能か(証明書の拇印を用いる)
  3. サーバは、解除要求を許可する場合、以下のようにNKPU応答パケットを生成し、クライアント向けにユニキャストします。
    ・保有する秘密鍵を用いて、KPを復号する
    ・KPに含まれるクライアント鍵(CK), セッション鍵(SK)を用いてキープロテクターレスポンス(KPR)を生成する
    ・DHCPパケットのオプションにKPRを含める

フローを図示すると、以下のようになります。(公式ドキュメントより引用)

出典:[MS-NKPU]: Network Key Protector Unlock Protocol 1.3.1 Message Flow Figure 1: Network key protector unlock process
用語集
  • ・キープロテクター (KP) : CK並びにSKを、X.509公開鍵(PK)にてPKCS#1 v1.5を用いて暗号化したもの。復号すると64 bytesのデータとなり、前半の32 bytesがCK, 後半の32bytesがSKである。
  • ・クライアント鍵 (CK) : クライアントがKPを用いてサーバに送り、サーバからKPRにて返送されることを期待している鍵。サイズは32 bytes
  • ・セッション鍵 (SK) : KPR生成時に使用する、ランダムに生成された32 bytesの鍵。
  • ・キープロテクターレスポンス (KPR) : CKヘッダ(12 bytes固定値, 0x2C 00 00 00 01 00 00 00 06 20 00 00)並びにCKを、SKにてAES-CCMを用いて暗号化し、得られたMAC(16 bytes)と暗号化データをこの順で並べたもの

パケット仕様

では本題の、NKPUで使用されるパケットの仕様を確認していきます。
仕様書上はIPv6, IPv4双方の定義が掲載されていますが、IPv4のみを紹介・実装することにします。

パケット仕様 (1) ― 共通事項

NKPUパケットは、要求/応答共に RFC2131 で規定されるDHCPパケット仕様に準拠します。NKPUに必要な情報は、すべてオプション領域に格納されます。
以下にDHCPパケット並びにそのオプション部のデータ構造を示します。表には参考まで、NKPU応答時に各フィールドにセットする値を記載しますが、独自研究であることに留意してください。

図1 DHCPパケット構造
フィールド名サイズ [byte]説明応答時の値
op1opコード0x02
htype1ハードウェアアドレス種別0x01
hlen1ハードウェアアドレス長0x06
hops1ホップ数0x00
xid4トランザクションID要求時と同一
secs2経過秒数0x00 00
flags2フラグ0x00 00
ciaddr4クライアントIPアドレス0x00 00 00 00
yiaddr4“あなたの”IPアドレス要求時と同一
siaddr4起動処理に使用されるIPアドレス要求時と同一
giaddr4リレーエージェントのIPアドレス要求時と同一
chaddr16クライアントのHWアドレス要求時と同一
sname64サーバーホスト名要求時と同一
file128ブートファイル名要求時と同一
optionvariableオプションパラメータ別途詳細解説
表1 DHCPパケットの各フィールド説明

図2 DHCPオプション領域構造
フィールド名サイズ [byte]説明
Magic Cookie4オプション部の開始を表す0x63 82 53 63
Option Code1オプションコード可変
Option Len1Option Data の長さ可変
Option Datavariableオプションデータ本体可変
End Code1オプション部の終了を表す0xFF
表2 DHCPオプション領域の各フィールド説明

なお、NKPUで使用されるDHCPオプションは、以下の通りです。

Option Code要求時応答時含まれる情報
43 (0x2B)NKPUデータ
60 (0x3C)固定文字列(ASCII) “BITLOCKER”
125 (0x7D)NKPUデータ
表3 NKPUで使用されるDHCPオプション

パケット仕様 (2) ― NKPU要求時のオプション

(2) ― 1 オプション43仕様

本オプションの第1サブオプションには使用される証明書のフィンガープリントが、第2サブオプションにはキープロテクター(KP)の前半部分が含まれます。データ構造並びに各値(独自研究)は以下のとおりです。

図3 オプション43(要求時)構造
フィールド名サイズ [byte]説明
1st Suboption Code1サブオプション番号0x01
1st Suboption Len1第1サブオプションの長さ0x14
1st Suboption Data20証明書フィンガープリント可変
2nd Suboption Code1サブオプション番号0x02
2nd Suboption Len1第2サブオプションの長さ0x80
2nd Suboption Data128KPの前半128byte可変
表4 オプション43(要求時)の各フィールド説明

(2) ― 2 オプション125仕様

本オプションには、企業識別番号並びにKPの後半部分が含まれます。データ構造並びに各値(独自研究)は以下のとおりです。

図4 オプション125構造
フィールド名サイズ [byte]説明
Enteerprise Number4企業識別番号0x00 00 01 37
Data Len1本フィールド以降の長さ0x82
Suboption Code1サブオプション番号0x01
Suboption Len1サブオプションの長さ0x80
Suboption Data128KPの後半128byte可変
表5 オプション125の各フィールド説明

パケット仕様 (3) ― NKPU応答時のオプション

NKPU応答時は、オプション43(とオプション60)が必要となります。オプション43にはキープロテクターレスポンス(KPR)が含まれ、そのデータ構造並びに各値(独自研究)は以下のとおりです。

図5 オプション43(応答時)構造
フィールド名サイズ [byte]説明
Suboption Code1サブオプション番号0x02
Suboption Len1サブオプションの長さ0x3C
Suboption Data60KPR可変
表6 オプション43(応答時)の各フィールド説明

ここまでで、サーバ側のエミュレートに必要な情報は揃いました。次回はクライアント側の設定について確認していきます。

BitLocker適用下のWOL (1) – 概要と事前準備

はじめに

出先からリモートデスクトップで作業可能なことは、デスクトップPCの利点の一つと言えます。Wake On LAN (WOL)へ対応すれば、必要なタイミングで出先から電源を入れることができ、電気代も最小限に抑えることができるでしょう。
一方で、BitLockerにて起動時のPIN入力を有効化している場合、WOLのみでは暗号化解除ができず、PCを起動させることができません。
今回はWOL送信用のデバイスにて、Windows Serverで使用可能なBitLocker ネットワークロック解除機能をエミュレートし、PIN有りBitLocker環境における遠隔での電源投入を実現します。

システム構成

構成は極めてシンプルです。24/365のデバイス (今回はNASを利用) をサーバ側とし、WOLのMagic PacketとBitLockerネットワークロック解除プロトコル1を扱えるプログラムを置きます。


このプログラムはを実行すると、Magic Packetを送信した後NKPUの受信待ちをします。PCはMagic Packetにより起動した後、NKPUでBitLockerを解除し、無事立ち上がるというわけです。

証明書の用意

まずは使用する証明書を用意します。
幸い Microsoft Learn にて証明書の詳細パラメータが紹介されていますので、これに則って作成しました。
概ね以下のパラメータに気を付ければよさそうです(2023/10時点)。

  • 秘密鍵長:2048bit
  • 署名アルゴリズム:SHA512
  • キー使用法:keyEncipherment
  • 拡張キー使用法:1.3.6.1.4.1.311.67.1.1

参考まで、OpenSSLでの発行手法を載せておきます。

#秘密鍵生成
openssl genrsa -aes512 -passout pass:hogehoge -out BitLocker.key 2048

# 署名要求作成
openssl req -batch -new -key BitLocker.key -out BitLocker.csr -subj "/CN= BitLocker Network Unlock"

# 自己署名
openssl x509 -req -in BitLocker.csr -signkey BitLocker.key -sha512 -days 365 -out BitLocker.crt -extfile Option.txt -outform DER

なお、使用した拡張情報ファイル Option.txt の内容は以下の通りです。

keyUsage = keyEncipherment
extendedKeyUsage = 1.3.6.1.4.1.311.67.1.1
subjectKeyIdentifier = hash

事前準備はこのあたりでおしまいです。
次回以降、NKPUのエミュレートを中心に記載します。