Netassist Blog

SFTPでのchroot設定について

初めまして、技術部新人のkkです。今日はSFTP専用ユーザーでのchroot設定手順を書きたいと思います。まずはSFTPというプロトコルがどんなものなのか説明していきます。

SFTPとは

「SSH File Transfer Protocol」の略で、sshで暗号化された通信路を使って安全にファイルを送受信できるFTP (File Transfer Protocol)よりもセキュアなプロトコルです。SFTPでは、やり取りする内容をSSHで暗号化するのでファイルを安全に送受信することができます。

SFTP専用ユーザーにする二つの理由

①Webサーバで特定のサイトの管理をする場合、サーバ上で複数のユーザーが操作することを想定し、自身の作業領域のみでコンテンツを操作させる為にSFTP専用ユーザーにします。

②ユーザーがSSHログインできないようにする為。

環境

CentOS Linux release 7.8.2003 (Core)

ユーザーの作業領域について

セキュリティを高める為に、作成するSFTP専用ユーザーは /home/kkikuchi-sftp/ より上位へは移動できない設定とし、作業ディレクトリは /home/kkikuchi-sftp/public_html とします。 また、chroot で作業領域を制限していますが、Webサーバーの公開ディレクトリとして /var/www/html/ も操作したいので mount –bind を実行することで、この二つのディレクトリで作業できるようにします。

設定内容

  • アカウント名 :kkikuchi-sftp ※ユーザは秘密鍵でのみログイン可能
  • SFTP専用ユーザ(SSH不可ユーザ) →ユーザは秘密鍵でのみログイン可能
  • ユーザのホームディレクトリ :/home/kkikuchi-sftp/
  • 作業ディレクトリへの接続ディレクトリ :/home/kkikuchi-sftp/public_html
  • 上記ディレクトリへ接続するディレクトリ :/var/www/html/

それではさっそく作業を実施します。

■設定ファイルのバックアップ

/etc/ssh/sshd_config のバックアップを作成、確認します。

