Slide 1

Slide 1 text

Transfer Family for SFTPを使ってみよう ~SSHの認証方法ごとに構築方法をご紹介~ JAWS 朝会 #51 はたはた

Slide 2

Slide 2 text

自己紹介 名前: 畠山 大治 業務: AWSを使ったインフラ構築 @アイレット 趣味: Perfumeを追いかける(ファンクラブ 9年目) 読書、映画・アニメを見る 資格・活動: AWS認定全冠、GC認定ACE OpsJAWS 運営 好きなAWSサービス: VPC @hatake_book

Slide 3

Slide 3 text

アジェンダ lTransfer Familyについて lサービス紹介 l主な登場人物 lその他便利機能 l使用できるプロトコル lTransfer Family for SFTPを使ってみる lパスワード認証を使用する場合 l鍵認証を使用する場合

Slide 4

Slide 4 text

Transfer Familyについて

Slide 5

Slide 5 text

Transfer Familyとは l インターネット経由でS3やEFSにデータを転送できる l 転送だけでなくダウンロードも可能 l モニタリング機能や転送後の処理自動化がマネージドで提供される ファイル転送プロトコルを使用してS3やEFSにデータを転送するサービス https://aws.amazon.com/jp/aws-transfer-family/

Slide 6

Slide 6 text

Transfer Familyの主な登場人物

Slide 7

Slide 7 text

Transfer Familyの主な登場人物 AWS Cloud VPC Public subnet Private subnet Region AWS Transfer Family User インターネット

Slide 8

Slide 8 text

Transfer Familyの主な登場人物 lサーバー lファイル転送を行うサーバー lSFTPサーバーが丸ごとAWSマネージドになってるイメージ lエンドポイント lクライアントが接続してくるサーバーのエンドポイント lVPCにホストさせるかどうかを選べる lカスタムドメインを使用可能

Slide 9

Slide 9 text

Transfer Familyの主な登場人物 lユーザー lクライアントがファイル転送をする際に使用するユーザー lパスワードや鍵、証明書などを使用して認証を行う lIDプロバイダー lサーバー側でユーザー情報を管理する機能 lAWS内部で完結させることが可能 l3種類から選択可能(後述)

Slide 10

Slide 10 text

Transfer Familyの主な登場人物 lドメイン lTransfer Familyでは、データを保存するストレージサービスの 種類を「ドメイン」と呼ぶことがある l選択可能なのはS3かEFS

Slide 11

Slide 11 text

その他の便利機能

Slide 12

Slide 12 text

その他の便利機能 lワークフロー l転送された後の処理を事前に登録しておき、転送をトリガーに 処理を実行させることができる l例)別の場所にコピーを作成する、タグをつける、など l処理の例外を登録することも可能 l失敗した数などはCloudWatchメトリクスで確認可能 https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/monitoring.html#metrics

Slide 13

Slide 13 text

その他の便利機能 lchroot lUNIX関連の機能で、ルートディレクトリを変更することを指す lユーザーがアクセスできるディレクトリを絞ることが可能 l同様の機能をTransfer Familyでもサポートしている user1 chrootなし /(root) home/ user1/ user2/ user1は/(root)配下全てにアクセス可能 user1 chrootあり (user1のルートディレクトリを“/home/user1” に設定) /(root) home/ user1/ user2/ user1は/home/user1配下のみアクセス可能

Slide 14

Slide 14 text

Transfer Familyで 使用できるプロトコル

Slide 15

Slide 15 text

Transfer Familyで使用できるプロトコル lFTP (File Transfer Protocol) l長い歴史を持つプロトコルで、20,21番ポートを使用する l暗号化されていないため現在では非推奨、SFTP or FTPSの利用が 推奨されている lSFTP (SSH File Transfer Protocol) lSSHを使用して暗号化を行う lSSHが使える環境であれば使用可能 l実態としては普通のSSHと変わらないため、22番ポートを使用する

