SCP と SFTP

提供: ArchWiki
2023年1月19日 (木) 10:02時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎Scponly: typo 修正)
ナビゲーションに移動 検索に移動

関連記事

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
ヒント: bind mount が再起動しても大丈夫なように、/etc/fstab にエントリを追加することを検討してください。

非特権ユーザーの作成

共有ユーザーを作成し、適切なパスワードを設定します。

# 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 を参照。

rsshAURscponly などのパッケージをインストールすることでさらに機能を追加できます。下を参照。

一般的な使用方法

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インストールしてください。

既にユーザーを作成している場合、ユーザーのシェルを 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
ノート: この場合、"sshusers" グループのユーザのみが "uploads" ディレクトリにアップロードすることができます (ただし、その内容を表示することはできません)。sshusers がコンテンツを閲覧できるようにするには、 chmod 770 を使用してください。

SFTP を利用するアプリケーションの中には、操作(ファイルのアップロードなど)を行う際にサブディレクトリの入力を許可せず、chroot のベースディレクトリにファイルをアップロードしようとする(これは拒否される)ものがあります。これらのアプリケーションで特定のサブディレクトリを使用するように強制するには、"ForceCommand" オプションに以下を追加してください。

/etc/ssh/sshd_config
...
 Match group sshusers
  ...
  ForceCommand internal-sftp -d /uploads

接続したユーザーのスタートディレクトリは、指定したサブディレクトリに変更されます(sshdサーバーの再起動を忘れずに)。