通常、OpenSSHの設定がされていれば、ssh/scpと同様にsftpが利用可能となります。
しかし、この状態だとcd
コマンドでどこへでも移動可能なので、外部の人にデータ授受の目的でユーザーアカウントを提供するのに適していません。
そのような場合、特定のユーザーアカウントにはssh/scpを禁止するとともに、sftpでホームディレクトリ以外への移動を抑制する事ができるChroot機能を使います。
ここでは、その設定について記載します。
OpenSSHの設定
まずはOpenSSHの設定を編集し、特定のユーザーをChroot機能の対象となるようにします。
以下の例では、ワイルドカードを利用してsftp-
で始まるユーザーは、Chroot機能の対象となるように設定しています。
su -
cp /etc/ssh/sshd_config{,.YYYYMMDD}
vi /etc/ssh/sshd_config
diff /etc/ssh/sshd_config{,.YYYYMMDD}
/etc/ssh/sshd_configの変更内容
133,134c133
< #Subsystem sftp /usr/libexec/openssh/sftp-server
< Subsystem sftp internal-sftp
---
> Subsystem sftp /usr/libexec/openssh/sftp-server
143,146d141
<
< Match User sftp-* # `sftp-`で始まるユーザーはChroot機能対象
< ChrootDirectory ~ # ホームディレクトリ(`~`)以外は利用不可
< ForceCommand internal-sftp
対象となるユーザー作成
実際に対象となるsftp-
で始まるユーザーを作成してみます。
useradd sftp-user00001
passwd sftp-user00001
Chroot機能を使う場合、ホームディレクトリの所有者をroot
にする必要があります。
以下の設定では、アクセスは/home/sftp-user00001
以下、書き込みは~/upload
以下のみにしています。
chown -R root:root /home/sftp-user00001
chmod 755 /home/sftp-user00001 # 755にしないと`ls`とか出来ない
mkdir /home/sftp-user00001/upload
chown -R sftp-user00001:sftp-user00001 /home/sftp-user00001/upload # 書き込めるように
動作確認
以下の動作確認は別サーバから行った。
(対象サーバ: target-server
/ ポート: 10220
)
接続できること
sftp -oPort=10220 sftp-user00001@target-server
sftp>
各種コマンドが実行できること
sftp> cd upload
sftp> ls
upload
sftp> put test.txt
test.txt
他のディレクトリに移動できない事
sftp> cd /var
Couldn't canonicalise: No such file or directory