仕様
-
ドキュメントルート配下のみ操作することができます。
- ドキュメントルートは/var/www/htmlとします。
-
パスワード認証でログインします。
-
SSHは利用できません。
ユーザーを作成
useradd sftp-user
passwd sftp-user
usermod -d / sftp-user
usermod -g apache sftp-user
chown sftp-user:apache /home/sftp-user
ポイント:所有グループをapacheに設定しパーミッション775にすることで、apacheの権限エラーを防ぎます。
#SFTP設定
vim /etc/ssh/sshd_config
修正内容
#PasswordAuthentication no //コメントアウト
#Subsystem sftp /usr/libexec/openssh/sftp-server //コメントアウト
Subsystem sftp internal-sftp
Match User sftp-user
ChrootDirectory /var/www/sftp
ForceCommand internal-sftp -u 0002
PasswordAuthentication yes
パラメータ | 説明 |
---|---|
Match | userかgroupを指定して条件範囲を指定 |
ChrootDirectory | chrootを行うディレクトリパス |
ForceCommand | 強制コマンド設定 |
PasswordAuthentication | パスワード認証を行うか |
補足:ForceCommand internal-sftp -u 0002 することでsftp-userがファイルをアップロードしたとき、
グループに権限が与えられます。未設定だと755だが、設定後775になります。
(グループに権限を与えることでapacheによる書き込みを許容します。)
修正後は再起動します。
systemctl restart sshd
ディレクトリ作成
ディレクトリ構成
まず抑えておきたいのがchrootに指定するディレクトリの権限は
root:rootのパーミッション755でなければならない
ということです。
この制約があることでディレクトリ構成が以下のようになります。
var
└ www
├ ドキュメントルート
└ chrootに指定するディレクトリ
└ 権限を委譲するためのディレクトリ(ドキュメントルートをマウントする)
ドキュメントルートの権限を変更
chown sftp-user:apache /var/www/html/
chmod 775 /var/www/html/
chrootに指定するディレクトリを作成
mkdir /var/www/sftp
chown root:root /var/www/sftp/
chmod 755 /var/www/sftp/
権限を移乗するためのディレクトリを作成
mkdir /var/www/sftp/sftp-user
chown sftp-user:apache /var/www/sftp/sftp-user
chmod 775 /var/www/sftp/sftp-user
権限を移乗するためのディレクトリを作らず、chroot直下にドキュメントルートを置くとrootユーザーしか操作できません。
ドキュメントルートをマウントする
mount -B /var/www/html /var/www/sftp/sftp-user
オプション | 説明 |
---|---|
B | 任意のディレクトリを別のディレクトリ下にマウントできる |
/var/www/sftp/sftp-user/ の配下にドキュメントルートと同様のファイル、ディレクトリが追加されます。
またファイルをアップロードしたら、相互追加されます。
サーバーリブート対策
再起動するとマウント解除されてしまいますので設定します。
vim /etc/fstab
追加
/var/www/html /var/www/sftp/sftp-user none bind 0 0
fstabについて丁寧に書かれている記事はこちら
以上です。サーバー内を好き勝手されたくない時はSFTPユーザーを作成しましょう。