[root@kkikuchi ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
[root@kkikuchi ~]# ll /etc/ssh/sshd_config /etc/ssh/sshd_config.org
-rw-------. 1 root root 3914 6月 26 17:14 /etc/ssh/sshd_config
-rw-------. 1 root root 3914 9月 29 13:53 /etc/ssh/sshd_config.org

■既存のSubsystemの変更と、SFTP利用ユーザの記述を追加

  • 「Subsystem sftp internal-sftp -f LOCAL5 -l VERBOSE」を追記 SFTPでchrootさせる場合は、internal-sftpとする必要があります。また、ファシリティをlocal5にすることでメッセージをより詳細(VERBOSE)に出力します。
  • 利用ユーザーを追記 利用ユーザー「kkikuchi-sftp」を追記し、umask値を002にすることで、グループ所有者に、rw(x)の権限が付与されます。
[root@kkikuchi ~]# vi /etc/ssh/sshd_config
[root@kkikuchi ~]# diff /etc/ssh/sshd_config /etc/ssh/sshd_config /etc/ssh/sshd_config /etc/ssh/sshd_config.org
140,148d139
<
< #Subsystem sftp /usr/libexec/openssh/sftp-server
< Subsystem sftp internal-sftp -f LOCAL5 -l VERBOSE
<
< # 利用ユーザを記述
< Match User kkikuchi-sftp
< AllowTcpForwarding no
< ForceCommand internal-sftp -u 002 -f LOCAL5 -l VERBOSE
< ChrootDirectory %h

■設定内容のテストと反映

構文チェックを行い、問題が無いことを確認できたのでsshdを再起動し、設定を反映させます。

[root@kkikuchi ~]# /usr/sbin/sshd -t

[root@kkikuchi ~]# systemctl restart sshd
[root@kkikuchi ~]#

■ログ出力設定

/etc/rsyslog.conf ファイルを編集し、SFTPの操作をログに残す為の設定を行います。

  • local5.* /var/log/sftp/sftp.log →syslogに出力された内容をファイルへ出力するように設定します。
  • $AddUnixListenSocket /home/kkikuchi-sftp/dev/log →出力先のログディレクトリを指定します。
[root@kkikuchi ~]# cp -ip /etc/rsyslog.conf /etc/rsyslog.conf /etc/rsyslog.conf /etc/rsyslog.conf.org

[root@kkikuchi ~]# ll /etc/rsyslog.conf /etc/rsyslog.conf.org
-rw-r--r--. 1 root root 3232 11月 28 2019 /etc/rsyslog.conf
-rw-r--r--. 1 root root 3232 11月 28 2019 /etc/rsyslog.conf.org

[root@kkikuchi ~]# vi /etc/rsyslog.conf

[root@kkikuchi ~]# diff /etc/rsyslog.conf /etc/rsyslog.conf /etc/rsyslog.conf /etc/rsyslog.conf.org
75,78d74
< #chroot配下にrsyslogのソケットファイルを作成する
< $ModLoad imuxsock
< $AddUnixListenSocket /home/kkikuchi-sftp/dev/log
< local5.* /var/log/sftp/sftp.log

■ソケット用ディレクトリ作成

ソケットを使うことによって、通信手順の詳細や環境などを気にすること無くデータの送受信を行うことが出来ます。

[root@kkikuchi ~]# mkdir /home/kkikuchi-sftp/ 
[root@kkikuchi ~]# ll /home/kkikuchi-sftp/dev 合計 0

■ログディレクトリ作成

出力先のログディレクトリを作成します。

[root@kkikuchi ~]# mkdir /var/log/sftp
[root@kkikuchi ~]# ll /var/log/sftp
合計 0

■rsyslog再起動

設定を反映させます。

[root@kkikuchi ~]# systemctl restart rsyslog
[root@kkikuchi ~]#

■ローテート設定

今回は新規でログ設定を作成したので、/var/log/maillogなどの自動的にローテ―ト設定がされるものとは異なり、ログファイルの肥大化を防ぐ為にはローテ―ト設定をする必要があります。 その為以下のように設定を行い、一定の容量や期間ごとに古いログを削除させます。

[root@kkikuchi ~]# vi /etc/logrotate.d/syslog 
(追記内容) /var/log/sftp/sftp.log
[root@kkikuchi ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
/var/log/sftp/sftp.log
{
missingok
sharedscripts
postrotate
/bin/kill -HUP cat /var/run/syslogd.pid 2> /dev/null || true
endscript
}

■ユーザ作成

useraddコマンドでユーザーを作成し、idコマンドで作成したユーザーの識別情報を確認します。

[root@kkikuchi ~]# useradd kkikuchi-sftp

[root@kkikuchi ~]# id kkikuchi-sftp uid=10001(kkikuchi-sftp) gid=10001(kkikuchi-sftp) groups=10001(kkikuchi-sftp)

■パスワード発行

passwd コマンドでユーザーを指定し、パスワードを発行します。

[root@kkikuchi ~]# passwd kkikuchi-sftp
ユーザー kkikuchi-sftp のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

■作成したユーザへ切り替え、秘密鍵と公開鍵の作成

rootユーザーから作成したユーザーに切り替え、作成する鍵ファイルのパーミッション調整を簡略化します。

[root@kkikuchi ~]# su - kkikuchi-sftp
[kkikuchi-sftp@kkikuchi ~]$
[kkikuchi-sftp@kkikuchi ~]$ ssh-keygen

■秘密鍵の確認と削除

秘密鍵を削除することで、今後この秘密鍵に対応する公開鍵を作成できないようにします。

[kkikuchi-sftp@kkikuchi ~]$ cat .ssh/id_rsa
[kkikuchi-sftp@kkikuchi ~]$ rm .ssh/id_rsa

■公開鍵のリネームと権限変更

作成された公開鍵は、下記のようにリネームする形で接続先サーバに登録します。 リネームしたファイルは、所有者のみが読み書き出来るように権限を変更します。

[kkikuchi-sftp@kkikuchi ~]$ mv .ssh/id_rsa.pub .ssh/authorized_keys
[kkikuchi-sftp@kkikuchi ~]$ chmod 600 .ssh/authorized_keys

▽各chroot対象ユーザのホームディレクトリ内にディレクトリを作成の上、アクセス先ディレクトリでmount –bindを実施する 

■ユーザー切り替え

kkikuchi-sftpユーザーで作業していたので、rootユーザーに切り替えます。

[kkikuchi-sftp@kkikuchi ~]$ ログアウト
[root@kkikuchi ~]# uname -n
kkikuchi.architects.ne.jp

■各ホームディレクトリの所有者などをrootに変更、各ホームディレクトリの権限を調整

対象のディレクトリの所有者をrootに変更し、グループには権限を与えず(0に設定)、705とします。

[root@kkikuchi ~]# ll -d /home/kkikuchi-sftp
drwx------. 3 kkikuchi-sftp kkikuchi-sftp 95  9月 16 15:23 /home/kkikuchi-sftp

[root@kkikuchi ~]# chown root:root /home/kkikuchi-sftp

[root@kkikuchi ~]# ll -d /home/kkikuchi-sftp
drwx------. 3 root root 95  9月 16 15:23 /home/kkikuchi-sftp

[root@kkikuchi ~]# chmod 705 /home/kkikuchi-sftp

■各ホームディレクトリにマウント用ディレクトリ作成し、グループ権限をApacheに変更

root権限のままでは、Webコンテンツを操作し、公開する際に権限が無くエラーになってしまうので、グループ権限をApacheに変更します。

[root@kkikuchi ~]# mkdir /home/kkikuchi-sftp/public_html

[root@kkikuchi ~]# chown kkikuchi-sftp:apache /home/kkikuchi-sftp/public_html

■作成したディレクトリへ mount –bind を実施する 

chroot設定により、普通はアクセスできないような領域も一部、作業可能にしておきます。

[root@kkikuchi ~]# mount --bind /var/www/html/public_html/ /home/kkikuchi-sftp/public_html

■/etc/fstabに追記し、サーバ再起動後もマウントが有効となるように指定する

/etc/fstab ファイルはディスクパーティションや様々なブロックデバイス、リモートファイルをどうやってファイルシステムにマウントするかを記述するファイルです。ここに、マウント設定を記述します。

[root@kkikuchi ~]# cp -ip /etc/fstab /etc/fstab.`date +%Y%m%d`

[root@kkikuchi ~]# ll /etc/fstab /etc/fstab.`date +%Y%m%d`
-rw-r--r--. 1 root root 465  6月 25 19:08 /etc/fstab
-rw-r--r--. 1 root root 465  6月 25 19:08 /etc/fstab.20200916

[root@kkikuchi ~]# vi /etc/fstab

[root@kkikuchi ~]# diff /etc/fstab /etc/fstab.`date +%Y%m%d`
12d11
< /var/www/html/public_html/ /home/kkikuchi-sftp/public_html    none    bind    0 0

■マウント記述を確認

設定されているファイルシステムすべてをマウントする -a オプションを実行し、マウント設定に漏れが無いか確認します。

[root@kkikuchi ~]# mount -a
[root@kkikuchi ~]#

■マウント元のドキュメントルートにグループ書き込み権限を付与

chmodコマンドでg+wを実行し、グループに書き込み権限を与えます。

[root@kkikuchi ~]# ll /var/www/html/public_html/
合計 0
→ファイルが存在しないので適当なものを置き、ユーザー名を書いておきます。
[root@kkikuchi ~]# vi /var/www/html/public_html/index.html

[root@kkikuchi ~]# cat /var/www/html/public_html/index.html
kkikuchi-sftp

[root@kkikuchi ~]# chmod g+w  /var/www/html/public_html/ -R

[root@kkikuchi ~]# ll /var/www/html/public_html/
合計 4
-rw-r--r--. 1 root root 15  9月 16 15:31 index.html





WinSCPにてログインを確認

→問題なし。

■kkikuchi-sftpユーザーでSSHログインができないことを確認

ログイン試行後、ログを確認します。

Sep 16 18:48:32 kkikuchi sshd[15779]: pam_unix(sshd:session): session opened for user kkikuchi-sftp by (uid=0)
Sep 16 18:48:45 kkikuchi sshd[15779]: pam_unix(sshd:session): session closed for user kkikuchi-sftp
Sep 16 18:51:31 kkikuchi sshd[15869]: Accepted publickey for kkikuchi-sftp from 113.33.37.98 port 63106 ssh2: RSA SHA256:Y03paQirxogNlsQmPhIR/taAne6iWnZqvjnhEx7rnFY
Sep 16 18:51:32 kkikuchi sshd[15869]: pam_unix(sshd:session): session opened for user kkikuchi-sftp by (uid=0)
Sep 16 18:59:45 kkikuchi sshd[12691]: pam_unix(sshd:session): session closed for user kkikuchi-sftp

無事にSSHログインが拒否されていることが確認できました。 1つのサーバ上で複数ユーザー、複数Webコンテンツを取り扱う際には、今回のようにSFTP専用ユーザーにすると良いでしょう。

以上、SFTP専用ユーザーの発行手順、SFTPを使用した安全なファイル転送について書かせていただきました。今回はここまでとします。またお会いしましょう。