chrootの設定でハマった話【cloudpack 大阪 BLOG】

chrootの設定でかなりハマったので、今回はその内容をまとめたいと思います。

実現したいこと

sftp_userの接続時のホームディレクトリを「/home/sftp_user/home_dir」に制限したい。
 意図は、bash_profile、bash_history、.sshなどをsftp接続ユーザーに見せたくないため

設定方法

ユーザー追加
useradd sftp_user
passwd sftp_user
/etc/ssh/sshd_configの設定変更
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

Match User sftp_user
    ChrootDirectory /home/sftp_user/home_dir
    ForceCommand internal-sftp
    PasswordAuthentication yes
sshd再起動
/usr/sbin/sshd -t    ← 構文チェック
service sshd restart

sshdサービス再起動は十分注意してください。再起動が失敗した場合、新たにssh接続ができなくなります。
クラウドサービスのように直接接続する手段がない場合に対応するときは、別でもう一つssh接続をしておくなど慎重に対応してください。
今回はAWSでの対応のため、起動失敗のままセッションを切ってしまうと接続できなくなってしまい、リカバリ対応がかなり大変になることが想定されました。

ディレクトリの設定
chown root:root /home/sftp_user/home_dir ←必須
chmod 755 /home/sftp_user/home_dir   ←必須

mkdir /home/sftp_user/home_dir/data
chmod 755 /home/sftp_user/home_dir/data

※「/home/sftp_user/home_dir/」にはsftp_userの書き込み権限がないため、書き込み可能なディレクトリを用意しておく必要があります。

接続確認
sftp sftp_user@IP_ADDR

でパスワードを入力して接続OK

これで対応完了!

としたかったのですが・・・

接続は鍵認証にしたかったようなので、接続用の鍵を作成し設定しました。
いざ接続確認してみるものの、Connection Refuse・・・
再度ユーザー作成し、sshで鍵認証ができることを確認してから上記対応を行うも接続出来ない状況でした。
/var/log/secureを確認しても芳しい情報は得られずでなかなか解決ができませんでした。

で、もう一度よく設定を見直すと今回chrootの設定先は「/home/sftp_user/home_dir」となります
そのため「/home/sftp_user」はroot権限に設定しているため、ssh接続時に鍵の参照ができてないため接続エラーとなっていることに気が付きました。

ということで上記のディレクトリ構成のままで鍵認証ができないことが分かったので、制限用のディレクトリは別途「/var/sftp/sftp_user」などにすることで解決しました。