SFTP 接続を使用した EC2 Linux インスタンスへの接続をトラブルシューティングする方法を教えてください。
最終更新日: 2021 年 5 月 4 日
安全なファイル転送プロトコル (SFTP) 接続を使って Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスに接続できません。または、「remote readdir Permission denied」(リモート readdir アクセス許可が拒否されました) というエラーが発生しています。この問題を解決するには、どうすればよいですか?
簡単な説明
SFTP 接続を介した EC2 インスタンスへの接続が失敗する原因は複数あります。一般的な接続の問題のトラブルシューティング手順を次に示します。
- インスタンスが SSH 接続の前提条件を満たしていることを確認します。
- 詳細なメッセージングをオンにしてインスタンスにログインし、エラーを特定します。
- 認証ログとシステムログにエラーがないかどうかを確認します。
- SSHD 設定ファイルに SFTP 用のサブシステムが設定されていることを確認します。
- 「リモート readdir アクセス許可が拒否されました」エラーを解決します。
解決方法
インスタンスが SSH 接続の前提条件を満たしていることを確認する
SFTP は SSH の上で動作します。インスタンスがすべての SSH 接続の前提条件を満たしていることを確認します。前提条件のリストについては、「SSH を使用した Linux インスタンスへの接続」を参照してください。
詳細なメッセージングをオンにしてインスタンスにログインし、エラーを特定する
一般的な接続エラーメッセージは次のとおりです。
- 接続がタイムアウトしたか、接続が拒否された
- アクセス許可が拒否されたか、認証に失敗した
- サーバーがキーを拒否した
詳細メッセージングを使用したインスタンスへのログインと、これらのエラーおよびその他の SSH 関連のエラーの解決方法については、「SSH を使用した Amazon EC2 Linux インスタンスへの接続をトラブルシューティングする方法を教えてください」を参照してください。
EC2 シリアルコンソールを有効にしている場合は、それを使用して、サポートされている Nitro ベースのインスタンスタイプのトラブルシューティングを行うことができます。シリアルコンソールは、起動の問題、ネットワーク設定、および SSH 設定の問題のトラブルシューティングに役立ちます。シリアルコンソールは、正常に動作するネットワーク接続を必要とすることなく、インスタンスに接続します。Amazon EC2 コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、シリアルコンソールにアクセスできます。
シリアルコンソールを使用する前に、アカウントレベルでコンソールにアクセス権を付与します。その後、IAM ユーザーにアクセス権を付与する AWS Identity and Access Management (IAM) ポリシーを作成します。また、シリアルコンソールを使用するすべてのインスタンスには、パスワードベースのユーザーを 1 つ以上含める必要があります。EC2 シリアルコンソールの設定の詳細については、EC2 シリアルコンソールへのアクセスを設定するを参照してください。
注意: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください。
認証ログとシステムログにエラーがないか確認する
RHEL および Fedora 認証ログ:
$ sudo less /var/log/secure
RHEL および Fedora の一般的なシステムログ:
$ sudo less /var/log/messages
Debian および Ubuntu 認証ログ:
$ sudo less /var/log/auth.log
Debian および Ubuntu の一般的なシステムログ:
$ sudo less /var/log/syslog
SSHD 設定ファイルに SFTP 用のサブシステムが設定されていることを確認する
SSHD 設定ファイルに SFTP 用のサブシステムが設定されており、sftp-server 用の共有オブジェクトファイルがそれぞれのディレクトリに存在することを確認します。SFTP サブシステムが見つからないために SFTP 接続が切れると、ログに「subsystem request failed on channel 0」(サブシステムリクエストがチャネル 0 で失敗しました) というエラーが表示されることがあります。
RHEL および Fedora ベースのディストリビューション:
$ sudo grep Subsystem /etc/ssh/sshd_config
Subsystem sftp /usr/libexec/openssh/sftp-server
$ sudo ls -l /usr/libexec/openssh/sftp-server
-rwxr-xr-x. 1 root root 100784 Jun 26 2019 /usr/libexec/openssh/sftp-server
Debian および Ubuntu ベースのディストリビューション:
$ sudo grep Subsystem /etc/ssh/sshd_config
Subsystem sftp /usr/lib/openssh/sftp-server
$ sudo ls -l /usr/lib/openssh/sftp-server
-rwxr-xr-x 1 root root 105608 Mar 4 2019 /usr/lib/openssh/sftp-server
詳細については、Linux のマニュアルページの sshd_config の「サブシステム」セクションを参照してください。
「リモート readdir アクセス許可が拒否されました」エラーを解決する
「リモート readdir アクセス許可が拒否されました」エラーは、SFTP 接続を試みているユーザーに正しいアクセス許可がないことを示しています。ターゲットディレクトリに切り替えるには、少なくとも読み取り権限と実行権限が必要です。
次のコマンドを使用して、ユーザーがターゲットディレクトリへのアクセス許可を持っていることを確認します。
ls -ldZ /directory
次のコマンドを使用して、ユーザーアクセスを制限しているアクセスコントロールリスト (ACL) のアクセス許可を確認します。
getfacl /directory
SELinux が有効になっていることを確認するには、次のコマンドを使用します。
getenforce
SELinux が有効になっている場合は、/var/log/audit/audit.log または /var/log/audit.log を確認して、SELinux コンテキストに基づいてアクセス許可が拒否されたエラーがないか確認します。