IMPOV::In My Point Of View

仕事、SEO、ウェブマーケティング、時事問題、健康、生き方などなど、書きたいことを勝手に書き倒しているブログです。とどのつまり「便所の落書き」

SFTP用ユーザーを、chrootでアクセス可能範囲を限定する(さくらのVPS)

昨年立ち上げたサーバーは、一つのアカウントを使いまわしてSFTPユーザー管理する方法をとったが(SFTP用ユーザーの追加と管理方法)、今回建てたサーバーでは関わる人数が多くなりそうだったので、個別にアカウントを発行し chroot でアクセス範囲を限定することにした。

ポイントになるのはファイルの所有者とグループの設定で、今回は以下のようにした。

  • ユーザー : 1人に1つずつユーザーアカウントを作成
  • プライマリグループ : apache
  • サブグループ : sftp_users
  • アクセス方法 : 鍵アクセスのみ

また、デフォルトのパーミッションを、umask 002 として、グループに書き込み権限を与える設定とする。

SFTPユーザーの作成

まず最初に、SFTPでアクセスするユーザーのグループを作成。

[root@hoge ~]# groupadd sftp_users
SFTPユーザーの追加(ユーザーごとに繰り返し)

設定例:ユーザー名 = sftp-example

su - で 作業用アカウントから root に昇格して作業を行う。
ユーザーを作成(プライマリグループ:apache、サブグループ:sftp_users)
[root@hoge ~]# useradd -g apache -G sftp_users sftp-example

作成したユーザーに切り替え
[root@hoge ~]# su sftp-example

鍵の作成
[sftp-example@hoge root]$ ssh-keygen -t rsa

公開鍵のファイル名変更など
[sftp-example@hoge root]$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
[sftp-example@hoge root]$ chmod 600 ~/.ssh/authorized_keys
[sftp-example@hoge root]$ exit

鍵のダウンロード(作業用アカウントに所有者を変更しないとDLできない)
[root@hoge ~]# mv /home/sftp-example/.ssh/id_rsa /home/
[root@hoge ~]# chown 作業用アカウント /home/id_rsa
  → /home/id_rsa をダウンロード(TeraTerm SCPコマンドなど)

鍵をサーバー上から削除
[root@hoge ~]# rm /home/id_rsa

chroot設定

サブグループに対しても chroot は有効にかかるので、先ほど作成した sftp_users グループを対象に chroot する。

sshd_config を修正
[root@hoge ~]# vim /etc/ssh/sshd_config

	Subsystem      sftp    /usr/libexec/openssh/sftp-server
	  ↓ コメントアウトして無効化
	#Subsystem      sftp    /usr/libexec/openssh/sftp-server
		
	追加
	Subsystem sftp internal-sftp -u 002


	最終行に追加
	Match Group sftp_users
	  X11Forwarding no
	  AllowTcpForwarding no
	  ChrootDirectory /var/www
	  ForceCommand internal-sftp -u 002

sftp_users をプライマリグループに設定してしまうと、SFTPでアップロードしたファイルの「所有者:グループ」が、「個別アカウント:sftp_users」となってしまい、そのままでは apache上で動かす php や perl などと喧嘩してしまう。

というわけで、プライマリグループを apache とし、グループの書き込みを許す権限とすることで回避した。

上記の設定では、/var/www ディレクトリ以下にジェイルしたが、下層ディレクトリ毎にそれぞれ別々のユーザーをジェイルしたければ、グループを複数作り、グループ毎にそれぞれディレクトリを設定すれば良い。

複数のユニットが共用する場合は、ホームディレクトリからシンボリックリンクをユーザーごとに設定するよりも管理が楽だと思う。