前回まで4回にわたり、lsコマンドにオプションを指定するとファイルやディレクトリのパーミッションを確認できること、そして「rwx」で表されるパーミッションの読み解き方などについて紹介してきた。実は「rwx」による指定だけでは困るケースがあるため、さらにいくつかのパーミッションが用意されている。今回は、その代表格として「rwx」の「x」の部分が「s」または「t」になっているものについて説明しよう。

パーミッション「t」(スティッキー・ビット)

まず知っておいたほうがよいのが、/tmp/に設定されているパーミッションだ。/tmp/のパーミッションは、UNIX系のOSなら大体次のようになっている。

/tmp/のパーミッション

「持ち主以外のユーザー」が、そのディレクトリの下のファイルやディレクトリを編集できるかどうかを表す部分が「t」になっているのがおわかりいただけるだろうか。この「t」によって表されるパーミッションは、「スティッキー・ビット」と呼ばれる。ちなみに、CentOS 7でスティッキー・ビットが設定されたディレクトリを探すと、次のような結果が得られる。

スティッキー・ビットが設定されたディレクトリ

ご覧のとおり、ほとんど/tmp/である。スティッキー・ビットはほぼ/tmp/のために導入されたような機能だと思っておけばよい。

スティッキー・ビットが設定されたディレクトリの下のファイル/ディレクトリは、そのファイル/ディレクトリの持ち主しか削除できなくなる。たとえグループのユーザーに対して削除や編集が許可されていても、その持ち主以外は変更できない(ただし、最強の権限を持っているrootは例外で、変更も削除もできる)。

これは、すべてのユーザーがファイルを書き出したりする/tmp/を不具合なく動作させるためだけに用意されたような機能だ。対象はディレクトリで、どのユーザーも読み書きできることが前提になっている場所なので、パーミッションの表記は「drwxrwxrwt」のようになっている。

スティッキー・ビットの存在意義がいまいち理解できない場合、「これはほぼ、/tmp/専用の機能」、「/tmp/以外に設定されていたら、何かマズイ気がする」ということを押さえておいてもらえれば良いと思う。

パーミッション「s」(SUID)

ユーザーに対するパーミッションの実行許可の部分が「x」ではなく「s」になっていることがある。これは「SUID(Set User ID on excution)」と呼ばれているもので、実行ファイルに付与されるフラグだ。

SUIDが設定された実行ファイル

SUIDが設定された実行ファイルは、実行時に、ユーザー権限ではなくファイルの持ち主の権限を持って動作せよ、と指定されていることになる。例えば、パスワード変更で考えてみるとわかりやすいのだが、通常、パスワード・データはrootの権限を持っていなければ変更できない。しかし、一般ユーザーもパスワードは変更できるようになっていないと困る。つまり、passwdコマンドは、一般ユーザーの権限ではなくroot権限で動作してほしいわけだ。SUIDは、こうした場合に使う。

passwdにはSUIDが設定されているので、誰が実行してもroot権限で動作する

passwdコマンド以外にもいくつかのコマンドにはSUIDが設定されており、一般ユーザーが管理者権限の必要なファイルを編集しなければならないときに使われている。

パーミッション「s」(SGID)

「s」は、もう1カ所設定されることがある。それは、グループに対して設定されている場合で、「SGID(Set Group ID on excution)」と呼ばれる。

SGIDが設定された実行ファイル

SGIDの設定されたファイルは、実行ファイルのグループの権限で動作する。理由はSUIDのときと同様、そうでなければ困るコマンドがあるからだ。

この機能、なくてもよいんじゃ……?

/tmp/を使わないようにしたり、単一のファイルではなく複数のファイルにデータを配置したりして構造や実装を変更すれば、スティッキー・ビットやSUID/SGIDを使わないで済ませる方法はある。現在なら、スティッキー・ビットやSUID/SGIDの存在を前提とした設計は良しとはされないだろう。これらの機能を必要としている既存のコマンドやソフトウェアを書き換えれば、機能自体を削除することもできるはずだ。

とは言え、すでにこの機能の存在を前提としたソフトウェアが存在しているし、1度作ったからには互換性のためにも残しておく必要がある。積極的に使いたいとは言えない機能なので、管理者としては「こういう機能がある」、「乱用されると危ない気がする」ということだけ押さえておいてもらえればよいと思う。

今回のおさらい

今回のおさらいは、次のとおりだ。

  • /tmp/のパーミッションには、「drwxrwxrwt」のように「t」が付く。これがスティッキー・ビットを表している
  • スティッキー・ビットのついたディレクトリの下では、持ち主とrootのみがファイルやディレクトリの削除/名前の変更ができる
  • SUIDが付いていると、実行時の権限が実行ファイルの持ち主になる
  • SGIDが付いていると、実行時の権限が実行ファイルのグループになる

先にも述べたように、管理者が積極的に使うような機能ではないし、悪用されやすい面もあるので、一般ユーザーやほかの管理者ユーザーがこれらの機能を乱用しているのを見かけたら、「デンジャラスだな」と思える感性を身に付けておいてほしい。