7.1 セキュリティ対策の基本

(1/1)
セキュリティ対策
これは Python に限った話ではないが、ローカルドライブにあるファイルや、Webサイトやクラウドサービスとの入出力を行うプログラムをつくることは、自分の(組織の)資産が悪意のある第三者の目に止まるリスクにつながる。そこで、これら入出力処理を学ぶ前に、セキュリティ対策の基本を押さえておく。

目次

セキュリティ対策の必要性

本章では、ローカルドライブにあるファイルや、Webサイトやクラウドサービスとの入出力について学んでいくのだが、その前にセキュリティ対策の基本を抑えておくことにする。

この段階で初学者向けにセキュリティ対策を学ばせる教科書・参考書は少ないのだが、今日、PC単独で動作するアプリケーションは皆無に近い。DX化の流れの中で、既存のデータを読み込んで効率的に仕事を進めたり、初学者でもクラウドサービスを使ったプログラムを作ってみたいと考えるだろう。
ハッカー・ネットワーク犯罪のイラスト(セキュリティー)
だがしかし、いま触っている自分のパソコンやスマホが他システムとデータのやり取りをはじめた途端、サイバー攻撃に晒されるリスクが発生する。他システムとは、ネットワーク接続しているシステムだけでなく、BluetoothやUSB機器も含まれる。
これまで紹介してきたプログラムで、入出力はキーボードと画面に限定し、ファイル入出力やネットワーク連携を行ってこなかったのは、セキュリティ対策について説明をしていなかったからだ。
唯一、「5.1 組み込み関数とモジュール」でWebサイトから入力するプログラム "getHtmlTags1.py" を作ったが、これは外部ライブラリ BeautifulSouprequests によってセキュリティが保たれているとみなす。

さて、世の中にセキュリティ対策の参考書やコンテンツは星の数ほどあるのだが、大多数が方法論を中心に書かれている。本連載の冒頭に書いたが、学んだ内容は他の言語にも応用できるように、まず、「セキュリティとは何か」について考えてみたい。

セキュリティ対策の目的

財産管理をする後見人のイラスト
セキュリティとは、自分の(組織の)資産を守ること
ここでいう資産とは、換金できる財産や美術工芸品、玩具やコンテンツ(情報資産)などを指す。換金はできないが、人間やペットの生命も財産に含めていいだろう。また、資産を財産権、生命を生存権とみなすと、参政権、社会権、プライバシー権なども資産に含めていいかもしれない。

逆に言えば、「自分の(組織の)資産を守ることがセキュリティ対策の目的」ということになる。

信頼境界

ここで極端な状況を考えてみる――世界中には、あなた1人しかいなかったとする。このとき、あなたの資産を脅かす存在はないわけだから、世界中どこにいても、何もしないでも、セキュリティ対策は担保できていると言える。
戸締りの確認のイラスト(外側)
だが現実の世界には、あなたの資産を脅かす存在が大勢いる。そこで、あなたの資産が安全に保管できる境界線を引く必要が生まれる。
リアル世界であれば、自宅の内側は安全だろう。ドアや窓は常時施錠しており、場合によっては監視カメラを付けているかもしれない。このとき、自宅とその外側の境界線のことを信頼境界と呼ぶ。
セキュリティの目的である「自分の(組織の)資産を守ること」を実行するために、信頼境界への出入りを制限するのがセキュリティ対策の基本だ。
さて、自宅のドアや窓を常時施錠しても、電気・水道・ガス・電話・ネットワーク回線は自由に行き来ができる。電気・水道・ガスを使ったテロの可能性もあるわけだが、ここでは、電話・ネットワーク回線に限って、その信頼境界について考えてみることにしよう。

PCの信頼境界

パソコンのインターフェース
自宅のセキュリティ対策すべてを考えるわけにはいかないので、ここではミニマムモデルとして、あなたのPCに入っている情報資産――自作プログラムを含む――を守ることを目的に置いてみることにする。

あなたのPCが完全にスタンドアロンで、Wi-FiやBluetoothはもちろん、有線LANもUSBポートも何も付いていないとする。この場合の信頼境界は、パソコンの筐体と一致する。
しかし現実には、ノートPCなら Wi-FiBluetooth は標準装備だし、USBポートも付いている。デスクトップPCなら有線LANも付いているだろう。
この場合も、信頼境界はパソコンの筐体と考え、そこにデータが出入りすることができるインターフェースが、自宅のドアに相当する。なので、インターフェースの部分に通過制限を設けることでセキュリティ目的を達成すると考える。

