メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

Alpine LinuxのFTPで暗号化通信 SFTP編

前回はAlpine Linux上に構築したFTPサーバにLibreSSLを実装し、秘密鍵とCSR(証明書署名要求)の作成および証明書に署名を実行、クライアント側からFTPクライアントツールを使用しFTPサーバにアクセス。FTPサーバ〜クライアント間をSSLで通信した。
FTPSをやったのだから当然SFTPもやるでしょ...という事で、今回はもう一つのFTPの暗号化通信であるSFTPをやってみた。


SFTP(SSH File Transfer Protocol)とは、通信経路自体をSSHで暗号化しファイルを送受信するプロトコル。
サーバと接続先との間で暗号化された通信経路上にデータを流すものだが、第三者によるデータの改竄や覗き見を防ぐ為にsshを使用している。
FTPとは異なり、sshというツールの中のsftpコマンドを使用しFTPのような操作を行う事で、セキュアなファイル転送を実現している。
前回のFTPSはFTPの通信をSSLやTSLで暗号化するものだが、今回のSFTPはsshの通信にFTPのような通信を流すものとなる。
SFTPの実態はsshである為、デフォルトではポート番号は22を使用しTCPで通信する。
SFTP単体でRFCによる標準化はされていない為、RFCは採番されていない。
SSHの設定ファイルを変更するだけで実現する為、ポート番号はsshアクセス時に使ってきた22222をそのまま使用する。

Alpine Linuxではopenssh-sftp-serverというツールが有るが別途インストールする必要は無く、他の大手のLinuxディストリビューションと同様にSSHの設定ファイル/etc/ssh/sshd_configを編集するだけでSFTPが実現出来る。

FTPサーバへの接続確認は、MacBook Airで動作するターミナルツール「iTerm-2」でsshコマンドを使用した。
今回は既存環境は使用せずSFTP環境構築の為、新規にAlpine Linuxをインストールした。
尚、SFTPにおいてもSSLの実装が可能であるが今回はSSLには触れていない。


当方の環境
・スマホ(ホスト機):SONY Xperia XZ2 / Android OS 9
・ホスト機の通信環境:WLANと4G回線
・エミュレータ:Limbo PC Emulator 2.10.0
・ゲストOS:alpine-virt-3.14.3-x86.iso
・ソフトウェアキーボード:Androidアプリの「Hacker's Keyboard」
※スマホ内で動作するAlpine LinuxにMacBook Airからsshでログインし設定投入した。
※勿論、VirtualBoxやVMware WorkstationにデプロイしたAlpine Linuxでも当記事の内容で設定可能。


SFTP用アカウントの作成
クライアントからのSFTP接続の為、adduserコマンドでSFTP用のアカウントを作成。
Alpine Linuxの場合、useraddではなくadduserである。
SFTP用アカウントのユーザ名はftpuserとした。

# adduser hogehoge
New password:
Retype password:
passwd: password fot hogehoge changed by root
#



公開ディレクトリの設定
SFTP用の公開ディレクトリのパーミッションを設定。
上記のftpuserアカウント作成の際に生成された/home/ftpuserディレクトリをSFTPの公開ディレクトリとする。
/home/ftpuserパーミッションの設定後、lsコマンドを打ち設定内容を確認。

# chown root:ftpuser /home/ftpuser/
# chmod 755 /home/ftpuser/
#
# ls -la /home/ftpuser/
total 12
drwxr-sr-x    3 root     ftpuser       4096 Jan 11 18:17 .
drwxr-xr-x    4 root     root          4096 Jan 11 18:09 ..
#



設定ファイルの修正
sshdの設定ファイル/etc/ssh/sshd_configを開き、以下を編集。
・# override default of no subsystemsの中にあるSubsystem sftp /usr/lib/ssh/sftp-serverをコメントアウト
・Subsystem sftp internal-sftpを追加
・Match Userの左側をftpuserに変更
・X11Forwarding、AllowTcpForwardingの行頭のコメントアウト(#)を削除
・ChrootDirectoryの左側を/home/ftpuserに修正
・ForceCommandの左側をinternal-sftpに修正

Match Userの行は、万が一Match groupになっていたらMatch Userに修正する必要が有る。
ChrootDirectory /home/ftpuser/によって、ログインユーザのディレクトリを制限する事が出来る。
ForceCommand internal-sftpは、sshdにビルドインされているsftpを使用する事を示す。
これらの設定により、ユーザftpuserは/home/ftpuserディレクトリのみアクセスが可能になる。

(省略)
:
# override default of no subsystems
#Subsystem	sftp	/usr/lib/ssh/sftp-server
Subsystem	sftp	internal-sftp

Match User ftpuser
	X11Forwarding no
	AllowTcpForwarding no
	ChrootDirectory /home/ftpuser
#	PermitTTY no
	ForceCommand internal-sftp



sshdの再起動
設定完了後、rc-service sshd restartコマンドでsshdサービスを再起動させて上記の設定内容をシステムに反映させる。
sshdサービスの再起動後、rc-service sshd statusコマンドでsshdサービスが正常に立ち上がっている事を確認する。
status: startedであれば正常に立ち上がっている事を示す。
status: crashedが出力された場合、/etc/ssh/sshd_configに追加設定した内容を見直す。

# rc-service sshd restart
 * Caching service dependencies ...                                          [ ok ]
 * Stopping sshd ...                                                         [ ok ]
 * Starting sshd ...                                                         [ ok ]
#
# rc-service sshd status
 * status: started
#



SFTP通信の確認
前回のFTPSの通信確認の際と同じく、今回もCyberduckというFTPクライアントツールを使用。
Cyberduckを立ち上げて新規接続から入り、接続方式は「SFTP (SSHによる暗号化FTP)」を選択。
FTPサーバのIPアドレスやポート番号やユーザ名、パスワードを入力し接続ボタンをクリックすると、SFTPサーバに接続する。
SFTP接続の確立の際、「そのホストは現在システムに認識されていません」と書かれたウインドウが表示される。その際は「許可」をクリックしSFTP接続を確立させる。



以下の画像は、SFTP設定後にクライアント側とサーバ側との間の通信をWiresharkでパケットキャプチャした内容。
プロトコルはTCP、ポート番号は自側は50074、SFTPサーバ側はLimbo PC Emulatorにて設定した22222が使用されている事が分かる。
※画像をクリックすると拡大表示します




Alpine Linuxの情報源等
https://alpinelinux.org/ Alpine Linux
https://wiki.alpinelinux.org/wiki/Main_Page Alpine Linux Wiki

SFTPの情報源
https://man.openbsd.org/sftp.1 sftp(1) - OpenBSD Manual Page
https://webkaru.net/linux/sftp-command/ Linuxコマンド【 sftp 】安全なファイル転送

Alpine Linuxに関する過去の記事
https://debslink.hatenadiary.jp/entry/20200418/1587204948 AndroidスマホでAlpine Linuxを動かす
https://debslink.hatenadiary.jp/entry/20200506/1588733149 Androidスマホで動作するAlpine LinuxにてFTPサーバを構築
https://debslink.hatenadiary.jp/entry/20211024/1635075047 Alpine Linuxの保守用コマンド
https://debslink.hatenadiary.jp/entry/20211228/1640668431 Alpine LinuxでAwallを使ってiptables設定
https://debslink.hatenadiary.jp/entry/20220101/1640973274 Alpine LinuxのFTPで暗号化通信 FTPS編