【入門編】 HMI(ヒューマンマシンインターフェース)の脆弱性とWebベース攻撃 – IoT・OT(制御システム) & ブロックチェーンセキュリティ防御ガイド

こんにちは!新人のIT担当者や、これからセキュリティの勉強を始めるという開発者の皆さん、日々の業務お疲れ様です。「セキュリティ」と聞くと、なんだか難解な暗号や、映画に出てくるようなハッカーの画面を想像して身構えてしまいますよね。

でも、安心してください。今日は私たちの身近にある「お家と泥棒」の防犯にたとえながら、工場の設備やビルを管理する大切なシステム(HMI)を守る方法を、一歩ずつ優しく紐解いていきたいと思います。

それでは、さっそく扉を開けていきましょう!

—

1. 工場の頭脳「HMI」ってなぁに? お家にたとえてみよう

皆さんは「HMI(ヒューマンマシンインターフェース)」という言葉を聞いたことがありますか?難しそうに聞こえますが、要するに「人間が機械とお話しするための画面」のことです。

例えば、最新のスマートハウスを想像してみてください。リビングの壁に埋め込まれたタッチパネル画面から、お風呂のお湯を溜めたり、エアコンの温度を変えたり、玄関の鍵を閉めたりできますよね。あれがまさにHMIです。

これが工場のプラントやビルの空調管理システムになると、もっとスケールが大きくなります。「今のボイラーの温度は何度か」「水漏れ警報が鳴っていないか」などを、作業員がオフィスのパソコンやタブレットのWebブラウザ(Google ChromeやSafariなど)を通じて確認・操作するわけです。

ここで想像してみてください。もし、その「お家のスマートコントローラー(Web管理画面)」の合鍵が、道端に落ちていたらどうなるでしょうか? あるいは、泥棒が「私は家族です」と書かれた偽物の名札をつけて簡単に家の中に入れてしまったら……。想像するだけでゾッとしますよね。

近年のサイバー攻撃者は、セキュリティが少し甘くなりがちなIoTデバイスや工場のHMIのWeb画面を狙って、日々侵入のチャンスをうかがっています。今日はその代表的な手口である「クロスサイトスクリプティング(XSS)」と、それを防ぐための仕組みを一緒に見ていきましょう。

—

2. 泥棒が忍び込む手口:クロスサイトスクリプティング(XSS)とは?

さて、泥棒(攻撃者)がHMIのWeb画面に侵入する手口の一つに、クロスサイトスクリプティング(通称:XSS)というものがあります。名前はすごくカッコいい(?)ですが、やっていることは古典的です。

お家の郵便受けにたとえてみましょう。

あなたの家の郵便受けには、近所の人からの「回覧板です」というメモや、宅配便の「不在票」が入りますよね。もし、いたずらっ子が、その郵便受けに「この紙に書いてある呪文を声に出して読むと、玄関の鍵が自動で全開になります」という悪意あるメモをこっそり放り込んだとしたらどうでしょう?

何も知らないお父さんが帰宅して、郵便受けからそのメモを取り出し、うっかり声に出して読んでしまった瞬間……ガチャッ!と鍵が開いて、隠れていた泥棒が入り込んできてしまいます。

Webの世界でもこれと全く同じことが起きます。

1. 攻撃者が、HMIの入力フォーム(例えば、作業員が自分の名前や点検メモを残すコメント欄)に、悪意あるプログラム(悪さをするJavaScriptのコード)を書き込んで保存します。
2. 管理者や他の作業員がそのページを開いたとき、システムがその悪意あるコードを「普通のメモ書き」だと勘違いして、そのまま画面に表示して実行してしまいます。
3. その結果、ログインしている人の権限が乗っ取られ、勝手に機械のスイッチを切られたり、パスワードを盗まれたりしてしまいます。

これが、XSSの恐ろしいメカニズムです。

—

3. 泥棒を家に入れない!セキュアなアクセス制御と防御の基本

では、どうすればこの「泥棒の悪質なメモ」や「不正な侵入」を防ぐことができるのでしょうか? 対策は大きく分けて2つあります。

1. 入力されたものを絶対にそのまま信じない(エスケープ処理)
2. ブラウザにお願いして、危険なことが起きないようにガードしてもらう(セキュリティヘッダー)

一歩ずつ、具体的なコードを見ながら確認していきましょう。

対策①:文字を「ただの文字」として扱う(サニタイジングとエスケープ)

