OpenSSHのsftp専用ユーザーを設定する

スポンサーリンク

概要

この内容は以前の記事なので、若干古い可能性があります。
内容が示すとおり、Gumblar が流行った頃の情報になります。

ファイル転送の方法としてはFTPがこれまでよく使われてきましたが、通常のFTPは通信が平文というセキュリティ的な弱みを持っており、しかもここ最近ではGumblarのようなFTPアカウントを狙って盗むようなウイルスも出現しました。
従って、もはやFTPは捨ててしまい、scpもしくはsftpに全面的に切り替える時が来たのではないかと思います。
そこで、OpenSSH を使用してFTPの代替えとなるsftp専用ユーザーを作成する方法を紹介します。
まだまだFTPほどには使い勝手的にはよくないですが、chrootしてセキュリティ的にさらに高めることもできます。

なお、ここで紹介する方法は古いバージョンでは対応していないものもあります。
特に internal-sftpChrootDirectory はわりと最近のバージョンで対応しました。
ちなみに、私が設定したバージョンは、openssh-5.3p1 です。

基本構築

まずは OpenSSH を通常通りインストールします。
Linux 系であれば yum などの各種パッケージ管理を使ってインストールしてしまうのが常道です。
ソースアーカイブからのインストールやパッケージ管理コマンドでうまくインストールできない場合には、OpenSSHのインストール をどうぞ。

次にsftp専用のユーザーを作成します。
ユーザー自体は普通に作成すればOKです。

 # useradd ftpuser1

さらに、ftpuser1 で普通にsshでログインできるように、公開鍵等を設定します。
ここまでは至って普通の設定です。

sftp専用設定

ここからが通常のユーザーとは異なる設定となります。
まず、sshd_config のsftp設定を以下のように変更します。

 Subsystem       sftp    internal-sftp

この設定は、sshdが内部で持っている internal-sftp で、sftpをサービスするという設定となり、次で紹介するchroot設定を行う場合に非常に楽になります。
さらに、以下のような設定をファイルの最後に追加します。

 Match user ftpuser1
   ForceCommand internal-sftp

上記の設定により、ftpuser1internal-sftp しかコマンドが使えなくなり、実質的に sftp でしかアクセスができなくなります。
また、Match user 設定のブロックの区切りはよく分からないので、ファイルの最後に記述しておくのが無難です(^_^;
さらに、Match group でグループで設定することも可能です。

なお、chrootしない場合には、通常通り以下の設定でもOKです。

 Subsystem       sftp    /usr/local/libexec/sftp-server

ディレクトリ制限

sftp専用ユーザーの参照権限として、ある特定のディレクトリ以下のみ参照可能にしたいことはよくあります。
このような場合、ftpであればいわゆるchrootを使うのですが、OpenSSH でも同様にchroot設定が可能です。
ちなみに、OpenSSH ではパッチをあててchroot対応する方法や、/usr/local/libexec/sftp-server を使ってchrootする方法もあるのですが、internal-sftp を使う方法が圧倒的に簡単なので、ここではinternal-sftp を使う方法を紹介します。
internal-sftp を使ってchrootするには、以下のように ChrootDirectory 設定を追加するだけでOKです。

 Match user ftpuser1
   ForceCommand internal-sftp
   ChrootDirectory /home/%u

なお、%u はユーザー名に展開されます。
つまり上記の設定では、/home/ftpuser1 にchrootされます。

ここで注意が必要なのは、ChrootDirectory によるchrootは、所有者やパーミッションの設定が非常に厳格であることです。
chrootするディレクトリそのものだけでなく、そのディレクトリまでの全ての階層のディレクトリが以下の条件を満たす必要があります。

  • 所有者は root
  • パーミッションは最低でも 755

従って、上記で設定した /home/ftpuser1 の所有者は root である必要があります。

 # chown root:root /home/ftpuser1

よって、sftp専用のユーザーはchrootしたディレクトリには書き込み権限が無いことになるので、書き込み可能なディレクトリをそのディレクトリ以下に用意する必要があります。

これで設定は完了なので、あとは sshdreload すればOKです。

共有ディレクトリについて

ftpでは簡単に実現できたユーザーごとのディレクトリの共有。
例えば、以下のような設定が、ChrootDirectory を使ったchrootでは実現できません。

  • ftpuser1 がchrootするディレクトリ:/home/ftpuser1
  • ftpuser2 がchrootするディレクトリ:/home/ftpuser1/ftpuser2
  • ftpuser1/home/ftpuser1/ftpuser2 以下も書き込み権限あり

あまりに設定が厳格すぎてこのような設定が出来ないのは非常に困ったものなのですが、良い方法とかあるでしょうか?(/_\;)
私は仕方がないので、現状ではchrootするディレクトリはユーザー別々に用意し、そこから共有ディレクトリに定期的に同期を取るような仕掛けで凌いでます。
早くこんなつまらん設定は外したいので、条件をもう少し緩めて欲しい。。。。(/_\;)
せめでグループレベルでの書き込み権限とか、root以外の所有者とかあたりは許可して欲しいですね。

コメント

タイトルとURLをコピーしました