簡単なように思えて,結構ハマったのでメモしておきます.
SSH サーバは既に稼働していることを前提に書きますので,SSH,SSHd の細かい設定は他サイト様に委ねます.
仕様および前提
sftpを許可するユーザ: ftpuser(シェルでのログイン不可)
ftpuserの所属グループ: ftpgroup
ftpuserのhome: /home/ftpuser
ftpuserに公開したいディレクトリ: /pass/to/chrooted
環境
$ lsb_release -drc
Description: Ubuntu 11.10
Release: 11.10
Codename: oneiric$ uname -r
3.0.0-13-generic$ ssh -v
OpenSSH_5.8p1 Debian-7ubuntu1, OpenSSL 1.0.0e 6 Sep 2011
まずサーバ側でftpgroup,ftpuser を作成します.
# groupadd ftpgroup
# useradd --create-home --home /home/ftpuser --shell /bin/false -g ftpgroup
確認
$ getent group | tail -n 1
ftpgroup:x:133:ftpuser$ getent passwd | tail -n 1
ftpuser:x:1001:133::/home/ftpuser:/bin/false
/etc/group
や/etc/passwd
を直接編集するという強行手段でも構わないのですが,ログオフが必要な上に結構危険です.
編集するにしても,vigr
やvipw
という専用のコマンドがあります.
クライアント側でRSA鍵ペアを作成します.既に作成済みの場合,飛ばしてください.
$ ssh-keygen -t RSA -b 2048
できたら,エディタでもUSBメモリでもscp でも構わないので,クライアントの~/.ssh/id_rsa.pub をサーバの/home/ftpuser/.ssh/authorized_keys にコピーします. ((今回はPC1 -> PC2 へはssh可能,PC2 -> PC1 へはsftp のみ可能としたかったので,scp 使えるならsftp 要らないじゃん,というツッコミは無しで.))
通常のSSHと同じですね.
パーミッションは以下のように設定します.
/home 755 root:root (おそらくデフォルトでOK)
/home/ftpuser 755 root:root
/home/ftpuser/.ssh 700 ftpuser:ftpgroup
/home/ftpuser/authorized_keys 600 ftpuser:ftpgroup
処理系によっては,authorized_keys
が700 の場合もあるようです.既にSSH ログイン可能なuser の/home/user/.ssh
を確認してみてください.
ここで注意しなければならないのが,/home/ftpuser
の所有者がroot だということです.とはいえ,ここまでは単にchown
すればいいだけです.
問題はここからです. /pass
,pass/to/
,/pass/to/chrooted
もそれぞれ所有者がroot かつ他ユーザの書き込み不可である必要があります.
「そうすべき」ではなく「そうする必要があります」.
これは,セキュリティの観点からルール化されたものです.詳しい背景はここに書いてあります.
それじゃあ/pass/to/chrooted
を/media/hard_disk/ftp
にしたいけど,/media/hard_disk
の所有者は一般ユーザに残しておきたい・・・ということができないかというと,そんなことはありません.以下に方法例を書いておきます.と言ってもSimLink貼るだけです.
# cd /home/ftpuser
# ln -s /pass/to/chrooted ./
# chown root:root /pass/to/chrooted
# chmod 755 /pass/to/chrooted
/home/ftpuser
の所有者はroot に設定してあるので,/pass
,/pass/to
(あるいは/media
,/media/hard_disk
)の所有者がroot である必要はなくなります.
また,/pass/to/chrooted の所有者はroot である必要があるのですが,/pass/to/chrooted/data
の所有権はftpuser:ftpgroup で構いません.
普段使ってるユーザをftpgroup に加えておくか,/pass/to/chrooted/data
のパーミッションを777 にでも設定すれば管理が楽でしょう.おそらく前者のほうがセキュリティ的には好ましいと思われます.
次に/etc/sshd_config
をエディタで編集します
#AuthorizedKeysFile %h/.ssh/authorized_keys
AuthorizedKeysFile %h/.ssh/authorized_keys#Subsystem sftp /usr/local/libexec/sftp-server
Subsystem sftp internal-sftp# 最後の行に以下を追記.全角スペースは半角に変換
Match user ftpuser
ChrootDirectory /home/ftpuser/chrooted
AllowAgentForwarding no
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
internal-sftp を使うのは,ftpuser はchroot
をかけたディレクトリの外に出られないからです.
つまり,/usr/local/libexec/sftp-server
にもアクセスできなくなるからです.
書けたら
/etc/init.d/ssh restart
クライアント側からサーバ(192.168.1.1)にアクセスしてみます.ssh -p
の-p
はポートですが,sftp
では-P
(大文字)です.
$ ssh -p 10000 ftpuser@192.168.1.1
Enter passphrase for key '/home/client_user/.ssh/id_rsa':
This service allows sftp connections only.
Connection to 192.168.1.1 closed.$ sftp -P 10000 ftpuser@192.168.1.1
Enter passphrase for key '/home/client_user/.ssh/id_rsa':
Connected to 192.168.1.1.
sftp> exit
上手くいかなければssh -v
,sftp -v
してみれば何か分かるかもしれません.
もう一度,所有権をまとめて書いておきます.
/home/ftpuser/:
drwxr-xr-x root:root .
drwxr-xr-x root:root ..
lrwxrwxrwx root:root share -> /pass/to/chrooted/home/ftpuser/.ssh:
drwx------ ftpuser:ftpgroup .
-rw------- ftpuser:ftpgroup authorized_keys/pass/to/chrooted
drwxr-xr-x root:root .
drwxrwxrwx ftpuser:ftpgroup data
nautilus のFile -> Connect to Server にでも登録しておくと便利かもしれません.
参考サイト
restrictive ssh problem (ForceCommand, ChrootDirectory): Write failed: Broken pipe
あるシステム管理者の日常: sftpとChrootDirectory(3)