こんにちは!セキュリティの世界へようこそ。
新人のIT担当者の皆さんや、普段はアプリ開発がメインで「セキュリティはちょっと難しそう…」と感じている一般開発者の皆さん、日々の業務お疲れ様です。
今回は、工場やビルなどの設備を遠隔から動かす「産業用制御システム(SCADA/OT)」の世界で、なぜ今「リモートアクセスゲートウェイへの多要素認証(MFA)の強制」がこれほどまでに叫ばれているのか、その裏側の泥臭い現実と対策を、身近な防犯にたとえながら一緒に紐解いていきましょう!
難しい用語が出てきても、「一歩ずつ対策を学んでいきましょう!」の精神で優しく解説していきますので、リラックスして読んでくださいね。
—
1. 家の鍵を思い出す:なぜ「パスワードだけ」では破られてしまうのか?
皆さんのご自宅の玄関には、しっかりとした鍵がついていますよね。でも、もしその鍵が「世界中の誰でも知っている暗証番号1つ」だけで開いてしまうとしたらどうでしょうか? しかも、その番号を悪い人が総当たりで何百万回も試せるとしたら……怖くて夜も眠れませんよね。
ITの世界でも全く同じことが起きています。工場などの制御システムを保守(メンテナンス)するために、外部のベンダーさんやエンジニアが社外からアクセスするための「リモートアクセスゲートウェイ(VPNや踏み台サーバー)」という入り口が用意されています。
攻撃者たちは、この入り口の「パスワード」を狙っています。
- フィッシングメールで本物の担当者からパスワードを盗み出す
- 使い回しのパスワードをリスト攻撃で破る
パスワード「だけ」の認証は、いわば「名前と合言葉さえ言えば誰でも入れるセキュリティの甘いマンションの自動ドア」のようなものです。これを突破された瞬間、攻撃者はプラントや工場の心臓部に直接アクセスできるパスポートを手に入れてしまうのです。
—
2. 多要素認証(MFA)ってなに? 身近な例えで理解する
そこで登場するのが、今回の主役である「多要素認証(MFA: Multi-Factor Authentication)」です。
MFAを身近な例で説明すると、銀行のATMや、少し厳重なオフィスの入退室ゲートに似ています。
1. 知っている要素(Something you know): パスワードやPINコード
2. 持っている要素(Something you have): スマホの認証アプリに届くワンタイムコードや、物理的なセキュリティキー
3. 生体要素(Something you are): 指紋や顔認証
このうちの「2つ以上」を組み合わせるのがMFAです。たとえ攻撃者が運良くあなたの「パスワード」を盗み出したとしても、あなたの「スマホ(持っている要素)」が手元になければ、絶対に扉を開けることはできません。
制御システム(SCADA)のネットワークにおいて、このMFAを「強制する」ということは、「どんなに偉いベンダーの担当者であっても、例外なく二重のロックを通らなければ工場に入れないようにする」という、極めて強力で当たり前の防衛策なのです。
—
3. 現場でどう設定する? NginxリバースプロキシでのMFA/認証ヘッダーの例
「MFAが大事なのは分かったけれど、具体的にどうやってシステムに組み込むの?」という疑問に答えるため、実務でよく使われるリバースプロキシ(ここではNginx)の設定を例に見てみましょう。
リモートアクセスゲートウェイの手前にIDP(Identity Provider: OktaやAzure ADなど)を配置し、MFAをクリアしたユーザーだけがバックエンドのSCADAシステムに到達できるように、適切な認証ヘッダーを渡す構成が一般的です。
以下の設定サンプルは、認証済みのユーザー情報やセッション情報を安全にバックエンドへ引き渡すための設定例です。
# リモートアクセスゲートウェイ(Nginx)の設定サンプル
server {
listen 443 ssl;
server_name remote-scada.factory.internal;
# 厳格なSSL/TLS設定(古い暗号スイートは排除)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 証明書のパス
ssl_certificate /etc/ssl/certs/scada_gateway.crt;
ssl_certificate_key /etc/ssl/private/scada_gateway.key;
location / {
# 1. 外部の認証基盤(OAuth2/OIDCプロキシ等)へ未認証ユーザーをリダイレクト
# ここでMFA(多要素認証)が強制されます
auth_request /auth_verify;
# 2. 認証成功後に、バックエンドのSCADAサーバーへ転送する
proxy_pass https://backend-scada-plc-controller.local;
# 3. バックエンドへ渡すヘッダー情報の付与
# 誰がアクセスしているかを確実に伝えるためのトレーサビリティ確保
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 認証基盤から渡されたユーザーIDをバックエンドに引き継ぐ
proxy_set_header X-Authenticated-User $upstream_http_x_auth_user;
# MFAが正常に完了していることを示すフラグ(制御系では非常に重要)
proxy_set_header X-MFA-Verified "true";
}
# 内部の認証確認用エンドポイント
location = /auth_verify {
internal;
proxy_pass https://identity-provider.factory.internal/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
}
この設定では、auth_request ディレクティブを使って、ユーザーが事前にMFAを通過しているかを厳しくチェックしています。そして、通過が確認できた場合のみ、X-MFA-Verified "true" という特別なヘッダーを添えて内部のSCADAサーバーへ通す仕組みになっています。
—
4. アクセスログの厳格な監査手順:泥棒が入った痕跡を見逃さない
「鍵をかけたから安心」ではありません。セキュリティのプロは「いつか必ず破られる、あるいは侵入される」という前提で動きます。だからこそ、アクセスログの監査が不可欠です。
インフラ担当者やセキュリティ担当者が日々の運用で確認すべき、泥臭くも重要な監査手順をチェックリスト形式でまとめました。
監査チェックリスト
1. 「誰が・いつ・どこから」入ったかの突合
- 制御システムのメンテナンススケジュールと、VPN/ゲートウェイのログイン履歴が一致しているか確認します。
- 深夜や休日など、誰も作業していないはずの時間帯にアクセスがないか?
2. 多要素認証の「バイパス(すり抜け)」試行がないか
- MFAのプッシュ通知が大量に送りつけられる「MFAファティーグ(疲弊)攻撃」の兆候はないか、認証基盤のエラーログを監視します。
3. アクセス元IPアドレスの異常検知
- 通常は国内の特定の保守ベンダーのIPからしかアクセスがないはずが、突然海外の不審なIPやVPNサービスからアクセスされていないか?
—
5. まとめ:一歩ずつ、確実な防衛を
今回は、産業用制御システム(SCADA)におけるリモートアクセスゲートウェイのMFA強制と、ログ監査の重要性について解説しました。
- パスワードだけの認証は、合言葉だけの簡単な自動ドアと同じ。
- 多要素認証(MFA)を強制することで、たとえパスワードが漏れても不正侵入を防げる。
- リバースプロキシの設定やヘッダーの活用、そして日々の泥臭いログ監査がシステムを守り抜く。
セキュリティ対策に「終わり」はありません。難しく考えすぎず、まずは身の回りの防犯と同じ感覚で「うちは二重の鍵をかけられているか?」を確認することから、一歩ずつ進めていきましょう!
コメント