SCP と SFTP
関連記事
Secure copy (SCP) は Secure Shell 接続を使ってファイルを転送するプロトコルです。SSH file transfer protocol (SFTP) は同じようなプロトコルで、SCP と同様に Secure Shell をバックエンドとして使います。どちらのプロトコルでもパスワードや転送データが暗号化されるので、安全にファイルを転送できます。ただし、SFTP プロトコルには、中断した転送の再開やリモートのファイルを削除したりする機能が追加されています。
目次
Secure file transfer protocol (SFTP)
OpenSSH をインストール・設定するだけで SFTP のセットアップも完了しています。SSH が動作しているのであれば、SSH のデフォルト設定で有効になっているので SFTP も同じく動作しています。設定が古い場合は以下の手順に従ってください。
適当なエディタで /etc/ssh/sshd_config
を開いて、以下の行を (存在しない場合) 追加してください:
Subsystem sftp /usr/lib/ssh/sftp-server
sshd.service
デーモンを再起動すれば SFTP が機能します。
sftp プログラムや sshfs を使ってファイルを操作できるはずです。標準的な FTP プログラムも大抵は動作します。
chroot 監獄 による Secure file transfer protocol (SFTP)
システム管理者は、openssh を使って、ユーザのサブセットを chroot 監獄にし、特定のディレクトリツリーへのアクセスを制限することができます。これは、完全なシステムアクセスやシェルアクセスを許可することなく、単にいくつかのファイルを共有するのに便利です。このタイプの設定のユーザは、filezilla のような SFTP クライアントを使用して、chroot 監獄内にファイルを置いたり取得したりすることができます。
ファイルシステムのセットアップ
監獄ディレクトリの作成:
# mkdir -p /var/lib/jail
オプションで、このディレクトリに共有するファイルシステムをバインドマウントします。この例では、/mnt/data/share
を使用します。所有者はrootで、8 進数のパーミッションは 755 です。
# mount -o bind /mnt/data/share /var/lib/jail
非特権ユーザーの作成
共有ユーザーを作成し、適切なパスワードを設定します。
# useradd -g sshusers -d /var/lib/jail foo # passwd foo
OpenSSHの設定
/etc/ssh/sshd_config
の末尾に以下を追加して、共有を有効にし、制限を実施するようにします。
/etc/ssh/sshd_config
... Match group sshusers ChrootDirectory %h X11Forwarding no AllowTcpForwarding no PasswordAuthentication yes ForceCommand internal-sftp
sshd.service
を 再起動して、設定ファイルを再読み込みします。chroot を使用する場合は SFTP chroot を参照して正しくキーを設定しないと、パーミッションが拒否されることがあります。
シェル経由で ssh 接続を試みて、実際に制限がかかっていることをテストしてください。ssh サーバは、設定されたことを丁寧に通知してくれるはずです。
$ ssh foo@someserver.com
foo@someserver.com's password: This service allows sftp connections only. Connection to someserver.com closed.
Secure copy protocol (SCP)
openssh をインストール・設定して起動してください。パッケージにはファイルを転送するための scp コマンドが含まれています。詳しくは Secure Shell を参照。
rsshAUR や scponly などのパッケージをインストールすることでさらに機能を追加できます。下を参照。
一般的な使用方法
Linux から Linux
リモートホストからローカルホストにファイルをコピーする SCP の例:
$ scp username@from_host:file.txt /local/directory/
ローカルホストからリモートホストにファイルをコピーする SCP の例:
$ scp file.txt username@to_host:/remote/directory/
リモートホストからローカルホストにディレクトリをコピーする SCP の例:
$ scp -r username@from_host:/remote/directory/ /local/directory/
ローカルホストからリモートホストにディレクトリをコピーする SCP の例:
$ scp -r /local/directory/ username@to_host:/remote/directory/
リモートホストからリモートホストにファイルをコピーする SCP の例:
$ scp username@from_host:/remote/directory/file.txt username@to_host:/remote/directory/
Linux から Windows
WinSCP などの Windows プログラムを使用します。
Scponly
Scponly は scp/sftp だけでしかコンピュータにアクセスできないようにする制限的なシェルです。さらに、scponly で特定のディレクトリに chroot をセットアップして更にセキュリティを高めることもできます。
既にユーザーを作成している場合、ユーザーのシェルを scponly に設定するだけです:
# usermod -s /usr/bin/scponly username
これで完了です。適当な sftp クライアントを使用してテストしてみてください。
chroot 監獄の追加
パッケージには chroot を作成するスクリプトが付属しています。使用するには:
# /usr/share/doc/scponly/setup_chroot.sh
- 質問に答えてください。
/path/to/chroot
の所有者をroot:root
にして others の権限をr-x
にします。- 使用するユーザーのシェルを
/usr/bin/scponlyc
に変更します。 - sftp-server は libnss_files などの libnss モジュールを必要とします。モジュールを chroot の
/lib
パスにコピーしてください。
Chroot 監獄のルートディレクトリにアップロードする
セキュリティ上の理由から、chroot ディレクトリとして設定されたディレクトリは、rootが所有し、rootのみが書き込み権限を持つ必要があり、root でなければ sftp/ssh 接続が拒否されます。もちろん、これは一般ユーザがルートディレクトリにファイルをアップロードできないことを意味します。この問題を回避し、セキュリティを損なわないようにするには、chroot ディレクトリ内に、通常のユーザまたはグループが書き込み権限を持つフォルダを作成します。例えば、
# cd /var/lib/jail # mkdir uploads # chown :sshusers uploads # chmod 730 uploads
SFTP を利用するアプリケーションの中には、操作(ファイルのアップロードなど)を行う際にサブディレクトリの入力を許可せず、chroot のベースディレクトリにファイルをアップロードしようとする(これは拒否される)ものがあります。これらのアプリケーションで特定のサブディレクトリを使用するように強制するには、"ForceCommand" オプションに以下を追加してください。
/etc/ssh/sshd_config
... Match group sshusers ... ForceCommand internal-sftp -d /uploads
接続したユーザーのスタートディレクトリは、指定したサブディレクトリに変更されます(sshdサーバーの再起動を忘れずに)。