unoh.github.com

ウェブ開発の共同作業でパーミッションを有効活用する

Thu Feb 22 21:16:51 -0800 2007

前回カメラをなくした!!とかいってたら見つかってホッとしているjokagiです. 前回のエントリの書き上げはかなりサボってしまったので,その影響で今回はすぐに順番が回ってきてしまいました. 今回も負けずにロングエントリで行きます!!

このエントリの目的

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

必須環境

少なくとも初期作業においてはroot権限が必要になります. また,ある程度最低限のコマンドやその実行結果についての知識,あるいは調べる能力が必要になるかもしれません.

UNIXの一般的なファイルシステムのパーミッションについて

基本的なこと

UNIXのファイルシステムはいろいろありますが,おおむねパーミッション(アクセス権限)は3段階のレベルがあります.

User
ファイル・ディレクトリの所有者自身についての権限を現します.
Group
アカウント情報で同じグループに所属する人たちの権限をあらわします.
Other
前述のどれでもない人たちの権限をあらわします. Otherは「UserとGroupを含むすべてのアカウント」でなく,「UserとGroupに所属''しない''すべてのアカウント」であることに注意してください.
レベル対象ls -la のイメージ
Userファイルのオーナーの権限rwx------
Groupファイルやディレクトリのオーナーグループに所属するユーザーの権限---rwx---
Other上記のいずれでもないユーザーの------rwx

特殊なパーミッション

余談からですが,パーミッションを3桁の8進数(755とか666とか)で表す人がいますが,実はそもそもパーミッションは24ビット9ビットではなく,もっと多い桁数なので4桁必要です.

さて本題ですが特殊なパーミッションというのは何があるのか? ですが,chmodコマンドの日本語マニュアルを参照するとこういう記述があります.

 特別なアクセス権
 
     1000 プログラムコードをスワップに維持
     2000 実行時にグループ ID を設定
     4000 実行時にユーザー ID を設定

