SFTP chroot

From ArchWiki
Jump to navigation Jump to search

OpenSSH 4.9 以上には sftp 用の chroot が含まれていますが、通常のインストールに多少の調整が必要です。

インストール

OpenSSHインストールして設定してください。起動したら、デフォルトで SFTP が使えるようになります。

sftpSSHFS でファイルにアクセスしてください。大抵の FTP クライアントが使えます。

代替

Secure copy protocol (SCP)

openssh をインストールするとファイルを転送するための scp コマンドが使えるようになります。SCP は SFTP よりも高速に動作します [1]

代替シェルとして rsshAUR あるいは scponly をインストールしてください。

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
ノート: Readers may select a file access scheme on their own. For example, optionally create a subdirectory for an incoming (writable) space and/or a read-only space. This need not be done directly under /srv/ssh/jail - it can be accomplished on the live partition which will be mounted via a bind mount as well.

非特権ユーザーの作成

ノート: 必ずしもグループを作成する必要はありません。Match Group の代わりに Match User を使うことができます。

まず sftponly グループを作成してください:

# groupadd sftponly 

そしてユーザーを作成 (`sftponly` をメイングループにします):

# useradd -g sftponly -d /srv/ssh/jail username

account is locked エラーを防ぐために (複雑な) パスワードを設定:

# passwd username

シェルからのログインアクセスを拒否:

# usermod -s /sbin/nologin username

OpenSSH の設定

ノート: グループを使用しない場合 Match Group の代わりに Match User を使ってください。
/etc/ssh/sshd_config
Match Group sftponly
  ChrootDirectory %h
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no
  PasswordAuthentication no

sshd.service再起動すると変更が適用されます。

authorized_keys のパスの修正

ヒント: (pre)auth エラーが発生する場合、クライアントとサーバーで OpenSSH のデバッグモードを使ってください。

AuthorizedKeysFile のパスがデフォルトのままだと SSH 鍵の認証は失敗します。修正するには、/etc/openssh/sshd_configAuthorizedKeysFile に 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再起動してください。

ヒントとテクニック

書き込み権限

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 を実行することで確認できます。

サブディレクトリの作成

ChrootDirectorydev サブディレクトリを作成してください。例:

# 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-ngsshd サービスを再起動してください。

/usr/local/chroot/theuser/dev/log should now exist.

参照