【入門編】 ブロックチェーンを用いたPLCロジックの改ざん検知システム – IoT・OT(制御システム) & ブロックチェーンセキュリティ防御ガイド

こんにちは!新人のIT担当者や、これからセキュリティの勉強を始めるという開発者の皆さん、日々の業務お疲れ様です。「セキュリティ」や「ブロックチェーン」って聞くだけで、なんだか難しそうな壁を感じてしまいますよね。

でも、安心してください!今日は身近な「家の鍵と防犯」に例えながら、工場やインフラを支える「PLC(制御用コンピューター)」を守る最新の仕組みについて、一歩ずつ優しく紐解いていきたいと思います。

それでは、ワクワクするセキュリティの冒険に出発しましょう!

—

1. 工場を動かす「PLC」ってなぁに? そして何が怖いの?

皆さんは「PLC(Programmable Logic Controller)」という言葉を聞いたことがありますか? これは、自動車工場でロボットを動かしたり、水処理施設でバルブを開け閉めしたりする、いわば「産業用の超頑丈な頭脳」です。

ここに泥棒(サイバー攻撃者)が侵入し、中のプログラム(ロジック)をこっそり書き換えてしまったらどうなるでしょう?
例えば、「プールの水をせき止める」はずのプログラムが「全開にする」に書き換えられたら……大惨事ですよね。

家の鍵に例えてみよう

これは、あなたの家の鍵がいつの間にか「合鍵」にすり替えられているようなものです。しかも、泥棒は鍵の見た目を全く同じにしておくので、普通にドアを開けようとしても、中身が変わっていることに気づけません。

この「プログラムのコソコソとした書き換え(改ざん)」を、どうにかしてリアルタイムで見破る方法はないものでしょうか?

—

2. 救世主「ブロックチェーン」の登場!

ここで登場するのが、仮想通貨などで有名な「ブロックチェーン」です。
「なんだか難しそう……」と思いましたよね? 大丈夫です。ブロックチェーンの本質は、一言で言うと「絶対に書き換えができない、みんなで見張るデジタル日記帳」です。

「合鍵」を見破る「指紋(ハッシュ値)」の仕組み

ブロックチェーンそのものにプログラムの全データを保存するのは重すぎるので、私たちは「ハッシュ値(要するにデータの指紋)」というものを使います。

  • 元のプログラム:if (temperature > 100) { alarm(); }
  • このプログラムの「指紋」:a1b2c3d4e5f6... (長さが一定の文字列になります)

この指紋は、プログラムの文字をたった1文字(スペースを消すだけでも)変えただけで、ガラリと全く別の文字列に変わってしまいます。つまり、「指紋が一致していれば、プログラムは1ミリも改ざんされていない」と一目で証明できるわけです。

この指紋をプライベートブロックチェーン(社内や工場内だけで共有する安全な日記帳)に毎秒記録し続けることで、「あ! 今、誰かが勝手にPLCのプログラムをいじったぞ!」とリアルタイムで検知できる仕組みを作るのです。

—

3. 実装してみよう!PLC改ざん検知システム

それでは、実際にこの仕組みを動かすためのイメージをコードで見ていきましょう。今回は、Node.jsという環境を使って、PLCの現在のプログラムの指紋を計算し、ブロックチェーン風の台帳に記録する簡単なスクリプトを作ってみます。

難しい専門用語はなるべく噛み砕いてコメントを入れているので、雰囲気を掴んでみてくださいね。

const crypto = require('crypto');

// 【模擬PLC】いま現在、PLCの中で動いているプログラムのデータ(文字列)
let currentPlcProgram = "function controlValve() { open = true; }";

/**
 * データの「指紋(ハッシュ値)」を計算する関数
 * @param {string} data - PLCのプログラムデータ
 * @returns {string} - 生成された指紋(64桁の文字列)
 */
function calculateFingerprint(data) {
    return crypto.createHash('sha256').update(data).digest('hex');
}

