2007年03月03日 06:30 [Edit]

unix - permissionあれこれ

う〜ん。これ、理解があやふやだと危ないのでまとめとっか。

ウノウラボ Unoh Labs: ウェブ開発の共同作業でパーミッションを有効活用する
複数人でウェブコンテンツを作成運用管理する場合,特に本番サーバーのファイルのパーミッションで悩んでいる人をよく見かけます.あまりパーミッションを積極的に有効活用できない人は挙句に誰でも読み書きできる(いわゆる0666や0777)ザルにすることが多いでしょう.いや待ってください.もうちょっと丁寧に設定してみませんか? というお話です.

早見表 by JavaScript

Readable Writable Executable SUID/SGID
User r w x s
Group r w x s
Others r w x t
Octal: ls -l

octalわかんねー、ls -l の出力が読めねー、という人、→を利用ください。

チェックするとoctalに反映され、octalを入力するとチェックに反映されます。


そもそもパーミッションって何?という人は

以下をご覧下さい。

基礎からきちんと知りたいという人は


Essential System Administration

Æleen Frisch
[邦訳:UNIXシステム管理 第3版 Vol.1 / Vol. 2]

「UNIXシステム管理」を手元においておきましょう。

お金を取ってシステム管理をする人なら、持っていてしかるべき本です。懐が寒ければ デスクトップリファレンスでも大丈夫だとは思いますが(ただし私自身は中身を確認していない;でもパーミッションに関してはきちんと載っているはず)、持っていて損はありません。


4番目のoctalの意味

パーミッションの4番目のoctal(例えば4755の4)は、実行ビットと組み合わせて初めて意味を持ちます。実行ビットが立っていない場合、何もしません。こういう場合、例えば7644とかになっていたばあい、ls -lでは

-rwSr-Sr-T

という具合に対応箇所が大文字になってそれを知らせてくれます。

以下がその意味になります。

名称ディレクトリーそれ以外
4Set UID (SUID) 意味なし 実行したユーザーではなく、ファイルの所有者の権限で実行
2 Set GID (SGID)配下にファイルを作成した際、作成したファイルのグループが作成者のデフォルトグループではなくディレクトリーと同じグループになる 実行したユーザーのデフォルトグループではなく、ファイルのグループの権限で実行 (i.e.)
1Sticky Bit 配下に作成されたファイルの削除が、所有者のみに許可される(i.e. /tmp) 現代的には意味なし。

SUIDの事例

代表的な例は、/usr/bin/passwdです。パスワード情報は、当然誰もが読み書きできてはまずいものですが、しかしパスワードを変更するにはその時に限ってパスワード情報の書き込みを許可しなければなりません。

/usr/bin/passwdにはSUIDがセットされ、かつ所有者がrootなので、スーパーユーザーのみ読み書きを許可されたパスワード情報を書き換えることができるわけです。

SGIDの事例

代表的な例は、/usr/bin/writeです。これは他のユーザーの端末(tty)にメッセージを送るためのプログラムですが、login済みの端末はcrw--w----というパーミッションになっています。グループttyからなら書き込みは可能なので、SGIDされたwriteプログラムは他のユーザーのttyを書き込むことができるわけです。

SUID/SGIDの危険性

見てのとおり、SUID/SGIDはセキュリティーホールとなり得ます。もしlogin shellがSUIDされていたらどうなるでしょう?何でもありになってしまいます。実際、この手でやられたホストが昔結構ありました。

自分でSUID/SGIDプログラムを書く時には細心の注意が必要ですし、システム付属のSUIDプログラムも常に誰かに書き換えられていないか確認する必要があります。なにしろ、SUID/SGIDプログラムは「勝手口」なのですから。

FreeBSDの場合、毎晩SUID/SGIDされたファイルをチェックし、変化があればmailで通知してくれるようになっています。

mountのnosuidオプション

さらに、*BSDではファイルシステムをマウントする際、SUID/SGIDを無視するよう設定にすることも可能です。

ぜひとも活用しましょう。

chmod tips

パーミッションの変更は、chmodコマンドで行いますが、以外と知られていないオプションとして+Xがあります。これは、「対象がディレクトリーの場合にのみ実行ビットを立て、それ以外の実行ビットは元のまま」という意味で、-Rスイッチと組み合わせると便利です。

ウノウラボ Unoh Labs: ウェブ開発の共同作業でパーミッションを有効活用する
$ find . -type d -exec chmod u+rwx,g+rwx {} \; $ find . -type f -exec chmod u+rw,g+rw {} \;

も、これを使えば

chmod -R ug+rwX .

で済んでしまいます。

かつてはこれはBSDの象徴だったのですが、今ではchmodの実装のほとんどがこれに対応しているはずです。

最後に

Safe Hex!

Dan the Man with Too Many Permission Bits to Flip


この記事へのトラックバックURL

この記事へのトラックバック
404 Blog Not Found:unix - permissionあれこれ
404 Blog Not Found:unix - permissionあれこれ【】at 2012年01月17日 21:59
find(1)ねたというのは、定期的にblogosphereを賑わせるものだし、それはそれでよいし、私自身いくつか書いているのだけど.... findを極める! - IDEA*IDEA 〜 百式管理人のライフハックブログ 〜 タグ「find」を含む新着エントリー - はてなブックマーク 404 Blog Not ...
findを極めたかったら、statを抑えよ【404 Blog Not Found】at 2009年05月13日 13:35
「ウノウラボ Unoh Labs: コマンドラインで作業する上で知っておくといいテクニック」の用法に首を傾げたので。
勝手に添削 - find(1)【404 Blog Not Found】at 2007年03月30日 00:25
この記事へのコメント
hirose31さん、
いや、対象にしません。

http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/chmod.1.html
> X The execute/search bits if the file is a directory or any
> of the execute/search bits are set in the original (unmodified)
> mode.

ですから。厳密には「元通りセットする」です。
ただ、「元のファイルに実行ビットが立ってた場合はどうよ?」という点が曖昧でもあるので、
「対象がディレクトリーの場合にのみ実行ビットを立て、それ以外の実行ビットは元のまま」
と改めました。ご指摘ありがとうございます。
Dan the chmod user for two decades
Posted by at 2007年03月03日 23:31
>「対象がディレクトリーの場合にのみ実行ビットを立てる」

細かいですが、ディレクトリだけではなく、実行ビットが立っている*ファイル*も対象になるんじゃないですかね?

http://www.freebsd.org/cgi/man.cgi%3Fapropos%3D0%26manpath%3DFreeBSD%2B6.1-RELEASE%26query%3Dchmod%26sektion%3D1
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/chmod.1.html
http://www.linuxcommand.org/man_pages/chmod1.html

Posted by hirose31 at 2007年03月03日 23:14
「通りすがらない」さん、
あら、スーパーが抜けてた。表記をrootに改めました。
Dan the Typo Generator
「bashとか」さん、
他のshellも対策されているのでしょうか。
でもchownがSUIDされていたらもうダメですね。
Dan the Typo Generator
Posted by at 2007年03月03日 16:57
今時のshellはSUIDしてても権限落とすようになってるんですよね
Posted by bashとか at 2007年03月03日 12:46
>/usr/bin/passwdにはSUIDがセットされ、かつ所有者がユーザーなので、

かつ所有者がスーパーユーザーなので、?
Posted by 通りすがらない at 2007年03月03日 11:21