pam_mountを使ったログイン時における暗号化ファイルシステムの自動マウント

 pam_mountは、ログイン時に自動的に暗号化ファイルシステムをアンロックしてくれる。ログインに使用するパスワードと同じパスワードで、暗号化ファイルシステムをアンロックするため、パスワードの入力は1回でよい。これを用いれば、ノートPCの共有が容易になる。ログイン時にそのユーザーのホームディレクトリのみをアンロックしてマウントしてくれるからだ。またpam_mountは、暗号化ファイルシステムだけでなく、任意のファイルシステムをマウントすることができるため、たとえば、使用したいが自分がログインしていないときにはマウントしたままにしておきたくないNFS共有などに適用することができる。

 これまでEncFSとLoop-AESdm-crypt翻訳記事)、Cryptmount翻訳記事)など、暗号化ファイルシステムを提供するための他の方法に関する記事を掲載したことがあるが、pam_mountではそのプロセス全体がシームレスに行われる。

 pam_mountは先月、0.49から1.2へのメジャーバージョンアップを果たしたばかりであるため、使用中のディストリビューションで提供されているのがまだ旧版であるからといってそれほど心配する必要はない。pam_mountは、Fedora 9のディストリビューションリポジトリに含まれており、openSUSE 11向けには1クリックインストールとして提供されている。Ubuntu Hardyではlibpam-mountというパッケージで提供されている。私はFedoraリポジトリからのバージョン0.48を、64ビットのFedora 9搭載マシンにインストールしたが、バージョン1.2も試用した。どちらも動作はまったく同じであった。変更点(以下参照)は、mount.cryptで、使用されている暗号(cipher)を指定しなければならないという点だけである。

# vi /etc/security/pam_mount.conf.xml
...
<cryptmount>mount.crypt -o cipher=aes "%(ifnempty=\"-o\" OPTIONS)" %(OPTIONS)
        %(VOLUME) %(MNTPT)</cryptmount>

 本記事ではpam_mountを使用する例として、LUKS暗号化ボリュームを用いる。ここでは暗号化ファイルシステムを格納するために1つのパーティションを使用するが、余分のパーティションがない場合は、ループバックデバイスを介してマウントされた単一のファイルを用いることもできる。

 以下のコードに示すように、まず初めに/dev/sdc1をフォーマットし、そのパーティションにあるすべてのデータを削除して新しい暗号化ボリュームを作成した。この暗号化ボリュームをmyencryptedstuffと名づけ、そこにext3ファイルシステムを作成した。このファイルシステムをマウントし、あるファイル(何でもよい)を作成してから、再びアンマウントして、暗号化ボリュームをロックした。ここでpam_mountパッケージのmount.cryptを用いて、暗号化ボリュームをアンロックし、/mnt/tにマウントした。mount.cryptは、pam_mountがファイルシステムをマウントするために用いるコマンドであるため、まずコマンドラインからこのコマンドを実行し、その動作を検証してみるとよい。最後にumount.cryptを実行して、ファイルシステムをアンマウントし、暗号化ボリュームを再びロックした。上記の2つの操作は、umountcryptsetup luksCloseを実行するのと同じである。

# cryptsetup luksFormat /dev/sdc1

WARNING!
========
This will overwrite data on /dev/sdc1 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

# cryptsetup luksOpen /dev/sdc1 myencryptedstuff
Enter LUKS passphrase for /dev/sdc1:
key slot 0 unlocked.
Command successful.

# mkfs.ext3 /dev/mapper/myencryptedstuff
mke2fs 1.41.0 (10-Jul-2008)
...

# mount /dev/mapper/myencryptedstuff /mnt/t
# date > /mnt/t/df1.txt
# cat /mnt/t/df1.txt
Mon Oct 27 09:20:22 EST 2008

# umount /mnt/t
# cryptsetup luksClose myencryptedstuff

# mount.crypt -o cipher=aes  /dev/sdc1 /mnt/t
# umount.crypt /mnt/t

 その名前が示すようにpam_mountは、Linuxシステムの認証に用いられるPluggable Authentication Modules(PAM)システムと連動する。Linux.comには、PAMを詳細に取り上げた過去の記事が存在する。PAM自体に興味のある読者は、Understanding PAMLet PAM take care of GNU/Linux security for you翻訳記事)、Hardening the PAM frameworkを参照してほしい。

 簡単に言えばPAMは、誰かがあるサービスを利用しようとする場合に、/etc/pam.dからそのサービス用のファイルを読み、何らかのアクション(サービス拒否など)を実行するものである。たとえば/etc/pam.d/loginは、システムにログインしようとするユーザーに対する処理を制御する。pam.dには、認証を制御するためのファイルだけでなく、サービスの初期セッションの設定方法を制御するファイルもある。

 /etc/pam.dのファイルの各行において、その行が定義するアクションが要求の許可のために必須なのか、任意なのか、または、その行の条件を満たす場合にPAMはそこで処理を終了して要求を許可してよいのかを、PAMに指示することができる。この最後のケース、つまり、条件を満たせば要求を許可してよいというエントリは「sufficient」と呼ばれる。pam_mountエントリを新しく追加する際には、pam_mountが必ず実行されるように、「sufficient」行の前に挿入しなければならない。

 またPAMは、ユーザーからのパスワードの取得をサポートする。各行ではPAMに対し、パスワードが必要であることと、ユーザーから取得済みのパスワードを再利用するか(use_first_pass)、あるいは既に取得したパスワードがあればそれを再利用し、なければ入力を促すか(try_first_pass)を指定することができる。これは便利な機能である。あるサービスに対するPAM認証が2行存在する場合にtry_first_passを用いれば、その2行から呼び出される認証サービスにおいてパスワードは2回必要となるが、PAMが処理してくれるおかげで入力は1回で済む。

 pam_mount自体については、/etc/security/pam_mount.conf.xmlで構成設定する。このXMLファイルでは、さまざまなヘルパープログラムの呼び出し方法、マウントされたファイルシステムの所有者、ユーザー毎にpam_mount設定ファイルを定義してもよいかどうか、pam_mountに実際のマウント方法を指定するボリュームエレメントの集合を定義する。テスト時に設定すると便利なオプションとして <debug enable="2" />があり、認証の際の動作に関する情報を/var/log/messagesに出力するため、これを用いて構成設定上の問題を修正することができる。

 私自身は、すべてを/etc/security/pam_mount.conf.xmlに定義するよりも、ユーザー毎に構成設定する方が好きだ。ユーザー毎の設定により、各ユーザーは独自の暗号化ボリュームを設定し、バインドマウントすることができる。各ユーザー用の設定ファイルはデフォルトでは無効になっている。これを有効にするには、以下の行を追加するか、コメントになっている場合はコメントからはずす。