// 【プライベートブロックチェーン(簡易版)】
// 過去に記録された「安全な指紋の歴史」を保存する配列
const blockchainLedger = [];

/**
 * ブロックチェーンに新しい指紋を記録する関数
 * @param {string} programData - 記録するプログラム
 */
function recordToBlockchain(programData) {
    // 1. プログラムの指紋を計算する
    const fingerprint = calculateFingerprint(programData);
    
    // 2. ブロック(記録のひとかたまり)を作る
    const newBlock = {
        timestamp: new Date().toISOString(), // 記録した時間
        programHash: fingerprint,            // プログラムの指紋
        status: "正常稼働中"
    };

    // 3. ブロックチェーン(日記帳)の末尾に追加する
    blockchainLedger.push(newBlock);
    console.log(`[ブロックチェーン記録完了] 時刻: ${newBlock.timestamp} | 指紋: ${fingerprint.substring(0, 10)}...`);
}

// --- ここからシミュレーション開始 ---

console.log("--- システム起動:正常な状態を記録します ---");
recordToBlockchain(currentPlcProgram);

// しばらく平和な時間が流れる...

console.log("\n--- (事件発生!)夜中に何者かがPLCのプログラムをこっそり書き換えた! ---");
// 攻撃者がこっそり「open = false;」に書き換えたとします
currentPlcProgram = "function controlValve() { open = false; }";

// 定期チェックのタイミング
console.log("\n--- 【リアルタイム監視】現在のPLCの状態をチェックします ---");
const currentFingerprint = calculateFingerprint(currentPlcProgram);
const lastValidBlock = blockchainLedger[blockchainLedger.length - 1];

console.log(`ブロックチェーン上の指紋: ${lastValidBlock.programHash}`);
console.log(`いまのPLCの指紋      : ${currentFingerprint}`);

// 比較チェック!
if (currentFingerprint === lastValidBlock.programHash) {
    console.log("判定: 安全です。プログラムに異常はありません。");
} else {
    console.error("【警告アラート】🚨 警報発令!PLCのプログラムが誰かに書き換えられています!即座にシステムを遮断してください!");
}

—

4. 現場で使えるパラメーター設定と運用のコツ

実際にこのシステムを工場の現場(OT環境)に導入する際、気をつけるべきポイントをいくつか挙げておきますね。現場のインフラ構築の参考にしてください。

① チェック間隔(ポーリング間隔)の調整

  • 推奨設定: 5秒〜10秒に1回
  • 解説: あまりに頻繁にPLCへアクセスしすぎると、PLC自体のCPUに負荷がかかってしまい、肝心の制御遅延を引き起こす原因になります。逆に長すぎると、攻撃されてから検知するまでにタイムラグが生まれるため、ネットワークの負荷とセキュリティのバランスを見極めましょう。

② ネットワークの分離

  • ブロックチェーンのノード(台帳を共有するサーバー)や検証用スクリプトは、インターネットから完全に切り離された「エアギャップ(閉域網)」の中に配置してください。外からアクセスできる状態にしておくと、ブロックチェーン自体が攻撃のターゲットになってしまいます。

—

5. おわりに:一歩ずつ、安全な未来へ

今回は「ブロックチェーンを用いたPLCロジックの改ざん検知システム」について、家の鍵や指紋の例えを交えながら解説しましたがいかがでしたでしょうか?

「ブロックチェーン」や「SCADA」と聞くと身構えてしまいますが、やっている本質は「大切なものの『指紋』をみんなで記録して、変わっていないかマメに確認する」という、とてもシンプルでアナログな防犯の知恵のデジタル版です。

セキュリティの道は一日にして成らず。まずはこういった仕組みのアイデアを頭の片隅に置き、日々の業務で「もしここに攻撃者が来たらどう守る?」という視点を少しずつ持ってみてくださいね。

皆さんのエンジニアライフが、安全でワクワクするものでありますように!それではまた次の記事でお会いしましょう!

コメント

タイトルとURLをコピーしました