1000は使ったことがないのでコメントかトラックバックでいい例題を教えてください(苦笑 2000と4000はそれぞれオーナーユーザーあるいはグループはディレクトリに付加すると,中でファイルやディレクトリを作成するとオーナー情報を継承するというイメージになります.

本当に正確な意味はファイルシステムを専門に勉強したわけじゃないのでわかりませんが(苦笑

つまり,共同作業のとき,共通のグループを用意し,関係者をすべてそのグループに追加し,ディレクトリに2000を付加すればそのディレクトリ以下のオーナーグループが共通になるはずということです.

とりあえず試してみる

テスト条件

テストにはjokagiというユーザーを作成し,グループにunohを追加,unohにjokagiを追加します.

ユーザー名:jokagi elf
グループ名:jokagi elf unoh(jokagiとelfはこちらにも所属する)
ウェブ作業ディレクトリ:/home/web/

アカウントとグループを作成する

useraddとgroupaddでユーザーとグループを作成し,グループunohにユーザーjokagiを登録します. 下記作業はroot権限で作業を行ってください.

# /usr/bin/useradd jokagi
# /usr/bin/useradd elf
# /usr/bin/groupadd unoh
# /usr/bin/usermod -G unoh jokagi
# /usr/bin/usermod -G unoh elf

ここで注意すべきことは,usermodなど,アカウント情報の修正をした場合,ログアウトをしなければその情報が反映されない場合があるということです. ここではusermodをした場合はjokagiは一旦ログアウトするようにします.

余談ですがusermodで別グループの追加ができるんですね.いつもvigrで作業をしていました.

上記のようにすると例えばアカウント情報を表示するコマンドidの表示は下記のようになります.

$ id jokagi
uid=500(jokagi) gid=500(jokagi) 500(jokagi),502(unoh)
$ id elf
uid=501(elf) gid=501(elf) 501(elf),502(unoh)

やっと実験開始!!

さてそれでは実際にディレクトリを作成して試して見ましょう.

大まかな流れ

大まかには下記のような流れで作業をします.

  • ルートになるディレクトリ(ここでは/home/webとします)を用意する
  • /home/webのオーナーを共通グループにする
  • /home/webのパーミッションは少なくともディレクトリは「u+rwx g+rwx」に,ファイルは「u+rw g+rw」にする
  • /home/webを触るアカウントのumaskは0002にする

基本的な作業手順

それでは実際の作業を行います.作業はroot権限で下記のように行います.

まずディレクトリを作成します.

# /bin/mkdir /home/web
# ls -lad /home/web
drwxr-xr-x 2 root root 4096 Feb 23 13:12 /home/web

作成されたディレクトリのオーナーとパーミッションを設定します.

# /bin/chgrp unoh /home/web
# /bin/ls -lad /home/web
drwxrwxr-x 2 root unoh 4096 Feb 23 13:12 /home/web
# /bin/chmod u+rwx,g+srwx /home/web
drwxrwsr-x 2 root unoh 4096 Feb 23 13:12 /home/web

これでOKです. それではユーザーjokagiになってテストをしてみましょう.

まずユーザーjokagiになってオーナーとパーミッションの確認をしてみます.

# /bin/su - jokagi
$ ls -lad /home/web
drwxrwsr-x 2 root unoh 4096 2007-02-23 13:12 /home/web

次に/home/webに移動してオーナーとパーミッションの確認をします.

$ cd /home/web
$ ls -la
total 8
drwxrwsr-x 2 root   unoh    4096 Feb 23 13:12 .
drwxr-xr-x 3 jokagi jokagi  4096 Feb 23 13:12 ..

それではファイルとディレクトリを作成してオーナーとパーミッションの確認をしてみましょう.

$ touch file
$ mkdir directory
$ ls -la
total 12
drwxrwsr-x 3 root   unoh   4096 Feb 23 13:44 .
drwxr-xr-x 3 jokagi jokagi 4096 Feb 23 13:12 ..
drwxr-sr-x 2 jokagi unoh   4096 Feb 23 13:44 directory
-rw-r--r-- 1 jokagi unoh      0 Feb 23 13:44 file

どうでしょう? グループがunohになっていますね. それではユーザーelfで同様な作業をしてみましょう.

# /bin/su - elf
$ touch file2
$ mkdir directory2
$ ls -la
total 16
drwxrwsr-x 3 root   unoh   4096 Feb 23 13:44 .
drwxr-xr-x 3 jokagi jokagi 4096 Feb 23 13:12 ..
drwxr-sr-x 2 jokagi unoh   4096 Feb 23 13:44 directory
drwxr-sr-x 2 elf    unoh   4096 Feb 23 13:45 directory2
-rw-r--r-- 1 jokagi unoh      0 Feb 23 13:44 file
-rw-r--r-- 1 elf    unoh      0 Feb 23 13:45 file2

いかがでしょうか? オーナーユーザーはそれぞれ作成ユーザーに,グループは共通になっているのがわかるでしょうか?

応用

これの応用としてapacheの実行ユーザー(通常apacheやnobody)を共通グループに登録するという技があります. apacheのファイルやディレクトリ操作もコマンドラインでの操作と基本的には変わらないので,上記内容と同様の処理が行われ,その結果apacheで作成したディレクトリやファイルを一般ユーザーが編集削除できるということになります.

逆に言うとapacheからウェブコンテンツのファイル(HTMLや画像)の改ざんもできるということになりますので,セキュリティリスクが高まるともいえますので使用するという決定には細心の注意をすべきです.

注意すること

今回はグループを活用したファイル管理になるので,グループライタブルでない(グループ権限ベースで書き込めない状態)ファイルやディレクトリがでてくると,そのファイルはオーナーユーザーしか編集ができなくなります.

また前述のようにユーザーやグループデータベースの編集を行った場合,ログアウトしなければ反映されない場合があります.

GUIを使用している場合

こういう状態になるパターンの多くはumaskが0022になっている状態,例えばGUIのftpクライアントやsftpクライアントなどを使用している場合に発生している気がします. 特にGUIで作業をしている方はどういうパーミッションをソフトウェアが設定するか再確認をしておくに越したことはありません.

別の場所にあるファイルやディレクトリを移動する場合

また,ディレクトリやファイルの移動を行うときにも注意してください. それらの移動時にはg+sな指定の影響は受けないので,オーナーグループが期待したものと異なる状態になるでしょう.

事後対処

対策は上記作業を行ったユーザーならできます. 例えばパーミッションの問題ならコマンドラインで下記のようにします.

$ cd .../target/path/to
$ chgrp -R unoh *
$ find . -type d -exec chmod u+rwx,g+rwx {} \;
$ find . -type f -exec chmod u+rw,g+rw {} \;

対象にドットで始まるファイルやディレクトリがあるときはchgrpでは下記のようにしましょう.

$ chgrp -R .??*

終わり

いかがでしょうか? 共同開発を行う場合,パーミッションをオールライタブル(誰でも読み書きできる)な状態で行っていたり,共通アカウント(webmasterなど)を用意して吹く数人で共用している人は意外と多いんじゃないでしょうか?

前者は本当にパーミッションという概念が破綻してしまうのである意味ありえませんし,後者は個人情報保護を見据えるとあまりいただけない判断になると思います. それらは今回のようにグループを活用することで十分回避することができます.

ウェブアプリケーションを共同で開発する場合,ファイルの権限などの問題は誰しもが一度は悩むところだと思います. もし心当たりがあり,試す環境がある方はぜひ一度お試しください. それではあでゅー