急激に気温が上がってきましたね。 気分転換にAppleのサイトでMac mini / MacBook Air / MacBook Proのカスタマイズをして、頭の中でバーチャル購入してる、技術課の森です。
はじめに
AWS Transfer for SFTPだけでなく、AWS Transfer for FTPやAWS Transfer for FTPSの提供が開始されました。 詳しくはこちら。 弊社メンバからも関連するブログがあがっています。
- ラジオ体操の時間にファイル転送したいんだよねぇ 〜AWS Transfer for SFTP〜
- 【AWS Transfer for SFTP】WinSCPを使用してファイル転送する
- AWS Transfer for SFTPがFTP/FTPSをサポートしました!
- 【YouTube配信】「30分でわかる AWS UPDATE!」第9回を配信しました!
それに触発されてやりたかったことをやっていきます。 ゴールは、 PythonスクリプトでSFTPサーバにPUT/GETができる です。 ブログは3部作で
- SFTPサーバをEC2で構築する
- SFTPサーバにファイルをPUTする
- SFTPサーバにファイルをGETする
です。 それでは、まずは SFTPサーバをEC2で構築する を進めていきます。
構築
EC2を構築
今回は、Amazon Linux2でEC2を構築。 単純に構築するだけですので、詳細は割愛します。 特別にしたこととしては、SecurityGroupだけです。 マイIPでSSHを通すだけとなります。 それ以外は、そのままで構築しました。
SFTPサーバの設定
SFTPサーバの設定手順としては、以下のとおりです。
- SFTPで接続するためのユーザ作成
- 作成したユーザの鍵の作成
- SFTPで接続したディレクトリを制限
- SFTP用ディレクトリの作成と権限変更
1. SFTPで接続するためのユーザ作成
まずは構築したEC2にログインします。 ログインが完了したらスーパーユーザになり、SFTPで接続するためのユーザを作成します。
$ sudo su -
# whoami
root
# useradd sftp-user
2. 作成したユーザの鍵の作成と設定
ユーザの作成が完了したので、次にSSHの公開鍵と秘密鍵を作成します。
# whoami
root
# sudo su - sftp-user
$ whoami
sftp-user
$ pwd
/home/sftp-user
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): *入力せずにEnter
Enter passphrase (empty for no passphrase): *入力せずにEnter
Enter same passphrase again: *入力せずにEnter
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
.....
$ ls
authorized_keys id_rsa id_rsa.pub
ここまでで鍵の作成が完了です。 次に、作成した鍵の設定を行います。 今回は作成した鍵のみを利用するため、そのままauthorized_keysファイルをとして利用します。
$ pwd
/home/sftp-user/.ssh
$ ls
authorized_keys id_rsa id_rsa.pub
$ cp id_rsa.pub authorized_keys
$ chmod 600 authorized/keys
3. SFTPで接続したディレクトリを制限
SFTPで接続された場合、専用のディレクトリ以外に移動されたりしないように制限します。 デフォルトでSFTPサーバは設定されてますが、ディレクトリ制限がされていないので、設定を追加します。 L130(2020/05/04時点のAmazonLinux2)に Subsystem
と書かれた行がありますので、その下に書いていきます。 実行コマンド
$ whoami
sftp-user
$ exit
# whoami
root
# vi /etc/ssh/sshd_config
編集ファイル:/etc/ssh/sshd_config L129以降
# override default of no subsystem
Subsystem sftp /usr/libexec/openssh/sftp-server
# add
Match user sftp-user
ChrootDirectory /home/sftp-user/root-dir
ForceCommand internal-sftp
ここまでできたら、ファイルを保存し、サービスを再起動します。
# service sshd reload
4. SFTP用ディレクトリの作成と権限変更
最後にSFTP用のディレクトリの作成と権限の変更を行っていきます。 まずは、SFTP用のディレクトリを /home/sftp-user/sftp-server
と定義しましたので、このディレクトリ設定を行います。 このディレクトリ自体はスーパーユーザの権限が必要となります。 そのため、ディレクトリ所有者が root
で且つ 他のユーザに書き込みさせない
設定が必要になります。 ということで、コマンドを実行していきます。
# whoami
root
# chown root: /home/sftp-user
# chmod 755 /home/sftp-user
# cd /home/sftp-user
# mkdir root-dir
# chown root: root-dir
# chmod 755 root-dir
ここまで設定で、SFTPで接続した際のルートフォルダまでの設定が完了しました。 ここからは、実際にファイルの配置やディレクトリ作成/変更/削除ができる権限を与えたディレクトリを作成します。
# pwd
/home/sftp-user
# cd root-dir
# pwd
/home/sftp-user/root-dir
# mkdir sftp-work-dir
# chown sftp-user: sftp-work-dir
# chmod 777 sftp-work-dir
これでSFTP用ディレクトリの作成と権限変更の設定が完了しました。 では、接続確認を行います。 接続するための秘密鍵は、 2. 作成したユーザの鍵の作成と設定 で作成した秘密鍵(id_rsa) となります。 それをローカルにコピーしておいてください。 以下のコマンドで接続確認を行います。
$ sftp -i [秘密鍵のパス] sftp-user@[EC2のIPv4パブリックIP] Connected to [EC2のIPv4パブリックIP] sftp> ls -la drwxr-xr-x 3 0 0 18 May 1 10:24 . drwxr-xr-x 3 0 0 18 May 1 10:24 .. drwxrwxrwx 2 1001 1001 36 May 1 11:04 sftp-work-dir sftp> cd sftp-work-dir sftp> ls -la drwxr-xr-x 3 0 0 18 May 1 11:04 . drwxr-xr-x 3 0 0 18 May 1 10:24 ..
これで、SFTPサーバに接続ができました。 ということで、前準備が完了になります。 次は、実際にプログラムを作成して、PUT/GETをすることにします。
さいごに
自分自身、SFTPにあまり馴染みはなかったものの、プログラムを作って、実際に使ってみるというものもいいものですね。 久々いい勉強になりました。 では、次回のSFTPサーバにファイルをPUTするでお会いしましょう。