SFTPサーバにファイルを 〜サーバ構築編〜

記事タイトルとURLをコピーする

急激に気温が上がってきましたね。 気分転換にAppleのサイトでMac mini / MacBook Air / MacBook Proのカスタマイズをして、頭の中でバーチャル購入してる、技術課の森です。

はじめに

AWS Transfer for SFTPだけでなく、AWS Transfer for FTPやAWS Transfer for FTPSの提供が開始されました。 詳しくはこちら。 弊社メンバからも関連するブログがあがっています。

それに触発されてやりたかったことをやっていきます。 ゴールは、 PythonスクリプトでSFTPサーバにPUT/GETができる です。 ブログは3部作で

  1. SFTPサーバをEC2で構築する
  2. SFTPサーバにファイルをPUTする
  3. SFTPサーバにファイルをGETする

です。 それでは、まずは SFTPサーバをEC2で構築する を進めていきます。

構築

EC2を構築

今回は、Amazon Linux2でEC2を構築。 単純に構築するだけですので、詳細は割愛します。 特別にしたこととしては、SecurityGroupだけです。 マイIPでSSHを通すだけとなります。 それ以外は、そのままで構築しました。

SFTPサーバの設定

SFTPサーバの設定手順としては、以下のとおりです。

  1. SFTPで接続するためのユーザ作成
  2. 作成したユーザの鍵の作成
  3. SFTPで接続したディレクトリを制限
  4. 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するでお会いしましょう。