のファイルは/var/spool/pq
ディレクトリに格納されていると仮定しましょう。ディレクトリprinter:printgrp:2700
のパーミッション(所有者printer
、グループprintgrp
、モード2700 - 読み込み、書き込み、所有者のみのために実行し、ディレクトリに設定SGIDビットはそれで作成されたすべてのファイルがグループprintgrp
に属していることを意味します)。
さらに、我々は、印刷キューイングプログラム、pq
は、権限printer:printgrp:4511
を(setuidをprinter
は、誰もがそれを実行することができますが、唯一のprinter
またはroot
それを見ることができます)があることを前提としています。
Joeがpq /home/joe/file
を実行し、ファイルのアクセス権がjoe:staff:600
(Joeのみがファイルを読み書きできる)とします。 Joeのumaskは022に設定されています(ただし、このファイルにはumaskよりも厳しい権限があります)。
プログラムが実行されるとき、プロセスの実際のUIDはjoe
ですが、有効なUIDはprinter
です。ここでsetgid操作は必要ないので、実際のGIDと有効なGIDはともにstaff
です。ジョーの補助グループリストにはprintgrp
は含まれていません。
ファイルへのアクセスを制御するプロセスの実効UIDとGIDであることに注意してください。ジョーは自分自身では、ジョブがプリンターキューに入っているのを見ることができません。表示されたディレクトリのアクセス許可は、ファイルの一覧表示やディレクトリ内のファイルへのアクセスを許可しません。逆のことが言えます。 printer
ユーザー(またはそのユーザーとして実行中のpq
プログラム)はJoeのファイルにアクセスできません。
pq
プログラムは、プリンタのキューディレクトリにファイルを作成できます。おそらくこの要求に対して2つのファイルを作成します。 1つは制御ファイルになり、もう1つは印刷されるファイルのコピーになります。これは、いくつかのメカニズムによってジョブ番号を決定します(12345と言う)と、それは(制限された権限で - 0600あるいは0400)を作成するためのオープン2つのファイルを作成してあります:
/var/spool/pq/c.12345
- 制御ファイル
/var/spool/pq/d.12345.1
を - 最初の(唯一の)データファイル
有効なUIDを実際のUIDにリセットして、Joeとして実行する必要があります。その後、Joeが印刷を依頼したファイルを開き、それをデータファイルにコピーすることができます。また、制御ファイルに関連する情報(日付、時刻、要求を提出した人物、印刷するファイルの数、特殊な印刷オプションなど)も書き込むことができます。これらのファイルを閉じると、Joeはそれらのファイルにアクセスできなくなります。しかし、プログラムはジョーのファイルをプリントキューにコピーすることができました。
これは、質問1(許可)と2(制御情報)に対処し、また4(制御情報)にも対処します。
質問3については、root
は、Unixライクなシステムでは常にワイルドカードです。なぜなら、彼が望むものは何でもできるからです。しかし、残りの答えによって示唆されるように、制御ファイルには、(特に)誰がそれを提出したかなど、印刷要求に関する情報が含まれています。 setuidプログラムの代わりにsetgidプログラムを使うことができます。これらは類似の方法で動作します。しかし、私が仮定したシステムの下では、グループのパーミッションは本質的には現れなかった。 pq
プログラムは、制御ファイルとデータファイルに対するアクセス権をグループが読み取れないように設定し、ディレクトリアクセス権もグループアクセスを拒否します。
我々は2つの以上のプログラムを仮定することができます
pqs
- プリンタキューの状態
pqr
- プリンタキューは、これらのプログラムはまた、printer
setuidのだろう
取り除きます。 pqs
プログラムは、ディレクトリ内の制御ファイルを読み込み、そこから関連情報をリストすることができます。pqr
プログラムは制御ファイルを読み取って、ジョーがジョブ12345の削除を要求したときにジョブ12345を発行したときに、ジョブ12345の削除を確認できます。プログラムが満足すれば、ファイルを削除できます。
これらのユーザー起動プログラムとは別に、実行中でなければpq
によって実行されるデーモンプログラム(このシステムでは通常はpqd
という名前の)があります。ディレクトリ内の制御ファイルを読み込み、その情報を使用して実際にデータファイルを関連するプリンタに印刷することになります。異なるプリンタと異なるデータ形式がどのように処理されるかの詳細は、デーモンが処理するための問題です。デーモンもprinter
特権で実行され、printer
は、プリンタデバイス(ローカルに接続されたプリンタ用)にアクセスできます。また、IPP(インターネットプリンタプロトコル)などのプロトコルでネットワーク経由で通信するように設定されています。 Joeはおそらくプリンタデバイスを直接使用することはできません。
setuidプログラムには、Joeにはない権限があることに注意してください。彼らはジョーが余分な力を乱用できないように慎重に書かなければなりません。どんなsetuidプログラムもやや危険です。 setuid root
プログラムが致命的になる可能性があります。一般に、setgidプログラムはあまり危険ではありません。しかし、両方のタイプのプログラムについては、そのようなプログラムの作成には細心の注意が必要です。
ありがとうございます。でも、私はまだ小さな質問をしていますが、一度ファイルを読み込んだり書いたりすると、ユーザーのプリンタとしてアクセスしたり、読んだり、書き込んだりすることができます。 ? – venuswu
もう一度ご協力いただきありがとうございます! – venuswu
はい:ファイル記述子が開いたら、プログラムが実効UID(またはGID)を変更しても問題はありません。再開は別の問題です。プログラムは、Joeがスプール領域にファイルを作成する前に、Joeがコマンドラインでファイルにアクセスできるかどうかを確認します。ジョーがコマンドラインで500個のファイルをリストした場合、ファイルディスクリプタを使い果たしてしまうこともないので、いくつかのスタントが前後に切り替えられます(保存されたUID)。ただし、アウトラインは基本的な操作モードです。 –