ApacheとPHPを実行するかなり標準的なサーバーがセットアップされています。私が実行しているアプリはファイルを作成し、これらはApacheユーザーwww-data
によって所有されています。 SFTP経由でアップロードしたファイルは、自分のユーザーcharlesr
が所有しています。すべてのファイルはwww-data
グループの一部です。私の問題は、charlesr
がwww-data
グループの一部であっても、www-data
が所有するファイルをSFTP経由で変更または上書きできないことです。 SSHセッションを介して問題なくファイルを変更できます。
だから私は何をすべきかわからない。 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
グループの一部に自動的になります)。
UPDATE
この問題は、アプリ自体、またはより具体的には、アプリケーションフレームワーク( Kohana )が特定のファイルを0644(rw-r--r--)に設定したために発生したようです。つまり、グループ書き込み不可です。これは、ファイルがwww-data
によっても所有されているという事実と相まって、charlesr
としてログインしたときにSFTPを介してファイルを編集できなかったことを意味します。 SSH経由でファイルを編集できる理由がわかりません。私の推測では、Sudoを使用したに違いありません。
Marty Friedの疲れのない助け のおかげで、私が現在使用しているアクセス許可戦略は次のとおりです。ありがとう、マーティ!
/var/www
のファイルとディレクトリは、root:webmasters
が所有する必要がありますwebmasters
グループのメンバーである必要があります/var/www
のすべてのディレクトリは、2775
またはu=rwx,g=rwxs,o=rx
(rwxrwx-r-x)に設定する必要があります/var/www
のすべてのファイルは、0664
またはug=rw,o=r
(rw-rw-r--)に設定する必要があります以下はwww-data:webmasters
が所有する必要があります(つまり、これらはApacheが書き込みできる必要があるディレクトリです):
デフォルトでファイルが提供される/var/www
にアクセス許可を設定するには:
Sudo addgroup webmasters
Sudo adduser $USER webmasters
Sudo chown -R root:webmasters /var/www
Sudo find /var/www -type f -exec chmod 664 {} \;
Sudo find /var/www -type d -exec chmod 775 {} \;
Sudo find /var/www -type d -exec chmod g+s {} \;
Sudo chown -R www-data:webmasters application/cache/
[etc ...]ここでログアウトして再度ログインし、変更を有効にします。
前の一連のコマンドは次のことを行います。
webmasters
という新しいグループを作成します。アプリファイルへの書き込みアクセスを必要とするすべてのユーザーがこのグループに追加されます。$USER
)をwebmasters
グループに追加します。/var/www
の所有者をroot
に変更し、グループをwebmasters
グループに変更します。/var/www
のすべてのファイルに 664許可 (-rw-rw-r--)を追加します。/var/www
内のすべてのディレクトリに 775許可 (drwxrwxr-x)を追加します。/var/www
およびその中のすべてのディレクトリにSGIDビットを設定します。この最後のポイントには、いくつかの説明があります。また、同じことを行うためにchmodの8進数の前に2を置くこともできることに注意してください(例:2644)。www-data
(Apacheのユーザー)に設定し、提供されたディレクトリのグループをwebmaster
に設定します。これにより、Apacheおよびwebmasters
グループの誰でもディレクトリが書き込み可能になります。書き込み可能にする必要がある他のすべてのディレクトリにも同じことを行います。Ubuntu.comには、 Apacheガイド などの非常に優れたサーバーガイドがあります。慎重に書き留めた手順はどこで入手しましたか?私がセットアップしたサーバーのどれでもそんなに面倒なことをする必要はありませんでしたが、私はそれを正しくやっていない可能性を開いています-また、実際にサーバーをインストールしていません非常に公開されているもの、または非常に大きいものなので、知らないセキュリティホールが存在する可能性があります。
ただし、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を使用すると、さらに制御が必要な場合にファイルのアクセス許可を設定するのに適した方法です。それは常にそれらを設定する良い方法であるかもしれません、そして私は調査すべきものです。
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は標準フォルダー許可です。
お役に立てれば :)
星