COBOLの権限管理とセキュリティ対策!バッチ処理の安全を守るポイント
生徒
「COBOLのバッチジョブを実行するとき、誰でもボタンを押して動かせるんですか?」
先生
「いいえ、そんなことをしたら大変です!銀行のシステムなどが誰でも触れたら、お金のデータが書き換えられてしまうかもしれません。」
生徒
「だから権限管理が必要なんですね。どうやって守られているんですか?」
先生
「特定の担当者やプログラムだけがデータに触れるように、『鍵』をかける仕組みがあります。そのセキュリティのポイントを一緒に学びましょう!」
1. 権限管理の基本とは?
コンピュータの世界における権限管理とは、特定のデータやプログラムに対して「誰が」「何をしていいか」を細かく決めておくことです。例えば、銀行員が顧客の住所を確認することはできても、勝手にお金を引き出すことはできない、といった制限のことです。
COBOLのバッチ処理では、大量の個人情報や企業の秘密データを一気に扱います。そのため、プログラムを実行する際、そのプログラムが本当にそのファイルを読み書きして良い正当な権利を持っているかを確認する必要があります。これをアクセス制御と呼びます。プログラミング未経験の方なら、ホテルの従業員がマスターキーを持っていても、勝手にお客様の部屋の金庫は開けられない、というルールをイメージしてください。
2. ジョブ実行ユーザーの識別
バッチ処理を動かすとき、コンピュータは「このジョブは誰が動かそうとしているのか?」をチェックします。このジョブを動かす主体のことを実行ユーザー(または実行アカウント)と呼びます。
個人の名前で動かすこともありますが、多くのシステムでは「バッチ専用のユーザー」を用意します。これにより、「個人の山田さんがファイルを消した」のではなく「夜間バッチプログラムが処理の一環でファイルを消した」ということを明確に区別します。もし問題が起きたとき、誰の権限でその処理が行われたのかを突き止めることは、原因究明の第一歩になります。プログラムの中でユーザー名を判定するイメージのコードを見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-USER.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NAME PIC X(10) VALUE "BATCH-ADM".
PROCEDURE DIVISION.
* 実行しているユーザーが管理者かどうかを確認
IF USER-NAME = "BATCH-ADM"
DISPLAY "管理者権限で実行中です。処理を継続します。"
ELSE
DISPLAY "エラー:権限がありません。"
STOP RUN
END-IF.
STOP RUN.
3. 最小権限の原則
セキュリティの鉄則に最小権限の原則というものがあります。これは、そのプログラムが必要な最低限の権限だけを与える、という考え方です。例えば、データを読み込んで集計するだけのプログラムには「読み取り権限」だけを与え、中身を書き換える「書き込み権限」は与えません。
こうしておくことで、もしプログラムに間違い(バグ)があったとしても、大切なデータが誤って消されてしまう被害を防ぐことができます。何でもできる万能な鍵を渡すのではなく、その扉だけを開けられる専用の鍵を渡すことで、システム全体の安全性を高めているのです。
4. データセットの保護とアクセス権
COBOLで扱うデータのまとまりをデータセット(ファイル)と呼びます。これらには一つひとつに「誰が触れるか」の設定がされています。これを権限設定と言います。
具体的には、「参照(読み取り)」「更新(上書き)」「削除」「実行」といったメニューがあります。バッチジョブの管理では、JCL(ジョブを動かすための設定書)の中に、どのユーザーとして動くかを書き込み、システムがそのユーザーの持ち合わせている鍵と、ファイルの鍵穴が一致するかを瞬時に判断します。パスワードも知らない不審者が勝手にデータを見ようとしても、システムが入り口でシャットアウトしてくれるのです。
5. パスワードと秘密情報の隠匿
バッチ処理の中でデータベースなどに接続する際、パスワードが必要になることがあります。しかし、プログラムの中に直接パスワードを書いてしまうと、そのプログラムを読める人全員にパスワードが漏れてしまいます。これを防ぐために、パスワードを直接書かない(ハードコードしない)工夫が必要です。
実際には、別の厳重に守られた場所からパスワードを読み込んできたり、あらかじめシステムに認証を済ませておいたりする方法を取ります。大切な鍵を、誰でも見える玄関先に置いておくのではなく、隠し金庫の中にしまっておくような配慮が、セキュリティを強固にします。
IDENTIFICATION DIVISION.
PROGRAM-ID. DB-CONNECT.
DATA DIVISION.
WORKING-STORAGE SECTION.
* パスワードを直接書かずに別の場所から受け取る準備
01 DB-PASSWORD PIC X(20) VALUE SPACES.
PROCEDURE DIVISION.
* 本来は外部ファイルやパラメータから安全に取得します
IF DB-PASSWORD = SPACES
DISPLAY "セキュリティ警告:パスワードが設定されていません。"
ELSE
DISPLAY "データベースに安全な方法で接続します。"
END-IF.
STOP RUN.
6. 監査ログ(証跡)の取得
セキュリティにおいて「誰が何をしたか」を記録に残すことを監査ログ(または証跡)と言います。これは監視カメラのような役割を果たします。ジョブがいつ開始され、どのファイルにアクセスし、いつ終わったのかをすべて記録します。
万が一、データが不正に持ち出されたり、壊されたりした疑いがあるとき、このログを調べることで「犯人」や「原因」を突き止めることができます。単なる実行記録ではなく、何かあったときの「証拠」として非常に重みがあるものです。バッチ運用管理者は、このログが改ざんされないように守ることも大切な仕事です。
7. ライブラリへのアクセス制限
プログラムそのものが置いてある場所をライブラリと言います。ここへのアクセス制限も非常に重要です。もし悪意のある人がプログラムの中身を勝手に書き換えて、お金を自分の口座に振り込むような仕組みを忍び込ませたら(バックドアと言います)、大変なことになります。
そのため、本番環境のライブラリに触れる人は極めて限定されており、開発者であっても自由に変更はできません。変更する際は、厳しい審査と承認を経て、専門の担当者が移動作業を行います。プログラムという「工場の設計図」を、勝手に書き換えられないように金庫で守っているイメージです。
8. リモートアクセスとネットワークセキュリティ
最近は、離れた場所からコンピュータを操作するリモートアクセスも増えています。しかし、ネットワークを通じて部外者が侵入してくるリスクも高まります。バッチジョブを実行するコンピュータへの通り道を制限することをネットワークセキュリティと呼びます。
特定の安全な回線からしかアクセスできないようにしたり、通信を暗号化(内容をグチャグチャにして盗み見られないようにすること)したりします。玄関だけでなく、家の周りのフェンスや監視モニターまで含めて守りを固めるような総合的な対策が求められています。
9. 特権ユーザーの厳格な管理
システムの中で何でもできる最強の権限を持つユーザーを特権ユーザー(またはスーパーユーザー)と呼びます。このアカウントは、システムの設定変更や全データの削除までできてしまうため、取り扱いには細心の注意が必要です。
特権ユーザーは普段は使わず、どうしても必要な作業のときだけ一時的に「借りる」という形をとるのが一般的です。また、特権ユーザーが行った作業は、他の誰かが必ず二重チェックする仕組みにしています。権力が一人に集中しすぎないようにする「相互監視」が、セキュリティを維持する知恵なのです。権限の状態をフラグで管理する例を見てみましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. PRIV-MANAGE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PRIV-LEVEL PIC 9(01) VALUE 0.
* 0:一般 1:特別 9:最強
PROCEDURE DIVISION.
DISPLAY "現在の権限レベルを判定します。"
IF PRIV-LEVEL = 9
DISPLAY "【警告】最強権限で動作中です。慎重に!"
ELSE
IF PRIV-LEVEL = 0
DISPLAY "一般権限で動作しています。安全です。"
END-IF
END-IF.
STOP RUN.
10. 継続的なセキュリティ教育と点検
どんなに立派な鍵をつけても、担当者がパスワードを机に貼っていたり、安易なパスワードを使ったりしていては意味がありません。システムを扱う「人間」の意識を高めることが、最後のセキュリティポイントです。
定期的に権限の設定に漏れがないか、不要になった古いユーザーアカウントが残っていないかを点検します。これをセキュリティ監査と言います。COBOLは長年使われるシステムが多いため、昔のルールがそのまま残ってしまっていることがありますが、最新の脅威に合わせてルールをアップデートし続けることが、大切なデータを守り抜く唯一の道なのです。
最後に、定期点検のメッセージを表示するプログラムの例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SECURITY-ANN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CHECK-MSG PIC X(30) VALUE "定期セキュリティ点検完了".
PROCEDURE DIVISION.
DISPLAY "--- セキュリティレポート ---"
DISPLAY CHECK-MSG
DISPLAY "本日もシステムは安全に稼働しています。"
STOP RUN.