OpenSSHを使ってRSA公開鍵認証なchroot付きSFTPサーバを立てる方法

(Last Updated On: 2011年12月9日)

簡単なように思えて,結構ハマったのでメモしておきます.
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 を直接編集するという強行手段でも構わないのですが,ログオフが必要な上に結構危険です.
編集するにしても,vigrvipw という専用のコマンドがあります.

クライアント側で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 すればいいだけです.
問題はここからです. /passpass/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 -vsftp -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)
 

コメントを残す

メールアドレスが公開されることはありません。