Chapter 1. はじめに

 

【訳註:聖書の訳は、日本聖書協会 聖書 新共同訳から引用しました。原文の参照元で ある NIV(New International Version)が改版されていたため、その日本語版 (http://www.gospelcom.net/ibs/bibles/japanese/) は用いませんでした。以下同様です】

知恵ある人はひとりで勇士たちの町に上り その頼みとする砦を落とすこともできる。

 旧約聖書 箴言 21 章 22 節

この文書は Linux および Unix システム上で安全なプログラムを書く際に必要と なる設計や実装について、そのガイドラインを提供します。 この文書の意図する、「安全なプログラム」とは、セキュリティの境界線上に位置し、 そのプログラムとは異なるアクセス権限を持つ接続元からの入力を扱うプログラム です。 そのようなプログラムには、遠隔のデータを見るためのビューアーを使ったものや、 Web アプリケーション(CGI スクリプトを含む)、ネットワーク・サーバ、setuid もしくは setgid してあるプログラムがあります。 この文書では、オペレーティングシステムのカーネル自体の修正は扱いませんが、 これから議論する原則はカーネルに対しても適用できる場合がよくあります。 安全なプログラムをどのように作成するかについて、さまざまな情報源を調べ回った 「教訓」を元に、ガイドラインとして構成し直し、広範に適用できるようにしました (著者の考えも加えています)。 この文書はいくつかの言語、具体的には C や C++、Java、Perl、PHP、Python、TCL、 Ada95 に固有の手引きも記載しています。

この文書は、保証基準やソフトウェア・エンジニアリングの工程、品質保証から 見た取り組みについては触れていません。そのような指標は大切ですが、既に あちこちで議論されています。 テストやピア・レビュー、コンフィギュレーション管理、形式的な各種の方法 がそれに当たります。セキュリティに関連した開発に当たっての保証基準については、 the Common Criteria [CC 1999] や the Systems Security Engineering Capability Maturity Model [SSE-CMM 1999] に記載してあります。 ソフトウェア・エンジニアリングの工程全般については Software Engineering Institute's Capability Maturity Model for Software (SW-CMM) [Paulk 1993a, 1993b] や ISO 12207 [ISO 12207] を参照してください。 高品質なシステムについての国際標準については、ISO 9000 や ISO 9001 [ISO 9000, 9001] を参照してください。

この文書では、ある特定の環境にあるシステムやネットワークを安全に設定する方法 については論じません。安全な設定は、あるプログラムを安全に使用するのに必須で あることは明らかですが、安全に設定することを論じたドキュメントは他にもたくさん あります。 Unix ライクなシステムを安全に設定することについて述べてある書籍には Garfinkel [1996]という素晴らしい作品があります。他にも、Anonymous[1998]というものが あります。 また Web サイトでも情報を得られます。たとえば http://www.unixtools.com/security.html 等です。 Linux システムを安全に設定する情報については、さまざまなドキュメントが利用可能 です。Fenzi[1999] や Seifried[1999]、Wreski[1998]、Swan[2001]、 Anonymous[1999] がそれに当たります。 Geodsoft [2001] では OpenBSD をいかに強固にするかといったことに加えて、 Unix ライクなシステムに役に立つ示唆がたくさんあります。 Linux システム(つまるところ他の Unix ライクなシステムも)をターゲットにして いるなら、Bastille Hardening Systemを調べるのも良いでしょう。このシステムは Linux オペレーティングシステムをより強固で厳重にしようとしています。 さらに Bastille について知りたいなら、 http://www.bastille-linux.org を 見てください。General Public License (GPL) にしたがって自由に利用できます。 Windows 2000 がターゲットなら Cox[2000] を見るのもよいでしょう。 米国国家安全保障局(The U.S. National Security Agency(NSA)) は、セキュリティに 関しての推奨ガイドを http://nsa1.www.conxion.com で整備しています。その中には、「60 Minute Network Security Guide」というもの もあります。

コンピュータを設定するのは、セキュリティ管理の一部にしかすぎません。 セキュリティ管理は広範な内容をカバーしています。ウイルスへの対処方法や どのような組織的なセキュリティ・ポリシが必要で、事業継続計画はどうするのか、と いったこと等を含んでいます。 セキュリティ管理には国際的な基準とガイドラインがあります。 ISO 13335 は全 5 部からなるテクニカル・レポートから構成され、セキュリティ管理 の手引きになっています[ISO 13335]。 また ISO/IEC 17799:2000 では作業標準を定義しています[ISO 17799]。 規定した目的は、「組織にあって、セキュリティ管理を企画、実行し、それを維持 する責任を負う立場の人間に推奨する情報を提供する」ことです(幅広い内容を扱って います。技術文書ではありません)。 興味深いのは ISO/IEC 17799:2000 の意見が分かれているところです。 ベルギーやカナダ、フランス、ドイツ、イタリア、日本、米国は採択に反対しました。 議論についての詳細は、NIST(National Institute of Standards and Technology) の ISO/IEC 17799:2000 FAQ を見てください。 The Commonly Accepted Security Practices & Recommendations (CASPR)( http://www.caspr.org)プロジェクトは、 セキュリティ情報を集約し、誰もが利用できるドキュメントの作成に取り組んでいます (誰もが将来の文書の派生物を入手可能であり続けられるように、GNU FDL ライセンス としました)。

この文書は読者の方がコンピュータのセキュリティ一般や、Unix ライクなシステム 、ネットワーク(特に TCP/IP ベース)、C 言語について理解していることを前提に しています。 この文書には Linux や Unix でセキュリティを維持するのに必要なプログラミング・ モデルの情報があります。 TCP/IP ベースのネットワークや安全なプロトコルを含むプロトコルの動作に ついてさらに知りたいなら、[Murhammer 1998] のような TCP/IP 全般について の資料を調べてください。

この文書は Unix ライクなシステムを全て網羅しています。Linux をはじめ、 さまざまな系列の Unix を含んでいますが、特に Linux に焦点を当て、Linux に特化した情報を提供します。 Windows CE に焦点を当てたところもありますが、実際大部分の項目は特定の オペレーティングシステムに限定されません。 関連した情報でここで触れていない事項があれば、お知らせください。

この文書の原本は、http://www.dwheeler.com/secure-programs にあります。 この文書は Linux Documentation Project (LDP) http://www.linuxdoc.org の一部でも あり、ミラーサイトがいくつか存在しています。ミラーにある LDP のコピーや ディストリビューションにあるものは、原本よりも古いかもしれないので注意して ください。 この文書について意見がいただけると助かりますが、最新版をまず確認してから、 送ってください。

This book is copyright (C) 1999-2001 David A. Wheeler and is covered by the GNU Free Documentation License (GFDL); 詳しくは、Appendix CAppendix D を見て ください。

Chapter 2 それでは Unix や Linux、セキュリティの背景について論じます。 Chapter 3 まず Unix と Linux のセキュリティ・モデル全般について論じています。そのモデルは、 セキュリティに関する属性とプロセスやファイルシステム等の操作について概観します。 そして、この文書の要となる Linux と Unix システム上でアプリケーション開発をするに 当たっての、設計と実装のガイドラインが続きます。 この文章は結論 Chapter 11 で締めくくり、その後に参考文献 一覧と付録がずらっと並びます。

プログラマの観点として重要と考える側面から、設計と実装についてのガイドライン を分類します。 プログラムは入力を受取り、データを処理し、他のリソースを呼び出し、出力を生成 します。Figure 1-1はこれを図で表わしています。 つまり概念上、セキュリティ・ガイドラインはすべてこれらのカテゴリのどれかに当て はまります。 さらに「データ処理」を専門的な話題に分類します。その分野とは、プログラム内部の 構造化への取り組み方(Chapter 6)、バッファオーバー フロー(入力の問題として検討するケースもあります)の回避、言語に固有の情報です。 章の構成は、順序立てて理解しやすいようにしています。 以上の考えにもとづき、このガイドラインの章立ては次のようになります。入力される ものすべてを検証する(Chapter 4)、バッファオーバーフローの回避 (Chapter 5)、プログラムのインタフェースと内部構成を きちんとすること(Chapter 6)、他のリソースを利用する場合は 慎重に(Chapter 7)、情報はえりすぐってフィードバックする (Chapter 8)、言語固有の問題 (Chapter 9)、そして最後にどのように乱数を得るかと いった、専門的な話題(Chapter 10)を扱うこととします。

Figure 1-1. プログラム概念図