web-dev-qa-db-ja.com

SFTP権限は拒否されましたが、SSHは正常に機能します

SFTP経由でファイルへの変更をアップロードしようとするとPermission deniedエラーが発生しますが、同じユーザーとしてSSHを直接使用する場合は問題なく動作します。

アップロードしようとしているファイルは/srv/www/website/current/app/AppKernel.phpです(現在、このエラーはプロジェクト内のすべてのファイルに当てはまりますが、単純にするために1つのファイルを使用します)。

私の最初の呼び出しポートは、同じユーザーとしてサーバーにSSH接続し、権限が機能していることを確認することでした。

SSHでログインした後、自分が誰であるかを確認します

$ whoami
cp5w

ls -lは、次の権限を明らかにします(関連する行に転送されます)

$ ls -l
-rwxrwxr-x 1 deploy nginx   1523 Nov 11 12:51 AppKernel.php

ファイルの所有者はdeployで、グループはnginxです。ユーザーcp5wがグループnginxにいることを確認できます:

$ groups
opsworks nginx

理論的には、私はAppKernel.phpに書き込むことができるはずですか?それを試してみましょう:

$ tail -n 3 AppKernel.php
        $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
    }
}

$ echo "# add line to end of file" >> AppKernel.php
$ tail -n 3 AppKernel.php
    }
}
# add line to end of file

うん、うまくいきます。エラーはありません。私は怒っていません。

いくつかの可能な解決策は、提案します 親ディレクトリにグループ実行可能ファイルがあることを確認する これを次のように再確認しました(ここでも関連する行に切り詰めています)。

$ ls -l ..
drwxrwxr-x  6 deploy nginx  4096 Nov 11 15:31 app

システムが所有するディレクトリの問題 もチェックしましたが、子ディレクトリwebsiteにも取り組んでおり、プロジェクトの残りの部分と同じ権限パターンを共有しています。

  • deployが所有
  • グループはnginx
  • グループはディレクトリの読み取り、書き込み、トラバースが可能

次に、ワークステーションからSFTPを使用してファイルをアップロード(別名:変更)します。同じユーザー。同じSSHキー。同じワークステーション。同じサーバー。同じファイルをターゲットにしています。 SSHではなくSFTPを使用してください。

psftp> open myserver
login as: cp5w
psftp> cd /srv/www/website/current/app
Remote directory is now /srv/www/website/releases/20151111145342/app
psftp> lcd C:\Users\chris\Source\website\app
New local directory is C:\Users\chris\Source\website\app
psftp> put AppKernel.php
/srv/www/website/releases/20151111145342/app/AppKernel.php: open for write: permission denied

何が出るの?!

考えるためのもう少し食べ物:

  • これは数日前にSFTPを介して機能していましたと私は思い出すことができるサーバー構成の変更を最近行っていません
  • 私がシンボリックリンク経由で書こうとしているので問題はありますか?
  • 最近変更した唯一のことは、ワークステーションがLinuxではなくWindowsになったことです。これは私の罰ですか?安い冗談。真剣に、ワークステーションOSはこれに影響しますか?

TODO:

  • 別のワークステーションOSからテストする

[〜#〜]編集[〜#〜]

SSHログをチェックして、意味のある何かを追加できるかどうかを確認しました。これは、アップロードの試行によって発生した出力です(%のプレースホルダーで一部のデータが隠されています)。

$ tail -f /var/log/secure
Nov 11 17:46:58 %server% sshd[22455]: Accepted publickey for cp5w from %ip% port %port% ssh2: RSA %fingerprint%
Nov 11 17:46:58 %server% sshd[22455]: pam_unix(sshd:session): session opened for user cp5w by (uid=0)
Nov 11 17:46:58 %server% sshd[22455]: pam_unix(sshd:session): session closed for user cp5w

また、sshd_configを変更し、-l INFOを次のように追加して、SFTPログを有効にしました。

Subsystem sftp  internal-sftp -l INFO

/var/log/messagesを次のようにフォローしました:

$ tail -f /var/log/messages
Nov 11 18:06:57 %server% internal-sftp[23002]: session opened for local user cp5w from [%ip%]
Nov 11 18:06:57 %server% internal-sftp[23002]: opendir "/srv/www/."
Nov 11 18:06:57 %server% internal-sftp[23002]: closedir "/srv/www/."
Nov 11 18:06:57 %server% internal-sftp[23002]: open "/srv/www/website/current/app/AppKernel.php" flags WRITE,CREATE,TRUNCATE mode 0666
Nov 11 18:06:57 %server% internal-sftp[23002]: sent status Permission denied
Nov 11 18:06:57 %server% internal-sftp[23002]: session closed for local user cp5w from [%ip%]
2
teaforchris

中心的な問題は、SFTPサーバーが適切に接続を許可するためにSSHキー認証を必要とすることです。あなたはFileZillaで言及したので、私はこの答えをそのように書きました。

場合によっては、パスワードで保護されていないSSHキーにこれを使用できます。

  1. FileZillaクライアントを開きます。
  2. ホーム画面の上部で、[編集]をクリックして[設定]を選択します。
  3. メニューの左側で、[接続]セクションを展開し、[SFTP]を強調表示します。
  4. [キーファイルの追加...]ボタンをクリックして、ローカルマシンのディレクトリを参照し、プライベートキーファイルを選択します。
  5. 次に、FileZillaのホーム画面の上部から、もう一度[ファイル]をクリックして[サイトマネージャー]を選択します。
  6. 最後に、サイトマネージャーの左側で、[新しいサイト]ボタンをクリックし、今後この特定のリモートサーバーを簡単に識別できるように、[個人用サイト]の下に一意の名前を入力します。
  7. 次に、[全般]タブで、[ホスト](IPアドレスまたはFQDNのいずれか)および[ポート]フィールド(デフォルトは22)に入力します。
  8. [プロトコル]ドロップダウンメニューで、[SFTP-SSHファイル転送プロトコル]を選択します。
1

Selinuxを実行していて、これが問題と関係があるのではないかと思います。 getenforceまたはsestatusは何を示していますか?強制を実行している場合、寛容に切り替えるとどうなりますか?

そうでない場合、あなたに代わってsftpがファイルの書き込みに使用しているユーザーアカウントをテストして証明できますか?原則としてcp5wである必要がありますが、それは実際のケースですか?

最後に、chrootがボールをプレーしていないことに気付くかもしれません。 chrootなしで動作しますか?

幸運を祈るウィルモットさん。

1
Stuart Slade