SFTP chroot
OpenSSH 4.9 以上には sftp 用の chroot が含まれていますが、通常のインストールに多少の調整が必要です。
目次
インストール
OpenSSH をインストールして設定してください。起動したら、デフォルトで SFTP が使えるようになります。
sftp や SSHFS でファイルにアクセスしてください。大抵の FTP クライアントが使えます。
代替
Secure copy protocol (SCP)
openssh をインストールするとファイルを転送するための scp コマンドが使えるようになります。SCP は SFTP よりも高速に動作します [1]。
代替シェルとして rsshAUR あるいは scponly をインストールしてください。
Scponly
既存のユーザーのシェルを scponly に設定:
# usermod -s /usr/bin/scponly username
詳しくは Scponly Wiki を参照。
chroot 監獄の追加
パッケージには chroot を作成するためのスクリプトが付属しています。使用するには:
# /usr/share/doc/scponly/setup_chroot.sh
- 質問に答えてください。
/path/to/chroot
の所有者がroot:root
で他者のパーミッションがr-x
であることを確認してください。- ユーザーのシェルを
/usr/bin/scponlyc
に変更してください。 - sftp-server は libnss_files などの libnss モジュールを必要とします。chroot の
/lib
パスにコピーしてください。
設定
ファイルシステムの設定
共有したいファイルシステムをディレクトリにバインドマウントします。以下の例では root
ユーザーによって所有されているパーミッションが 755
の /mnt/data/share
を使います:
# chown root:root /mnt/data/share # chmod 755 /mnt/data/share # mkdir -p /srv/ssh/jail # mount -o bind /mnt/data/share /srv/ssh/jail
エントリを fstab に追加して再起動してもバインドマウントされるようにしてください:
/mnt/data/share /srv/ssh/jail none bind 0 0
非特権ユーザーの作成
まず sftponly
グループを作成してください:
# groupadd sftponly
そしてユーザーを作成 (`sftponly` をメイングループにします):
# useradd -g sftponly -d /srv/ssh/jail username
account is locked
エラーを防ぐために (複雑な) パスワードを設定:
# passwd username
シェルからのログインアクセスを拒否:
# usermod -s /sbin/nologin username
OpenSSH の設定
/etc/ssh/sshd_config
Match Group sftponly ChrootDirectory %h ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no PasswordAuthentication no
sshd.service
を再起動すると変更が適用されます。
authorized_keys のパスの修正
AuthorizedKeysFile のパスがデフォルトのままだと SSH 鍵の認証は失敗します。修正するには、/etc/openssh/sshd_config
の AuthorizedKeysFile に root が所有しているディレクトリを追加してください (例: /etc/ssh/authorized_keys
):
/etc/ssh/sshd_config
AuthorizedKeysFile /etc/ssh/authorized_keys/%u .ssh/authorized_keys PermitRootLogin no PasswordAuthentication no PermitEmptyPasswords no Subsystem sftp /usr/lib/ssh/sftp-server
authorized_keys フォルダを作成し、クライアントでSSH 鍵を生成して、鍵の中身をサーバーの /etc/ssh/authorized_keys
にコピーして適切なパーミッションを設定してください:
# mkdir /etc/ssh/authorized_keys # chown root:root /etc/ssh/authorized_keys # chmod 755 /etc/ssh/authorized_keys # echo 'ssh-rsa <key> <username@host>' >> /etc/ssh/authorized_keys/username # chmod 644 /etc/ssh/authorized_keys/username
設定できたら sshd.service
を再起動してください。
Tips and tricks
書き込み権限
chroot ユーザーのバインドパスは完全に root
によって所有される必要がありますが、中のファイルやディレクトリはその限りではありません。以下の例では backup ユーザーでホームディレクトリとして (root によって所有される) /root/backups
を使用します:
# mkdir /root/backups/share # chown backup:sftponly /root/backups/share # chmod 775 /root/backups/share # touch /root/backups/share/file # chmod 664 /root/backups/share/file
ログ出力
ユーザーは /dev/log
にアクセスできなくなります。ユーザーで接続してファイルのダウンロードを開始してプロセスに対して strace
を実行することで確認できます。
サブディレクトリの作成
ChrootDirectory
に dev
サブディレクトリを作成してください。例:
# mkdir /usr/local/chroot/user/dev # chmod 755 /usr/local/chroot/user/dev
syslog-ng
は /usr/local/chroot/theuser/dev/log
デバイスを作成します。
Syslog-ng の設定
/etc/syslog-ng/syslog-ng.conf
に新しいソースを追加して設定を記述してください。例えば、以下を:
source src { unix-dgram("/dev/log"); internal(); file("/proc/kmsg"); };
以下のように変更:
source src { unix-dgram("/dev/log"); internal(); file("/proc/kmsg"); unix-dgram("/usr/local/chroot/theuser/dev/log"); };
そして以下を追加:
#sftp configuration destination sftp { file("/var/log/sftp.log"); }; filter f_sftp { program("internal-sftp"); }; log { source(src); filter(f_sftp); destination(sftp); };
SSH のメッセージも同じようにログに残したい場合 (syslog-ng#ログを別のファイルに移動を参照):
#sshd configuration destination ssh { file("/var/log/ssh.log"); }; filter f_ssh { program("sshd"); }; log { source(src); filter(f_ssh); destination(ssh); };
OpenSSH の設定
/etc/ssh/sshd_config
を編集して internal-sftp
を全て internal-sftp -f AUTH -l VERBOSE
に置き換えてください。
サービスの再起動
syslog-ng
と sshd
サービスを再起動してください。
/usr/local/chroot/theuser/dev/log
should now exist.