<luserconf name=".pam_mount.conf.xml" />

 私のシステムのユーザーbenに対する、ユーザー用設定ファイルを以下に示す。この設定ファイルでは、私のホームディレクトリのサブディレクトリに、先ほど作成した暗号化されたLUKSファイルシステムをマウントする。ファイルシステムのタイプ(fstype)としてcryptを指定すると、pam_mountはそのファイルシステムをmount.cryptコマンドによってマウントおよびアンマウントする。それ以外に指定しなければならないのは、暗号化ボリュームの場所(/dev/sdc1)と、マウント先(~/protected)だけである。

$ cat /home/ben/.pam_mount.conf.xml
<?xml version="1.0" encoding="utf-8" ?>

<pam_mount>

<volume fstype="crypt" path="/dev/sdc1" mountpoint="~/protected" />

</pam_mount>

 後は、実際にpam_mountを呼び出すように/etc/pam.dのファイルを編集するだけだ。これで必要なときに暗号化ファイルシステムがマウントされることになる。ファイルシステムのパーミッション設定も1箇所変更しなければならないかもしれない。以下に、グラフィカルログインユーティリティであるGNOME Display Managerを制御するファイル/etc/pam.d/gdmを示す。追加したのは太字で示した2行である。

# cd /etc/pam.d
# cat gdm
#%PAM-1.0
auth       optional    pam_mount.so try_first_pass
auth     [success=done ignore=ignore default=bad] pam_selinux_permit.so
auth       required    pam_env.so
auth       substack    system-auth
auth       optional    pam_gnome_keyring.so
account    required    pam_nologin.so
account    include     system-auth
password   include     system-auth
session    optional    pam_mount.so
session    required    pam_selinux.so close
session    required    pam_loginuid.so
session    optional    pam_console.so
session    required    pam_selinux.so open
session    optional    pam_keyinit.so force revoke
session    required    pam_namespace.so
session    optional    pam_gnome_keyring.so auto_start
session    include     system-auth

 今回は、パーティション全体を暗号化ボリュームとしてマウントしたため、pam_mountを動作させるために、「chown ben.disk /dev/sdc1」によってそのパーティションの所有者も変更しなければならなかった。

 上述の処理をすべて終えてgdmにログインすると、~/protectedが自動的にアンロックされマウントされていた。gdmにログインする前に他のマシンからSSHセッションを開始し、それを開いたままでログアウトしてみた。ログアウト時に自動的に~/protectedはアンマウントされ、暗号化ボリュームは再びロックされていた。

 pam_mountによってNFSやFUSEなどのファイルシステムもマウントし、バインドマウントできることを覚えていてほしい。バインドマウントとは、簡単に言えば、あるファイルシステムを2つの異なるパスで同時に使用可能とすることである。ユーザー毎の設定ファイルを有効にすれば、ファイルシステムの見え方をログイン時に自動的に変更することができる。頻繁に使用するパスを含む複数のNFSマウントがある場合は、バインドマウントは便利である。たとえば以下の例では、NFSマウント上の長いパスを、私のホームディレクトリの下から直接アクセス可能としている。

<volume path="/Fileserver2007/Docs/ben" mountpoint="~/docs" options="bind" />

追記

 Fedoraシステムでは、authconfigによって/etc/pam.dのファイルの一部が更新される。特にsystem-authファイルは、他の多くのファイルから呼び出される。おそらく他のLinuxディストリビューションにもauthconfigと同様のツールが存在する。authconfigが実行されると、それによる変更を保存するために/etc/pam.dの一部のファイルが書き換えられ、pam_mountに関する設定が無効となってしまう可能性がある。これを防ぐには、システムツールによって変更されることのない/etc/pam.dファイルのみを編集するようにしなければならない。まず調べておかなければならないのは、/etc/pam.dのどのファイルがこのようなツールによって書き換えられるのかという点である。たとえばsystem-authについては、上書きされる場合があり、編集してはならないと記載されている。今回は単一のサービスを対象としておりsystem-authは編集していないため、問題はなかった。

 pam_mountにより、ファイルシステムをログインまたはログアウト時に自動的にマウントおよびアンマウントすることが可能となる。暗号化ファイルシステムボリュームのアンロックに、ログインと同じパスワードを使用する場合は、パスワードを1回入力するだけで、ログインしていないときには個人的なドキュメントが暗号化によって保護されるようにシステムを設定することができるのだ。

Ben Martin 10年以上にわたってファイルシステムを研究。博士課程を修了し、現在、libferris、ファイルシステム、検索ソリューションを中心にコンサルティングをしている。

Linux.com 原文(2008年11月6日)