レベル: 初級 Robb R. Romans (robb@linux.vnet.ibm.com), Software Engineer, IBM
2008年 2月 26日 /tmp や /var/tmp など、誰でも書き込みできる共有ディレクトリーを不正に使用されないように保護したいのであれば、Linux® PAM (Pluggable Authentication Module) を役立ててください。pam_namespace モジュールはユーザーがログインすると、ユーザー用に隔離した名前空間をシステム上に作成します。この隔離は Linux オペレーティング・システムによって行われるため、ユーザーはさまざまなタイプのセキュリティー攻撃から保護されるというわけです。Linux システム管理者を対象としたこの記事では、PAM を使って名前空間を有効にする方法を手順に沿って説明します。
たいていの場合、セキュリティーを強化するためには複数の保護手段を講じるのが効果的です (「多層防御」とも呼ばれます)。複数の保護手段があれば、1 つの手段が侵害されたとしても他の手段がまだ効力があるため、さらなる侵入を防ぐことができます。この記事では、セキュリティー・ストラテジーにもう 1 つの防御層を加える方法を説明します。その方法では、PAM を使って誰もが書き込みできる共有ディレクトリーを多重インスタンス化します。つまり、/tmp などのディレクトリーをユーザーごとに新しくインスタンス化するのです。
Russell Coker が「Polyinstantiation of directories in an SE Linux system」(「参考文献」を参照) のなかで説明しているように、全ユーザーが書き込み権限を持つディレクトリーを多重インスタンス化すると、以下のタイプの攻撃を防ぐことができます。
- シンボリック・リンクによって競合状態に陥らせるという攻撃
- 機密情報あるいはアタッカーに有益であると考えられるファイル名の公開
- ユーザー間での攻撃
- ユーザーによるデーモンへの攻撃
- root 以外のデーモンによるユーザーへの攻撃
ただし、多重インスタンス化をしても以下のタイプの攻撃を防ぐことにはなりません。
- root デーモンによるユーザーへの攻撃
- root (アカウントまたは拡大した特権) によるユーザーへの攻撃
PAM と多重インスタンス化の機能
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 の編集です。
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 を変更する
次に、ログイン時にコンソールおよびセキュア・シェルから実行する必須モジュールのリストに 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 を使えるようにする
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
|
Gnome Display Manager の構成をする
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 オプションを使えば、致命的な間違いは起こりません。ただし、構成のテストが終わったら、このオプションを削除することをお忘れなく。
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Robb Romans は IBM User Technologies グループのライターで、Linux、Cell Broadband Engine Architecture、そしてオープン・ソース・ソフトウェアを専門としています。Information Development チームで現在の仕事に携わる前は、開発者として Linux セキュリティーと組み込み Linux に取り組んでいました。 |
記事の評価
|