COBOLのセキュリティ対策と権限管理!初心者でも安全に運用できるCLIツール設定ガイド
生徒
「COBOLで作ったCLIツールや自動化用の運用スクリプトのセキュリティって、どのように考えたらよいのでしょうか?大切なデータが盗まれたりしないか心配です。」
先生
「とても大切な視点ですね。プログラムの安全性を作るには、権限管理といって、関係のない人が勝手に中身を見たり動かしたりできないように鍵をかける設定が必要になります。」
生徒
「鍵をかけるのですね。パソコン初心者でも理解できるような、セキュリティを高く保つための具体的な工夫や記述方法を教えてください。」
先生
「それでは、誰にどのファイルを見せるかという基本的なルール作りから、安全なプログラムの書き方まで詳しく学んでいきましょう!」
1. 権限管理とセキュリティの基本概念
企業のシステムやお金の計算などで長年使われているCOBOLですが、プログラムをただ動かすだけでなく、悪意のある人や間違った操作からデータを守るための工夫が絶対に欠かせません。この守るための仕組みのことをセキュリティ設定と呼びます。そして、数あるセキュリティ対策の中でも基本となるのが権限管理です。これは、特定のファイルやプログラムに対して「誰が読んでもよいか」「誰が書き換えてよいか」「誰が実行してよいか」を明確に決めて制限をかけることを言います。
パソコン初心者の方に向けて分かりやすく例えると、会社のオフィスと同じです。社長室には鍵がかかっていて限られた人しか入れませんし、重要な書類が入った金庫は特定の社員しか開けることができません。これと全く同じことを、パソコンの中にある文字だけの世界、すなわちCLIツールや、それを自動で動かす運用スクリプトのファイルに対して行っていきます。この仕組みを正しく設定しないと、重要なデータが消えてしまう原因になります。
2. 読み取りと書き込みと実行の三つの権利
パソコンのファイルシステムには、すべてのファイルに対して主に三つの権利が設定されています。一つ目は、ファイルの中身を見る権利である「読み取り権限」です。二つ目は、ファイルの中身を新しく書き換えたり削除したりする権利である「書き込み権限」です。そして三つ目が、プログラムを起動して動作させる権利である「実行権限」になります。これら三つの組み合わせで安全性を保っています。
COBOLで作成した業務プログラムや、それを動かすための台本であるスクリプトは、この三つの権利を厳しく最小限に絞ることが鉄則です。例えば、一般の社員が使うパソコンでは、金額データを書き換えるプログラムの「実行権限」を無くしておけば、間違って起動してデータがおかしくなるトラブルを防ぐことができます。このように、必要のない人には権利を与えないという考え方を最小権限の原則と呼びます。
3. スクリプトの実行権限を確認して制限をかける方法
文字だけでパソコンを操作する画面では、特定の命令を使ってファイルが持っている権利の状態を調べたり、変更したりすることができます。運用スクリプトを実行するには、そのファイルに対して実行するための権利が付与されている必要があります。まずは、初心者の方向けに、どのような命令を使ってファイルの権利を設定するのか、その手順を見ていきましょう。
ファイルを新しく作った直後は、まだ安全のために実行する権利がついていない状態のことがあります。これを動かすために権利を追加する命令を出します。以下のコードは、セキュリティ設定を意識して、指定したスクリプトファイルに対して、自分だけが動かせるように設定を変えるときの画面の文字の入力例です。
# ファイルの詳細な権利状態を確認する命令
ls -l run_cobol_job.sh
# 自分だけに実行する権利を追加して他の人には触らせない設定
chmod 700 run_cobol_job.sh
この命令を打ち込んだ後の画面の表示結果を確認してみましょう。ファイルの左側にあるアルファベットの並びが、現在の権利の状態を表しています。自分だけが読み書きと実行ができる状態になっていることが確認できます。
-rwx------ 1 user group 120 May 21 00:00 run_cobol_job.sh
4. 実行するユーザーの名前を調べて制限するCOBOL記述
ファイル自体の権利を設定するだけでなく、COBOLプログラムの内部でもセキュリティを高める記述を入れることができます。プログラムが起動した瞬間に、「いまこのパソコンを操作しているのは誰か」というユーザーの名前を自動的に調べることができます。もし、あらかじめ許可された管理者以外の名前だった場合は、そこで処理を強制終了させるというガードの仕組みを作ることが可能です。
COBOLでは、パソコンの環境情報を取得するためにACCEPTという命令を使います。この命令を使って、現在ログインしている人の名前をデータを入れる箱である変数に読み込みます。そして、条件によって処理を分けるIF文を使って、名前が正しいかどうかを判定します。これを行うことで、万が一プログラムが他人に盗まれて勝手に実行されそうになっても、内部でブロックすることができます。
IDENTIFICATION DIVISION.
PROGRAM-ID. SECURECHK1.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NAME PIC X(10) VALUE SPACES.
PROCEDURE DIVISION.
DISPLAY "ユーザー確認を行っています。"
ACCEPT USER-NAME FROM ENVIRONMENT "USER"
IF USER-NAME NOT = "ADMINUSER " THEN
DISPLAY "【セキュリティ警告】アクセス権限がありません。"
STOP RUN
END-IF
DISPLAY "認証成功。重要な業務処理を開始します。"
STOP RUN.
もし、許可されていない一般ユーザーの画面でこのプログラムを動かそうとした場合、以下のような実行結果になり、大事な処理が行われる前に安全に停止します。
ユーザー確認を行っています。
【セキュリティ警告】アクセス権限がありません。
5. パスワードや機密データをプログラムに直接書かない工夫
プログラムを作るときに、初心者が一番やってしまいがちな危険な書き方があります。それは、データベースに接続するためのパスワードや、社外に出してはいけない暗号の鍵などを、プログラムの文字の中に直接書き込んでしまうことです。これを専門用語でハードコーディングと呼びます。プログラムの文字は、知識がある人が見れば簡単に中身を読めてしまうため、パスワードを直接書くのは絶対にやめましょう。
正しいセキュリティ対策としては、大切なデータはプログラムの外にある、厳重に鍵をかけた別の設定ファイルに保存しておきます。そして、プログラムが動いたときに、そのファイルを一瞬だけ読み込んで中身を取り出すようにします。COBOLでファイルの内容を一行ずつ読み込むときは、READという命令を使用します。まずは設定ファイル専用の読み込み記述を覚えましょう。
IDENTIFICATION DIVISION.
PROGRAM-ID. SECURECHK2.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT KEY-FILE ASSIGN TO "secret.dat"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD KEY-FILE.
01 KEY-RECORD PIC X(20).
WORKING-STORAGE SECTION.
01 W-SECRET-KEY PIC X(20) VALUE SPACES.
PROCEDURE DIVISION.
OPEN INPUT KEY-FILE
READ KEY-FILE INTO W-SECRET-KEY
CLOSE KEY-FILE
DISPLAY "安全に秘密の鍵を読み込みました。"
STOP RUN.
このプログラムを実行すると、画面にパスワードそのものは表示されず、処理に必要なデータだけが裏側で安全に準備されます。
安全に秘密の鍵を読み込みました。
6. ファイルを開くときの失敗を検知して安全に止める方法
セキュリティの設定を厳しくしていくと、プログラムがデータファイルを開こうとしたときに、「権限がないため開けません」という理由でパソコンから拒否されるようになります。これはセキュリティが正しく働いている証拠なのですが、プログラムがその拒否されたことに気づかずに無理やり処理を続けようとすると、画面がフリーズしたり、おかしな動作を引き起こしたりして危険です。
そこで、COBOLにはファイルを開いた結果が成功したか失敗したかを、数字の合図で受け取る仕組みが用意されています。これをファイルステータスと言います。ファイルを開く命令であるOPENを行った直後に、その数字を確認し、もし権限エラーを意味する数字だった場合は、それ以上進まずに安全に画面にエラーを出して終了するようにプログラムを設計します。
IDENTIFICATION DIVISION.
PROGRAM-ID. SECURECHK3.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT DATA-FILE ASSIGN TO "master.dat"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS W-STATUS.
DATA DIVISION.
FILE SECTION.
FD DATA-FILE.
01 DATA-RECORD PIC X(100).
WORKING-STORAGE SECTION.
01 W-STATUS PIC X(2).
PROCEDURE DIVISION.
OPEN INPUT DATA-FILE
IF W-STATUS = "35" OR W-STATUS = "42" THEN
DISPLAY "【エラー】ファイルのアクセス権限がないか、存在しません。"
STOP RUN
END-IF
DISPLAY "ファイルが正常に開かれました。"
CLOSE DATA-FILE
STOP RUN.
もし権限設定によってファイルの読み込みがブロックされた場合、プログラムは暴走することなく、以下のように親切なメッセージを出して綺麗に終了します。
【エラー】ファイルのアクセス権限がないか、存在しません。
7. 画面に入力された文字の長さをチェックする防御策
CLIツールでは、利用者がキーボードから文字を入力してプログラムに値を渡すことがよくあります。このとき、悪意を持った人が、プログラムが壊れることを狙って、想定よりも遥かに長い文字数を一気に入力してくる攻撃手法があります。これをバッファオーバーフローと呼び、セキュリティの世界では非常に有名な脅威です。これを防ぐのも大切なセキュリティ対策です。
COBOLでは、あらかじめ文字を入れる箱の大きさ(桁数)を厳密に決めて定義します。しかし、定義された大きさを超えるデータが無理やり送り込まれると、隣の箱のデータを破壊してしまうことがあります。そのため、入力された文字の長さを数えたり、おかしな文字が混ざっていないかを検査する命令を使って、処理の前にしっかりと検品を行う必要があります。以下のコードでは、入力データの簡易的な長さ確認をイメージした構造を示しています。
IDENTIFICATION DIVISION.
PROGRAM-ID. SECURECHK4.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 IN-DATA PIC X(10) VALUE SPACES.
01 W-LEN PIC 9(2) VALUE 0.
PROCEDURE DIVISION.
DISPLAY "10文字以内でコードを入力してください。"
ACCEPT IN-DATA
INSPECT IN-DATA TALLYING W-LEN FOR CHARACTERS BEFORE INITIAL SPACE
IF W-LEN = 0 THEN
DISPLAY "【警告】入力されたデータが空っぽです。"
STOP RUN
END-IF
DISPLAY "入力チェック完了。処理を継続します。"
STOP RUN.
何も文字を入れずにエンターキーを押したり、おかしな形式で入力されたりした場合は、最初の検品処理で引っかかるため、安全が保たれます。
10文字以内でコードを入力してください。
【警告】入力されたデータが空っぽです。
8. 定期的な監査とログの保護
ここまでご紹介した権限管理やプログラムの防衛策を導入したら、最後にそれらがずっと正しく動いているかを見守る必要があります。誰がいつどのプログラムを実行したのか、誰がファイルにアクセスしようとして拒否されたのかという履歴を、鍵のかかった安全な別の場所に保管しておきます。このアクセスの履歴のことを監査ログと呼びます。セキュリティの最後の砦です。
この監査ログが書き込まれるファイル自体も、一般のユーザーが勝手に消したり書き換えたりできないように、一番強い権限を持つ管理者だけが触れるように設定しておきます。定期的にこのログを見直すことで、「最近、権限エラーが何度も起きているな。誰かが不正に大切なデータを見ようとしているかもしれない」といった危険の兆候を早期に発見できるようになります。初心者の方も、これらの設定を一つずつ丁寧に行い、安全なシステム運用を目指しましょう。