Slide 16

Slide 16 text

Transfer Familyで使用できるプロトコル lFTPS (File Transfer Protocol over SSL/TLS) lSSL/TLSで暗号化、ポートは989(制御用),990(データ転送用)を 使用する l証明書の用意が必要 lAS2 (Applicability Statement 2) l小売業などで広く使用されるプロトコル lウォルマートが普及を推進したことが由来らしい lHTTP, HTTPSを使用してデータ転送を行う

Slide 17

Slide 17 text

補足:SSHの認証方法についておさらい lパスワード認証方式 lユーザー名、パスワードを使用 して認証を行う lパスワードの使い回しリスク などを考慮し、公開鍵認証が 使われることが多い ユーザーの認証方法が2つ存在する l公開鍵認証方式 l公開鍵と秘密鍵を使用して認証 を行う l詳細な仕組みについては長くなるた め割愛 l秘密鍵が漏洩しない限りは安全

Slide 18

Slide 18 text

Transfer Family for SFTPを 使ってみる

Slide 19

Slide 19 text

前提 認証方法によって作成手順が異なる l公開鍵認証方式 lIDプロバイダーにサービス マネージド、もしくはカスタム IDプロバイダーを使用する lサービスマネージドの方が 管理が楽 lパスワード認証方式 lIDプロバイダーにカスタムID プロバイダーを使用する ↓ IdPを自分で構築する必要がある

Slide 20

Slide 20 text

補足:IDプロバイダーの種類 lサービスマネージド lTransfer Familyの一機能として提供されているIDプロバイダー lTransfer Familyで完結するため管理が楽 lAWS Directory Service l既存のAWS Directory Serviceのディレクトリのユーザー情報を使用する lカスタムIDプロバイダー lユーザー自ら開発したLambdaやAPI Gatewayを組み合わせて IDプロバイダーを用意する

Slide 21

Slide 21 text

補足 2023/8のアップデートで鍵とパスワード両方を要求することが可能に (※カスタムIDプロバイダーを使用する場合) https://aws.amazon.com/jp/about-aws/whats-new/2023/08/aws-transfer-family-multiple-methods-authenticate-sftp-users/

Slide 22

Slide 22 text

l以下の流れで紹介していきます lサーバー作成 lユーザー作成 l接続確認 lchrootの設定を入れてみる

Slide 23

Slide 23 text

Transfer Family for SFTPを 使ってみる 〜鍵認証を使用する場合〜

Slide 24

Slide 24 text

1. サーバー作成:プロトコル選択

Slide 25

Slide 25 text

1. サーバー作成:IDプロバイダー選択 l鍵認証の場合はサービスマネージドで事足りるので、サービス マネージドを選択

Slide 26

Slide 26 text

1. サーバー作成:エンドポイント設定 lパブリック or VPC 選択可能 lカスタムホスト名には、所有 しているドメインを使用可能 lVPCにホストさせる場合は、 プライベートにさせることも 可能

Slide 27

Slide 27 text

1. サーバー作成:エンドポイント設定 パブリックサブネットにホストする場合はEIPをアタッチする

Slide 28

Slide 28 text

1. サーバー作成:ドメインの選択 lここでいうドメインは転送されたデータを保存するストレージを指す

Slide 29

Slide 29 text

1. サーバー作成:追加設定(一部抜粋) lログ記録 l転送処理のログをCloudWatchの ロググループに保存可能 lワークフロー l転送時の処理をカスタマイズ可能 lオプションなので設定なしでもOK

Slide 30

Slide 30 text

1. サーバー作成:追加設定(一部抜粋) lサーバーホストキー l認証で使用するSSH秘密鍵、後で追加可能

Slide 31

Slide 31 text

1. サーバー作成:追加設定(一部抜粋) l表示バナー lセッションを張った時に表示されるメッセージをカスタマイズ可能

Slide 32

