Skip to content

Instantly share code, notes, and snippets.

@takemi-ohama
Last active July 5, 2022 23:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save takemi-ohama/425c82a2af0927dd64ca to your computer and use it in GitHub Desktop.
Save takemi-ohama/425c82a2af0927dd64ca to your computer and use it in GitHub Desktop.
[Linux]共有ディレクトリの実現方法

#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をだいぶ昔に提案していた、というお話し。

setgidでの共有フォルダ

  • 共有のファイルを置きたいディレクトリ(共有フォルダ)を作成する
    • mkdir /opt/appname
  • 書き込み権限を与えるグループを指定する
    • chgrp users /opt/appname
  • setgid bitを立てる * chmod g+ws /opt/appname
  • グループに、書き込めるメンバーを放り込む
    • `usermod -G users mapps

こうすることで、全体の設定をいじることなく、共有フォルダ的なものが快適に運用できる。

ただし、user/groupがUPGに従っていない場合は、umask 002を明示的に指定する必要がある。

そもそも、umaskとは

ファイルを新規作成する際の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種類だけ。実運用上もセキュリティに配慮しつつ意味がある設定はこの程度のはず。

UPG(User Private Group)とは

企業などで複数人が触る開発環境(Webアプリのテスト用環境とか)はumaskは基本的に002で運用したい。だけどlinuxに詳しくない人が適当に作ったファイルが他の人も読み書きできちゃうのはどーよ、ということを解決するための発想。 setgid bit(chmod g+ws)とうまく組み合わせると、いわゆる[共有フォルダ]が簡単に運用できる。

UPGのルール:

  • ユーザには主グループと補助グループを設定できるが、主グループはユーザ名と同じ名前とし、自分だけが所属するグループにしておく(ユーザ名がmappsならグループ名もmapps)
  • この条件が満たされてれば、umaskは常に002となるように設定する
  • 共有フォルダを作りたい場合、補助グループを作り(usersとか、プロジェクト名とか)、ユーザを登録する。

こうしておくことにより、常にファイルは664、ディレクトリは775のpermissionとなるが、なにも設定せずにファイルを作った場合、グループ所有者は主グループつまり自分しか所属していないグループとなるため、事実上他の人から見られることはなくなる。

(脱線)ディストリビューションごとのUPGの実装

脱線ではあるが、むしろこちらを書きたかった。

CentOSの場合

/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に切り替えている。**超プリミティブだがわかりやすい。**久々に感動した。

Ubuntuの場合

  • 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. グループディレクトリの作成

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment