クライアント上のファイルをサーバにSFTPでアップロードできるようにします。
今回解説する手順は、SFTP専用のユーザを作成して、Chrootにより限定された場所にファイルをアップロードできるようにする手順となります。
環境について
サーバ側の環境
- Ubuntu
- OpenSSHサーバ ※インストール済み
クライアント側の環境
- macOS Monterey
OpenSSHサーバの環境構築
SFTP専用ユーザーの作成
sudo adduser sftpuser
ユーザ認証はパスワード認証を使うので、任意のパスワードを設定します。
※ 公開鍵認証も可能ですが、SFTP中心の解説にしたいので省略します。
SFTP専用グループの作成
sudo groupadd sftponly
ユーザをグループに追加 ※セカンダリグループ
sudo adduser sftpuser sftponly
SFTP専用ディレクトリの作成
SFTP専用ディレクトリの作成 ※Chrootディレクトリ
sudo mkdir /var/sftp
sudo chown root:root /var/sftp
SFTP専用ユーザのディレクトリの作成 ※ここにアップロードする
sudo mkdir /var/sftp/sftpuser
sudo chown sftpuser:sftponly /var/sftp/sftpuser
sudo chmod 755 /var/sftp/sftpuser
OpenSSHサーバの設定
設定ファイルの編集
sudo vi /etc/ssh/sshd_config
※ /etc/ssh/ssh_config というファイルもあるけれども、設定するのは/etc/ssh/sshd_config
設定した内容(一部抜粋)※既存の設定の変更やコメントアウトなど
AllowTcpForwarding no
X11Forwarding no
Subsystem sftp internal-sftp
設定した内容 ※末尾に追記
Match User sftpuser
ChrootDirectory /var/sftp
ForceCommand internal-sftp
PasswordAuthentication yes
- ChrootDirectory は、SFTP接続した際のルートディレクトリを/var/sftp に設定する
- ForceCommand internal-sftp により、SFTP の利用に限定する(SSHとSCPが使えない)
- ChrootDirectory とForceCommand internal-sftp の両方を設定することでChroot とSFTP 限定が有効になるようです
設定の有効化
OpenSSH サーバを再起動
sudo systemctl restart sshd
接続確認
サーバのローカル環境上でのSFTP接続の確認
sftp sftpuser@localhost
接続確認(クライアントからサーバ)
SFTP接続の確認(成功)
Mac のターミナルを使ってネットワーク経由でSFTP接続の確認
echo "test" > testfile.txt
sftp sftpuser@<hostname またはipaddress>
→パスワードを入力してユーザ認証
pwd
→ Remote working directory: /
put testfile.txt
→ remote open("/testfile.txt"): Permission denied
cd sftpuser
put testfile.txt
ls
quit
- 接続した時点のカレントディレクトリは/var/sftp がルートディレクトリとなっていて、ディレクトリの所有者とグループがroot なのでput でファイルをアップロードしようとすると失敗します。
- cd でカレントディレクトリを/var/sftp/sftpuser に変えてからput するとアップロードが成功します。
SSHとSCP接続の確認(失敗)
SSHの接続を試してみると失敗します
ssh sftpuser@<hostname またはipaddress>
→ This service allows sftp connections only.
SCPの接続を試してみると失敗します
scp testfile.txt sftpuser@<hostname またはipaddress>:
→ This service allows sftp connections only.
あとがき
ChrootDirectory を/var/sftp としましたが、ユーザのホームディレクトリ/home/sftpuser を指定してもよさそうです。
SFTPでファイルのアップロード・ダウンロードをするのが専用のユーザなので、SSH接続できるユーザがそのファイルのコピー等をするのにどこが運用上望ましいかで判断する感じでしょうか。