工場やプラント、ビルなどの自動化を支えるOT(制御システム)の世界では、最近すごい勢いでIT技術との融合が進んでいますよね。「これからはスマート工場だ!」と、現場のセンサーやPLC(プログラマブル論理コントローラー)をネットワークにつないで、遠隔からデータを集めたり操作したりするシステムが増えています。
そんなIoT・OTの世界で、異なる機器やシステム同士が安全に言葉を交わすための「共通語」として、今やなくてはならない存在になっているのが OPC UA(Open Platform Communications Unified Architecture) です。
今回は、このOPC UAが持つ「セキュリティの心臓部」、つまり 署名と暗号化(Sign & Encrypt)の仕組み と、それを支える 証明書管理(信頼のチェーン) について、難しい専門用語の裏側にある「本当の意味」を、身近な防犯のたとえを交えながら一歩ずつ紐解いていきましょう!
—
1. 家の鍵で例える「OPC UAのセキュリティ」の正体
突然ですが、みなさんのご自宅の玄関を思い浮かべてみてください。
夜、家に帰って鍵を閉めますよね。もし、その鍵が「誰でも簡単にコピーできるプラスチックの板」だったらどうでしょう? さらに、ご近所に「あなたの家の合鍵をこっそり作ろうと狙っている泥棒」がウロついていたら……想像するだけでゾッとしますよね。
工場やプラントのネットワークもこれと全く同じです。
「うちは工場の中にあるローカルなネットワークだから、外部からは見えないはず!」なんて油断していませんか? 近年のサイバー攻撃者は、ちょっとしたオフィスのPCを踏み台にして内部ネットワークに侵入し、野ざらしになっているOTデバイスを次々と乗っ取っていくのが常套手段です。
ここで登場するのが、OPC UAが標準で備えている「通信の鍵(セキュリティプロファイル)」です。
- None(セキュリティなし): 玄関の鍵が常に全開で、誰でもウェルカム状態。中身は丸見え、書き換え放題です。
- Sign(署名のみ): 手紙に「自分バッジ(電子署名)」を押すイメージ。中身は読めますが、途中で誰かに改ざんされると「あれ、この封筒あけられたな?」とバレます。
- Sign & Encrypt(署名 + 暗号化): 最高レベルの防犯です。通信内容を金庫に入れて鍵をかけ(暗号化)、さらに本人の署名もつけるので、途中で盗み見られても中身は絶対に見えないし、勝手に書き換えることもできません。
現場のIT担当者や開発者として絶対に覚えておいてほしい鉄則は一つだけ、「実運用の現場では、必ず Sign & Encrypt を選ぶこと」。これだけは譲れない大原則になります。
—
2. 「顔パス」は厳禁!証明書による信頼のチェーン構築
さて、暗号化を有効にすれば通信の盗聴や改ざんは防げますが、ここで一つ厄介な問題が発生します。
「今、話しかけてきているその相手は、本当に信用していい本物の仲間ですか?」
泥棒が巧妙に警察官のコスプレをして「点検です」と家に上がり込もうとするように、ネットワークの世界でも「私は信頼されたサーバーです」「私は正当なクライアントです」と偽る詐欺師(不正な端末)がたくさんいます。
ここで使われるのが デジタル証明書(X.509証明書) です。これは、インターネット上の「身分証明書(パスポート)」だと考えてください。
信頼のチェーン(Chain of Trust)とは?
身分証明書を発行するとき、誰もが適当な紙に「私は本物です」と書いて配っていたら、偽造し放題になってしまいますよね。だからこそ、みんなが絶対に信頼している「お墨付きの親玉(認証局:CA)」が存在します。
OPC UAの世界でも仕組みは同じです。
1. ルート証明書(Root CA): 一番大元にある、絶対に信用できる親の証明書。
2. アプリケーション証明書: 個々のPLCやSCADAサーバーが持つ、子どもの証明書。親(CA)のハンコが押されているので、「この証明書を持っているということは、我がグループの仲間だな」と一目で分かります。
新しく導入したデバイスをシステムに参加させるときは、この証明書をあらかじめお互いの「信頼済みフォルダ(Trusted Store)」に登録し合う作業(=身元確認の儀式)が絶対に必要になります。これをサボると、いくら暗号化をがっちり固めても、知らない偽物とセキュアに通信してしまうというマヌケな事態になってしまうので注意してくださいね。
—
3. 実践!OPC UAサーバー設定の実例とコードのポイント
理屈が分かったところで、次は実務で役立つ設定のイメージを見ていきましょう。
Pythonの代表的なOPC UAライブラリである opcua (または asyncua) を使ったサーバー側のセキュリティ設定例を覗いてみます。
import asyncio
from asyncua import Server, ua
from asyncua.common.security_policies import SecurityPolicyBasic256Sha256
async def main():
# 1. サーバーインスタンスの初期化
server = Server()
await server.init()
# エンドポイント(通信の窓口)の設定
# クライアントはこのURLに向かって接続してきます
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
# アプリケーション情報のURI設定
await server.set_application_uri("urn:example.org:freeopcua:server")
# 2. 証明書と秘密鍵のロード(ここが身分証明書の提示です!)
# 実運用では、自社で発行した安全なPKI(公開鍵基盤)の証明書ファイルを指定します
await server.load_certificate("certificates/server_cert.der")
await server.load_private_key("certificates/server_key.pem")
# 3. セキュリティポリシーの有効化
# 業界標準で推奨されている強力な暗号化アルゴリズムを指定します
server.set_security_policy([
ua.SecurityPolicyType.NoSecurity, # テスト用(本番では絶対に外しましょう!)
ua.SecurityPolicyType.Basic256Sha256_SignAndEncrypt, # ←★これを使います!
])
# 4. 信頼するクライアント証明書の管理ディレクトリを指定
# ここに登録されていないクライアントからの接続は、身分証不携帯として門前払いします
server.set_security_IDs(["Anonymous", "Username"])
# サーバーの起動
async with server:
print("OPC UA セキュアサーバーが起動しました...")
while True:
await asyncio.sleep(1)
if __name__ == "__main__":
asyncio.run(main())
設定における重要なチェックポイント
SecurityPolicyBasic256Sha256_SignAndEncryptの指定: 古いアルゴリズム(例えばBasic128Rsa15など)はすでに脆弱性が指摘されており、現代のサイバー攻撃者にとっては「古い木製の南京錠」のようなものです。必ずより強固なBasic256Sha256以上のプロファイルを選んでください。- 証明書の有効期限切れに要注意: デジタル証明書には必ず「有効期限」があります。これを忘れて放置すると、ある日突然工場全体の通信がプッツリ途絶えるという大インシデント(自爆テロ状態)が発生します。証明書の自動更新や監視の仕組みは、インフラ構築とセットで必ず組み込みましょう。
—
4. 現場の落とし穴:攻撃者が狙う「盲点」
最後に、現場のIT担当者や開発者がやりがちな「危うい落とし穴」について少しだけお話しします。
よくあるのが、「セットアップやデバッグが面倒くさいから、とりあえず NoSecurity(セキュリティなし)のままで動かして、あとで本番稼働する時に直そう」というパターンです。
人間、動くものを見るとついつい安心してそのまま忘れてしまいがちですよね。しかし、この「仮のつもり」が原因で、ランサムウェアに工場全体の制御を乗っ取られる事件が後を絶ちません。
また、自己署名証明書(オレオレ証明書)を適当に作って使い回し、どこの誰が発行したかも分からない状態のまま運用しているケースも危険です。攻撃者が間に割り込んで通信を乗っ取る「中間者攻撃(MitM攻撃)」の格好の餌食になってしまいます。
—
まとめ
OPC UAのセキュリティ設定、いかがでしたでしょうか?
一見すると難しそうな暗号化や証明書の話も、「家の鍵をしっかりかけ、身元確かな人だけを招き入れる」という私たちが普段の生活で当たり前にやっている防犯の基本と全く同じです。
- 通信の暗号化には必ず
Sign & Encryptを選ぶこと。 - お互いの身分証明書(証明書)を正しく管理し、信頼のチェーンを途切れさせないこと。
この2つをしっかりと押さえておけば、サイバー攻撃者にとってあなたのシステムは「攻略するのに手間がかかりすぎる、旨みのない要塞」になります。
安全なOTライフの第一歩として、今日からぜひ、自社のシステムのセキュリティプロファイルを見直してみてくださいね。一歩ずつ、確実に守りを固めていきましょう!
コメント