通常の (非 root) ユーザがコンピュータにローカルにログインすると、それらのユーザには 2 つのタイプの特別な権限が与えられます。別の方法では実行することのできない一定のプログラムを実行し、別の方法ではアクセスすることのできない一定のファイル (通常はディスケット、CD-ROM、などにアクセスするために使用される特別なデバイスファイル) にアクセスすることができます。
一つのコンピュータが複数のコンソールを持ち、同時に複数のユーザがそのコンピュータにログインすることができるため、ファイルにアクセスするための戦いにユーザの誰かが「勝利」する必要があります。コンソールに最初にログインしたユーザがそれらのファイルを所有します。最初のユーザがログアウトすると、次にログインしたユーザがファイルを所有することになります。
逆に、コンソールにログインしたすべてのユーザに対して、通常では root ユーザのみに制限されるプログラムの実行権限が与えられます。デフォルトでは、それらのプログラムはユーザのパスワードを要求します。X が動作している場合には、これがグラフィカルに行われます。X にはそれらのアクションをグラフィカルユーザインタフェースのメニュー項目として組み込むことができます。出荷状態でコンソールからアクセスすることのできるプログラムは shutdown、halt、および reboot です。
他の方法 (BIOS および LILO パスワードを設定する、Ctrl-Alt-[Delete] を無効化する、電源スイッチおよびリセットスイッチを無効化するなど) でコンソールを保護していない環境では、コンソールの前にいる任意のユーザに対して shutdown、halt、および reboot の実行権限を与えるのは望ましくないかもしれません。
コンソールのユーザによるコンソールプログラムへのアクセスをすべて無効化するには、次のコマンドを発行する必要があります。
rm -f /etc/security/console.apps/* |
プログラムやファイルへのアクセスを含むすべてのコンソールアクセスを無効化するには、/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 |
/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]* <cdrom>=/dev/cdrom <jaz>=/dev/zip |
独自の行を追加することもできます。
<scanner>=/dev/sga |
(もちろん、/dev/sga が本当にスキャナであり、ハードドライブなどではないことを確認してください。)
これが第一の部分です。第二の部分では、これらのファイルによって何を行うのかを定義します。/etc/security/console.perms の最後のセクションに以下のような行があるか否かを調べてください。
<console> 0660 <floppy> 0660 root.floppy <console> 0600 <cdrom> 0600 root.disk <console> 0600 <jaz> 0660 root.disk |
さらに以下のような行を追加します。
<console> 0600 <scanner> 0600 root |
この場合、このコンソールからログインすると、そのユーザには /dev/sga デバイスの所有権が与えられ、権限は 0600 となります (そのユーザのみによる読み書きが可能)。そのユーザがログアウトすると、デバイスの所有者は root となり、引き続き権限は 0600 となります (その後は root のみによる読み書きが可能)。
コンソールユーザに対して、shutdown、reboot、および halt 以外のアプリケーションへのアクセスを許可するには、もう少し作業を行う必要があります。
第一に、コンソールアクセスは /sbin または /usr/sbin の中に存在するアプリケーションについてのみ機能するので、実行したいアプリケーションをこの場所に配置しなければなりません。
アプリケーションの名前から /usr/bin/consolehelper アプリケーションへのリンクを作成してください。
cd /usr/bin ln -s consolehelper foo |
/etc/security/console.apps/foo ファイルを作成します。
touch /etc/security/console.apps/foo |
foo サーバに関する PAM 設定ファイルを /etc/pam.d/ の中に作成します。まず shutdown サービスをコピーし、その機能を変更したい場合にコピーを変更することをお奨めします。
cp /etc/pam.d/shutdown /etc/pam.d/foo |
ここで /usr/bin/foo を実行すると、consolehelper がコールされます。このコマンドは、/usr/sbin/userhelper と共同でユーザの認証を行ない (/etc/pam.d/foo が /etc/pam.d/shutdown のコピーである場合はユーザのパスワードを要求します。その他の場合には、/etc/pam.d/foo に指定された通りのことを実行します)、次に root 権限をもって /usr/sbin/foo を実行します。