sftpでユーザがアクセスできるディレクトリを制限する

sftpでユーザがアクセスできるディレクトリを制限するには、chroot設定を行う。

同時にsftpのみ許可し、sshアクセスできないようにも制限できる。

目次

ユーザホームフォルダをroot所有に変更

chrootではホームフォルダをroot所有に変更する必要があるため、以下のように変更する。

chown root:root /home/[user]

/home/[user]はユーザのホームディレクトリ。

ユーザホームフォルダの権限を変更

chrootではホームフォルダから指定フォルダに移動できる必要があるため、以下のように変更する。

chmod 655 /home/[user]

/home/[user]はユーザのホームディレクトリ。

sshd_configを修正し、chrootを有効化する

/etc/ssh/sshd_configにて、以下の設定を追加する。

Match User [user]
  ChrootDirectory /home/%u
  ForceCommand internal-sftp

%uはユーザ名で、/home/[user]ディレクトリが指定されることになる。 また、internal-sftpコマンドを指定することで、sshアクセスもできないように制限できる。

sshdサービスを再起動して設定を有効化

service sshd restart

アップロード用のディレクトリを作成

ホームフォルダはroot所有にしているため、ファイルのダウンロードはできてもファイルのアップロードはできない。

また、write権限を与えるとchrootによるログインができなくなるので、ホームフォルダのパーミッションを変更することもできない。

そのため、ホームフォルダ以下にアップロード用のディレクトリを作成する。  

mkdir /home/[user]/upload

作成したアップロード用のディレクトリを、ユーザ所有に変更する。

chmod [user]:[user] /home/[user]/upload

これで、uploadフォルダ以下はユーザがファイルアップロード可能になる。

動作確認

sshアクセスできるか試してみる。

$ ssh -i ~/.ssh/[secret_key] hoge@xxx.xxx.xxx.xxx
This service allows sftp connections only.
Connection to xxx.xxx.xxx.xxx closed.

sftpのみしかコネクション許可していない、というメッセージがでてsshアクセスはできなくなっている。

sftpアクセスしてみる。

sftp -i ~/.ssh/[secret_key] hoge@xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx.

正しく接続できた。 現在のディレクトリを確認してみる。

sftp> pwd
Remote working directory: /

/となっており、ホームフォルダ以外のディレクトリに移動できないようになった。

upload以下にファイルがアップロードできるか試してみる。

> put example.log upload/
Uploading example.log to /upload/example.log
example.log                          100%   81     6.6KB/s   00:00

正しくアップロードできることも確認できた。

このエントリーをはてなブックマークに追加
Takatomo Honda avatar
About Takatomo Honda
システム開発 / プロトタイプ開発 / 開発組織の構築 / アプリケーションの内製化 /等、お気軽にご相談ください。