なぜSFTP専用アカウントなのか
SSHを解放するのはちょっと・・・ね
ssh でなんでも出来てしまうし、なんでも見れてしまうんで。指定したフォルダ以外にはアクセス出来ないようにしたい。
つまり、指定したディストリ=chroot したSFTP専用のアカウントを作ってみようと思った。
chroot 脱出は、、、まぁ出来るんだろうけど、不用意にファイルを見せない的な意味でSFTPに限定したアカウントがあれば便利だねって。
前提条件
SFTPのアカウントをChrootさせるには、いくつか前提条件があって。
SSHを起動してログインできるようにする
これは最初から付属して有効になってるだろうから割愛。
ufw などファイアウォールがあれば、それを使ってログインできるようにしておく
ユーザーの作成
SSHができるユーザーを作成しておく、これも adduser
コマンドでなどで十分
複数ユーザーを作るときは、ファイルが共有できるように umask 0002 にして useradd -aG groupname
でグループを整えておく
ユーザー名の保護
もし、ユーザー名をよくあるものにして、パスワードログインを許可するのであれば、ユーザー名に難解な文字列を付与しておくのがベターだと思います。
Mac の場合は、 sf-pwgen を使って読みやすいアルファベットの羅列を生成できます。
takuya@Desktop$ sf-pwgen -a memorable -a letters -l 15 itwitichyozcyic tecelyuprakamui nivoujicloipher eweogozadgeerho ausholdubiishai
www-admin
や webuser
などわかりやすい文字列の後ろに追記しておくと良いでしょう。
www-admin
などは容易に攻撃対象になるので、ユーザー名を難解で憶測困難なものにしておくほうが良いでしょう。
今回は webuser
に文字列を付けて webuser-ausholdubiishai
としました。
SFTPを使う人相手に公開鍵認証を説明するのも面倒な話だし。パスワード認証を使いたいよねやっぱり。
sudo adduser webuser-ausholdubiishai sudo adduser webuser-nivoujicloipher
グループも作っておきます。
sudo addgroup webusers sudo usermod -aG webusers webuser-ausholdubiishai sudo usermod -aG webusers webuser-nivoujicloipher
共有するフォルダのパーミッションを、グループを強制しておきます。これで他ユーザーのファイルが消せないとかは減る。umask でもいいけど。
sudo chmod g+srwx /var/www/webusers
SFTPの設定
SFTP の設定をしたいユーザー名に次のような設定を書きます。
/etc/ssh/sshd_config
## currently only sftp user Subsystem sftp /usr/lib/openssh/sftp-server match user webuser-ausholdubiishai PasswordAuthentication yes X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ChrootDirectory /var/www/
一つずつ見ておきます。
Subsystem sftp /usr/lib/openssh/sftp-server
これは、SSHの内部SFTPサーバーを有効にします。標準で入っています
match user
match user webuser-ausholdubiishai
ユーザー名がマッチした時にそれ以降の設定を上書きします。
match group or match user name*
複数ユーザーがいるときは、Match Group
や ワイルドカードが便利です。
PasswordAuthentication yes
パスワードログインを許可します。
X11Forwarding ForceCommand AllowTcpForwarding
X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
ここでは、通常のSSHで出来るようなシェル機能を無効にしておきます。ログインしたら シェルとして sftp サーバーを起動するようにしておきます。
ChrootDirectory /var/www/
SFTPでアクセスしたときに Chroot を掛けて、指定のフォルダ以降のアクセスに限定します。
ディレクトリのアクセス制限
chroot したいディレクトリのパーミッションを root:root で 755 にします。
ll -d /var/www drwxr-xr-x 5 root root 4096 Dec 7 18:46 /var/www/
もしコレを忘れると、切断されて broken pipe などとエラーになったりします。
忘れた場合のログです。 /var/log/auth
Aug 9 04:00:29 acid sshd[6185]: fatal: bad ownership or modes for chroot directory
sudo chmod 755 /var/www/path/to/chroot sudo chown root:root /var/www/path/to/chroot
こうですね。
最後に再起動
ssh をリロード(再起動)して終わりです。
systemctl reload ssh
これで完了
まとめ
パーミッションにハマるとしんどい。最初に知っておけばよかった。
SFTPは各種ソフトが対応していてファイルの転送だけを考えれば、使いやすい。
ユーザー名とパスワードを考えるのが面倒なのでユーザー名自動生成でアルファベット的に読めるものを自動生成はうれしいですね。
あと、chroot は便宜的なもので過信してはいけない。
今時なら、SFTPを使わずCIまわして自動デプロイか自動docker なんだろうけどさ。
2018-08-09
エラー・メッセージを追記