| 無料ホームページスペース無料メールアドレスをご提供します。 KANSAI WEBサービス会員規約 |
| コンピュータ/通信総合サイト・広島の関西商事 管理人:大内 雅司 |
不正侵入への対策
ファイアウォールだけではセキュリティ対策は万全ではありません。ここではサーバー攻撃の代表、ソフトウェアの不具合を衝くバッファ・オーバー・フローっへの対策方法を紹介します。
★ファイアウォールだけでは万全ではない
サーバー運用で最も気を付けなければならないのが不正侵入です。
しかし中には「パーソナル・ファイアウォールを設定しているので不正侵入の危険は無い」と考えている人もいるのではないでしょうか。
確かに、少し考えただけでは、例えばWebサーバーが利用するポート:80番だけを公開しても不正侵入の危険は無いように思えます。
通常Webサーバーはリモート・ログイン用の機能を提供しちませんし、ユーザー名やパスワードなどのアカウント情報も管理していないからです。
■サーバー攻撃の代表的手法
ところが、このようなサーバーであっても「バッファ・オーバーフロー」を発生させる欠陥を持っている場合、これがセキュリティ・ホールとなって不正侵入を許すことがあります。
バッファ・オーバーフローはプログラムの不正動作の1つで、「バッファ」と呼ばれる一時記憶領域があふれる状態を指します。この不正動作が生じるのは、ほとんどの場合入力データの大きさのチェックをしていないか、誤った判断をするプログラム・ミスがあることが原因です。
このような欠陥をかかえるプログラムがあると、リモートから不正なコードを含む大きなデータを送り付けることで、バッファを意図的にあふれさせて、その不正なコードをサーバー上で実行できる可能性が生じます。クラッカーは、これを利用して不正侵入を行うのです。
★不正侵入が可能になる仕組み
なぜバッファがあふれると不正侵入ができるのでしょうか?やや専門的になりますが、危険性の正確な把握や対処を施す上でこの知識が欠かせませんので、説明して行きましょう。
Linuxでのプログラム開発に良く用いられるC言語やC++言語では、一部の変数(バッファ)を「スタック」という特殊な記憶領域に確保します。ところがこの記憶領域には、変数の内容だけでなく、関数の戻りアドレスも記憶されます。戻りアドレスとは、関数が終了した際にどこからプログラムの実行を再開するかを示した情報です。関数終了時にはスタック上のデータで示された場所にあるプログラムが実行されます。
スタック上に確保される変数でバッファ・オーバーフローが生じる可能性があると、条件がそろえば、この戻りアドレスを任意の数値に変えることができます。そうなるとクラッカーの思う壷です。好きなプログラムを送り込んで、これを実行するように戻りアドレスを書き換えれば良いのです。例えば、”/sbin/sh”のようなシェル・プログラムを起動することもできます。
| プログラム領域 | データ領域 | スタック領域 「不正プログラム」 |
このようにしえ起動したプログラムはサーバーと同じ権限で動作します。そのため、サーバー・ソフトウェアを”root権限”で動作させる場合、即座に”root権限”を奪い取られます。
★考えられる対処方法
バッファ・オーバーフローを悪用した不正侵入に対処するのは簡単ではありません。
基本的にプログラムの欠陥で生じるセキュリティ・ホールですから、プログラムを書き換えて処理する必要があるからです。
対処が施された新版が用意されれば、それにアップグレードすれば良いのですが、必ずしも全ての欠陥が修正されているとは限りません。
ユーザー側でできる対処としてはいくつか考えられます。
1.ソフトウェアを常に最新版にアップデートする。
2.バッファ・オーバーフローが生じにくいプログラム言語で開発されたソフトウェアを利用する。
3.バッファ・オーバーフロー発生時にプログラムを停止する仕組みを導入する。
4.SELinuxを利用する。
1ですが、これは目ページで紹介した「yum」を活用することで、簡単に実現できます。
さらにアップデートだけではなく、各種のセキュリティ情報サイトにも目を配ってセキュリティ・ホールの情報をいち早く入手するようにしましょう。
セキュリティ情報を提供するサイトとしては、アメリカの”CERT/CC”(http://www.cert.org/)や日本の”JPCCERT/CC”(http://www.jpcert.or.jp/)などがあります。
2はもっと根本的な対処です。先ほど紹介したように、バッファ・オーバーフローが発生しやすく、また発生した場合の危険が大きいのは、C言語やC++言語を使って開発されたプログラムです。PerlやPHP,Rubyのようなスクリプト言語では一般的にバッファ・オーバーフローの危険は小さくなっています。また、java言語もセキュリティ面で優れた言語の1つです。できるだけこれらの言語で開発されたソフトウェアを利用するようにすれば、不正侵入の恐れは少なくなります。
ただし、Linuxでのサーバー・ソフトウェアは一般にC言語やC++言語で開発されています。javaで開発されたものもありますが、少数に留まります。機能面で折り合いつかなければ、現実的には対処は難しいでしょう。
3の方法を積極的に活用することを推奨します。
特に「Libsafe」といるライブラリは導入が容易で、柔軟な利用ができますのでお勧めです。
「Libsafe」は、C言語やC++言語の標準関数のうち、バッファ・オーバーフローを起こしやすい関数にチェックを付け、バッファのあふれが生じたらプログラムを停止させる働きをするライブラリです。
★Libsafeの利用方法
バッファ・オーバーフローがしょうじやすいのは、C言語やC++言語の標準関数にデータの大きさをチェックせずにバッファにデータを格納するものが多数含まれているためです。
このような関数には、文字列をコピーする”strcpy( )”や、標準入力から文字列を取得する”gets( )”などがあります。
Libsafeでは、これらの危険な関数にバッファあふれのチェック機構を付加した代替関数を提供します。そして、これをLinuxの動的ライブラリ読み込みの仕組みを上手に生かして、実行時にプログラムに利用させれば、セキュリティ・リスクを大幅に低減できます。
■Libsafeを入手
ここからの作業には”root権限”が必要です。もし一般ユーザーでログインしている場合は「su」コマンドを使用して”root権限”を取得するか、一度ログアウトしてから”root”でログインし直しましょう。
Libsafeは開発もとのアメリカAvaya社のWebサイトから入手できます。
Webブラウザを起動してアメリカのAvaya社のサイト「http://www.research.avayalabs.com/project/libsafe/」にアクセスします。
RPMパッケージが公開されていますので、Fedora Coreにインストールします。
2004年11月現在の最新版はバージョン2.0.16で、RPMファイルは「libssafe-2.016.i386.rpm」でした。
これをダウンロードします。
インストールはGNOME端末を起動して、「rpm」コマンドで行います。
| [root@linux ~]# rpm -ivh libsafe-2.0-16.i386.rpm [enter] |
これにより、Libsafeライブラリがインストールされ、”/etc/d.so/preload”ファイルにそのライブラリを読み込むための設定が加えられます。”/etc/d.so/preload”ファイルの設定により、全てのライブラリに先立って「Libsafe」が読み込まれるようになりますので、危険な関数を「Lbsafe」のものに置き換えられるのです。
■Libsafeの動作チェック
実際にlibsafeが利用されているかは、実行ファイルを「ldd」コマンドでチェックしてみれば分かります。
例えば、”/usr/bin/less”コマンドを「ldd」コマンドでチェックすると、次のような出力が得られます。
| [root@linux ~]# ldd /usr/bin/less [enter]
-------->コマンドの実行 /lib/libsafe.so.2 (0xf6ffa000)----->libsafeのライブラリが読み込まれる libncursesw.so.5 => /usr/lib/libncursesw.so.5 (0x00825000) libc.so.6 => /lib/tls/libc.xo.6 (0x006fc000) libdc.so.2 => /lib/libdl.so.2 (0xf6feb000) /lib/ld-linux.so.2 (0x006e3000) [root@linux ~]# |
出力の最初に「/lib/libsafe.so.2(0xf6ffa000)」という行があり、確かに”Libsafe”ライブラリが読み込まれていることが分かります。
”Libsafe”により安全性は比較的に高まりますが、完全な対処ではないという点に注意してください。
代替関数が用意されている関数以外で発生したバッファあふれには対処できませんし、スタック上に配置されたバッファだけにしか効果がないからです。
”Llibsafe”を導入したからといって安心せずに、こまめにソフトウェアをアップデートすることを心がけてください。
★SELinuxとは
バッファ・オーバーフローの対処策として現在有望視されているのが「SELinux」です。「SELinux」とは細かな権限処理をさせることを可能にしたカーネル・ベースで対応させるものです。
バッファ・オーバーフローが危険なのは先に説明したとおり、”root権限”で動作しているプログラムで任意のプログラムを実行出来てしまうということです。
つまり、Webサーバーの「Apache」やメール・サーバーの「Sendmail」などは”root権限”で動作するようになっており、問題を抱えていればシステムを乗っ取られてしまう可能性gあるということです。
そこで、「SELinux」ではそれぞれのアプリケーションを別々の権限で実行し、またその権限からは”root権限”に昇格できないようにしておきます。
こうすることで、もし、「Apache]などに問題があり、不幸なことにその問題を使って侵入されたとしても、Webページなどを改ざんされることがあっても、”root権限”になることはできずシステムを乗っ取られるまでには達しません。つまり、被害を最小限に抑えることができます。
Fedora Coreでは、インストール時の設定で「SELinux」を有効にすることが可能です。「ファイアーウォールの設定」のところで、「SELinuxを有効にしますか」を「アクティブ」にすることで有効になります。
またインストール後であっても、セキュリティレベルの設定を変更することによって有効にできます。「アプリケーション・メニュー」から「システム設定」→「セキュリティレベル」を選択して起動する「セキュリティレベルの設定」ダイアログで設定します。「SELinux」たぶの「有効になりました」にチェックを入れ、「OK」ボタンをクリックして設定し、システムを再起動すると「SELinux」が有効になります。
ただし、「SELinux」は運用に高度な知識が必要になります。「SELinux」を有効化したことにより、今まで正常に動いていた機能が動かなくなった、ということがおこる可能性があります。
ですので始めてFedora Coreを使う場合などには、「SELinux」を適用しない方が無難です。
| ○SELinux入手先 http://www.nsa.gov/selinux/index.cfm 本家サイト(英語) http://www.selinux.gr.jp/ SELinux.jp(日本語) |
| copy right kansai-syoji,.co all right reserved Web-Master masashi ouchi http://kansai.homelinux.com/~Linux |