通常の(rootでない)ユーザーがコンピュータにローカルからログインすると、2種類の特別な権限が与えられます。
ユーザーは、それ以外には実行できないような特定のプログラムを実行できます。
ユーザーは、それ以外にはアクセスできないように特定のファイル(通常はディスケット、CD-ROMなどへのアクセスに使用される特別なデバイスファイル)にアクセスできます。
1つのコンピュータ上に複数のコンソールがあり、複数のユーザーを同時にローカルからコンピュータにログインできるので、ユーザーのうちの1人がファイルにアクセスする競争に「勝つ」必要があります。これらのファイルは、最初にコンソールにログインするユーザーのものです。最初のユーザーがログアウトすると、ファイルはログインしている次のユーザーのものになります。
逆に、コンソールからログインしているすべてのユーザーは、rootユーザーに通常制限されている処理を行うプログラムを実行できます。Xが動作している場合、これらのアクションはグラフィカルユーザーインタフェースのメニュー項目として取り込むことができます。コンソールからアクセスできるプログラムには、出荷時に、halt、poweroff、rebootなどが収録されています。
デフォルトでは、コンソールで使用されるCtrl-Alt-Del キーコンビネーションに応答してシステムをシャットダウンして再起動するようなシステム設定は、/etc/inittabで指定します。この機能を完全に無効にしたい場合は、/etc/inittabで次の行をコメントアウトする必要があります。
ca::ctrlaltdel:/sbin/shutdown -t3 -r now |
あるいは、Ctrl-Alt-Delキーコンビネーションを使用してコンソールからシステムをシャットダウンする権利だけをrootでないユーザーに許可したい場合もあります。次の手順で、この特権を特定のユーザーに制限することができます。
上に示した/etc/inittab行に-aオプションを追加すると、次のように表示されます。
ca::ctrlaltdel:/sbin/shutdown -a -t3 -r now |
-aフラグは、次の手順で作成する/etc/shutdown.allowファイルを探すようにshutdownに指示します。
/etcにshutdown.allowというファイルを作成します。shutdown.allowには、Ctrl-Alt-Delキーコンビネーションを使用してシステムのシャットダウンが許されているユーザーのユーザー名が一覧表示されるはずです。/etc/shutdown.allowファイルのフォーマットは、次のようなユーザー名(1行に1名ずつ)のリストです。
stephen jack sophie |
このshutdown.allowファイルの例によれば、stephen、jack、sophieはCtrl-Alt-Delキーコンビネーションを使用してコンソールからシステムをシャットダウンすることが許可されています。このキーコンビネーションを使用すると、/etc/shutdown.allow内のユーザー(またはroot)が仮想コンソールにログインされているかどうかが/etc/inittabのshutdown -aで確認されます。ユーザーの誰かがログインされている場合は、システムのシャットダウンが続きます。ログインされていなければ、その代わりにシステムコンソールにエラーメッセージが書き込まれます。
shutdown.allowの詳細については、shutdownマニュアルページを参照してください。
コンソールプログラムへのユーザーのアクセスを無効にするには、このコマンドをrootとして実行してください。
rm -f /etc/security/console.apps/* |
それ以外ではコンソールの安全性が保証されている環境(BIOSとLILOの各パスワードが設定されている環境、Ctrl-Alt-Deleteキーコンビネーションが無効化されている環境、電源スイッチやリセットスイッチが無効化されている環境など)では、デフォルトでコンソールからアクセスできるpoweroff、halt、rebootをコンソールにいるユーザーが実行できないようにしたい場合があります。
これらの機能を解除するには、rootとして次のコマンドを実行します。
rm -f /etc/security/console.apps/poweroff rm -f /etc/security/console.apps/halt rm -f /etc/security/console.apps/reboot |
PAM pam_console.soモジュールは、コンソールファイルの権限と認証を管理します(PAMの設定の詳細については、Chapter 8を参照してください)。プログラムアクセスやファイルアクセスなどのすべてのコンソールアクセスを無効化したい場合は、/etc/pam.dディレクトリ内のpam_console.soを参照するすべての行をコメントアウトします。これは、次のスクリプトで行います。
cd /etc/pam.d for i in * ; do sed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $i done |
pam_console.soモジュールは、/etc/security/console.permsファイルを使用してシステムコンソールにいるユーザーの権限を決定します。このファイルの構文は非常に柔軟性があります。すなわち、これらの指示が適用されないようにファイルを編集することができます。ただし、デフォルトファイルには次のような行があります。
<console>=tty[0-9][0-9]* :[0-9]\.[0-9] :[0-9] |
ユーザーがログインすると、ある種の名前の付いた端末、すなわち、:0やmymachine.example.com:1.0のような名前のXサーバーまたは/dev/ttyS0や/dev/pts/2のようなデバイスに接続されます。デフォルトでは、ローカルの仮想コンソールやローカルのXサーバーがローカルと見なされるように定義されますが、/dev/ttyS1ポート上の隣のシリアルターミナルをローカルと見なしたい場合は、 次のようにその行を変更できます。
<console>=tty[0-9][0-9]* :[0-9]\.[0-9] :[0-9] /dev/ttyS1 |
/etc/security/console.permsで、次のような行を持つセクションがあります。
<floppy>=/dev/fd[0-1]* \ /dev/floppy/* <sound>=/dev/dsp* /dev/audio* /dev/midi* \ /dev/mixer* /dev/sequencer \ /dev/sound/* <cdrom>=/dev/cdrom* /dev/cdwriter* |
必要であれば、このセクションに独自の行を追加できます。追加する行が対応するデバイスを参照するかどうかを確認してください。たとえば、次の行を追加できます。
<scanner>=/dev/sga |
(もちろん、/dev/sgaが実際にはスキャナーであり、ハードドライブなどでないことを確認します。)
第1ステップはこれで終わりです。第2ステップでは、これらのファイルで何を実行するかを定義します。次のような行については、/etc/security/console.permsの最終セクションを調べてください。
<console> 0660 <floppy> 0660 root.floppy <console> 0600 <sound> 0640 root <console> 0600 <cdrom> 0600 root.disk |
さらに、次のような行を追加します。
<console> 0600 <scanner> 0600 root |
次に、コンソールからログインすると、/dev/sgaデバイスの所有権が与えられ、デバイスと権限は0600(自分だけが読み取り可能かつ書き込み可能)です。ログアウトすると、デバイスはrootのものになり、引き続き0600(今度はrootのみが読み取り可能かつ書き込み可能)の権限があります。
コンソールユーザーが他のアプリケーションにアクセスできるようにしたい場合は、少し余計に作業をするだけで済みます。
まず、コンソールアクセスは/sbinと/usr/sbinのいずれかに存在するアプリケーションに対してのみ有効なので、実行したいアプリケーションがそこになければなりません。それを確認した後、次のステップを実行します。
fooサンプルプログラムなどのアプリケーションの名前から/usr/bin/consolehelperアプリケーションまでのリンクを作成します。
cd /usr/bin ln -s consolehelper foo |
/etc/security/console.apps/fooファイルを作成します。
touch /etc/security/console.apps/foo |
/etc/pam.d/内にfooサービスのためのPAM設定ファイルを作成します。これを行う簡単な方法として、まずホールトサービスのPAM設定ファイルをコピーし、次に動作を変更したい場合にファイルを変更します。
cp /etc/pam.d/halt /etc/pam.d/foo |
次に/usr/bin/fooを実行するときに、consolehelperを呼び出します。このコマンドは、/usr/sbin/userhelperを利用してユーザーを認証します。ユーザーを認証するために、/etc/pam.d/fooが/etc/pam.d/haltのコピーであれば、consolehelperはユーザーのパスワードを聞き(それ以外は/etc/pam.d/fooで指定されている内容を正確に実行します)、次にroot権限で/usr/sbin/fooを実行します。