先ほどの郵便受けの例で言えば、メモに「玄関の鍵を開けろ」と書いてあっても、それを「あ、これは文字としてのただの落書きだな」とスルーできれば安全ですよね。プログラムの世界でも同じで、ユーザーから受け取った文字を画面に表示するときは、HTMLの特別な意味を持つ記号(< や > など)を別の安全な表現に変換します。

例えば、PHPというプログラミング言語を使って画面に文字を表示する場合、次のように書きます。

<?php
// 【実務で使えるPHPの安全な出力例】
// ユーザーから受け取った入力を、そのまま画面に出してはいけません!
$user_input = '<script>alert("ハッキングされたよ!");</script>';

// htmlspecialchars関数を使って、HTMLタグとして解釈されない「ただの文字列」に変換します
// 特殊文字(<, >, &, ", ')を安全な実体参照に置き換えます
$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

// 安全になった文字列を画面に出力します
echo "<div>作業メモ: " . $safe_output . "</div>";
// ブラウザにはスクリプトとして実行されず、文字としてそのまま表示されます。
?>

このように、ユーザーが入力したデータを画面に出すときは、必ず「ただの文字ですよ」とブラウザに教えてあげる(エスケープ処理をする)ことが、すべての基本になります。

対策②:HTTPヘッダーで強固な「お家の防犯システム」を構築する

プログラム側でいくら気をつけていても、人間が書くコードにはうっかりミス(ヒューマンエラー)がつきものです。「もしエスケープを忘れてしまったらどうしよう……」という不安を解消するために、Webサーバー自体に強力なガードマンを配置する方法があります。それが「HTTPセキュリティヘッダー」の設定です。

今回は、その中でも最強の防犯装置である CSP(Content Security Policy:コンテンツセキュリティポリシー) をご紹介します。

お家にたとえるなら、CSPは「我が家では、リビングで勝手に外部から持ってきた怪しい人形を動かしたり、知らない人と勝手に電話でおしゃべりしたりすることを、すべての部屋で一切禁止します!」という、警察官顔負けの鉄壁のルールブックを玄関に貼り出すようなものです。

実際のWebサーバー(今回はNginxというよく使われるサーバーソフトの例)の設定ファイルを見てみましょう。

# 【NginxでのHTTPセキュリティヘッダー設定例】
# HMIのWeb管理画面を守るための鉄壁のガードマン設定です

server {
    listen 80;
    server_name hmi.local-factory.internal;

    # 1. XSS(クロスサイトスクリプティング)を水際で防ぐCSP(Content-Security-Policy)
    # 「このページの中では、自分のサーバーにあるスクリプトしか実行しちゃダメ!」と厳しく命じます。
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none';" always;

    # 2. ページが勝手に別のサイトの「枠(iframe)」の中に埋め込まれるのを防ぐ(クリックジャッキング対策)
    # 悪意あるサイトの上に、このHMI画面を透明にして重ね合わせる「罠」を防ぎます。
    add_header X-Frame-Options "DENY" always;

    # 3. ブラウザ側の古いXSSフィルターを強制的に有効化する
    add_header X-XSS-Protection "1; mode=block" always;

    # 4. アップロードされたファイルをブラウザが勝手にプログラムとして誤認するのを防ぐ
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        root /var/www/hmi-dashboard;
        index index.html index.php;
    }
}

このように設定しておくと、万が一コードの中にXSSの抜け穴(脆弱性)があったとしても、ブラウザ自身が「おいおい、このスクリプトは外部から読み込まれようとしているから、セキュリティポリシー違反だ!実行をストップしよう!」と、自動で泥棒を捕まえてくれるのです。

—

4. まとめ:日々の泥棒対策と同じように、セキュリティを楽しもう!

いかがでしたでしょうか?
「HMIのWeb管理画面」と言われるとすごく難しそうに感じますが、本質は私たちが普段暮らしているお家の防犯とまったく同じです。

  • 鍵をかけ忘れていないか確認する(認証バイパスの防止)
  • 怪しい郵便物は中身をよく確かめてから開ける(XSS対策・エスケープ処理)
  • 頑丈な防犯カメラや自動ロックを導入する(CSPなどのセキュリティヘッダー設定)

セキュリティ対策は、一度やったら終わりではなく、日々の暮らしの中の「戸締まり」と同じ習慣の積み重ねです。新人エンジニアの皆さんも、ぜひ今日のコードや考え方を実際の開発やインフラ構築の現場で思い出してみてくださいね。

一歩ずつ、確実に安全なシステムを作れるエンジニアを目指して一緒に頑張っていきましょう!

コメント

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