2.2 プログラムに免疫を与えるための、オープンポートの検査

プロファイルするべきネットワークサーバデーモンの検索を自動化する方法は、制限なしのツールを使用することです。YaST GUIで、この情報のレポートを参照することができます(説明については4.3.1.1項 「アプリケーション監査レポート」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照)。

コマンドnetstat -nlpを使用してコンピュータの内部から、制限なしのツールはオープンポートを検査し、これらのポートに関連するプログラムを検出し、ロードしたNovell AppArmorプロファイルセットを検査します。その次に制限なしのツールは、各プログラムに関連したNovell AppArmorプロファイルに加えてこれらのプログラムをレポートします。またはプログラムが制限されていなければ「none」をレポートします。

[Note]注意

新しいプロファイルを作成する場合、新しいプロファイルの状態を検出およびレポートするには、制限なしに対しプロファイルされたプログラムを再起動する必要があります。

以下は、制限なしの出力の例です。

2325 /sbin/portmap not confined 
37021 /usr/sbin/sshd2 confined
   by '/usr/sbin/sshd3 (enforce)' 
4040 /usr/sbin/ntpd confined by '/usr/sbin/ntpd (enforce)' 
4373 /usr/lib/postfix/master confined by '/usr/lib/postfix/master (enforce)' 
4505 /usr/sbin/httpd2-prefork confined by '/usr/sbin/httpd2-prefork (enforce)'
5274 /sbin/dhcpcd not confined 
5592 /usr/bin/ssh not confined 
7146 /usr/sbin/cupsd confined by '/usr/sbin/cupsd (complain)'
  
1

最初の部分は番号です。この番号は、リスニングプログラムのプロセスID番号(PID)です。

2

2番目の部分は、リスニングプログラムの絶対パスを表す文字列です。

3

最後の部分では、プログラムを制限するプロファイルが存在する場合、それを示します。

[Note]注意

制限なしにはroot権限が必要で、AppArmorプロファイルにより制限されたシェルから実行するべきではありません。

制限なしでは、ネットワークインタフェースをそれぞれ区別しません。そのため、プロセスが内部のLANインタフェースをリスンしている場合でも、それらを含むすべての制限なしのプロセスをレポートします。

ユーザネットワーククライアントアプリケーションを検索することは、ユーザの設定により決められます。制限なしのツールは、クライアントアプリケーションが開いたネットワークポートを検出しますが、制限なしの分析が行われるときに実行しているクライアントアプリケーションだけが検出されます。ネットワークサービスは常に実行している一方、ネットワーククライアントアプリケーションはユーザが希望するときのみ実行しているため、これは問題となります。

Novell AppArmorプロファイルをユーザネットワーククライアントアプリケーションに適用することもまた、ユーザの設定に依存します。またNovell AppArmorはワークステーション向きよりむしろ、サーバ向きです。そのため、ユーザネットワーククライアントアプリケーションのプロファイリングは、ユーザに実行を委ねます。

積極的にデスクトップアプリケーションを制限するため、制限なしのコマンドはParanoidオプションをサポートしています。このオプションでは、実行中のすべてのプロセス、および対応する、各プロセスに関連するまたは関連しないAppArmorプロファイルをレポートします。その後、制限なしのユーザは、これらの各プログラムにAppArmorプロファイルが必要かどうかを決定します。

新規または修正したプロファイルがある場合は、実施したアプリケーションの動作の使用事例と共に、apparmor-general@forge.novell.comのメーリングリストへ投稿できます。AppArmorチームがそれを調査し、場合によってその内容をopenSUSEに提出します。すべてのプロファイルを含めるという保証はできませんが、エンドユーザの貢献によるセキュリティプロファイルが、できるだけ多くopenSUSEに含まれて出荷されるように努力することをお約束します。

2.2.1 cronジョブへの免疫付与

cronが実行するプログラムを検索するには、ローカルのcron設定を検査する必要があります。残念ながら、cronの設定はかなり複雑で、検査するファイルの量は膨大です。定期的なcronジョブは以下のファイルから実行されます。

