Vraag Hoe vermijd je het gebruik van sudo bij het werken in / var / www?


Ik wil stoppen met gebruiken sudo telkens als ik werk /var/www. Hoe kan ik dat doen? Ik wil eenvoudig al mijn sites in deze directory plaatsen en met hen werken zonder al te veel pijn.


162
2018-06-01 03:43


oorsprong


Gebruikt u apache? - Rinzwind
Na het lezen hier kan dit ook helpen in het toestemmingsgedeelte: askubuntu.com/questions/20105/... - Luis Alvarado♦
Een andere manier om veiligheid te krijgen, is doorgaan met gebruiken sudo -u www-data maar beperk jezelf in de sudoers bestand om alleen te kunnen sudo www-data (en niet sudo root). Zien serverfault.com/questions/295429/... - Simon Woodside


antwoorden:


De meeste antwoorden zijn hier niet geschreven met het oog op beveiliging. Het is goed om het gevoel te krijgen dat je rent sudo elke keer is niet erg verstandig. Als u een typfout maakt (bijvoorbeeld (niet uitvoeren) sudo rm -rf / var/www/dir), kunt u uw systeem trashen.

Notitie: Beginnend met Apache 2.4.7 / Ubuntu 14.04, /var/www is verplaatst naar /var/www/html Pas de opdrachten in dit antwoord dienovereenkomstig aan.

Zien:

Slechte ideeën:

  • chmod 777 (sagarchalise) - hierdoor kan iedereen met toegang tot uw systeem in de mappen en bestanden schrijven en daardoor de indringer in staat stellen elke code onder de www-data gebruiker
  • chgrp -R www-data $HOME (cob) - dit staat toe www-data om bestanden in de basismap te lezen of te schrijven. Dit houdt niet de Least Privilege-regel in gedachten
  • chown -R $USER:$USER /var/www (kv1dr) - tenzij de wereld toestemmingen heeft gelezen /var/www, de webserver die onder draait www-data kan de bestanden niet lezen (dienen). Als het bestand een openbaar toegankelijk eenvoudig HTML-document is, is het misschien geen probleem als de wereld het bestand kan lezen. Maar als het een PHP-bestand met wachtwoorden is, is het dat wel.

NOTITIE: in de onderstaande oplossingen, die ik heb verleend www-data schrijf privileges. Echter, /usr/share/doc/base-passwd/users-and-groups.txt.gz luidt als volgt:

www-data

Sommige webservers werken als www-gegevens. Webinhoud zou hier geen eigendom van moeten zijn     gebruiker of een aangetaste webserver in staat zou zijn om een ​​website te herschrijven. Gegevens     uitgeschreven door webservers worden eigendom van www-data.

Waar mogelijk, doe niet verleen schrijfrechten aan de www-data groep. www-data hoeft alleen maar te kunnen lezen de bestanden zodat de webserver deze kan gebruiken. Het enige geval waar www-data heeft schrijfrechten nodig voor mappen die uploads en andere locaties opslaan die moeten worden geschreven.

Oplossing 1

Voeg jezelf toe aan de www-data groep en stel de setgid bit in op de /var/www directory zodat alle nieuw gemaakte bestanden deze groep ook erven.

sudo gpasswd -a "$USER" www-data

Corrigeer eerder gemaakte bestanden (ervan uitgaande dat u de enige gebruiker bent van /var/www):

sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;

(nog veiliger: gebruik 640 of 2750 en handmatig chmod g+w file-or-dir dat moet beschrijfbaar zijn door de webserver)

Oplossing 2

Maak een symbolische link voor elk project naar uw thuismap. Stel dat uw project zich bevindt op ~/projects/foo en je wilt dat het zich bevindt op /var/www/foo, rennen:

sudo ln -sT ~/projects/foo /var/www/foo

Als uw home-directory geen execute-bit (aflopend) heeft ingesteld other (om veiligheidsredenen), wijzig de groep ervan in www-data, maar stel alleen het execute-bit in (geen lezen / schrijven). Doe hetzelfde voor de ~/projectsmap omdat deze andere projecten kan bevatten dan www. (Je hebt het niet nodig sudo als je eerder je gebruiker hebt toegevoegd aan de www-data groep.)

sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects

Stel de groep in op www-data op ~/projects/foo en laat de webserver bestanden en bestanden + mappen lezen en schrijven en afdalen naar mappen:

sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;

Nog veiliger: gebruik standaard 640 en 2750 en handmatig chmod-bestanden en -directory's die door de webservergebruiker kunnen worden beschreven. De setgid-bit moet alleen worden toegevoegd als u wilt dat elk nieuw bestand wordt gemaakt ~/projects/foo toegankelijk zijn voor de groep.

Vanaf nu heeft u toegang tot uw site op http://localhost/foo en bewerk je projectbestanden in ~/projects/foo.

Zie ook


229
2018-06-01 09:48



Wat vind je van een www-sessie in een terminal van sudo su www-data? Gecombineerd met een verschillend gekleurde prompt, om het duidelijker te maken dat het de shell is van een andere gebruiker, en een beleid om altijd de bijbehorende xterm op de virtuele desktop 4 te zetten, zodat je eraan went, om Vermijd verwarring? - user unknown
@user onbekend: als je alles in de terminal goed doet, heb je een duidelijke scheiding tussen gebruikersaccounts. Maar het zal niet werken als je een GUI-programma gebruikt zoals gedit. Ik heb nog nooit onderzocht of het uitvoeren van een GUI-programma onder een andere gebruiker in de huidige sessie veilig is of niet, het zou een interessante vraag zijn. - Lekensteyn
@imaginaryRobots: als ik voor elke vraag verschillende oplossingen zou posten, zou Askubuntu vol zitten met antwoorden van drie regels. Ik zal het houden zoals het is, tenzij je me kunt overtuigen om het te splitsen. - Lekensteyn
@berbt setfacl -d u::rwX,g::rX /var/www heeft het grappige effect dat de standaardmodus 0750 (of 0640) wordt, zelfs als de umask nul is. Het is misschien een goed idee om wereldbeschrijfbare bestanden te vermijden, maar als /var/www is al ontoegankelijk door de wereld, het is niet nodig. - Lekensteyn
Is er een probleem met het omkeren van het proces in oplossing 1? Daar bedoel ik mee, /var/www/app01 heeft eigendom app01:app01en dan de www-data  gebruiker is toegevoegd aan de app01  groep? Of breekt dat iets? - Jack_Hu


In plaats van mijn websites op te slaan in / var / www plaats ik daar links naar de sites die zich in mijn thuismap bevinden. Ik kan vrij bewerken of pagina's toevoegen aan mijn sites. Wanneer ik blij ben met veranderingen, dan FTP ik naar een hostingbedrijf waar mijn domeinnaam links zijn.


7
2018-06-01 07:06



Dit is een verstandig idee. - thomasrutter


Als je / var / www beschrijfbaar maakt voor zijn groep en jezelf toevoegt aan de groep, hoef je sudo niet te gebruiken terwijl je nog steeds redelijk veilig bent. Probeer dit:

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rw /var/www

U zou dan moeten kunnen bewerken /var/www/ bestanden zonder gedoe.

De eerste regel voegt u toe aan de www-data groep, verwijdert de tweede regel alle bestanden met verknipt eigendom en de derde maakt het zo dat alle gebruikers die lid zijn van de www-data groep kan alle bestanden lezen en schrijven /var/www.


6
2017-07-01 00:41



Dit is een zeer slecht idee voor beveiliging en dit advies moet niet worden gevolgd, om redenen die in andere antwoorden worden uitgelegd. www-data hoort een te zijn zonder privileges groep, zonder schrijftoegang. - thomasrutter


