[開発日誌] デバイス関連のアクセス制御続き

端末デバイス調査

端末に関連したデバイスを見てみる。

  • 普通の端末
    • man 4 tty
    • /dev/tty(数字)
      • これのいずれかをユーザの端末として使う。ロールに基づいたタイプが付与される。
    • /dev/tty0
      • 現在の端末を表す。
    • /dev/tty
      • 現在の端末を表す。加えて、これをioctlすることで、端末の制御が可能。
      • TIOCNOTTYという制御端末から切り離すioctlは/dev/ttyからしかできない。
  • 疑似端末
    • Xtermやsshでログインした時に作られる端末
    • /dev/pts以下に端末を開くたびにファイルができる。ロールに基づいたタイプが付与される。
    • /dev/ptmx
      • 通常world read/writable
      • /dev/ptmxを開くと/dev/ptsに自分の端末が作られる。端末が欲しい時はまずは/dev/ptmxを開くことになっている。
  • VCS
    • man vcs参照
    • 現在ログインしているユーザの端末のメモリ
    • /dev/vcs* , /dev/vcsa*が実体。
    • cat /dev/vcs* とすると、ローカルログインしているユーザ端末のスクリーンショットが取れる。
    • 書き込みを行うことで、端末に文字を表示できる。
    • これはアクセス制御せねばなるまい。
  • /dev/console
    • システムコンソール (Documentation/devices.txtより)

The console device, /dev/console, is the device to which system
messages should be sent, and on which logins should be permitted in
single-user mode.

    • システムとして使う端末か。

端末にアクセスされると何が困る?

  • 各自の端末へのアクセス(/dev/tty1- /dev/pts/*)
    • 作業を邪魔される
    • 例:

echo "hoge" > 他人の端末
とすると、他人の端末に文字表示。
cat 他人の端末ファイル
とすると、他人の端末の入力を横取り。
(他人の端末では、文字のエコーバックがないし、何も入力できないように見えるので、キーロガーにはなりにくいとは思うけど)
なお、他人の端末にアクセスするには、root権限が必要。

なので、SELinuxでは端末にロールに応じたラベルをつけている。

→今まで通りallowtty,pts <ロール>相当のものを設ける

  • ラベル付けされていない /dev/tty*と /dev/ptmx , /dev/tty, /dev/ttyS0
    • 消去されない限り、特に困らない。

→ 今まではallowtty/pts generalで設定していたが、それを使う。「noowner」にしようかな。

  • /dev/console

システムログの一部が閲覧される。
/dev/console経由で変なメッセージ(?)
→/dev/consoleは普通にファイル単位のアクセス制御が可能なので、そちらで。

  • /dev/vcsへのアクセス

スクリーンショットを取られることで、もしかしたら情報漏洩。
端末への文字表示で作業を邪魔。
→対策:
/dev/vcsxxxというファイル名を使ってファイルのallow文でアクセス制御可能だが、
ファイル数が多くなるので,allow文での設定は困難
結局/dev/tty(数字)全てにアクセスと同じ意味。
これは、allowtty 「global」と同じ操作になるので、allowtty globalにまとめる。

allowtty allowptsをallowdevに整理

allowtty,allowptsはallowdevにまとめた。
で、上の考察を踏まえ、以下のように

  • allowdev -tty|-pts|-allterm open;
    • 独自の端末を開くことを許可。roleブロック内でしか意味がない。
  • allowdev -tty|-pts|-allterm <ロール> r,w;
    • ロールが作った端末を読み書き
  • allowdev -tty|-pts|-allterm <ロール> admin;
    • ロールが作った端末の持ち主を変える
  • -ttyは/dev/tty*の端末。-ptsは/dev/ptsの端末。-alltermは両方。
    • <ロール>をgeneralにすると、ラベル付けされてない端末。globalにすると、全端末ファイルおよび/dev/vcs

できたらいいな機能

バイスファイルは、ファイル名をみてもピンとこないことが多い。
GUIでは「ディスクデバイス r: s: w: x:」みたいに表示して、
内部的には/dev/hda*,/dev/sda*へのallowを出力するとか。。