単にSFTPで接続するだけであれば、SSHの設定さえされていれば接続できてしまうため、
特に問題になることはありません。
ですが、
- 「SFTP接続するユーザーに制限を付けたい。」
- 「SFTPユーザーに特定のディレクトリ以外を見せたくない。」
など、要件がある場合、適切な制限を設ける必要があります。
特に、システム管理者以外にSFTP経由でサーバーアクセスを許可する場合は、
誤操作や情報漏洩を防ぐためにも、明確な制御が不可欠です。
まあそもそも、本来SSHとSFTPは用途が異なるものとして、
明確に管理を分けるべきですよね。
ということで、備忘録も兼ねて設定方法をまとめておこうと思います。
ユーザー&ディレクトリ作成
グループの作成(必要であれば)
sudo groupadd sftpusers
ユーザー作成&パスワード設定
# ユーザー作成(サーバーログイン不可設定)
sudo user add -m -d /home/sftpuser -s /sbin/nologin -g sftpusers sftpuser
# パスワード設定
sudo passwd sftpuser
chroot用 ディレクトリ構成・設定
# chroot用のディレクトリは root 所有である必要があります。
sudo mkdir -p /home/sftpuser/upload
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser
# アップロード用のディレクトリを sftpuser に付与
sudo chown sftpuser:sftpusers /home/sftpuser/upload
chrootとはなんぞや?
chroot
は UNIX/Linuxにおけるセキュリティ機能の1つで
「特定のプロセスに見せるルートディレクトリ(/)を変更する」仕組みです。
つまり、今回は sftpuser
のルートディレクトリ(最上位階層)を
/
ではなく、 /home/sftpuser
にしてしまう設定をしています。
こうすることで sftpuser
からは /home/sftpuser
が /
として扱われるので
それより上の階層、例えば /home
とか /etc
などには
アクセスはもちろん中身を見ることも出来なくなります。
公開鍵認証の設定
秘密鍵・公開鍵ペアの作成
# 鍵ペア作成(RSA方式、2048bit)
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa_sftpuser
実行すると以下が表示されるかと思います。
対話形式でパスフレーズが求められるので、必要に応じて設定してください。
空Enterで無設定にすることも出来ます。
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): # 任意。空Enterで無設定でもOK
Enter same passphrase again:
Your identification has been saved in /home/yourname/.ssh/id_rsa_sftpuser.
Your public key has been saved in /home/yourname/.ssh/id_rsa_sftpuser.pub.
すると、現在の場所に2つファイルが作成されます。
-
id_rsa_sftpuser
秘密鍵 (SFTPアクセスする人にのみ渡す。他人には渡さない) -
id_rsa_sftpuser.pub
公開鍵 (サーバー側に置いておく)
この後、認証キー(authorized_keys)に配置するので
id_rsa_sftpuser.pub(公開鍵)
の中身をコピーしておきましょう。
.sshディレクトリ作成
sudo mkdir -p /home/sftpuser/.ssh
sudo chmod 700 /home/sftpuser/.ssh
公開鍵設定
公開鍵配置
# vimでなくても、viでもnanoでも。
sudo vim /home/sftpuser/.ssh/authorized_keys
# ここで先程作成した ~/.ssh/id_rsa_sftpuser.pubの中身を貼り付けて保存します。
パーミッション設定
sudo chmod 600 /home/sftpuser/.ssh/authorized_keys
sudo chown -R sftpuser:sftpusers /home/sftpuser/.ssh
sshd設定
sshd_config編集
sudo vim /etc/ssh/sshd_config
末尾に以下を追加します。
# 一般設定(必要に応じて。既存の設定と重複しないように気を付けて下さい。)
PasswordAuthentication yes # パスワード認証を有効化
PubkeyAuthentication yes # 公開鍵認証を有効化
ChallengeResponseAuthentication no # チャレンジ/レスポンス認証を無効化
PermitRootLogin no # rootユーザーのログインを無効化
# sftpuser 用の制限
Match User sftpuser
ChrootDirectory /home/sftpuser # sftpuserのroot(最上位)ディレクトリを/home/sftpuserに
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTTY no # SSHターミナルを完全に無効化
PasswordAuthentication yes # パスワード認証を有効化
PubkeyAuthentication yes # 公開鍵認証を有効化
AuthenticationMethods publickey,password # パスワード・公開鍵認証の両方成功しないとログイン不可
上記、設定の ChrootDirectory
で sftpuser
にとっての最上位ディレクトリ
Chrootとして扱うディレクトリを指定しています。
設定確認と再起動
# 設定確認
sudo sshd -t
# エラーが無ければ再起動して設定を反映
sudo systemctl restart sshd
動作確認
sftpコマンドやWinSCPなどのFTPソフトを使って確認してください。
以下が確認ポイントです。
- 秘密鍵+パスワードの両方があって接続できること
- chrootより上の階層にアクセスできないこと
- TeraTermなどのSSHターミナルから接続が出来ないこと
まとめ
chrootの設定など始めは面食らうかもしれませんが
仕組みや考え方がわかればそれほど難しくないかなと思います。
SSH接続はなじみ深いですが、SFTPはなかなか機会がないと設定することないですよね。
仕組みや流れだけでも頭の片隅に残ればと思います。