#TL;DR
- 共有開発環境でgit cloneするディレクトリには、groupを設定してsetgid bitを付けるとよい。
- 同時にumask を002にする。ちょっと怖い。
- UPGに従えば怖くないらしい。
##課題
Webアプリ開発で、CIでdeployするほどでもない共有環境(客先やテスターに見せる画面とか)のdeployは直接git pullですませることが多い。 が、複数人で開発していると、そのままではgit pullする際にpermission deniedではじかれる。
sudo -u [共有ユーザ] git pull
- pullした後に
chmod -R go+w .
とかのルールでしばらく運用できるが、
うっかりsudo -s git pull
でrootになった
鍵上書いた
セキュリティひどい。
大体破たんする。
なんか方ないかなーと調べていたら、既にRed HatがBest Practiceをだいぶ昔に提案していた、というお話し。
- 共有のファイルを置きたいディレクトリ(共有フォルダ)を作成する
mkdir /opt/appname
- 書き込み権限を与えるグループを指定する
chgrp users /opt/appname
- setgid bitを立てる
*
chmod g+ws /opt/appname
- グループに、書き込めるメンバーを放り込む
- `usermod -G users mapps
こうすることで、全体の設定をいじることなく、共有フォルダ的なものが快適に運用できる。
ただし、user/groupがUPGに従っていない場合は、umask 002を明示的に指定する必要がある。
ファイルを新規作成する際のpermissionを決めるための設定。
"許可しないbit"を指定する方式なので直感的にわかりずらいが、かなり柔軟に設定できる設計になっており、分かると作った人の頭の良さに感心する。
が、linuxを普通に運用できる設定値は現実的には3-4種類しかないため、無駄な柔軟さな気がしなくもない。
この辺参照: http://x68000.q-e-d.net/~68user/unix/pickup?umask http://kazmax.zpp.jp/linux_beginner/default_permission.html http://open-groove.net/linux/umask/
- 新しく作るファイルを「644」(自分だけ書き込み可)にしたければ→umask 022
- 新しく作るファイルを「664」(グループの人も書ける)にしたければ→umask 002
- .sshなど、機密性を確保したいディレクトリ(自分以外は入れない)→umask 077
- ファイルは読めないけど、ディレクトリには入れる→umask 066
CentOSでgrep -r umask /etc
して出てくる設定はこの4種類だけ。実運用上もセキュリティに配慮しつつ意味がある設定はこの程度のはず。
企業などで複数人が触る開発環境(Webアプリのテスト用環境とか)はumaskは基本的に002で運用したい。だけどlinuxに詳しくない人が適当に作ったファイルが他の人も読み書きできちゃうのはどーよ、ということを解決するための発想。 setgid bit(chmod g+ws)とうまく組み合わせると、いわゆる[共有フォルダ]が簡単に運用できる。
- ユーザには主グループと補助グループを設定できるが、主グループはユーザ名と同じ名前とし、自分だけが所属するグループにしておく(ユーザ名がmappsならグループ名もmapps)
- この条件が満たされてれば、umaskは常に002となるように設定する
- 共有フォルダを作りたい場合、補助グループを作り(usersとか、プロジェクト名とか)、ユーザを登録する。
こうしておくことにより、常にファイルは664、ディレクトリは775のpermissionとなるが、なにも設定せずにファイルを作った場合、グループ所有者は主グループつまり自分しか所属していないグループとなるため、事実上他の人から見られることはなくなる。
脱線ではあるが、むしろこちらを書きたかった。
/etc/bashrc
/etc/csh.cshrc
/etc/profile
の3ファイルにスクリプトコードとして実装されている。
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
UIDが199以上(一般ユーザ)で、ユーザ名とグループ名が一致していたら、UPGに従っているので安全とみなしてumaskを002に切り替えている。**超プリミティブだがわかりやすい。**久々に感動した。
-
pam_umask.soモジュールに
USERGROUPS_ENAB
というboolパラメータがあり、Yesに設定すると、一般ユーザのumaskは自動的に002に変更される模様。 -
パラメータ設定は
/etc/login.defs
に記載する -
USERGROUPS_ENAB
を「userdelコマンド実施時に、ユーザグループから除外するか否か」と書いてあるblogもある。間違ってはいないけどUPGに従った結果、主グループは不要になるので除外されるようになるだけだと思う。 http://taikou09.blog33.fc2.com/blog-entry-23.html
先にredhatのマニュアルとgrep -r umask /etc
の結果で手繰って調べていったが、Ubuntuでつまずいた。pam_umask.soというのが開発されてて、より厳密に設定できるようになっているらしい。
このあたりのことは、RedHatのマニュアルが分かりやすかった。 3.1.1. ユーザープライベートグループ 3.3.3. グループディレクトリの作成