Main Content

サイバーフィジカル システムでの動的ウォーターマーキングを使用した攻撃の検出

サイバーフィジカル システム (CPS) は、施設内のセンサーおよびアクチュエータとコントローラーの間でデータを送信する通信チャネルで構成されます。これらのチャネルは故障や攻撃の影響を受けやすく、それによって動作が中断または低下したり、そのような閉ループ システムに致命的な障害をもたらすこともあります。

この例では、そのようなネットワーク化された DC マイクログリッド システムへの攻撃を動的ウォーターマーキング [1] を使用して検出する方法を示します。この手法では、安全なコントローラーの指令に励起 (ウォーターマーク) を追加し、観測された信号でウォーターマークの歪みを監視することで攻撃を検出します。

電流コンセンサス制御をもつ DC マイクログリッド モデル

DC マイクログリッド (DCmG) の分散型発電ユニット (DGU) は、ネットワーク化された CPS の物理ノードを表します。電流負荷を複数のユニットで均等に共有するように、中央のコントローラーで各 DGU の基準電圧を調整します。

DCmG.png

プラント モデルとコントローラーのパラメーターの詳細については、分散型ウォーターマーキングを使用した DC マイクログリッドでのリプレイ攻撃の検出を参照してください。

50 マイクロ秒のサンプル時間と 3 秒のシミュレーション期間を使用します。

Ts = 5e-5;
Vin = 100;
Ct = 2.2e-3;
Lt = 1.8e-3;
Rt = 0.2;

Lij = 1.8e-6;
Rij = 0.05;

Vref = 48;
Kp = 0.1;
Ki = 6.15;
Kd = 4.6e-4;
N = 2.56e3;
Tf = 1/N;

電流コントローラーは、個々のノードで負荷電流を共有し、個々の線の容量の比率を維持するように設計されています。最初の DGU の容量が他の 3 つのノードの 2 倍になるように定義します。

K = 150;
Icapacity = [2 1 1 1];

M = ones(4,4);
M(1,1) = -1/Icapacity(1);
M(1,[2 3 4]) = 1/sum(Icapacity([2 3 4]));
M(2,2) = -1/Icapacity(2);
M(2,[1 3 4]) = 1/sum(Icapacity([1 3 4]));
M(3,3) = -1/Icapacity(3);
M(3,[1 2 4]) = 1/sum(Icapacity([1 2 4]));
M(4,4) = -1/Icapacity(4);
M(4,[1 2 3]) = 1/sum(Icapacity([1 2 3]));

負荷電流は Controlled Current Source ブロックを使用して適用され、すべてのノードへの影響を確認できるようにインスタンスごとに変更されます。

ILoadInitial = [5, 5, 5, 5];
ILoadChanged = [2, 4, 1.5, 3];
tLoadChanged = [0.5, 0.75, 1.0, 1.25];

ノミナル条件でのモデルのシミュレーション

ウォーターマーキング、攻撃、および攻撃検出の各サブシステムを有効 (true) または無効 (false) にする変数を設定します。

enableWatermark = false;
enableAttack = false;
enableAttackDetection = false;

モデルをシミュレートして負荷の変化の影響を確認します。いずれの負荷の変化においても、それぞれの DGU の線電流が容量の比率を維持していることがわかります。

modelName = 'DynamicWatermarkingInDCMicroGrid';
open_system(modelName);

simInput = Simulink.SimulationInput(modelName);
out = sim(simInput);

figure;
plot(out.DGU_LineCurrents);
ylim([0 9]);
grid on
legend('DGU1','DGU2','DGU3','DGU3');

モデルの線形化

監視戦略では、閉ループ信号の変化を検出するためにプラント モデルを使用します。linearize (Simulink Control Design)を使用して、定常状態の操作点における DCmG の線形近似を取得します。

findop (Simulink Control Design)を使用して、システムが定常状態になった後の t = 0.3 秒の時点のスナップショットの操作点を取得できます。線形化の操作をサポートするために、Solver Configuration ブロックのサンプルベースのローカル ソルバーは無効にしています。

op = findop(modelName,0.3);

プラントへの入力をコントローラーの出力として定義し、さらに負荷電流の入力を定義します。これは、負荷外乱の変化が攻撃または故障と誤って検出されないようにするために必要です。プラントの出力は各 DGU の線電流です。

io(1) = linio([modelName,'/Current Consensus Controller'],1,'openinput');
io(2) = linio([modelName,'/DC Microgrid/ILoad_1'],1,'openinput');
io(3) = linio([modelName,'/DC Microgrid/ILoad_2'],1,'openinput');
io(4) = linio([modelName,'/DC Microgrid/ILoad_3'],1,'openinput');
io(5) = linio([modelName,'/DC Microgrid/ILoad_4'],1,'openinput');
io(6) = linio([modelName,'/Select line currents'],1,'openoutput');