don'ts

  • Stel geen bestandsrechten in 777 (World-beschrijfbare)

    Dit is een belangrijke beveiligingsfout, vooral als u server-side scripting zoals PHP inschakelt. Niet-bevoorrechte processen zouden niet in staat moeten zijn om naar bestanden te schrijven die de website zouden beïnvloeden of, in het geval van server-side scripting dat wordt gebruikt, willekeurige code uit te voeren.

  • Voeg uzelf niet toe als lid van de www-data groep en geef het schrijfrechten

    Het doel van die groep is dat het een is zonder privileges groepeer dat server processen rennen als. Ze zouden alleen waar mogelijk leesrechten moeten hebben voor de websitebestanden, om dezelfde redenen als hierboven.

  • Wijzig de rechten van de Apache-processen niet

    De kinderprocessen van Apache worden uitgevoerd als de www-data gebruiker en groep standaard, en dit zou niet moeten worden veranderd. Dit is slechts een manier om ze geen schrijfrechten te geven aan het bestandssysteem.

    In bepaalde omstandigheden wilt u dat uw server-side scripts in staat zijn om naar bestanden te schrijven, in welk geval enkel en alleen die bestanden zouden door te schrijven kunnen worden gemaakt www-data en er moet voor worden gezorgd dat de veiligheid wordt gewaarborgd.

Dos

  • Stel de bestanden in als eigendom van uzelf

    Als u de enige bent, of de gebruikelijke, om bepaalde bestanden op de website aan te passen, dan is het logisch om alleen die bestanden in eigendom te nemen. Stel hun eigenaar in op <your username>.

    U hoeft hiervoor de serverrechten niet aan te passen, omdat de server alleen-lezen toegang blijft krijgen, zelfs als de bestanden eigendom van u zijn.

  • Kies een geschikte plek om de bestanden te huisvesten (met DocumentRoot)

    Als /var/www klopt niet, je bent van harte welkom om ze ergens anders te plaatsen. Als ze specifiek zijn voor je eigen ontwikkeling of testen, kun je ze in je thuismap plaatsen. Of u kunt een aantal mappen instellen in /srv.

  • Als je wilt geven groep schrijf toegang, maak een nieuwe groep voor het doel

    Gebruik een systeemgroep niet opnieuw, omdat deze doorgaans zijn ontworpen om de toegang te hebben die ze momenteel hebben, en niet meer, om veiligheidsredenen.


5
2017-11-23 23:43





Het is zo eenvoudig. Je hoeft apache 'UserDir' (niet aanbevolen) niet in te schakelen en ook geen 'www-data'-groepen in de war te brengen (apache-groep in het geval van Fedora)

Maak gewoon uw projectdirectory binnen /var/www/html

cd /var/www/html
sudo mkdir my_project

Vervolgens heeft u de projectdirectory alleen aan uw gebruiker getoond.

sudo chown your_username my_project

Nu kunt u als gewone gebruiker aan uw projectmap werken met elke editor, IDE van uw keuze. Niet meer sudos :)


5
2017-08-06 07:49



+1 Dat is wat ik doe: van eigenaar veranderen niet van /var/www zelf, maar van subdirectories. - fkraiem


chmod in / var op www om de eigenaar toegang te verlenen en chown om er zeker van te zijn dat u de eigenaar bent. Waarschijnlijk een stom idee, maar het zou zeker werken.


1
2018-06-01 03:59



Geen dom idee, het is een verstandig idee op het gebied van veiligheid. Opmerking: u hoeft de machtigingen van (niet te) te wijzigen /var, net /var/www en / of de inhoud ervan. - thomasrutter


Je zou een www-sessie in een terminal kunnen beginnen met

sudo su www-data

Gecombineerd met een verschillend gekleurde prompt *, om het meer voor de hand liggend te maken dat het de schil van een andere gebruiker is, en een beleid om altijd de bijbehorende xterm (en editor en dergelijke) op - bijvoorbeeld - de virtuele desktop 4 te plaatsen, zodat je went eraan, om verwarring te voorkomen.

*) Maak voor een verschillend gekleurde prompt met een verschillend karakter een bestand / etc / prompt als volgt:

