本連載は今回が新年最初の回となるので,遅ればせながら読者の方々に新年のお祝いを申し上げる。昨年はLinuxがいよいよエンタープライズの分野でも広く認められ,普及しはじめた年になったと言えよう。SCO訴訟のような問題はあるものの,エンタープライズ分野の大規模サーバーに対するニーズに答えるために開発され,昨年末に公開された新しい安定版カーネルである2.6系カーネルが,Linuxの普及を加速していくと思われる。

2.4系カーネルにセキュリティ・アップデート

 前述のように,約3年ぶりの新しい安定版カーネルであるlinux-2.6.0が約5カ月の最終テスト期間を経て2003年12月18日に正式公開された。その後,テスト期間中は採用が見送られていたパッチなどを採用した2.6.1が2004年1月9日に公開されている。この2.6.1では後述するメモリー管理に関するセキュリティ・ホールも修正されている。

 一方,2.6系カーネルの正式公開に合わせてメンテナンス・モード(新しい機能の追加は行わず,今後はバグやセキュリティ問題の修正のみにとどめるモード)に入ると言われていた2.4系カーネルでは,昨年11月に公開された2.4.23以降,恐らく最後の新機能となるであろうXFSファイル・システムをマージする作業が進んでいる。

 この作業は現在も進行中だが,2.4.23以前のカーネルにはメモリー管理に関するシステム・コール内にセキュリティ上の問題があることが判明し,この問題に対応するための2.4.24カーネルが2004年1月5日に緊急リリースされている。

 この問題はネットワーク経由で直接悪用されるものではなく,そのマシンにアカウントを持つユーザーがDoS(サービス停止)攻撃や管理者権限奪取を行うことができるlocal exploitと呼ばれるものだが,複数ユーザーが利用しているサーバー・マシンなどでは対処が必要になるだろう。なお,2.4.24カーネルはセキュリティ問題対応のための緊急リリースであり,XFSなどの機能追加は次以降のバージョンで行われる予定である。

アクセス権限機能強化はエンタープライズ規模向け

 冒頭で紹介したように,2.6系カーネルではエンタープライズ分野のニーズに答えるためにさまざまな機能の追加や強化が行われている。本連載ではそれらの機能を随時解説していく予定である。

 今回はPOSIX ACLと呼ばれる,ファイルのアクセス権限付与に関する新機能を解説する。POSIX ACL機能はカーネル2.6で初めて公式に採用されたが,2.4カーネルへのパッチなどは以前から公開されており,既に利用されている読者もおられるかも知れない。

 Linuxを含む伝統的なUNIXでは,ファイルの所有者に関する概念は「所有者(owner)」,「所有者の属するグループ(group)」,「その他(other)」の3通りしか存在せず,あるファイルを特定のユーザーのみに見せたい場合,そのユーザーを自分と同じグループに所属させ,グループ単位での読み取り権限を与える必要があった。

 この仕組みは大学の研究室のような比較的小規模な環境では十分機能するものの,エンタープライズ規模の数千人規模のユーザーを抱えたファイル・サーバーでは管理者の負担が大きくなりすぎ,破綻することが目に見えている。そこで商用UNIXでは比較的早い時期からアクセス制御リスト(Access Control List:ACL)という機能を実装し,ファイルに対するアクセス権限をより柔軟に制御できる仕組みを用意した。

 POSIX ACLとは,このACLに関する仕様を,UNIXの標準であるPOSIXとして定めたもので,AIXやSolarisといったUNIX互換のOSだけでなく,Windows NTなどのOSも準拠しているACLの仕様である。POSIX ACLでは,伝統的なUNIXとは異なり,同じグループに属していないユーザーに対しても,ファイルの読み書き権限を与える機能を定義している。

ACLを使う準備を行う

 LinuxのACL機能はファイル・システム・レベルの機能として実装されているため,ACLを利用するにはカーネル・レベルで対応する必要がある。すなわち,必要な機能を組み込んだカーネルを用意する必要がある,ということだ。また,ACL機能を利用するためのユーザー・コマンドも必要となる。

 2.6カーネルをコンパイルする際の全般的な注意点等は本連載の第2回を参照してもらうことにして,今回はACL機能を利用する際に必要な設定のみを紹介する。