定義されている解析ポイントと操作点に基づいてプラントを線形化します。攻撃検出戦略で使用するため、オフセットの情報を格納しておきます。

opts = linearizeOptions(StoreOffsets=true,SampleTime=Ts);
[linsys,~,info] = linearize(modelName,io,op,opts);

動的ウォーターマーキング

このモデルでは、コントローラーが各物理ノードとやり取りする電圧指令に対して、ゼロ平均のガウス分布から取得されるランダムな励起信号 e[t] を追加します。コントローラーはセキュリティで保護されているため、この信号は外部のエージェントにはわかりません。励起信号の強度については、閉ループ制御の目的とする操作が変わらないように、電圧レベルに基づいて慎重にモデル化する必要があります。ただし、攻撃とノイズによる外乱を区別するのに十分な高さでなければなりません。

センサー測定値は、信号強度 σe2 の既知の安全なウォーターマーク e[t] と相関関係にあります。センサーが実際の出力を報告するときに満たす必要がある条件は統計検定を使用して確立されます。信号に歪みがあると、測定値の計算されたシーケンスが攻撃の兆候を示すしきい値を超えます。

多入力多出力のプラントの状態を次の状態空間モデルで表現します。

x[t+1]=Ax[t]+B(u[t]+e[t])

ここで、u[t] はコントローラーの指令を表し、e[t] は加えられるウォーターマークです。

[1] で示されているように、この場合の統計検定の定義は次のようになります。

r1=limTinf1Tk=0T-1(x[k+1]-Ax[k]-Bu[k])(x[k+1]-Ax[k]-Bu[k])T=σe2BBT

r2=limTinf1Tk=0T-1ei[k](x[k+1]-Ax[k]-Bu[k])=B.,iσe2

r2"i" 番目のアクチュエータについて生成されます。B.,iB"i" 番目の列を表します。

この例で使用している DCmG のような部分的に観測されるシステムについては、Kalman Filter ブロックを線形化モデル linsys と共に使用して状態ベクトルを推定します。入力および出力の測定値から info に格納されているオフセットの情報を差し引いてから、それらを使用して推定状態と統計検定の出力 r1 および r2 が生成されます。

enableWatermark = true;
watermarkVariance = [1e-6, 1e-6, 1e-6, 1e-6];

攻撃検出

通信チャネルが t = 2 秒に攻撃を受けた時点で、ネットワーク化されたサイバーフィジカル システムにおける DGU のバランスを変更するために線電流の測定値が変更されます。モデル設定は定常状態から始まるように構成されています。

検出の検定 r1r2 では、次元が NxNx 列の信号と Nx 行 1 列の信号がそれぞれ生成されます。ここで、Nx は線形化されたプラント システムの次数です。攻撃が発生したときの検出の応答を観察するために、detectionTest1_StateIndexdetectionTest2_StateIndex で定義された特定のインデックスの信号が抽出されてプロットされます。

enableAttack = true;
tAttack = 2;
IAttack = [1 0 -1 0 1 0 1 0];

enableAttackDetection = true;
actuatorIndex = 1;
detectionTest1_StateIndex = [1 1];
detectionTest2_StateIndex = 1;

simInput = setModelParameter(simInput,'LoadExternalInput','on');
simInput = setModelParameter(simInput,'ExternalInput','getinputstruct(op)');
simInput = setModelParameter(simInput,'LoadInitialState','on');
simInput = setModelParameter(simInput,'InitialState','getstatestruct(op)');

out = sim(simInput);

以下の出力電流のプロットからわかるように、システムが攻撃を受けた時点で DGU 2 の出力が他のユニットを犠牲にして増加しています。

figure;
plot(out.DGU_LineCurrents);
grid on;
legend('DGU1','DGU2','DGU3','DGU4');

検出の検定では 2 つのシーケンスが生成されます。各シーケンスの最初の要素を抽出したものを以下に示します。どちらの検定でも、t = 2 秒にプラント モデルに基づく条件を満たさなくなった時点で攻撃の兆候が示されています。

figure;
plot(out.AttackDetectionTest1);
grid on

figure;
plot(out.AttackDetectionTest2);
grid on

参考文献

[1] B. Satchidanandan and P. R. Kumar, "Dynamic Watermarking: Active Defense of Networked Cyber–Physical Systems," in Proceedings of the IEEE, vol. 105, no. 2, pp. 219-240, Feb. 2017, doi: 10.1109/JPROC.2016.2575064.

参考

(Simscape Electrical) | | (Simulink Control Design)

関連するトピック