きっかけ
複数ユーザで、あるwebサイトのドキュメントルートを編集することになり、そのときに気づいたことを整理してみました。。
SFTPとファイルパーミッションとumask
状況として、共通のユーザグループXに属している複数ユーザが、SFTPで特定ディレクトリ以下を編集するというものです。
ポイント1. グループ所有者の権限
この場合、グループ所有者に対する権限を常に適切に設定されてることが重要です。
新規作成時には、読み書きの権限(必要なら実行権限も)があり、既存のものに対してもその権限を維持する必要があります。
グループ所有者の書き込み権限が落ちると、他のユーザは編集も削除もできなくなります。
ポイント2. ログインシェル + umaskでは対応できない
上の話からすると、デフォルトのパーミッションを決めるumaskでなんとかしようとなります。
今回のケースでは umask 0002
とすることで、グループ所有者に、rw(x)の権限が付与されます。
まずはやるのは、ログインシェルでの対応です。
bashなら、.bashrcに umask 0002
を追加すれば、ログインの度にデフォルトのパーミッションが設定されるので、sshログインの場合なら今回の目的は達成されます。
ですが、残念なことにsftpについてはこれではだめです。
結論. sftp-serverで対応
ではどうするかというと、sshd_configに、sftpコマンドの実体を決めている箇所があり、それがsftp-serverです。
Subsystem sftp /usr/libexec/openssh/sftp-server
これには、umaskを設定するオプションがあるので下記にようにすればOKです。
Subsystem sftp /usr/libexec/openssh/sftp-server -u 002
これだと全ユーザに対して有効になるので、対象を絞りたい場合は、
Match User X
# Subsystem sftp /usr/libexec/openssh/sftp-server -u 002 ← Matchに使えるものが限定されているのでこれはできない
ForceCommand /usr/libexec/openssh/sftp-server -u 002
を追記すれば、対象のユーザグループに対してのみ、設定が上書きされます。
あるいは、シェルスクリプトでラップして、そっちでユーザグループの判定をするとかです。
参考サイト
- http://dev.classmethod.jp/etc/sftp_and_apache_write/
- http://qiita.com/idacchi/items/22d360932bb43fecee88
- http://hacknote.jp/archives/11289/
- http://sig9.hatenablog.com/entry/2016/10/26/120000
- http://qiita.com/incep/items/7e5760de0c2c748296aa
- http://kazmax.zpp.jp/linux_beginner/default_permission.html
- http://qiita.com/kawaz/items/53d1c837dd762337eb3b