正常に動作する次のスクリプトを作成しました。このスクリプトは sftp ユーザーを作成し、ユーザーがログインすると になりますが、/var/base/test1
このディレクトリに書き込むことはできません。その後/var/base/test1/test1
、 に入ってから書き込むことができます。
しかし、これは少し面倒なので、理想的には、ユーザーが ftp 経由でログインするときにディレクトリに入るようにしたいです/var/base/test1/test1
。これを容易にする方法はありますか? ChrootDirectory (sshd_config 内) を に変更すると/var/base/test1/test1
、ftp ユーザーはログインできなくなります。
mkdir -p /var/base/test1/test1
chown root:root /var/base/test1
chown root:root /var/base
chmod 755 /var/base/test1
adduser --disabled-password --gecos test1
echo “test1:apassword” | chpasswd
chown test1:test1 /var/base/test1/test1
vim /etc/ssh/sshd_config
systemctl restart sshd
sshd_config:
Match User test1
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/base/test1
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
答え1
短い答え
これは不可能ですが、/test1
回避策としてホームに設定します。
長い答え
openssh
ChrootDirectory
では、 およびそれに至るすべてのパス コンポーネントがルート所有であり、他のユーザーによる書き込みができないことを要求します。これは、 がChrootDirectory
悪意を持って操作され、たとえばまったく別の場所へのシンボリック リンクに置き換えられることのないようにするためのセキュリティ対策です。またはChrootDirectory
その親ディレクトリのいずれかがルートによって所有されていないか、グループまたはワールドが書き込み可能である場合、sshd
はログインを拒否します。これが発生すると、 に次のような内容が表示されます/var/log/auth.log
。
Jun 10 07:54:01 ubuntu-bionic sshd[2251]: fatal: bad ownership or modes for chroot directory "/var/base/test1"
Jun 10 07:54:01 ubuntu-bionic sshd[2173]: pam_unix(sshd:session): session closed for user test1
エラーメッセージは正しい方向を指し示すはずです。
これは、sshd_config マニュアルページ:
Chrootディレクトリ
認証後に chroot(2) するディレクトリのパス名を指定します。セッションの起動時に、sshd(8) はパス名のすべてのコンポーネントが他のユーザーまたはグループによって書き込みできないルート所有のディレクトリであることを確認します。chroot 後、sshd(8) は作業ディレクトリをユーザーのホーム ディレクトリに変更します。[...]安全のため、ディレクトリ階層がシステム上の他のプロセス (特に jail 外のプロセス) によって変更されないようにすることが非常に重要です。誤った設定は、sshd(8) が検出できない安全でない環境につながる可能性があります。
回避策
ただし、ユーザーのホーム ディレクトリを/test1
( sudo usermod test1 -d /test1
) に設定することができます。その場合、 がchroot
適用された後、ディレクトリは に変更されます/var/base/test1/test1
。その場合、ユーザーは に変更する必要はなく、そのディレクトリで既にセッションtest1
を開始します。sftp
$ sftp -P 2222 test1@localhost
test1@localhost's password:
Connected to localhost.
sftp> pwd
Remote working directory: /test1