Slide 32 text

2. ユーザー作成 l事前にクライアント側でSSHキーを発行しておく $ ssh-keygen -t rsa -b 4096 -f TestUser1_key Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in TestUser1_key Your public key has been saved in TestUser1_key.pub The key fingerprint is: SHA256:1j5n48+o4n2JE3S0RB/ysYdVv592K8rqFTAFw8CrqWc test@test1 The key's randomart image is: +---[RSA 4096]----+ | ..oo.oo o +| | . .o o+ *.| | .o o .= o| | . .+ o ..| | o S..o . | | o . .. . o| | . o++. oo| | . E ..==o=. o| | o .o++*+.+. | +----[SHA256]-----+ $

Slide 33

Slide 33 text

2. ユーザー作成 l作成したサーバーの画面からユーザーを追加する

Slide 34

Slide 34 text

2. ユーザー作成 lサーバー側にもユーザー情報を 追加する lホームディレクトリに指定した パスは事前に存在しなくてもOK lSFTP接続時に自動的に作成される 「制限付き」=chrootの設定

Slide 35

Slide 35 text

2. ユーザー作成 lSSHパブリックキー l事前に作成した”xxx.pub”の 中身を貼り付ける 「追加」をクリックすると ユーザー作成が完了する

Slide 36

Slide 36 text

3. 接続確認 lsftpコマンドを使用して接続できることを確認 $ sftp -i TestUser1_key TestUser1@s-xxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com The authenticity of host ' s-xxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com (52.199.195.108)' can't be established. RSA key fingerprint is SHA256:6SxF/xxxxxxxxxxxxxxxxxxxxxxxx/5u/nRQ9m30. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 's-xxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com' (RSA) to the list of known hosts. Connected to s-xxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com. sftp>

Slide 37

Slide 37 text

3. 接続確認 sftp> sftp> put test.txt Uploading test.txt to /da-hatakeyama-test-dev-sftp-target/TestUser1/test.txt test.txt 100% 18 0.9KB/s 00:00 sftp> lアップロードできることを確認

Slide 38

Slide 38 text

4. chrootの設定を入れてみる l今の設定だとS3のディレクトリ階層が見えてしまう lディレクトリ移動も自由にできてしまう sftp> sftp> pwd Remote working directory: /da-hatakeyama-test-dev-sftp-target/TestUser1 sftp> cd .. sftp> pwd Remote working directory: / da-hatakeyama-test-dev-sftp-target sftp> ls TestUser1 cdTestDirectory sftp> cd cdTestDirectory sftp> pwd Remote working directory: / da-hatakeyama-test-dev-sftp-target /cdTestDirectory sftp>

Slide 39

Slide 39 text

4. chrootの設定を入れてみる lユーザーの詳細画面で「制限付き」にチェックを入れる

Slide 40

Slide 40 text

4. chrootの設定を入れてみる l接続し直してみるとディレクトリ制限がされていることがわかる lバケットの中のTestUser1フォルダをルートディレクトリに設定 →TestUser1からはそれ以上の階層が見えない、移動も不可 sftp> sftp> ls test.txt sftp> pwd Remote working directory: / sftp> cd .. sftp> pwd Remote working directory: / sftp> sftp> ls test.txt

Slide 41

Slide 41 text

Transfer Family for SFTPを 使ってみる 〜パスワード認証を使用する場合〜

Slide 42

Slide 42 text

1. サーバー作成 lパスワード認証の場合は「カスタムIDプロバイダー」を選択する lIDプロバイダーの開発が必要になるが、AWS公式に提供されて いるCloudFormationテンプレートがあるので、今回はこれを使 用してみる l改訂版も存在しますが、私がSAMを使ったことがないので上記ブロ グで公開されているCFnテンプレートを使用しました l改訂版はFTPS, FTPでも使用できるテンプレートになっています

Slide 43

Slide 43 text

