過去都是用 samba 在區網中分享檔案,方便,快速,又不必新增使用者(單純讀取不寫入),傳過 4GB 左右的檔案都沒問題。
但是上個月有個大檔 (13GB) 要傳到 Win 7,但是透過 samba 下載不到十分鐘就會跳網路錯誤,接著就從頭開始傳檔,搜尋了一下,似乎是 Windows 的問題,只好在 Linux 上架 sftp , Win 7 使用 WinSCP 來傳,速度至少有 5 MB/s ,偶爾可以衝到 6 MB/s (中間還有經過無線網路),就算斷線還可以續傳,對於傳大型檔案來說是不可或缺的功能,也有 log 可以看,但是有個缺點 — 檔案名稱除了正體中文外,還包含日文或簡體字時,在 WinSCP 上會顯示問號,沒辦法正常顯示。
原本要設 chroot sftp ,結果搞了半天,發現 openssh 對 chroot directory 的限制還挺嚴格的,後來還是決定有需要才開啟帳號,平常把 ssh 關掉比較沒有安全上的顧慮,順便紀錄一下設定過程。
Package:
- openssh 5.9p1-3
- WinSCP 4.3.4
sftp user name: sftptest
sftp server ip: 192.168.1.2
------
# Create user account
sudo useradd -m sftptest
sudo passwd sftptest
# Generate ssh key
# WinSCP only accept "rsa" and "dsa" ,not support for "ecdsa" yet (PuTTYgen)
su sftptest
cd /home/sftptest
ssh-keygen -C "$(id -un)@$(uname -n)-$(date --rfc-3339=date)"
cp .ssh/id_rsa.pub .ssh/authorized_keys
# copy .ssh/id_rsa to client machine
# Disable sftp user from login into shell
usermod -s /bin/false sftptest
# Test if able to establish sftp connection from other machine
# also verify user is unable to login from ssh
sftp -i id_rsa_from_sftp_server sftptest@192.168.1.2
ssh sftptest@192.168.1.2 -i id_rsa_from_sftp_server
# Setup Windows client
# WinSCP only accept the ssh-key generated by PuTTYgen
# In PuTTYgen menu, select Conversions -> Import to load id_rsa
# Save private key will create a *.ppk file, use it in WinSCP
# Also set UTF-8 Encoding for Filenames -> On in WinSCP
# for non-ANSCII file names
測試的時候被 sftp 的 chroot directory 搞了很久,錯誤訊息根本不對,最後是跑去看 /var/log/auth.log 才想到問題可能是出在那邊
Error message for chroot directory ownship problem :
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer
這錯誤丟 Google ,大部分的解都是說要設定 TimeOut,進 /var/log/auth.log 一看,才發現問題是出在權限設定上
sshd[12399]: fatal: bad ownership or modes for chroot directory component "/path/of/chroot/directory/"
如果要設定 chroot sftp 路徑上所有目錄的擁有者都必須是 root ,而且其他使用者不能寫入,如果用家目錄 (%h) 當 chroot directory,還必須要注意使用者能夠讀取該目錄,不然 ssh 就會因為讀不到 key 跳 " Permission denied (publickey). " 錯誤,權限至少要 750
ls -l /home
drwxr-x--- 3 root sftptest 4.0K Sep 10 19:08 sftptest
Reference: