こんにちは!新人のIT担当者や、これからセキュリティの勉強を始めるという開発者の皆さん、日々の業務お疲れ様です。「セキュリティ」って言葉を聞くだけで、なんだか小難しい専門用語がいっぱいで頭が痛くなりそうになりますよね。
でも、大丈夫です!一歩ずつ、身近な例えから紐解いていけば必ず理解できるようになりますよ。
今回は、工場のプラントや電力網といった「OT(制御システム)」の現場で使われているDNP3という通信規格と、そのセキュリティ拡張であるDNP3 Secure Authentication (SA)について、お話ししていきたいと思います。
「えっ、工場やインフラの話なんて自分には関係ないよ…」なんて思っていませんか?
実は、OTの世界と私たちの普段使っているIT・Webの世界は、いまやガッチリ繋がっています。だからこそ、基礎から優しく学んでいきましょう!
—
1. 身近な例えで理解する「DNP3」とセキュリティの盲点
まずは、DNP3がどんなものか、そしてなぜセキュリティが必要なのかを「一軒家の防犯」に例えて考えてみましょう。
昔ながらの「DNP3」は、合鍵を配りまくるご近所付き合い?
DNP3 (Distributed Network Protocol 3) は、発電所や水道局などのインフラ設備で、遠くにあるセンサーやバルブの状態を中央の管理室に伝えたり、動かしたりするための共通言語(プロトコル)です。
このDNP3、実は生まれが結構古いです。昔の制御システムは、「泥棒なんてこの村には入ってこない」という性善説、つまり「工場の中は安全なエリアだから、通信を盗み見られたり変えられたりすることはないはずだ」という前提で作られていました。
これを一軒家に例えると、「玄関の鍵はいつも開きっぱなしで、なんならご近所さん全員に同じ合配ってます」という状態です。
管理室から「水を止めて!」という指令(パケット)が流れてくると、現場のポンプは「あ、管理室からの命令だな」と信じ込んで、そのまま実行してしまいます。もし、途中の電線に悪い人が割り込んで、勝手に「全開で水を流せ!」という偽の命令を流したら……?現場のポンプはそれも素直に聞いてしまうわけです。怖いですよね。
中間者攻撃(Man-in-the-Middle)という名の「偽手紙」
この「途中で悪さをされる状態」を、セキュリティ用語で中間者攻撃と呼びます。
攻撃者は、管理室と現場の間にこっそり割り込みます。管理室が「バルブを閉めろ」と言っているのを盗み聞きし、あるいは「バルブを開けろ」という偽の命令に書き換えて現場に送るのです。
これを防ぐために登場したのが、今回主役の DNP3 Secure Authentication (SA) です。
—
2. DNP3 Secure Authentication (SA) の仕組み
「じゃあ、DNP3 SAってどうやって家を守るの?」と思いますよね。
DNP3 SAは、一言で言うと「通信のたびに、差出人の身分証明と『中身が途中で書き換えられていないこと』をガッチリ確認する仕組み」です。
鍵を開ける前の「合言葉」:Aggressive Mode と 挑戦・応答 (Challenge-Response)
DNP3 SAでは、コマンドを送る前にこんなやり取りをします。
1. 管理室(送信側):「バルブ閉めて!」と頼む前に、まずは現場に「私、管理室の〇〇だけど、今の合言葉を教えて!」と聞きます(これを Challenge と呼びます)。
2. 現場(受信側):「それじゃあ、この新しい合言葉(ランダムな値)を使って、正しい署名を作ってみせてよ」と返します。
3. 管理室:事前にお互いだけが知っている「秘密の鍵(プリシェアードキー)」を使って、その合言葉に対する正しいハンコ(MAC: Message Authentication Code)を作って現場に渡します。
4. 現場:「おっ、バッチリ合言葉の計算があってるね!じゃあ命令を受け付けます!」
この仕組みがあるおかげで、たとえ途中で悪い人が「バルブを開けろ!」という命令を勝手に作って流そうとしても、「正しい秘密の鍵から作られたハンコ(MAC)」を持っていないため、現場の機器は「うそつき!そんな命令は無視だ!」と突っ返すことができるのです。
—
3. レガシーシステム導入の障壁と現実の泥臭い課題
「なんだ、じゃあ今すぐ全ての工場でDNP3 SAを導入すれば完璧じゃないか!」と思いますよね。
しかし、ここからがセキュリティリサーチャーの腕の見せ所、そして現場の泥臭い現実です。
1. 「動いているものは止めるな」の呪縛
制御システム(OT)の最大の鉄則は「可用性(システムが止まらないこと)」です。
例えば、24時間365日動き続けている化学プラントのメインコンピュータに対して、「セキュリティを上げるために、今からシステムを再起動して新しい通信プロトコルを設定しますね」なんて言ったらどうなるでしょう?もし設定ミスで通信が途絶えでもしたら、大惨事になりかねません。そのため、「動いているレガシーシステムに手を加えるのは怖い」という理由で、古いDNP3(暗号化も認証もない状態)のまま何十年も放置されているケースが山のようにあります。
2. 計算能力の限界(リソース不足)
何十年も前に作られた古い現場の端末(RTUやIEDと呼ばれる小さなコンピュータ)は、CPUのパワーもメモリもカツカツです。
そんな非力なデバイスに、複雑な暗号化処理や認証の計算(セキュア・オーセンティケーション)をさせると、処理が追いつかなくて命令の応答が遅れてしまう(レイテンシの悪化)という問題が発生します。電力の送配電網などでミリ秒単位の遅延が命取りになる現場では、これが導入の大きな障壁になります。
—
4. 実務で役立つ!設定のイメージと対策のヒント
それでは、もし皆さんが実際にDNP3の通信機器やゲートウェイの設定を行うことになった場合、どんな点に気を付ければよいのでしょうか。設定ファイルのイメージを少し覗いてみましょう。
実際の産業用ルーターやDNP3マスターステーションの設定では、以下のように「セキュア・アソシエーション(安全な結びつき)」や「キーの更新間隔」を定義します。
# --- DNP3 Outstation (現場の端末側) セキュリティ設定サンプル ---
[SecureAuthentication]
Enabled = true # DNP3 SAを有効化する
SecurityVersion = 5 # 最新のSpec v5 (Athentication v5)を指定
AssociationId = 1 # セキュア・アソシエーションの識別番号
# 鍵の管理に関する設定
MasterUserName = "AdminOperator"# 管理者のユーザー名
PreSharedKey = "0x0123456789ABCDEF0123456789ABCDEF" # 共有秘密鍵(※実際にはもっと複雑で安全に管理されたものを使います)
# 攻撃耐性を高めるためのパラメータ
CriticalFunctionBlocks = [0x02, 0x03, 0x0D] # 認証を厳格に要求する機能コード(書き込みや制御命令)
MaxTimeBeforeKeyUpdate = 3600 # 鍵を自動更新する間隔(秒)。頻繁に変えすぎても負荷になるのでバランスが大事です。
MaxChallengesOutstanding = 5 # 同時に処理する認証チャレンジの最大数
実務でのワンポイントアドバイス
- いきなり本番環境で「Enabled = true」にしない!
まずはテスト環境(Staging環境)で、マスター側とアウトステーション側の鍵がしっかり一致するか、暗号化処理によって通信遅延が許容範囲内に収まるかを徹底的にベンチマークテストしてください。
- 鍵(Pre-Shared Key)のハードコードに気をつける!
コードの中に直接 PreSharedKey = "password123" なんて書くのは絶対にNGです。ハードウェアセキュリティモジュール(HSM)や、安全な秘密情報管理システム(Vaultなど)を使ってライフサイクルを管理しましょう。
—
5. まとめ
いかがでしたでしょうか?
今回は、DNP3 Secure Authenticationの仕組みから、現場ならではの導入の苦労、そして設定のイメージまでを優しく紐解いてみました。
- DNP3 SAは、通信ごとに「合言葉」と「ハンコ」を確認して、中間者攻撃(偽の命令)を防ぐ強力な盾である。
- しかし、「システムを止められない」「古い機器のパワー不足」というレガシー特有の壁が現場にはある。
- だからこそ、影響範囲を慎重に見極めながら、テスト環境での検証と安全な鍵管理をセットで進めることが重要。
セキュリティは一朝一夕には完璧になりませんが、一つひとつの仕組みを理解すれば、確実にシステムを強固にすることができます。
「一歩ずつ、確実に」。日々の開発やインフラ運用の現場で、ぜひこの視点を活かしてみてくださいね!それではまた次回の記事でお会いしましょう!
コメント