たいていの場合、セキュリティーを強化するためには複数の保護手段を講じるのが効果的です (「多層防御」とも呼ばれます)。複数の保護手段があれば、1 つの手段が侵害されたとしても他の手段がまだ効力があるため、さらなる侵入を防ぐことができます。この記事では、セキュリティー・ストラテジーにもう 1 つの防御層を加える方法を説明します。その方法では、PAM を使って誰もが書き込みできる共有ディレクトリーを多重インスタンス化します。つまり、/tmp などのディレクトリーをユーザーごとに新しくインスタンス化するのです。
Russell Coker が「Polyinstantiation of directories in an SE Linux system」(「参考文献」を参照) のなかで説明しているように、全ユーザーが書き込み権限を持つディレクトリーを多重インスタンス化すると、以下のタイプの攻撃を防ぐことができます。
- シンボリック・リンクによって競合状態に陥らせるという攻撃
- 機密情報あるいはアタッカーに有益であると考えられるファイル名の公開
- ユーザー間での攻撃
- ユーザーによるデーモンへの攻撃
- root 以外のデーモンによるユーザーへの攻撃
ただし、多重インスタンス化をしても以下のタイプの攻撃を防ぐことにはなりません。
- root デーモンによるユーザーへの攻撃
- root (アカウントまたは拡大した特権) によるユーザーへの攻撃
PAM は、ログイン時に /tmp ディレクトリーを個人用に多重インスタンス化してシステム・インスタンス・ディレクトリー内に作成しますが、このリダイレクトはログインしているユーザーにはわかりません。ユーザーは標準 /tmp ディレクトリーを見て、いつも通りに読み取り/書き込み操作を行うことができます。ただし、他のユーザー (root ユーザーを含む) の /tmp 空間や、実際の /tmp ファイルシステムを見ることはできません。
多重インスタンス化されたユーザー・ディレクトリーは、root ユーザーに対しては隠されることも、保護されることもありません。そのレベルでの保護が必要な場合に役立つのは、SELinux です。しかしこの記事で紹介する構成例は、SELinux が使用可能であるか否かに関わらず機能します。SELinux の使用方法についての詳細は、「参考文献」で紹介しているリンクを参照してください。
このセクションでは、システムのユーザーに対して /tmp および /var/tmp ディレクトリーの多重インスタンス化を有効にする方法を説明します。また、X Windows やグラフィカル・ディスプレイ・マネージャーを収容するために必要なオプションの構成手順についても説明します。この記事を作成するにあたって私が使用したのは RHEL 5.1 (Red Hat Enterprise Linux 5.1) ですが、pam_namespace モジュールが含まれる Linux ディストリビューションであれば、どのディストリビューションでもここで説明する手順を試すことができます。
まず始めに取り掛かるのは、namespace.conf の編集です。
最初に編集するファイルは、pam_namespace モジュールを制御する /etc/security/namespace.conf です。このファイルに、ログイン時に PAM によって多重インスタンス化を行うディレクトリーを記載します。PAM に付属のファイルには、いくつかのサンプル・ディレクトリーがコメント・アウトされた状態でリストアップされています。namespace.conf に関するマニュアル・ページを表示するには、man namespace.conf と入力してください。namespace.conf における各行の構文は、polydir instance_prefix method list_of_uids です。
この構文の各変数の内容について、以下に要約します。
-
polydirは、多重インスタンス化するディレクトリーの絶対パス名です。 -
instance_prefixは、新しく多重インスタンス化されるユーザー・ディレクトリーの基本ディレクトリーです。 -
methodは、user、level、または context にすることができます。 -
list_of_uidsは、PAM がディレクトリーの多重インスタンス化の対象としないユーザー名のリストです。
この例では SELinux を使用しないので、method には user を指定してください。必要に応じて、構成ファイル内では $USER および $HOME 変数を使用することができます。
リスト 1 では、root と adm を除くシステム・ユーザーのそれぞれに対して、専用の /tmp および /var/tmp 名前空間インスタンスを作成します。
リスト 1. /etc/security/namespace.conf
#$HOME $HOME/$USER.inst/ user root,adm
/tmp /tmp/tmp-inst/ user root,adm
/var/tmp /var/tmp/tmp-inst/ user root,adm
|
/tmp および /var/tmp ディレクトリーは別々のファイルシステム上に配置する必要はなく、同じ 1 つのファイルシステム上のディレクトリーにすることができます。多重インスタンス化を機能させるには、ファイル・モードを 000 にして /tmp/tmp-inst ディレクトリーと /var/tmp/tmp-inst ディレクトリーをいったん手動で作成しなければなりません。これらのディレクトリーが正しく作成されていないと、ログインは失敗します。
root ユーザーとしてログインする際に、以下のコマンドを実行してこれらのディレクトリーを作成してください。
# mkdir /tmp/tmp-inst # mkdir /var/tmp/tmp-inst # chown root:root /tmp/tmp-inst /var/tmp/tmp-inst # chmod 000 /tmp/tmp-inst /var/tmp/tmp-inst |
次に、ログイン時にコンソールおよびセキュア・シェルから実行する必須モジュールのリストに pam_namspace.so モジュールを追加するために PAM 構成ファイルを変更します。それには、/etc/pam.d/login ファイルと /etc/pam.d/sshd ファイルを編集して、各ファイルの最終行に pam_namespace.so モジュールを配置してください。リスト 2 およびリスト 3 に、/etc/pam.d/login と /etc/pam.d/sshd それぞれでモジュールを追加する場所を示します。
リスト 2. /etc/pam.d/login への PAM モジュール追加
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session include system-auth
session required pam_loginuid.so
#
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the
user context
session required pam_selinux.so open
session optional pam_keyinit.so force revoke
# Polyinstantiation:
session required pam_namespace.so
|
リスト 3. /etc/pam.d/sshd への PAM モジュール追加
#%PAM-1.0
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
session optional pam_keyinit.so force revoke
session include system-auth
session required pam_loginuid.so
# Polyinstantiation:
session required pam_namespace.so
|
X Window System が一時ディレクトリーを使用する方法が原因となり、多重インスタンス化された /tmp ディレクトリーを使用するユーザーのグラフィカル・セッションが失敗する可能性があります。/etc/pam.d ディレクトリーに置かれたファイルのなかに 1 つでも pam_namespace を指定しているファイルがある場合、PAM はログイン時に /etc/security/namespace.init ファイルの内容を実行します。そこで、このファイルを使って X Window が正常に起動するために必要な変更を行います。デフォルトの namespace.init ファイルは RHEL 5.1 に付属していますが、リスト 4 ではこのデフォルト・ファイルを多少変更しています。
リスト 4. X Window が正常に起動するための変更
if [ $1 = /tmp ]; then
if [ ! -f /.tmp/.X11-unix ]; then
mkdir -p /.tmp/.X11-unix
fi
mount --bind /tmp/.X11-unix /.tmp/.X11-unix
[ -f /tmp/.X0-lock ] && cp -fp -- /tmp/.X0-lock "$2/.X0-lock"
mkdir -p -- "$2/.X11-unix"
ln -fs -- /.tmp/.X11-unix/X0 "$2/.X11-unix/X0"
fi
exit 0
|
GDM (Gnome Display Manager) の構成をするのは簡単です。/etc/pam.d/gdm ファイルにある必須モジュールのリストに pam_namespace.so を追加してください。リスト 5 に一例を示します。
リスト 5. Gnome Display Manager の構成
#%PAM-1.0
auth required pam_env.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
session optional pam_keyinit.so force revoke
session include system-auth
session required pam_loginuid.so
session optional pam_console.so
# Polyinstantiation:
session required pam_namespace.so
|
GDM ではなく XDM (X Display Manager) を使用している場合は、/etc/pam.d/xdm ファイルを同じようにして構成します。これで、グラフィカル・ログインとコマンドライン・ログインの両方で、/tmp および /var/tmp ディレクトリーが多重インスタンス化されるように設定できました。
pam_namespace.so モジュールの実行中に PAM がエラーを検出した場合には、ログインしようとしているユーザーのログイン・セッションが失敗してしまいます。すべてが意図したとおりに機能していると確信するまでは、エラーが発生してもログインが継続できるようにしてください。そのためには、ignore_config_error オプションを有効にします。このオプションを有効にするには、/etc/pam.d ディレクトリー内にある pam_namspace.so モジュールを追加した各ファイルの、pam_namspace.so モジュールを追加した行の終わりに ignore_config_error 追加してください。
/etc/pam.d/login ファイルを例に挙げると、pam_namspace.so モジュールが含まれる行を以下のように編集します。
session required pam_namespace.so ignore_config_error
全オプションのリストは、pam_namespace マニュアル・ページに記載されています。ユーザーがログインした後、/var/log/secure ファイルでエラーを調べてください。PAM 構成が正しいと満足できたら、ignore_config_error オプションを削除します。
構成ファイルを変更して保存したら、root 以外のユーザー・アカウントを選んでテストを行い、そのユーザーのすべてのインスタンスをシステムからログアウトさせます。もう一度ログインしなおすと、そのユーザーに対して新しく多重インスタンス化された /tmp および /var/tmp ディレクトリーが作成されているはずです。リスト 6 とリスト 7 に、この様子がどうユーザーに対して表示されるのか、またシステムではどう表示されるのかを示します。この例でのユーザー名は robb です。
リスト 6. ユーザーから見たコンソール・セッション
[robb@testbox tmp]$ cd /tmp
[robb@testbox tmp]$ touch foo
[robb@testbox tmp]$ ls
foo
|
リスト 7. root としてのシステムでのコンソール・セッション
[root@testbox ~]# ls /tmp
tmp-inst
[root@testbox ~]# ls /tmp/tmp-inst/
robb
[root@testbox ~]# ls /tmp/tmp-inst/robb/
foo
|
多重インスタンス化により、robb の /tmp ディレクトリーは /tmp/tmp-inst/ 配下の別個のディレクトリーに隔離されたため、robb にはシステムの /tmp ディレクトリーも、このディレクトリー内のどのファイルも見ることができません
多重インスタンス化はあらゆるタイプの攻撃を防ぐわけではありませんが、セキュリティーの追加手段として役立ち、構成するのも至って簡単です。/home といった他のディレクトリーでも多重インスタンス化を試してみてください。ignore_config_error オプションを使えば、致命的な間違いは起こりません。ただし、構成のテストが終わったら、このオプションを削除することをお忘れなく。
学ぶために
- 「Polyinstantiation of directories in an SE Linux system」(Russell Coker 著) では、tmp や /var/tmp などの共有ディレクトリーに関する問題、そして単一のホーム・ディレクトリーにアクセスするために複数の SELinux セキュリティー・コンテキストを使用する上での問題について解説しています。
- 「マウント名前空間を適用する」(developerWork、2007年9月) では、ユーザーがシステム管理者の決めた構造に制約されることなく、独自のファイルシステムをセットップする方法を紹介しています。高度な Linux マウント機能を実際に生かしたアプリケーションを学んでください。
- 「セキュアなプログラマー: 特権を最小限にとどめる」(developerWork、2004年5月) では、特権モジュール、許可される特権、そして特権が有効となっている時間をできるだけ少なくすることによって特権を最小限にとどめる方法について説明しています。
- 「What's new in SELinux for Red Hat Enterprise Linux 5」(Red Hat Magazine、2007年5月) では、SELinux for RHEL5 の概要を包括的に説明しています。
-
共有サブツリーに関するこの投稿 (LWN.net、2005年11月) では、「プロセスではその独自の名前空間を複製する必要があるが、最近マウントされた CD にも依然としてアクセスしなければならない」という状況を、機能、セマンティクス、マウント状態の説明、そして実装問題を詳細に説明しながら解決しています。
- 「SELinux from scratch」(developerWorks、2006年5月) では、SELinux 対応の Gentoo システムをビルドする方法を紹介しています。
- 「Role-based access control in SELinux」(developerWorks、2008年2月) では、SELinux で RBAC を操作する方法、そして RBAC を実行してユーザーを TE に結び付けるために SELinux のポリシー、カーネル、ユーザー空間が連動する仕組みを説明しています。
- SELinux を理解するには、SELinux History and Project FAQ、SELinux unofficial technical FAQ、Configuring the SELinux Policy を読んでください。
- NSA Web サイトで、Security-Enhanced Linux の詳細を学んでください。
-
developerWorks Linux ゾーンに豊富に揃った Linux 開発者向けの資料を調べてください。記事とチュートリアルの人気ランキングも要チェックです。
- developerWorks に掲載されているすべての Linux のヒントと Linux チュートリアルを参照してください。
-
developerWorks technical events and Webcasts で最新情報を入手してください。
製品や技術を入手するために
-
SELinux の Developers’ Mailing List に登録してください。
-
SEK for Linux を注文してください。この 2 枚組 DVD セットには、Linux 対応の DB2®、Lotus®、Rational®、Tivoli®、そして WebSphere® の最新 IBM トライアル・ソフトウェアが収録されています。
- developerWorks から直接ダウンロードできる IBM トライアル・ソフトウェアを使用して、Linux で次の開発プロジェクトを構築してください。
議論するために
- 「What's new in SELinux for Red Hat Enterprise Linux 5?」(Red Hat Magazine、2007年5月) の著者、Dan Walsh による SELinux ジャーナルを読んでください。
- 新しくなった developerWorks スペースのブログ、フォーラム、ポッドキャスト、そしてコミュニティーの話題を通して developerWorks community に参加してください。
