それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

SSHをSFTPに制限して、ディレクトリを制限(chroot)した専用アカウントを作る

なぜSFTP専用アカウントなのか

SSHを解放するのはちょっと・・・ね

ssh でなんでも出来てしまうし、なんでも見れてしまうんで。指定したフォルダ以外にはアクセス出来ないようにしたい。

つまり、指定したディストリ=chroot したSFTP専用のアカウントを作ってみようと思った。

chroot 脱出は、、、まぁ出来るんだろうけど、不用意にファイルを見せない的な意味でSFTPに限定したアカウントがあれば便利だねって。

前提条件

SFTPのアカウントをChrootさせるには、いくつか前提条件があって。

  • ssh が起動している
  • アカウントがある。
  • sftp がサブシステムで有効になってる
  • chroot ディレクトリが root:root 755 になってる

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-adminwebuser などわかりやすい文字列の後ろに追記しておくと良いでしょう。

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

エラー・メッセージを追記