ローカルログインユーザによるマルチメディアデバイスの利用 (2006/05/07)

グループが audio や cdrom などのマルチメディアデバイスは,オーナが root でアクセス権が 0660 です.すなわち,一般ユーザに利用を許可していません.これらを 0666 のように,全てのユーザにアクセス権を与えるのは,リモートログインした任意のユーザが音量を自由に変更できたり,もっと直接的には /dev/dsp などを削除できるなど,危険性が高いです.そこで,よく利用されるのは,audio や cdrom などのグループに所属することによって,実行権限を得ることです.例えば,ユーザ hoge が audio グループに所属するには,次のコマンドが使われます.

# adduser hoge audio

しかし,研究室内の複数のマシンを利用するときには,自分のユーザ名をいちいち登録するだけでもたいへんです.学生の個々のマシンに各自のアカウントを登録していくのも面倒です.卒業したら削除しなければなりませんので,管理がたいへんです.さらに,登録されたユーザは,リモートログインで自由に音量を変更できます (幸いにも,そんなことをする奇特な人はいませんが).できれば,ローカルログインしたユーザにだけ,マルチメディアデバイスへの利用を許可したいものです.

検索エンジンで調べたところ,libpam-devperm パッケージが有望であることが分かりました.

SunOS, Solaris で利用されている logindevperm と同等のことができるようです.通常は,ディスプレイマネージャ xdm, gdm, kdm からの利用になります.xdm, gdm, kdm から直接ログインしたユーザが audio, cdrom デバイスのオーナになり,かつ,アクセス権は 0600 にできます.ローカルでログインすれば,自分だけが利用できる環境です.しかし,私はディスプレイマネージャを頑なに拒んできたので,仮想コンソールログインから利用できないかと挑戦してみました.一応,仮想コンソールからのローカルログインでアクセス権を獲得するのは成功したのですが,リモートログインユーザにアクセス権が渡らないという確証が得られなかったので,やはりディスプレイマネージャを利用する方法に切り換え,gdm をインストールしました.以降では,その設定方法を書きます.

ウェブに情報は少ないですが,幸いにもドキュメント /usr/share/doc/libpam-devperm/README.Debian と設定ファイル /etc/logindevperm を見れば,だいたいのことが分かりました.まず,/etc/pam.d/gdm の @include common-session の下に次の一行を追加します.

session required pam_devperm.so

次に,/etc/logindevperm を次のようにします.

# for audio
:0 0660 /dev/mixer:/dev/audio:/dev/dsp:/dev/adsp
:0 0660 /dev/dmmidi:/dev/midi:/dev/rtc:/dev/snd/*
# for cdrom
:0 0660 /dev/hdc:/dev/scd0
# for dialout
:0 0660 /dev/ttyS0:/dev/ttyS1:/dev/ttyS2:/dev/ttyS3
# for floppy
:0 0660 /dev/fd0
# for video
:0 0660 /dev/agpgart

一行は3項目からできていて,最初がログインデバイス,次がアクセス権,最後がデバイスリストです.ワイルドカードとして "*" が利用できます.":0" は gdm のログインデバイスを表すようです.実はログインデバイスについてはよく分かっていません.仮想コンソールログインのときは,ここが分からずにワイルドカード "*" で全てのデバイスとして成功しました.この点が不安になり,gdm での利用に踏み切りました.次はアクセス権ですが,ここは元の /dev/logindevperm では 0600 となっていました.しかし,グループのアクセス権を利用してアプリケーションが動く可能性はあるかも知れないと思い,0660 としておきました.最後のデバイスリストは,audio, cdrom, dialout, floppy, video グループに所属しているデバイスを選択しました.というのもDebianインストール時に作成されたユーザは,audio, cdrom, dialout, floppy, plugdev, video のグループに所属するためです.この時点で,gdm から hoge でログインすると,

crw-rw---- 1 hoge audio 14, 4 2006-05-07 04:58 /dev/audio
となっています.

最後に,/usr/share/doc/libpam-devperm/README.Debian にアクセス権を元の状態に戻す /etc/login.defs の CLOSE_SESSIONS を有効にしなさい,と書いてありましたが,/etc/login.defs には CLOSE_SESSIONS は obsolute と書いてありました.そこで,gdm を一旦止めてから,仮想コンソールから root でログインすると,オーナが root になっていたので,おそらく CLOSE_SESSIONS は設定しなくても大丈夫かと思います (/etc/pam.d/login で動作するので確証はありませんが).なお,/etc/login.defs を見て,気が付いたのですが,CONSOLE_GROUPS を設定すると,仮想コンソールからのログインまたはsuでグループ登録してくれるようです.例えば,CONSOLE_GROUPS を floppy:audio としておき,hoge で仮想コンソールからログインすれば,hoge は floppy, audio グループに追加されます.残念ながら,ログアウトしたときに,その登録を削除してくれないようですが...

(追記 2006/05/13) 遠隔ログインして,/dev/dsp などのオーナが root に戻っていることを確認しました.

ログインデバイスとは,使用端末のことを表すようです.who コマンドで見ると,

hoge  :0           2006-05-13 19:13
hoge  pts/0        2006-05-13 19:21 (:0.0)
のように,端末 ":0" を利用しています.また,ps コマンドで確認すれば,
/usr/X11R6/bin/X :0 -dpi 96 -audit 0 -auth \
 /var/lib/gdm/:0.Xauth -nolisten tcp vt7
のように,gdm では,X を立ち上げる際に端末 ":0" を指定しているようです.

仮想コンソールからのログインで,logindevperm を利用するには,/etc/logindevperm に

/dev/tty1 0660 /dev/dsp
と書いて,/etc/pam.d/login に
session required pam_devperm.so
を追加すれば,コンソールログイン時に /dev/dsp のオーナが自分になっていることが確認できました.すなわち,ディスプレイマネージャを利用しなくても,logindevperm は利用できます.なお,"/dev/tty1" を単に "tty1" としたときには,"bad entry" というエラーが表示され,オーナが変わりませんでした.


梅原 大祐 / UMEHARA Daisuke umehara@kit.ac.jp
Last modified: 2020/05/01 15:37
Total Access Count