写真1●ACLを有効にするためのカーネル設定
 ACLを利用するには,make menuconfigなどで表示される機能設定画面で"File Systems"を選択し,利用したいファイル・システムを選択するとともに,それぞれのファイル・システムに用意されている"Posix Access Control Lists"機能をオンにする必要がある(写真1[拡大表示])。なお,ext2/ext3ファイル・システムでは"extended attributes"機能をオンにしないとACL機能の選択肢が表示され ないので注意されたい。

 写真にも見られるように,カーネル2.6.1ではReiserfsがACLに未対応となっているが,Reiserfs上でACL機能を使うためのパッチはSUSEのFTPサイトで公開されているので,Reiserfs上でACL機能を利用したい方は下記URLにあるパッチを適用した上でカーネル再構築を実行していただきたい.

ftp://ftp.suse.com/pub/people/jeffm/reiserfs/aclea/2.6.0-test11/
必要な機能の選択が終れば,それぞれのディストリビューションの手順に従ってカーネルを再構築,インストールし,更新したカーネルを用いてシステムを再起動する。

マウント時の設定

 ACLを利用するためにはファイル・システムをマウントする際のオプションにaclを付ける必要がある。/dev/sdb1をext3でフォーマットし,ACL機能を指定してマウントするには以下のコマンドを実行する。

# mount -t ext3 -o acl /dev/sdb1 /mnt
 マウントされたパーティションの一覧を表示させると下記のようにACL機能が有効になっていることが分かる。
# mount
/dev/sda1 on / type reiserfs (rw)
none on /proc type proc (rw)
none on /dev/pts type devpts (rw, gid=5,mode=620)
/dev/sdb1 on /mnt type ext3 (rw, acl)
 起動時からACL機能を利用したい場合は/etc/fstabの該当するエントリのオプション指定フィールドにaclオプションを設定しておけばいい。

ACL設定用ツールを使う

 ACL機能を利用するにはsetfacl/getfaclと呼ばれる専用のツールが必要となる。いくつかのディストリビューションでは,これらのツールはあらかじめ用意されているので,まずお使いの環境でこれらのパッケージがインストールされているかを確認していただきたい。例えばFedora Core 1の環境では以下のようなパッケージがインストールされていた。ただし,後述するようにRed Hat Linux 8/9やFedora Core 1のデフォルトのカーネルではACL機能は無効とされているので注意されたい。

$ rpm -qa | grep acl
libacl-2.0.11-2
libacl-2.2.7-2
acl-2.2.7-2
libacl-devel-2.2.7-2

$ rpm -qa | grep attr
libattr-2.4.1-2
attr-2.4.1-2
libattr-devel-2.4.1-2
 これらのパッケージがインストールされていなかったり,バージョンが古い場合は,それぞれのディストリビューションの配布元を調べるか,これらの開発元である米SGIのサイトftp://oss.sgi.com/projects/xfs/cmd_rpms/から必要なパッケージをダウンロードする必要がある。SGIのサイトにはrpmファイルと共にsrpmファイルも用意されているので,パッケージの再構築も容易であろう。

 rpmを使わずにソースコードから手動でコンパイルする場合はcmd_tarsディレクトリftp://oss.sgi.com/projects/xfs/cmd_tars/にあるacl-2.2.22.src.tar.gzとattr-2.4.13.src.tar.gzをダウンロードし,attr-2.4.13パッケージを先にコンパイル,インストールした上でacl-2.2.22パッケージをコンパイル,インストールする必要がある(aclパッケージはattrが提供するライブラリを必要とするため)。

 これらのソースコードにはconfigureスクリプトが付属しているので,コンパイル自体は容易だが,attr-2.4.13が利用するMakefileではlibattr.aや/usr/include/attr以下のヘッダー・ファイルがインストールされないという問題が見られた。これらのライブラリやヘッダー・ファイルが見つからないためacl-2.2.22のconfigureに失敗する場合,以下のコマンド例を参考にattr-2.4.13のlibattr/.libsに作成されるlibattr.aを/usr/libに,include以下のヘッダーファイルを/usr/include/attrに手動でコピーした上でconfigureを実行してほしい。

# cp attr-2.4.13/libattr/.libs/libattr.a /usr/lib
# ranlib /usr/lib/libattr.a
# mkdir /usr/include/attr
# cp attr-2.4.13/include/*.h /usr/include/attr

