www-dataが所有するファイルのSFTP許可が拒否されました


23

ApacheとPHPを実行するかなり標準的なサーバーがセットアップされています。私が実行しているアプリはファイルを作成し、これらはApacheユーザーによって所有されていますwww-data。SFTP経由でアップロードしたファイルは、自分のユーザーが所有していますcharlesr。すべてのファイルはwww-dataグループの一部です。私の問題は、グループの一部であるwww-dataにもかかわらず、が所有するSFTPを介してファイルを変更または上書きできないことです。SSHセッションを介して問題なくファイルを変更できます。charlesrwww-data

だから私は何をすべきかわからない。所有ファイルを変更するためのSFTPセッション許可を与えるにはどうすればよいwww-dataですか?

ちょっとした背景として、これらはサーバーをセットアップするときに自分のために書いたメモです。

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

次に、SGIDビットの設定が何を意味するのかを説明します(つまり、作成されたすべてのファイルは自動的にグループの/var/www一部になりwww-dataます)。


更新

この問題は、アプリ自体、またはより具体的には、アプリケーションフレームワーク(Kohana)が特定のファイルを0644(rw-r--r--)に設定したために発生したようです。すなわち、グループ書き込み不可。これは、ファイルも所有されているという事実と相まってwww-data、としてログインしたときにSFTPを介してファイルを編集できなかったことを意味しますcharlesr。SSH経由でファイルを編集できる理由がわかりません。私の推測では、sudoを使用したに違いありません。

Marty Friedのたゆまぬ助けのおかげで、私が現在使用しているアクセス許可戦略は次のとおりです。MartyFriedは、以前の戦略の欠陥を指摘し、Linuxアクセス許可の世界で私が最終的に手に入れるまで助けてくれました。ありがとう、マーティ!

概要

  • のファイルとディレクトリの/var/www所有者root:webmasters
  • すべての開発者はwebmastersグループのメンバーである必要があります
  • のすべてのディレクトリを次の/var/wwwように設定する必要があります: 2775またはu=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • のすべてのファイルを次の/var/wwwように設定する必要があります: 0664またはug=rw,o=r(rw-rw-r--)

次のものが所有する必要がありますwww-data:webmasters(つまり、これらはApacheが書き込みできる必要があるディレクトリです)。

  • アプリケーション/キャッシュ
  • アプリケーション/ログ
  • アップロードする
  • client_helpers / upload

の仕方

/var/wwwデフォルトでファイルの提供元のアクセス許可を設定するには:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [等...]

ここでログアウトして再度ログインし、変更を有効にします。

前の一連のコマンドは次のことを行います。

  1. という新しいグループを作成しますwebmasters。アプリファイルへの書き込みアクセスを必要とするすべてのユーザーがこのグループに追加されます。
  2. 現在のユーザー($USER)をwebmastersグループに追加します。
  3. /var/wwwto の所有者rootとグループをwebmastersgroupに変更します。
  4. のすべてのファイルに664個の許可(-rw-rw-r--)を追加します/var/www
  5. のすべてのディレクトリに775のパーミッション(drwxrwxr-x)を追加し/var/wwwます。
  6. SGIDビットをオンにし/var/www、その中のすべてのディレクトリを設定します。この最後のポイントには、いくつかの説明があります。また、同じことを行うために、chmodの8進数の前に2(例:2644)を置くこともできます。
  7. 所有者をwww-data(Apacheのユーザー)に設定し、提供されたディレクトリのグループをに設定しwebmasterます。これにより、Apacheおよびwebmastersグループ内の誰でもディレクトリが書き込み可能になります。書き込み可能にする必要がある他のすべてのディレクトリにも同じことを行います。

回答:


10

Ubuntu.comには、Apache guideなどの非常に優れたサーバーガイドがあります。慎重に書き留めた手順はどこで入手しましたか?私はセットアップしたサーバーのどれでもそんなに面倒なことをする必要はありませんでした。非常に公開されているもの、または非常に大きいものなので、知らないセキュリティホールが存在する可能性があります。

