share facebook facebook twitter menu hatena pocket slack

2015.08.31 MON

SFTPをセキュアに使いたかった

開発環境サーバを構築した

ソースファイル更新をSFTPでアップロードして行う開発環境サーバを構築しました。
「SFTPのアカウントを渡す=SSHアカウントを渡す」なので、渡すのがsudoerユーザじゃないにしろ、
適当にuseraddして使わせるのはセキュアじゃないなと思いました。
よりセキュアに、できる事を絞ったユーザを作る方法を調べました。

目標

ファイルのアップデートしかできないSSHユーザを作成する

実装

SSHログインと操作可能ディレクトリを絞る

そもそも、SSHログイン自体ができなくなれば大体の事ができなくなるので絞ります。

# Subsystem sftp /usr/libexec/openssh/sftp-server #コメントアウト
Subsystem sftp internal-sftp # 追加

Match User contents
    ChrootDirectory /home/%u
    ForceCommand internal-sftp

今回の対象となるユーザ contents に対して制限をかける記述です。

  • ChrootDirectory /home/%u
    • ホームディレクトリ /home/contents 以下に閉じ込める
  • ForceCommand internal-sftp
    • SSHを禁止しSFTPのログインのみを受け付ける

で、 service sshd reload でSSHの再起動

権限系の設定

これを

drwx------   3 contents  contents   4096  8月 19 15:57 2015 contents

こうじゃ

# chown root: /home/contents
# chmod 755 /home/contents
# ls -la /home/
合計 20
drwxr-xr-x.  5 root     root     4096  8月 18 12:15 2015 .
dr-xr-xr-x. 23 root     root     4096  8月 14 14:57 2015 ..
drwxr-xr-x   3 root     root     4096  8月 19 15:57 2015 contents

( ^ω^)
⊃ .. ⊂
  ‘∵
 ‘:’;

シンボリックリンク貼ろうとしたら失敗した

経緯
/var/www/html がドキュメントルートなのに、
/home/contents 以下に出られないよう設定したユーザなので、
ドキュメントルートをいじれない。
そこでシンボリックリンクだ!
という事でやってみたが、失敗しました。

調査
シンボリックリンクは、chrootの上位ディレクトリを参照する事ができません。
シンボリックリンクの正体はショートカットであって、
内部処理的には普通に /var/www/html を見に行くようです。

解決策
↑のリンクで比較されている通り、マウントはネットワークドライブみたいなものなので、
/home/contents 配下にマウントすればOKです。

# mount -B /var/www/html /home/contents/project

結果

色々やったけど、結局はソース管理だけなんだからgit入れればいいだけだったんじゃないかなー
って今思いました。

元記事はこちら

SFTPをセキュアに使いたかった

小谷松 丈樹

小谷松 丈樹

アイレット第一事業部のWebアプリ開発者。PHP、JavaScriptの案件がメイン。モノづくりは常に楽しみながらがモットー。面白いものを生み出して、管理までできるようになるのが目標。