sftpの下で特定のユーザーによって作成されたすべてのファイルに特定のグループとファイルのアクセス許可を持たせる方法はありますか?もちろん、問題のユーザーはグループのメンバーになりますが、それは彼のプライマリグループではありません。言い換えれば、sftpがumaskとnewgrpの効果を自動的に複製する方法はありますか?
(Open)SSHにはsubsystemのようなものがあります。これは、対話型シェル以外のものを要求すると起動するプログラムです。技術的には、リモートホスト上の実行可能ファイルであり、認証してsetuidを呼び出した後、exec
の子によってsshd
されます。
SSH構成でsftp
の標準サブシステム定義を見つけることができます。
Subsystem sftp /usr/lib/openssh/sftp-server
これは単なる実行可能ファイルであり、SUIDやその他の特別なものではないため、必要な属性を変更するシェルスクリプトを記述して、元のサブシステムハンドラーを起動するだけです。
次のスクリプトを/usr/lib/openssh
フォルダーに配置します。例: sftp-fperm-server
(これは必須ではありません。物事を1か所にまとめるためだけです):
#!/bin/sh
umask 026
exec /usr/lib/openssh/sftp-server
次に、/etc/ssh/sshd_config
の最後に行を追加します。
Subsystem sftp-fperm /usr/lib/openssh/sftp-fperm-server
次に、sshd
を再起動し(再起動時にセッションを強制終了しません)、-s sftp-fperm
オプションを指定してsftp
を起動します。出来上がり!ファイルは、新しく指定されたumaskを取得します。
毎回そのオプションを指定したくない場合は、標準のサブシステム定義を変更するだけです。インタラクティブセッションは影響を受けないため、何かを壊す可能性はありません。
newgrp
コマンドを使用する場合は、少し注意が必要です。 newgrp
は常に新しいインタラクティブシェルを起動しますが、愚かなことにパラメータを渡すことはできません。そのため、前の例のumask
として使用することはできません。ただし、スクリプトの最後の行を次のように置き換えることができます。
Shell=/usr/lib/openssh/sftp-server newgrp git
私が所属するグループのnewgrp
を実際に呼び出すと、パスワード要求が発行されるため、この解決策を確認できませんでした(つまり、newgrp
1つだけです)が、/bin/id
を渡すと機能します。私のラップトップ(SSHなし)では、ユーザーのためにnewgrp
が機能していれば、問題は発生しません。
Whitequarkが言っていることに加えて、これらの線に沿ってソリューションを構築することもできますが、グループの一種の「su」であるnewgrpの代わりに「sg」コマンドを使用します。少なくとも、どのLinuxシステムでも「mansg」として検索してください。
chmod g+s directory
将来作成されるすべてのディレクトリとファイルの所有権をユーザーのグループに付与します。
これはサーバー固有だと思います。潜在的な構成オプションについては、サーバー構成を確認してください。