<br><br><div class="gmail_quote">On Fri, May 1, 2009 at 11:02 AM, Brian Pitts <span dir="ltr">&lt;<a href="mailto:brian@polibyte.com">brian@polibyte.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">David M Lemcoe Jr. wrote:<br>
</div><div class="im">&gt; Hello hello.<br>
&gt;<br>
&gt; I currently have a server with about 15 people that have domains on<br>
&gt; it. When playing around in SSH, I noticed that if I ssh as a user that<br>
&gt; was not in his own directory, I could change, edit, and view his files.<br>
&gt;<br>
&gt; What permissions do I need to set in order for other users not to be<br>
&gt; able to access others&#39; files, but let Apache access them.<br>
&gt;<br>
&gt; It would make sense to first chown the directory, put all the web<br>
&gt; server users in a group, and chmod everything 707.<br>
<br>
</div>Here&#39;s a scheme that I think should work. I&#39;ve never actually seen any<br>
documentation oon how to accomplish this, so I&#39;d like to hear from<br>
anyone about problems you foresee or different approaches you would take.<br>
<br>
I&#39;m pretending that each user has a home directory where they store<br>
their files, and that the files apache needs to access are in<br>
~/public_html. I&#39;m also mostly pretending that you&#39;re starting from a<br>
blank slate with no existing files, while in reality you&#39;ll need to do<br>
some lot of recursive chmod and chown.<br>
<br>
First, set each users primary group to a group where they are the only<br>
member. It&#39;s easy to remember if you make the group name the same as the<br>
username.<br>
<br>
Second, set the users&#39; umasks to 026. This means that newly created<br>
files will have the permissions 640 and newly created directories will<br>
have the permissions 751. This means that by default the user can do<br>
anything to their files and their group can read them. Since the user is<br>
in a &quot;private&quot; group, only they can access these files. The trailing 1<br>
on directory permissions lets other users traverse through directories<br>
but not read their contents.<br>
<br>
Third, set each home directory to be owned by its user&#39;s username and by<br>
their primary group. E.G. my home directory would be brian:brian.<br>
<br>
Fourth, set their home directory permissions to 750. Now only the user<br>
can read or write in their home directory.<br>
<br>
Fifth, set ~/public_html to be owned by its user&#39;s username and by the<br>
group the webserver is running as. E.G. my ~/public_html directory would<br>
be brian:www-data.<br>
<br>
Sixth, set the ~/public_html directory permissions to 750. Now the web<br>
server can see inside this directory.<br>
<br>
Seventh, set the setgid permission on ~/public_html. This means that<br>
files created inside the directory will inherit its group owner instead<br>
of the user&#39;s primary group. E.G. instead of being owned by brian:brian<br>
files in my public_html would be owned by brian:www-data. Now the web<br>
server can read the files it needs to serve.<br>
<br>
I think this does exactly what you asked for.<br>
<br>
What if you need several users to be able to edit the same set of files<br>
served by Apache? One approach is to change the umask to 002, put the<br>
users in a group together, set that group as the owner of the directory<br>
where the files to be edited reside, and enable setgid on it. This<br>
requires relaxing your restriction that files can&#39;t be world-readable,<br>
which may or may not be reasonable (e.g. it&#39;s fine if you&#39;re serving<br>
static content and apache wasn&#39;t doing any authentication, it&#39;s less<br>
fine if you have cgi programs with database passwords in them).<br>
<br>
--<br>
All the best,<br>
<font color="#888888">Brian Pitts</font></blockquote><div><br></div><div><br></div><div>If you put the web content outside the user&#39;s home, or set the user&#39;s home to a directory not /home, ie: /var/www/hosted/* , you can set a default acl for the apache user to get rx perms on any file/directory created therein.  aka  setfacl -m d:u:apache:rx /var/www/hosted</div>
<div><br></div><div>Then you can either set the perms on the directories within hosted to be 700 so just the user has access to place/remove content files.  If several users who belong to the same group are going to be manipulating content, set the shared group as their directory owner and set the perms to 2770 so that the group owner propagates.  Because you already added the default acl for the apache user, as though by magic, the web server still gets access to all those people&#39;s files even though the user-group-other permissions indicate otherwise.</div>
<div><br></div><div>ACLs, ACLs, ACLs</div><div><br></div><div>-Scott</div></div><br>