# PROMPTING
#       When  executing  interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the sec-
#       ondary prompt PS2 when it needs more input to complete a command.  Bash allows these prompt strings to be  customized
#       by inserting a number of backslash-escaped special characters that are decoded as follows:
#              \a     an ASCII bell character (07)
#              \d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
#              \D{format}
#                     the  format is passed to strftime(3) and the result is inserted into the prompt string; an empty format
#                     results in a locale-specific time representation.  The braces are required
#              \e     an ASCII escape character (033)
#              \h     the hostname up to the first `.'
#              \H     the hostname
#              \j     the number of jobs currently managed by the shell
#              \l     the basename of the shell's terminal device name
#              \n     newline
#              \r     carriage return
#              \s     the name of the shell, the basename of $0 (the portion following the final slash)
#              \t     the current time in 24-hour HH:MM:SS format
#              \T     the current time in 12-hour HH:MM:SS format
#              \@     the current time in 12-hour am/pm format
#              \A     the current time in 24-hour HH:MM format
#              \u     the username of the current user
#              \v     the version of bash (e.g., 2.00)
#              \V     the release of bash, version + patchelvel (e.g., 2.00.0)
#              \w     the current working directory
#              \W     the basename of the current working directory
#              \!     the history number of this command
#              \#     the command number of this command
#              \$     if the effective UID is 0, a #, otherwise a $
#              \nnn   the character corresponding to the octal number nnn
#              \\     a backslash
#              \[     begin a sequence of non-printing characters, which could be used to embed a terminal  control  sequence
#                     into the prompt
#              \]     end a sequence of non-printing characters
#
#       The  command  number and the history number are usually different: the history number of a command is its position in
#       the history list, which may include commands restored from the history file (see HISTORY below),  while  the  command
#       number  is  the  position in the sequence of commands executed during the current shell session.  After the string is
#
# colors:
# \[...\]   wird benötigt, damit die shell weiß, daß hier kein printable output ist, und die Umbrüche richtig plaziert.
#
# ANSI COLORS
CRE="\[
[K\]"
NORMAL="\[[0;39m\]"
# RED: Failure or error message
RED="\[[1;31m\]"
# GREEN: Success message
GREEN="\[[1;32m\]"
# YELLOW: Descriptions
YELLOW="\[[1;33m\]"
# BLUE: System messages
BLUE="\[[1;34m\]"
# MAGENTA: Found devices or drivers
MAGENTA="\[[1;35m\]"
# CYAN: Questions
CYAN="\[[1;36m\]"
# BOLD WHITE: Hint
WHITE="\[[1;37m\]"
#
# default:
# postgres, oracle, www-data
#
# PS1=$BLUE"machine]->"$NORMAL\\w"$BLUE ø $NORMAL"
PS1=$BLUE"machine]:"$NORMAL\\w"$BLUE > $NORMAL"
#
# root, stefan:
#
case "$UID" in
    '0')
        PS1=$RED"machine:"$NORMAL\\w"$RED # $NORMAL"
    ;;
    '1000')
    PS1=$GREEN"machine:"$BLUE\\w$YELLOW" > "$NORMAL
    ;;
#    default)
#    ;;
esac

en bron het van /etc/bash.bashrc bijvoorbeeld.

Als extra hulpmiddel om onderscheid te maken, zou je je bestanden altijd kunnen bewerken met een alias 'edit' of een symlink, die, afhankelijk van je identiteit (taylor / www-data) naar gedit of mousepad, vim of pico verwijst. Of u kunt verschillende editorprofielen gebruiken, althans in gedit kunt u uw voorkeuren bijvoorbeeld instellen op zwarte tekst op witte grond of witte tekst op zwarte grond.

Ik heb alleen zo'n beleid om als root te werken, dus ik weet niet zeker hoe goed het zal werken met www-data. Gecombineerd met ssh-sessies om verschillende hosts te onderscheiden, die hun eigen prompts hebben, heeft dit me er niet van weerhouden soms verkeerd te zijn, maar als het gebeurt, realiseer ik me snel, wat is er mis en het gebeurt zelden.

opmerking: het prompt-script is gedeeltelijk een kopie van de manpage van bash.


1
2018-06-01 15:49



Dit werkt en zal niet (als het zorgvuldig wordt gebruikt) een negatieve invloed hebben op de beveiliging, maar is mogelijk niet de meest eenvoudige oplossing. Het is echter voor sommige mensen een geldige oplossing. - thomasrutter


Op deze pagina van mijn site Ik behandel de opdrachten voor het wijzigen van de machtiging in /var/www tussen apache en de pi-gebruiker, maar het is essentieel

sudo chown -R pi /var/www

vervolgens een apache herstart

sudo service apache2 restart

-1
2017-11-23 23:27



Link werkt nu - Gadgetroid