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

最終更新日時:2010-02-09 00:31:14
OpenSSH FTP

概要


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

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

基本構築


まずはOpenSSHを通常通りインストールします。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


上記の設定により、ftpuser1は internal-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したディレクトリには書き込み権限が無いことになるので、書き込み可能なディレクトリをそのディレクトリ以下に用意する必要があります。
これで設定は完了なので、sshdをreloadすればOKです。

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


ftpでは簡単に実現できたユーザーごとのディレクトリの共有。
例えば、以下のような設定が、ChrootDirectoryを使ったchrootでは実現できません。
・ftpuser1がchrootするディレクトリ:/home/ftpuser1
・ftpuser2がchrootするディレクトリ:/home/ftpuser1/ftpuser2
・ftpuser1は/home/ftpuser1/ftpuser2以下も書き込み権限あり

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

お問い合わせは 掲示板 にて。