コマンドでACLを設定する

 ACLの設定を操作するにはsetfacl/getfaclというコマンドを用いる。名前が示すようにsetfaclがACLの設定コマンド,getfaclが現在のACLの状態を入手するコマンドである。

 以下では3人のユーザー(alice,betty,cathy)がfile1.txtとfile2.txtを共有している様子を紹介する。なお,file1.txtとfile2.txtはそれぞれaliceが作ったファイルで,aclオプションを指定してマウントした/mnt/Textディレクトリにあるものとする。

alice% ls -l
total 16
-rw-r-----  1 alice  alice     22 Jan 14 23:24 file1.txt
-rw-r-----  1 alice  alice     22 Jan 14 23:25 file2.txt
 aliceはsetfaclコマンドを使い,file1.txtはbettyに読み取り権限を,file2.txtはcathyに読み書きの権限を与えた。
alice% setfacl -m u:betty:r file1.txt ; setfacl -m u:cathy:rw file2.txt
 これらのファイルのACLの状況をgetfaclで調べると以下の通りとなる。
alice% getfacl *.txt
# file: file1.txt
# owner: alice
# group: alice
user::rw-
user:betty:r--
group::r--
mask::r--
other::---

# file: file2.txt
# owner: alice
# group: alice
user::rw-
user:cathy:rw-
group::r--
mask::rw-
other::---
 これらのファイルをbettyやcathyが見ようとすると以下のような結果となる。
ユーザーbettyから見た場合
betty% cat *.txt
This file for betty. file1.txt は見える
cat: file2.txt: Permission denied file2.txt は見えない

ユーザーcathyから見た場合
cathy% cat *.txt
cat: file1.txt: Permission denied file1.txt は見えない
This file for cathy. file2.txtは見える
cathyからはfile2.txtに書き込むこともできる
cathy% cat >> file2.txt
Add betty to this file.^D
cathy% cat file2.txt
This file for cathy.

Add betty to this file.
aliceはbettyにfile2.txtの読み取り許可を追加した。
alice% setfacl -m u:betty:r file2.txt ; getfacl file2.txt
# file: file2.txt
# owner: alice
# group: alice
user::rw-
user:betty:r--
user:cathy:rw-
group::r--
mask::rw-
other::---
この状態ならば,bettyもfile2.txtを閲覧できる。
betty% cat file2.txt
This file for cathy.

Add betty to this file.
 このようにsetfaclコマンドを用いることで,ユーザーごとにファイルへのアクセス権限を指定できる。また,setfaclコマンドはそのファイルの所有者である一般ユーザーから実行できるため「特定ユーザーのみで共有したいファイルのために,新規グループを作成する」といった管理者の手間を省くことも可能となる。

 setfacl/getfacl の詳細な使い方はパッケージに付属のマニュアル・ページやPOSIX ACL機能の開発元であるhttp://acl.bestbits.at/のサイトなどを参照してほしい。

ディストリビューションによる違いなどに注意

 本文中にも述べたように,POSIX ACL機能は2.4カーネルへのパッチとしても公開されているが,この機能の扱いはディストリビューションによって異なっている。例えばRed Hat LinuxではACL機能を用いると高負荷時の安定性に問題が見られるとして,ACL関連のパッケージやカーネル・パッチは用意されているものの,デフォルトのカーネルでは比較的最近までACL機能は無効とされていた(Fedora Core 1も含む)。Red Hatでは,問題が解決したとして最新のRed Hat Enterprise Linux 3以降ではデフォルトのカーネルにACL機能を組み込むようになったようだ。また,Fedora Core 1では,ACL機能を有効した2.6 カーネルがrpmの形で提供されている。

 カーネルにACL機能が組み込まれているかは,ファイル・システムをマウントする際の-o aclオプションが有効などうかで判断することができるだろう。例えば手元のRed Hat Linux 8.0上では,aclオプションは不正なオプションとされた。

[root@rh8]# mount -o remount, acl /
mount: / はまだマウントされていないか,不正なオプションです
 この場合,ACL機能を利用するには,必要なパッチを適用し,ACL機能を設定した上でカーネルを再構築する必要がある。あるいはこの機会に2.6カーネルに挑戦してみるのはいかがだろうか。
大鳥 信弘 (Ootori Nobuhiro)

■著者紹介 大鳥 信弘 (おおとり のぶひろ)
株式会社テンアートニ 第二事業部シニアマネージャ。株式会社テンアートニは1997年設立のLinuxとJavaを専門とする企業。第二事業部はLinux/OSS関連のソフトウェア開発,SI(企画,コンサルティング,構築,運用等),サポート,教育,製品の販売等を手がける。