確認したい内容
Transfer FamilyでSFTP通信をする際、使用される暗号化アルゴリズムとその決定プロセス
構成
- SFTPサーバを作成する。
- SFTPサーバは内部接続とするため、VPCエンドポイントが作成される。
- SFTPサーバ内にマネージドユーザとしてsftp_userを作成する。
- sftp_userにロジカルディレクトを使用してS3のフォルダを割り当てる。
- EC2サーバ内でSSHのキーペア(keyとkey.pub)を作成する。
- sftp_userに公開鍵(key.pub)を登録する。
EC2からsftp -v -i key sftp_user@xxxx.vpce.amazonaws.com
コマンドを実行しTransfer Family経由でS3に接続する。
SFTP通信の流れ
最初にSFTP通信の流れを確認します。(SSH情報のバージョン交換等一部の処理を割愛して記載しています。)
②③④でクライアント側、サーバ側で利用可能な暗号化アルゴリズムを比較しクライアント側の優先順位によって利用する暗号化アルゴリズムを決定します。暗号スイート(SshCiphers)、鍵交換アルゴリズム(SshKexs)、メッセージ認証コード(SshMacs)の3つを決定します。鍵交換アルゴリズムは緑色の箇所、暗号スイートとメッセージ認証コードは赤色の箇所で使用されます。
Tranifer Familyサーバ側の設定
サーバのセキュリティポリシーの設定で使用する暗号化アルゴリズムを制限することが可能です。
TransferSecurityPolicy-2024-01のSshCiphersの箇所を抜粋、暗号化スイートでは下記5つが使用可能です。
{
"SecurityPolicy": {
"Fips": false,
"SecurityPolicyName": "TransferSecurityPolicy-2024-01",
"SshCiphers": [
"aes128-gcm@openssh.com",
"aes256-gcm@openssh.com",
"aes128-ctr",
"aes256-ctr",
"aes192-ctr"
],
クライアント側の設定
Amazon Linux 2023の例です。Ciphersの箇所を抜粋、見やすいように改行していますが実際のファイルは改行はありません。最初に書いてあるものほど優先度が高いです。
# cat /etc/crypto-policies/back-ends/openssh.config
Ciphers
aes256-gcm@openssh.com,
chacha20-poly1305@openssh.com,
aes256-ctr,
aes128-gcm@openssh.com,aes128-ctr
アルゴリズム決定のプロセス
sftp -v
でデバックした際の情報の一部抜粋です。
クライアント側とサーバ側で共通する暗号化スイートの内、クライアント側で優先度が高いaes256-gcm@openssh.com
が選択されていることが分かりました。
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: rsa-sha2-512
debug1: kex: server->client cipher: aes256-gcm@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: aes256-gcm@openssh.com MAC: <implicit> compression: none
debug1: kex: curve25519-sha256 need=32 dh_need=32
debug1: kex: curve25519-sha256 need=32 dh_need=32
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: SSH2_MSG_KEX_ECDH_REPLY received
確認方法
SFTPサーバの接続情報はCloudWatchログに記録されます。下記のログから使用している暗号アルゴリズムの確認が可能です。
{
"role": "●●●",
"activity-type": "CONNECTED",
"macs": "<implicit>,<implicit>",
"ciphers": "aes256-gcm@openssh.com,aes256-gcm@openssh.com",
"client": "●●●",
"source-ip": "●●●",
"resource-arn": "●●●",
"home-dir": "LOGICAL",
"user": "●●●",
"kex": "curve25519-sha256",
"session-id": "●●●"
}