こんにちは!ITインフラやセキュリティの担当になったばかりのみなさん、日々の業務本当にお疲れ様です。
突然ですが、みなさんの会社や現場で使われている「SCADA(スカダ)」や「HMI(ヒューマン・マシン・インターフェース)」って、なんだかすごく難しそうに聞こえますよね。でも、難しく考えすぎないで大丈夫です。HMIは、いわば「工場やプラントの巨大な機械を動かすための、ハイテクなリモコン画面」だと思ってください。
最近は、オフィスにいながら自宅からでも、このリモコン画面を操作したいという要望が増えています。便利になるのはすごく良いことなのですが……ここに「大きな落とし穴」があります。もし、このリモコン画面の入り口がガバガバだったらどうなるでしょうか? そう、悪意を持ったハッカー(泥棒)に、工場の機械を勝手に操られて大事故につながりかねないのです。
今回は、そんなリモコン画面(HMI)を安全にリモート操作するための「鉄壁の守り方」を、身近な防犯にたとえながら一歩ずつ優しく学んでいきましょう!
—
1. 家の鍵にたとえて知る、リモートアクセスの危険性
みなさん、自分の家を留守にするとき、玄関の鍵はちゃんと閉めますよね。では、もし「鍵がついていないどころか、世界中誰でも自由に開け閉めできるガラス戸」がリビングにあったとしたら……怖くて夜も眠れませんよね。
インターネットに直接つながったHMIの画面をそのまま放置するのは、まさにこれと同じ状態です。
「パスワードがかかっているから大丈夫!」と思うかもしれませんが、パスワードだけでは、泥棒がピッキング(総当たり攻撃など)で簡単に開けてしまう可能性があります。
そこで必要になるのが、次の2つの強力な防犯グッズです。
- VPN(仮想専用線):家の周りに「外から見えない頑丈な塀とトンネル」を作るイメージです。インターネットという危険な外の世界から、工場のネットワークをすっぽり隠して安全につなぎます。
- MFA(多要素認証):合言葉(パスワード)に加えて、「スマホに飛んでくるワンタイムコード」や「指紋認証」など、もう一つの鍵を組み合わせる仕組みです。
—
2. 具体的な守りの設定:VPNとMFAを組み合わせよう
それでは実際に、安全なリモートアクセス環境をどうやって作るのか、設定のイメージを見ていきましょう。今回は、現場でよく使われるオープンソースのVPNソフト「OpenVPN」や、WebベースのHMIを守るための設定を例に解説しますね。
① VPNサーバーの設定(目に見えない秘密のトンネル)
まずは、社外から社内ネットワークに入るための「入り口」を一本化します。誰でも入れる表玄関はなくしてしまい、社員専用の秘密の通用口(VPN)だけを用意するわけです。
以下は、安全なVPN接続を許可するための設定ファイルのサンプルです。強力な暗号化アルゴリズムを指定しています。
# OpenVPN サーバー設定のサンプル (server.conf)
# 外部からの怪しい侵入を防ぐため、強力な暗号化方式を指定します
port 1194 # 通信に使隠しポート番号
proto udp # 追跡されにくいUDPを使用
dev tun # トンネルモードを作成
ca ca.crt # 認証局の証明書
cert server.crt # サーバーの証明書
key server.key # サーバーの秘密鍵(絶対に外部に漏らさない!)
dh dh2048.pem # 暗号化の鍵交換を安全に行うためのパラメータ
cipher AES-256-GCM # 最高水準の強力な暗号化方式を指定
auth SHA256 # 改ざん検知のためのハッシュアルゴリズム
keepalive 10 60 # 接続が切れていないか定期的にチェック
persist-key
persist-tun
この設定によって、外の世界(カフェのWi-Fiなど)から通信しても、データの中身は完全に暗号化され、泥棒が見ても「ただの意味不明な文字の羅列」にしか見えなくなります。
② WebベースHMIにおける多要素認証(MFA)の実装
VPNを抜けて社内に入れたとしても、それだけで油断してはいけません。万が一VPNのパスワードが破られたときの「二重の保険」として、HMIのログイン画面でもMFA(多要素認証)を義務付けます。
PHPで作られたシンプルなWebログイン画面に、Google認証アプリなどを使ったワンタイムパスワード(TOTP)を組み込むコードのイメージを見てみましょう。
<?php
// hmi_login.php - セキュアなHMIログイン処理のイメージ
session_start();
require_once 'totp_library.php'; // ワンタイムパスワード検証用のライブラリ
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
$user_token = $_POST['otp_token'] ?? '';
// 1. ユーザーIDとパスワードの基本認証
if (authenticate_user($username, $password)) {
// 2. 登録されている秘密鍵を使って、スマホアプリのワンタイムコードを検証
$secret_key = get_user_totp_secret($username);
if (verify_totp($secret_key, $user_token)) {
// 認証成功!セッションを発行してHMI操作画面へ
$_SESSION['is_authenticated'] = true;
$_SESSION['user'] = $username;
header('Location: /hmi/dashboard.php');
exit;
} else {
// ワンタイムコードが間違っている場合
$error_message = "認証コード(MFA)が正しくありません。";
}
} else {
$error_message = "IDまたはパスワードが間違っています。";
}
?>
このように、「パスワードを知っていること」に加えて、「今手元にあるスマホを持っていること」という2つの条件が揃わないと、絶対にHMIの操作画面には入れない仕組みを作ります。これでセキュリティレベルはグッと跳ね上がります!
—
3. 「入り口を塞いだだけでは不十分?」セッション監視の重要性
さて、無事にVPNとMFAで頑丈な鍵をかけました。これで一安心……と言いたいところですが、セキュリティの世界はそんなに甘くありません。
もし、正規の権限を持っている担当者のパソコンが、マルウェア(ウイルス)に感染して乗っ取られてしまったらどうなるでしょうか? 泥棒は「正しい鍵」を持ったまま、正々堂々とおうちに侵入してきてしまいますよね。
ここで必要になるのが、おうちの中を監視する防犯カメラや警備員のような役割、すなわち「セッション監視」です。
不正操作を防ぐためのリアルタイム監視
HMIの画面を開いた後、以下のような異常な動きがないかをシステム側で常に監視・検知できるようにします。
1. タイムアウトの徹底:操作画面を開いたまま席を外した場合、一定時間(例: 10分)操作がなければ自動的にログアウトさせる。
2. 異常な操作の検知:普段は触らない深夜の時間帯に、急にプラントのバルブを全開にするような危険なコマンドが飛んできた場合、即座に管理者にアラートを飛ばす。
フロントエンド(JavaScript)側での簡単なアイドル検知(放置検知)のコード例を見てみましょう。
// idle_monitor.js - 放置されたセッションを自動切断するスクリプト
let idleTime = 0;
// ユーザーのマウス操作やキーボード入力を検知してタイマーをリセット
window.onload = resetTimer;
window.onmousemove = resetTimer;
window.onkeypress = resetTimer;
function resetTimer() {
idleTime = 0; // 操作があったらタイマーを0に戻す
}
// 1分ごとにチェックを行う
setInterval(timerIncrement, 60000);
function timerIncrement() {
idleTime++;
if (idleTime > 10) { // 10分間何も操作がなかった場合
alert("一定時間操作がなかったため、安全のためログアウトします。");
window.location.href = "/logout.php"; // 強制ログアウト処理へ飛ばす
}
}
こうした細かな気配りの積み重ねが、万が一のインシデント(事故)を防ぐ決定打になるのです。
—
まとめ:一歩ずつ、確実な要塞を作っていこう
今回は、SCADAシステムにおけるHMIのセキュアなリモートアクセスについて、VPN、MFA、そしてセッション監視の重要性を解説しました。
最初は覚えることが多くて大変そうに見えるかもしれませんが、要するにこういうことです。
1. 外からの通信は、秘密のトンネル(VPN)ですっぽり隠す!
2. 入り口では、2つの鍵(MFA)で厳しく本人確認をする!
3. 中に入ってからも、油断せずに見守り(セッション監視)を怠らない!
この基本の「3つのステップ」をしっかりと押さえておけば、あなたも立派なセキュリティの守り手です。ぜひ、日々の開発やインフラ構築の現場で取り入れてみてくださいね。一歩ずつ、安全なシステム環境を作っていきましょう!
コメント