ただし、www-dataグループのメンバーになる必要はなく、wwwのソースファイルはwww-dataによって所有されていません。私の理解では、これはApacheによって独自のファイルにのみ使用され、理論的にはwww-dataに書き込み許可を与える重要なファイルがないため、他のファイル自体への書き込み許可はありません。www-dataが所有するファイルは、他のすべてのユーザーに読み取り専用のアクセス許可を与え、誰もそのファイルへの書き込みアクセス許可を持つべきではないと思います。もちろん、私は完全に間違っている可能性があります。もし私なら、誰かが私に教えて、異なる説明をする実際のドキュメントを教えてくれることを願っています(私のようなランダムなインターネットユーザーが彼のために働いた指示を作ったフォーラムではなく)。

おそらく私は何かを見逃していますが、あなたの問題はかなり簡単なはずです。sftpを使用してログインするユーザーは、グループwww-dataのメンバーである必要があり、変更しようとしているファイルには、グループwww-dataの書き込み権限が必要です。sshを使用してファイルを変更できるが、sftpを使用できないことは、私には意味がありません。両方で同じアカウントにログインしていると確信していますか?sftpでは!groups、グループをリストしたり!whoami、使用しているログイン名を確認するなどのコマンドを入力できます。結果は、sshを使用して表示されるものと一致するはずです(同じコマンドから感嘆符を引いたもの)。

また、許可がある場合は、sftpからchmod、chown、chgrpを使用できる必要があります。

ところで、あなたのリストには少なくとも一つのかなり悪いコマンドがあると思います:

sudo chmod -R g+rw /var/www

これにより、/ var / www内のすべてのファイルおよびフォルダーへの書き込み許可が与えられます。これは悪い考えのように聞こえます。通常、これらのディレクトリへの書き込み許可は、特定のディレクトリに追加の許可が必要な場合を除き、通常は単一のディレクトリのみにあります。

注:これは私の側のエラーでした。これを指摘してくれたDonalLaffertyに感謝します。これは、「a」ではなく「g」を指定しているため、グループの許可のみを変更します。私の疲れた古い目(または悪いフォント)は、それを「a」と読んだに違いありません。

明確化のための編集

通常、Apacheによって作成されたファイルは、/ var / wwwのルート所有ファイルと同じように、www-dataグループと他のすべてのユーザーの両方に対して読み取り専用です。したがって、誰かをwww-dataのメンバーにする理由はないはずです。問題は、全員に書き込みアクセス権を付与することです。これは別のケースです。これは、サイト内で特定のディレクトリを使用可能にすることで行う必要があります。これは、rootが所有している可能性が高いため、sudoでchmodを使用するか、sudoを使用せずに所有者を作成します。

サイト全体へのアクセスを必要とする開発者がさらにいる場合、つまり「ウェブマスター」などのユーザー+グループを作成し、サイトの所有者にし、そのグループに書き込み権限を与え、すべての開発者をメンバーにする場合そのグループの。したがって、サイトディレクトリのリストは次のようになります。

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

その他の編集

それ以来、ユーザー「ウェブマスター」を作成する必要はなく、グループを作成するだけでよいことに気付きました。その後、ファイルはroot:webmastersが所有できます。つまり、rootは所有者ですが、webmastersはグループです。

以下の質問への回答では、Apacheが書き込むファイルはwww-dataおよびグループwww-dataによって所有されます。これらのファイルは通常、ユーザーが書き込むものではないため、www-dataの非メンバーは読み取り専用アクセス権を持っている可能性があります。ディレクトリのアクセス権に依存していると思います。ときどき書き込みアクセスが必要な場合は、グループに自分を追加すると便利です。通常、Apacheによって保存されたコンテンツに対して特定のディレクトリを書き込み可能にします。また、シェルアクセスなしでApacheを実行するほとんどの共有Webホスティングには、グループを設定する方法すらありません。

ただし、Apacheはルートが所有しているファイルでも読み取ることができます。ほとんどすべてのファイルには、誰でも読み取り可能なアクセス権がありますが、書き込み可能ではありません。したがって、これを変更する場合を除き、Apacheはwebmastersグループに所属する必要はありません。

