[アップデート] AWS Transfer Family の SFTP コネクターが認証情報のローテーション中も転送を継続できるようになりました
いわさです。
AWS Transfer Family の SFTP コネクターは、AWS 側がクライアントになって外部の SFTP サーバーと S3 の間でファイルをやり取りする機能です。基本的な使い方は以前 DevelopersIO で紹介されています。
コネクターが外部サーバーにログインするための認証情報(SFTP ユーザーの秘密鍵やパスワード)は Secrets Manager に置きます。これを定期的に入れ替える運用では、これまでシークレットを更新するたびにコネクター側も新しいバージョンを見るよう設定し直す必要があり、この切り替えがずれるとコネクターが古い鍵のまま接続して認証に失敗することがありました。
先日のアップデートで、鍵を入れ替えている間もコネクターがそのまま転送を続けられるようになりました。コネクターに OrderedUserSecretVersionStages という設定が追加されています。
今回こちらを確認してみたので紹介します。
実際に確認してみる
リモート役の SFTP サーバーとして Transfer Family の SFTP サーバー(S3 バックエンド)を用意しました。
SFTP の鍵認証で、秘密鍵はシークレットに入れておきます。今回はこの鍵を新旧2つ(v1・v2)用意して、ローテーションした時の挙動を観察してみます。

続いてコネクターを作成します。
マネジメントコンソールを見てみると SFTP 設定に「シークレットバージョンステージ」の欄が追加されていました。

ここで AWSCURRENT(最新版)と AWSPREVIOUS(1つ前)の2つを順番付きで設定できました。
順序の意味が最初よくわからなかったですが、どうやらコネクターはこの順に認証を試し、最初に成功した鍵で接続するという仕様になってるみたいです。
以下は設定後のコンソールの状態です。

この時点では v1 の秘密鍵が AWSCURRENT に入っています。
この後の接続テストではファイル転送は AWSCURRENT(v1)で問題なく成功しました。
鍵をローテーションしてみる
さて、ここからが今回のアップデートの検証部分ですが鍵をローテーションしてみましょう。
まずサーバー側の SFTP ユーザーに新しい公開鍵(v2)を追加し、新旧どちらでも認証できる状態にします。
次に Secrets Manager に v2 の秘密鍵を投入すると、AWSCURRENT だった v1 が AWSPREVIOUS に退避し、v2 が新しい AWSCURRENT になります。
$ aws secretsmanager describe-secret --secret-id <arn> --query 'VersionIdsToStages'
{
"1afe4a74-...": ["AWSPREVIOUS"],
"c16a481b-...": ["AWSCURRENT"]
}
コネクター側は何も更新してないのですが、この状態でもコネクターは先頭の AWSCURRENT(v2)で認証してそのまま転送できました。
従来はここでコネクターの設定を編集して、参照するシークレットバージョンを新しい方に変更する必要がありました。
$ aws transfer test-connection --connector-id c-xxxx --query '{Status:Status,Msg:StatusMessage}'
{
"Status": "OK",
"Msg": "Connection succeeded"
}
シークレットは新しい鍵に切り替わったけどもサーバー側の公開鍵の差し替えがまだ間に合っていないケースもありえます。
シークレットは v2 のまま、サーバー側の公開鍵を v1 だけに戻して接続テストしてみました。
コネクターの AWSCURRENT(v2)はサーバーの v1 と合わず認証できませんが、AWSPREVIOUS(v1)で接続できました。
$ aws transfer test-connection --connector-id c-xxxx --query '{Status:Status,Msg:StatusMessage}'
{
"Status": "OK",
"Msg": "Connection succeeded"
}
AWSPREVIOUS を設定せず AWSCURRENT だけにしたコネクターでも、同じ状況で接続テストしました。
こちらは AWSCURRENT(v2)で認証できず、次に試す鍵がないので認証エラーになりました。
$ aws transfer test-connection --connector-id c-yyyy --query '{Status:Status,Msg:StatusMessage}'
{
"Status": "ERROR",
"Msg": "Authentication failed (Available Authentication Methods: PrivateKey)"
}
さいごに
本日は AWS Transfer Family の SFTP コネクターが認証情報のローテーション中も転送を継続できるようになったので試してみました。
AWSCURRENT と AWSPREVIOUS の2つを設定しておくだけで、鍵が切り替わってもコネクターを変更せずに転送使えましたね。
指定できるステージングラベルは1〜2個までで、既存のコネクターにも update-connector で設定できるので、鍵やパスワードを定期的にローテーションしている環境では利用してみても良さそうです。




