work.log

元エンジニアの備忘録的ブログ

SFTPでchrootを設定しつつSSHでログインできないユーザーを作成する

投稿:

SFTPでchrootは設定しつつも、SSHではログインできないユーザーを作成するメモ書きです。

サーバを複数人で共有で使いたいのですが、こんな感じの要件を満たす必要が出てきました。

  1. ユーザーはSFTPのみを使用
  2. そのユーザーアカウントではSSH接続を禁止したい (でもSFTPは使いたい)
  3. 他人のディレクトリを覗かれないようにchrootしたい
  4. SFTPユーザーにはパスワード認証でログインしてもらう
  5. SSHの場合は鍵認証のみに制限する

ちょっと細かいですがやってみましたので、忘れないようにメモをしたいと思います。

スポンサードサーチ

SFTPユーザーの作成とホームディレクトリの設定

sftpuser1 は /home/www/worklog.be にchrootを設定。

sftpuser2 は /home/www/example.com にchrootを設定。

上記のように設定したいと思います。まずはシェルに/sbin/nologinを指定してユーザーを作成します。

# mkdir /home/www
# useradd -s /sbin/nologin -d /home/www/worklog.be sftpuser1
# useradd -s /sbin/nologin -d /home/www/example.com sftpuser2

次は作成されたホームディレクトリのパーミッションを変更します。

# chmod 755 /home/www/worklog.be
# chown root:root /home/www/worklog.be

# chmod 755 /home/www/example.com
# chown root:root /home/www/example.com

この設定を忘れるとSFTP時にエラーが出てしまいます。(詳細は末尾)

このままだとSFTPで接続してもパーミッション不足で何も出来ないので、必要なディレクトリやファイルを適時作成しておきます。

# mkdir /home/www/worklog.be/htdocs
# chown sftpuser1:sftpuser1 /home/www/worklog.be/htdocs

sshd_configの設定

ユーザー周りの設定が終わったら、SFTPでchrootさせる設定をsshd_configに追加します。

# vi /etc/ssh/sshd_config
-----

# override default of no subsystems
#Subsystem	sftp	/usr/libexec/openssh/sftp-server <= コメントアウト
Subsystem	sftp	internal-sftp <= 追加

# 下記を追加
Match User sftpuser*
	ChrootDirectory ~
	PasswordAuthentication yes
	X11Forwarding no
	AllowTcpForwarding no

変更をしたらsshdを再起動させます。

Match Userの部分で正規表現でユーザーを範囲指定できるので、プレフィックスか何かでSFTP専用ユーザーを識別できるようにしといた方が楽だと思います。

Match User以降に書いた設定でSFTPユーザーの挙動を制御できるので、ここでPasswordAuthentication yesを設定する事によってSFTPユーザーのみのパスワード認証を許可する事ができます。

SFTPでも鍵認証は使えますが、鍵認証って何?って人が相手の場合はやっぱりパスワード認証を使いたいところです。

Subsystemの項はこのように全体設定しなくても、Match User以降で上書き設定できるという情報があるのですが、CentOS6でやったら上手くいかなかったのでこのようにやりました。

これでSSHユーザーのセキュリティは保ちつつ、しっかり制限をしたSFTPユーザーのchroot設定が出来ました。

エラーログ

少しつまづいたポイント等、/var/log/secure に出力されたエラーログと一緒に残しておきます。

error: subsystem: cannot stat…

error: subsystem: cannot stat /usr/libexec/openssh/sftp-server: No such file or directory

sshd_configをこう書くとSFTP接続できず、上記のようなエラーログが出力されます。

de default of no subsystems
Subsystem	sftp	/usr/libexec/openssh/sftp-server

Match User sftpuser*
	ChrootDirectory ~
	PasswordAuthentication yes
	X11Forwarding no
	AllowTcpForwarding no
	ForceCommand internal-sftp

ForceCommandで上書きできるからSubsystemは変更しなくても良いとの情報がありましたがうまく行かず。

これは環境依存なのか…?

bad ownership

fatal: bad ownership or modes for chroot directory component “/home/www/worklog.be/”

ホームディレクトリより上の所有者がrootに設定されていないと出るエラーです。

chown root:rootしておきましょう。

SFTPソフトでPermission denied

SFTPソフトで接続した時にPermission deniedと表示され、ウィンドウに何も表示されないのはディレクトリのパーミッションが不足しているのが原因です。

chmod 755でchrootに設定したディレクトリを変更しておきましょう。

SFTPのchrootについては以上です。

よく読まれている記事

  • 本日
  • 週間
  • 月間