1. サーバー作成 lCFnテンプレートをそのまま流し込むと、以下構成が作成される lAPI Gateway lLambda関数に渡す入力をマッピングする lLambda lパスワード認証の場合は照合・検証処理 l鍵認証の場合は公開鍵を返す処理 lSecrets Manager lユーザーに紐づく各種メタデータを保存 l 使用するIAMロール l ホームディレクトリ l chrootの設定 l パスワード or 公開鍵 etc.

Slide 44

Slide 44 text

1. サーバー作成 lCFnテンプレートをそのまま流し込むと、以下構成が作成される 1. 認証情報を入力してSFTP接続を試みる 2. API Gatewayに認証情報を渡し、Lambda関数の入力パラメー タ向けにマッピングする 3. LambdaがSecrets Managerに対してクエリを実行

Slide 45

Slide 45 text

1. サーバー作成 lCFnテンプレートをそのまま流し込むと、以下構成が作成される 4. 認証情報と紐づいたキーと値をSecrets Managerが返す 5. Lambdaが処理を実行し、結果をAPI Gatewayに返却

Slide 46

Slide 46 text

2. ユーザー作成 lSFTPユーザーが使用するIAMロールを作成しておく l信頼関係:transfer.amazonaws.com lポリシー:特定のS3バケットに対する全操作許可

Slide 47

Slide 47 text

2. ユーザー作成 lユーザー情報をSecrets Managerに保存する 接続時に使用するパスワード SFTPユーザーに アタッチするIAMロール ホームディレクトリの設定

Slide 48

Slide 48 text

2. ユーザー作成 lユーザー情報をSecrets Managerに保存する aws/transfer/ / と入力する ※改定前のブログでは ” SFTP/ ” と入力するように 指示があるがこれは誤りなので注意

Slide 49

Slide 49 text

3. 接続確認 lパスワードを使用して接続できることを確認 $ sftp sftp-user@s-xxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com sftp-user@s-xxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com’s password: Connected to s-xxxxxxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com. sftp> lただ、chrootの設定をしていないためディレクトリ階層が丸見え lディレクトリ移動も可能 sftp> pwd Remote working directory: /da-hatakeyama-test-dev-sftp-target/sftp-user sftp> cd .. sftp> pwd Remote working directory: /da-hatakeyama-test-dev-sftp-target sftp>

Slide 50

Slide 50 text

4. chrootの設定を入れてみる l今回使用したCFnテンプレートはchrootの設定もできるように なっており、手順も公式ブログで公開されている lSecrets Managerのキーと値を追加することで設定可能 Before After

Slide 51

Slide 51 text

4. chrootの設定を入れてみる lchrootの設定が反映されていることを確認 sftp> pwd Remote working directory: / sftp> cd .. sftp> pwd Remote working directory: / sftp> ls test.txt sftp>

Slide 52

Slide 52 text

まとめ lTransfer FamilyはSFTPサーバーをフルマネージドで提供し てくれるサービス l鍵認証を使用するのであれば、IdPもTransfer Familyで完結 するので楽 lパスワード認証を使用したい場合は一部開発が必要になる l公式に提供されているのでありがたく使おう lAWSサービスで全て完結するのでおすすめ

Slide 53

Slide 53 text

参考情報 lAWS Secrets Manager を使用して AWS Transfer for SFTP のパスワード認証を有効にする (英語記事) l https://aws.amazon.com/jp/blogs/storage/enable-password-authentication-for-aws-transfer-for-sftp- using-aws-secrets-manager/ lAWS Secrets Manager を使用して AWS Transfer Family のパスワード認証を有効にする (更新) (英語記事) l https://aws.amazon.com/jp/blogs/storage/enable-password-authentication-for-aws-transfer-family- using-aws-secrets-manager-updated/ l論理ディレクトリを使用して Transfer Family ディレクトリ構造を簡素化する l https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/logical-dir-mappings.html