手っ取り早い方法は、Windows Defender や、市販のセキュリティ対策アプリを導入することだ。ファイアウォール機能が付いているブロードバンドルータを導入することも効果がある。
信頼境界
だが、これらのセキュリティ対策アプリ/ハードは、存在が確認されているマルウェアの動きを制限するものであり、あなたが作ったプログラムが異常な動きをしても、それを察知することができないかもしれない。
つまり、データが信頼境界を行き来するプログラムを作るときは、どんなに初学者であっても、本項以降で紹介するセキュリティ対策を怠ってはいけないのである。あなたのPCに悪意をもった第三者の侵入を許す恐れがあるからだ。

セキュリティ対策:入出力バリデーション

作成した Python プログラムがPCの信頼境界をまたいでデータの受渡しをするケースは、大きく2つの分けられる。
  1. ファイル入出力‥‥ローカルドライブ、USBメモリ、ネットワークドライブなど
  2. インターネット上のデータ受渡し‥‥WEBサイト、クラウドサービス、ファイルダウンロードなど
いずれの場合も、ファイルまたはストリームデータの形で、データが信頼境界を行き来するので、考えられるリスクは共通している。それを下表に整理する。
No.原因危害プログラムで対策できるかリスク低減策
1マルウェアファイル/データを盗まれるできないセキュリティ対策ソフトの導入など
2悪意のあるスクリプトファイル/データを盗まれるできる入出力バリデーション
3データが存在しないプログラムが落ちる、ハングアップするできるファイルの存在チェック
4想定外の値プログラムが落ちる、ハングアップするできる入出力バリデーション
5想定外のサイズプログラムが落ちる、ハングアップするできるファイルサイズのチェック
6間違ったファイル/データプログラムが落ちる、ハングアップするできる入出力バリデーション
7想定外のファイル数プログラムが落ちる、ハングアップするある程度はできる同時処理ファイル数を制限
対象ファイルやデータにマルウェア(悪意があるプログラム)が埋め込まれていた場合にはプログラム側ではどうにもならないが(No.1)、悪意のあるPythonプログラムやJavaScript、SQLコマンドといったものが埋め込まれており、プログラムの異常動作を狙っているケース(No.2)は対策が可能である。それ以外のケースでも、入出力時に逐次バリデーションを行うことでリスクを低減できる
No.6の「間違ったファイル/データ」というのは、ユーザー操作で入力ファイルを指定するようなケースである。結果として、No.1~5の危害が発生するリスクがある。間違ってマルウェアを選択してしまった場合にはプログラム側ではどうにもならないが、それ以外はバリデーションを行うことでリスクが低減できる。さらに、ユーザー操作によるファイル選択という場面を減らせば、その分、セキュリティ・リスクは低減できる。

練習問題

次回予告

次回は、Python でテキストファイルやCSVファイルを読み込んで、その内容を画面に表示するプログラムを作る。このときファイルのエンコードを指定する必要がある。あわせて、セキュリティ対策として、「データが存在しない」「想定外のサイズ」「間違ったファイル/データ」対策を盛り込む。

コラム:EPPとEDR

ホームセキュリティのイラスト
トレンドマイクロやマカフィーなど、個人で導入しているセキュリティ対策ソフトの多くは EPP(Endpoint Protection Platform)に分類される製品です。EPP は、「マルウェアによる攻撃を水際で防ぐ」ことを目的としており、シグニチャ(定義ファイル)や機械学習、振舞い解析といった技術を用いてマルウェア攻撃を検出し、分析と修復(削除)を行う。
しかし、ゼロデイアタックなどによりEPPを突破するマルウェアも出てきており、「マルウェア感染後の対応を支援する」ことを目的とした EDR(Endpoint Detection and Response)を導入する企業が増えている。世界各地で多くの基幹システムを停止させてしまった CrowdStrikeは、メジャーなEDR製品の1つだ。
EDR は、ネットワークやエンドポイントのログを監視し、感染してから発症(動作)するまえの間にマルウェアの予兆を検出し、これを封じ込めたり、被害の範囲を最小限に抑え込む。また、情報資産の復旧を支援する。

このように目的が異なる EPPEDR だが、製品によっては両方の機能を兼ね備えているものもある。また、EDR はその目的からして、ファイルの振る舞いを監視しており、必然的に誤検知は避けられない。また、検知結果を人間が評価を下すシーンもあり、専門スキルを求められることも多い(この部分を受託サービスしたり、AIによってフォローするソリューションもある)。導入に際しては EPP よりも綿密な計画と、導入後のフォローアップが欠かせない。
(この項おわり)
header