前回カメラをなくした!!とかいってたら見つかってホッとしているjokagiです. 前回のエントリの書き上げはかなりサボってしまったので,その影響で今回はすぐに順番が回ってきてしまいました. 今回も負けずにロングエントリで行きます!!
このエントリの目的
複数人でウェブコンテンツを作成運用管理する場合,特に本番サーバーのファイルのパーミッションで悩んでいる人をよく見かけます.
あまりパーミッションを積極的に有効活用できない人は挙句に誰でも読み書きできる(いわゆる0666や0777)ザルにすることが多いでしょう.
いや待ってください.
もうちょっと丁寧に設定してみませんか? というお話です.
必須環境
少なくとも初期作業においてはroot権限が必要になります. また,ある程度最低限のコマンドやその実行結果についての知識,あるいは調べる能力が必要になるかもしれません.
UNIXの一般的なファイルシステムのパーミッションについて
基本的なこと
UNIXのファイルシステムはいろいろありますが,おおむねパーミッション(アクセス権限)は3段階のレベルがあります.
レベル | 対象 | 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は一旦ログアウトするようにします.
上記のようにすると例えばアカウント情報を表示するコマンド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で作成したディレクトリやファイルを一般ユーザーが編集削除できるということになります.
注意すること
今回はグループを活用したファイル管理になるので,グループライタブルでない(グループ権限ベースで書き込めない状態)ファイルやディレクトリがでてくると,そのファイルはオーナーユーザーしか編集ができなくなります.
また前述のようにユーザーやグループデータベースの編集を行った場合,ログアウトしなければ反映されない場合があります.
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など)を用意して吹く数人で共用している人は意外と多いんじゃないでしょうか?
前者は本当にパーミッションという概念が破綻してしまうのである意味ありえませんし,後者は個人情報保護を見据えるとあまりいただけない判断になると思います. それらは今回のようにグループを活用することで十分回避することができます.
ウェブアプリケーションを共同で開発する場合,ファイルの権限などの問題は誰しもが一度は悩むところだと思います. もし心当たりがあり,試す環境がある方はぜひ一度お試しください. それではあでゅー