これはすべて基本的なLinuxセットアップであり、実際にはApacheではありません。ApacheはWebサーバー内からのアクセスのみを考慮し、それは設定ファイルによって設定されます。この理由から、私が投稿に含めたUbuntuのドキュメントリンクは、公開wikiよりも優れたソースと見なされるべきです。

ところで、O'Reilly Apache Cookbookは、「htdocs、cgi-bin、iconsなどのドキュメントディレクトリには、特定のWebサイトの開発モデルにとって最も適切な方法で設定されたアクセス許可が必要です。しかし、いかなる状況においても、これらのディレクトリまたはそれらに含まれるファイルは、Webサーバーのユーザーによって書き込み可能ではありません。」

最後に、ACLを使用すると、さらに制御が必要な場合にファイルのアクセス許可を設定するのに適した方法です。それは常にそれらを設定する良い方法であるかもしれません、そして私は調査すべきものです。


こんにちは@ marty-fried、答えてくれてありがとう、試してみるのに十分なことがあります。Re。あなたの質問。さまざまなソースから情報をつなぎ合わせたので(そのため、自分の使用ガイドに書き留めたのです)、正確なソースを思い出せません。私はこの特定のソースを使用しませんでした(ソリューション1)(私はそれを見つけたばかりです)、それは私の決定の良い根拠を与えます。あなたが言及するApacheガイドでは、「webmasters」と呼ばれるグループを作成することを推奨していますが、私がそれをした場合、Apacheは/var/wwwそのグループに追加せずにどのように書き込みますか?
チャールズローパー

そして、私が行う他のユーザーにアクセス与える必要/var/www私はグループのアクセス権を与えると思ったのでwww-data、誰もがそのグループのメンバーは良い解決策になる作りを。ただし、Apacheがそこにあるすべてのファイルを上書きできるという問題がわかりました。2人の開発者(自分を含む)のみがコードにアクセスできることを考えると、短期的には比較的安全です。
チャールズローパー

1
ありがとう、マーティ。Apache Cookbookのこの部分は私を笑わせました。「Apacheサーバーにファイル許可を設定する正しい方法を12人に尋ねると、12種類の答えが得られることに注意してください。」あなたは私が今進歩するために必要なほとんどすべてを私に与えました。お時間をありがとうございました。:
チャールズローパー

1
私も少し学んだので、詳細な議論を楽しんでいます。通常、かすんだ部分を明確にするのに役立ちます。私は主にプログラマーであり、問​​題の修正とWebサイトのセットアップを依頼されるため、常により良い方法を学んでいます。他に質問がある場合はお気軽にお問い合わせください。
マーティフライド

1
私の知る限り、sudo chmod -R g + rw / var / wwwは「グループ」アクセスを許可します。ワールドアクセスには「a + rw」を使用します。
ドナルラファティ

7

あなたが使っていないことに気づきましたchown

ファイル/フォルダの所有権を適切に設定するには、次の方法でディレクトリ全体を設定できます。 chown -R www-data:www-data

これにより、所有権がグループwww-dataとユーザーに設定されますwww-data

また、一時的な回避策としてこれを行うことができます:

chmod 777 /var/data/<filename> または chmod 777 /var/data/<foldername>

必要に応じてファイルを編集してから、

chmod 644 /var/data/<filename> または chmod 755 /var/data/<foldername>

「-R」スイッチを使用すると、すべてのサブファイルとフォルダーのアクセス権も変更されるため、注意してください。

664はApacheの標準ファイル許可、755は標準フォルダー許可です。

お役に立てれば :)


こんにちは、時間を割いて答えてくれてありがとう、とても感謝しています。ただし、実際には役立ちません。ファイルをチャニングすると、SFTPを使用するときにすべてのファイルが変更不可能になります(私が望んでいるのとは逆です!)。a)SFTPでchmodの権限がないため、chmodの回避策を実際に使用できません。b)本当にSSH経由でログインしたり、権限を変更したり、SFTPを実行したり、元に戻したりしたくない。c)セキュリティ上の理由で一部のファイルのアクセス許可が異なるため、とにかくchmodできません。
チャールズローパー

なに/var/data?また、彼がコマンドを使用することを提案しているディレクトリは何chown -R www-data:www-dataですか?うまくいけない/var/www
マーティフライド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.