/etc/crontab 
/etc/cron.d/* 
/etc/cron.daily/* 
/etc/cron.hourly/*
/etc/cron.monthly/* 
/etc/cron.weekly/*

rootのcronジョブに対して、crontab -eを使用してタスクを編集し、crontab -lを使用してrootのcronタスクを一覧表示できます。これらを行うには、rootである必要があります。

これらのプログラムを見つけたら、[プロファイルの追加ウィザード]を使用して、そのプログラムへのプロファイルを作成できます。詳細については、3.3.1項 「ウィサードを使用してプロファイルを追加する」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

2.2.2 Webアプリケーションへの免疫付与

Webアプリケーションを検索するには、Webサーバの設定を調べる必要があります。Apache Webサーバは自由に設定が可能で、ローカルの設定に応じてWebアプリケーションを多くのディレクトリに保存できます。SUSE Linuxでは、デフォルトでWebアプリケーションを/srv/www/cgi-bin/に保存します。各Webアプリケーションは、Novell AppArmorプロファイルを最大限に持つ必要があります。

これらのプログラムを見つけたら、AppArmorの[プロファイルの追加ウィザード]を使用して、そのプログラムへのプロファイルを作成できます。詳細については、3.3.1項 「ウィサードを使用してプロファイルを追加する」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

2.2.2.1 WebアプリケーションでのCGIプログラムおよびサブプロセスの制限

CGIプログラムはApache Webサーバにより実行されるため、Apache自体へのプロファイルusr.sbin.httpd2-prefork(SUSE Linux上のApache2向け)を変更して、これらの各プログラムに実行権限を追加する必要があります。たとえば、/srv/www/cgi-bin/my_hit_counter.pl rpxという行を追加すると、Perlスクリプトmy_hit_counter.plを実行する権限がApacheに与えられ、my_hit_counter.plへの専用プロファイルが存在することを要求します。my_hit_counter.plに関連する専用プロファイルがない場合、ルールでは/srv/www/cgi-bin/my_hit_counter.pl rixと記述して、my_hit_counter.plusr.sbin.httpd2-preforkプロファイルを継承させます。

Apacheが呼び出すすべてのCGIスクリプトに対して実行権限を設定するのは不便だと感じるユーザも、中にはいるでしょう。代わりに、CGIスクリプトをまとめたものに、管理者が制御されたアクセスを許可することができます。たとえば、/srv/www/cgi-bin/*.{pl,py,pyc} rixという行を追加すると、/srv/www/cgi-bin/内にあり、末尾が.pl であるファイル(Perlスクリプト)、および.pyまたは.pycであるファイル(Pythonスクリプト)すべてを実行する権限が、Apacheに付与されます。上記のように、ルールのixの部分により、PythonスクリプトはApacheプロファイルを継承します。各Pythonスクリプトへの個別のプロファイルを書くことを望まない場合に、これは適しています。

[Note]注意

WebアプリケーションがApacheモジュール(mod_perlおよびmod_php)を扱うときに、サブプロセス制限モジュール(mod-apparmor)が必要な場合、プロファイルを追加する際に、YaSTまたはコマンドラインでChangeHat機能を使用します。サブプロセス制限を活用するには、5.1項 「Apache ChangeHat」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

mod_perlおよびmod_phpを使用するWebアプリケーションをプロファイルするには、多少異なる扱いが必要です。この場合、「program」はApacheプロセス内のモジュールが直接解釈するスクリプトであるため、execは発生しません。代わりに、ApacheのNovell AppArmorバージョンがchange_hat()を呼び出します。このコマンドは、要求したURIの名前と一致するサブプロファイル(「hat」)を指定します。

[Note]注意

Apacheがモジュールスクリプトを探す場所の設定により、スクリプト実行用に表示される名前は、URIと異なる場合があります。Apacheで異なる場所にスクリプトを設置する設定をした場合、Novell AppArmorがアクセス違反へのメッセージを送信するときに、syslogに異なる名前が表示されます。第4章 プロファイルしたアプリケーションの管理 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

mod_perlおよびmod_phpスクリプトにとって、これは要求されたPerlスクリプトまたはPHPページの名前です。たとえば、このサブプロファイルを追加すると、localtime.phpページはシステムのローカルタイムを実行し、アクセスできます。

/usr/sbin/httpd2-prefork^/cgi-bin 
localtime.php { 
/etc/localtime                        r, 
/srv/www/cgi-bin/localtime.php        r, 
/usr/lib/locale/**                    r, 
}

サブプロファイルが定義されていない場合、ApacheのNovell AppArmorバージョンではDEFAULT_URIハットを適用します。サブプロファイルは基本的に、HTML Webページを表示するには十分です。Novell AppArmorがデフォルトで備えているDEFAULT_URIハットは以下です。

/usr/sbin/suexec2 ixr, 
/var/log/apache2/** rwl,
/home/*/public_html/**             r, 
/srv/www/htdocs/**                 r, 
/srv/www/icons/*.{gif,jpg,png}     r, 
/usr/share/apache2/**              r,
    

ApacheがあるWebページおよびCGIスクリプトすべてへの単独のNovell AppArmorプロファイルを希望する場合、DEFAULT_URIサブプロファイルを編集するのはよいアプローチです。

2.2.3 ネットワークエージェントへの免疫付与

プロファイルするべきネットワークサーバデーモンを検索するには、マシン上のオープンポートを検査し、それらのポート上で応答するプログラムを検討し、できるだけ多くのそれらのプログラムにプロファイルを与えます。ネットワークポートがあるプログラムすべてにプロファイルを与える場合、攻撃者はNovell AppArmorプロファイルポリシーを通過しないと、マシン上のファイルシステムにアクセスできません。

nmapのようなスキャナを使用してマシンの外側から、またはnetstatを使用してマシンの内側から、オープンネットワークポート用のサーバを手動でスキャンします。その後マシンを検査して、検出されたオープンポート上で応答しているプログラムを判別します。