Автор Тема: Права под линъкс върху уеб-директорията на сървъра  (Прочетена 3660 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Здравейте приятели!

Често в форума виждам нови потребители в линъкс идващи от света на уиндолс да задават въпроси от рода:
1. Защо copy или moving функциите не работят в php?
2. Защо влизам в определени директории, но не мога да едитвам определени файлове?
3. Защо през netbeans мога да пиша там, а през моят файлов менаджър номера не минава и т.н и т.н...

Целта на този кратък урок е да ви обясня основни положения в линъкс и правата в/у директориите, под-директориите и файловете в тях.
Няма да се спирам в детайли за правата в линъкс, има страшно много how to информация в мрежата.
1. Виждам много потребители от форума да съветват ами дай направо - chmod 755 /var/www -R и всичко ще проработи.
Да това е така, но системата по този начин почва да прилича на уиндолс, което на мен не ми харесва и затова ще ви покажа моят начин.
2. Допускам, че вече имате инсталиран линъкс стака LAMP ( Linux, Apache, MySQL, PHP )
3. Допускам, че имате основни познания какво е "terminal" и как се листват директориите и файловете през него.
Има и GUI инструменти, чрез които можете да правите всичко това, но тук ще го правим през терминала на системата.
4. Всичките команди се run-ват под CentOS, така че те са валидни за CentOS / Fedora / RedHat потребителите.
Може и да има известно разминаване з потребителите на Debian / Ubuntu и някои други дистрибуции на линъкс, ако има то няма да е голямо. 
5. Ще работим с 3 различни потребителя имащи различни права в/у /var/www/html директорията.
6. След инсталиране на всяка една linux desktop дистрибуция, след рибуутването и,тя ви дава възможност да създадете desktop потребител. В моят случай той се нарича - "jazzman"
7. След инсталиране на LAMP стака, линъкс автоматично създава потребител с име "apache" при CentOS/Fedora/RedHat, чийто права са да може да пише, чете, изпълнява скриптове root директорията на сървъра, при мен е /var/www/html. За потребителите на Debian/Ubuntu този юзър мисля, че се нарича "www-web" или "www-data" не съм сигурен, както и това
че техният root server folder е /var/www защо е така не ме питайте, това също е едно голямо недомислие в линъкс, както и различните пакетни системи и техните инсталатори.
8. Ще създадем и трети потребител с име - dummy, но това в края на урока.


1. Първото нещо е да разберем кои са валидните имена на потребители в системата. За целта отварям терминала и run-вам следният скрипт:
[jazzman@localhost]$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3 }' /etc/passwd

username: root      uid:0
username: bin      uid:1
username: daemon      uid:2
username: adm      uid:3
username: lp      uid:4
username: sync      uid:5
username: shutdown      uid:6
username: halt      uid:7
username: mail      uid:8
username: uucp      uid:10
username: operator      uid:11
username: games      uid:12
username: gopher      uid:13
username: ftp      uid:14
username: nobody      uid:99
username: dbus      uid:81
username: usbmuxd      uid:113
username: avahi-autoipd      uid:170
username: vcsa      uid:69
username: rpc      uid:32
username: rtkit      uid:499
username: abrt      uid:498
username: nscd      uid:28
username: haldaemon      uid:68
username: apache      uid:48
username: nslcd      uid:65
username: saslauth      uid:497
username: postfix      uid:89
username: avahi      uid:70
username: ntp      uid:38
username: rpcuser      uid:29
username: nfsnobody      uid:65534
username: pulse      uid:496
username: gdm      uid:42
username: sshd      uid:74
username: tcpdump      uid:72
username: jazzman      uid:500
username: mysql      uid:27
username: dummy      uid:501

В случая ни интересуват - "apache", "jazzman" и "dummy" (който е създаден последен).
2.Второто нещо след като имате всичко това на лице е да създадете новата директория където ще бъде вашият php проект, аз ще го нарека - permission.
Ако аз се опитам да създам този фолдър от мое име (jazzman), аз ще получа съобщение за отказани права, че нямам работа в server root folder - което е супер ;)
Някой ще каже........абе влез като root и давай 777 с рекурсуя в края и нямаш проблем - това е много лоша практика, както писах по-горе.
Идеята е да се запази пермишъна в/у основната директория и да се дадат права само за тази под-директорията.
Какво правя аз:
Влизам като root и създавам директорията с име permission.
Командата е : mkdir /var/www/html/permission -p
Ако искаме да видим какви са правата в/у нея изпълняваме
ls -la /var/www/html/permission
Results:
drwxr-xr-x   2 root root 4096 Nov 24 15:06 .
drwxr-xr-x. 12 root root 4096 Nov 24 15:06 ..

Няма да се спирам в подробности какво означават всички тези букви, но ако се опитам от името на jazzman  да създам нов файл в нея, вижте какво ще получа:

[jazzman@localhost ~]$ touch index.php /var/www/html/permission/
touch: setting times of `/var/www/html/permission/': Permission denied
touch: cannot touch `index.php`: Permission denied

С други думи, никой освен root или тези които са от групата на root могат да пишат вътре - ами супер, ами сега какво да правя ?
Трябва ли да влизам винаги като root за да пиша там? Отговора е не, просто трябва да се предоставят пълни права само на потребителя jazzman.

За да се дадат такива в/у тази директория и под-директории правим следното, променяме групата и собственика.

[root@localhost jazzman]# chgrp -Rhv jazzman /var/www/html/permission/
changed group of `/var/www/html/permission/' to jazzman

[root@localhost jazzman]# chown -R jazzman /var/www/html/permission/
changed ownership of `/var/www/html/permission/' to jazzman

Да видим сега какво получаме:
[jazzman@localhost ~]$ ls -la /var/www/html/permission/
drwxrwxr-x   2 jazzman jazzman 4096 Nov 24 15:47 .
drwxr-xr-x. 12 root    root    4096 Nov 24 15:06 ..

Това означава, че правата в/у server root directory си е на root а новата permission отива при jazzman и само той (освен root) има права над нея.

Обаче какво става с юзъра  "apache"? Под името на този потребител се изпълнява всичко свързано с php (понеже php е сървърен език).
Ако аз създам един php файл, който да копира текст от друг файл и да го записва в/у сървъра нека да видим какво ще се случи.
Първо създваме index.php файла в нашата permission директория (ползвам vim):

[jazzman@localhost ~]$ vim /var/www/html/permission/index.php
и в него пиша следният прост скрипт: (exampe.txt е създаден предварително от jazzman)

<?php 

$file = 'example.txt';
$newfile = 'new.txt';

copy($file, $newfile);

Ако стартираме браузъра с url localhost/permission,изкача следното съобщение:
Warning: copy(example.txt) [<a href='function.copy'>function.copy</a>]: failed to open stream: No such file or directory in /var/www/html/permission/index.php on line 6

Това означава, че скрипта нещо се сгъбясва, защо? ами щото "apache" няма право да пише там, за да оправим този проблем добавяме user-a apache към групата на jazzman.

[root@localhost jazzman]# chgrp -Rvh apache /var/www/html/permission/
changed group of `/var/www/html/permission/index.php' to apache
changed group of `/var/www/html/permission/test.php' to apache
changed group of `/var/www/html/permission/' to apache

Даваме и пълни права на потребителите от групата на джазмените, без чалгаджиите ( в случая е само apache).

[jazzman@localhost ~]$ chmod -Rv 775 /var/www/html/permission/
mode of `/var/www/html/permission/' retained as 0775 (rwxrwxr-x)
mode of `/var/www/html/permission/index.php' changed to 0775 (rwxrwxr-x)
mode of `/var/www/html/permission/test.php' changed to 0775 (rwxrwxr-x)

5-та в края може я орежете на 3 или 2 ( това е пермишъна за всички останали които са извън групата).........

Отваряме и httpd.conf файла и променяме групата от apache на jazzman, понеже той е описан в config file на apache...

Сега ако изпълните в браузъра localhost/permission, всичко трябва да е както трябва.

Новият файл се създате от потребител с име apache принадлежащ към групата на jazzman чиито потребители имат пълни права.

Другото което бихте могли да направите е всичките php scripts да се изпълняват от името на jazzman принаадлежащ към групата на apache.
Може да обърнете логиката както си искате.

Последно ако създам потребител с име "dummy" той ще има права само да изпълнява и чете скриптовете, но не и да пише.....

Надявам се да ви бъде интересно и най-вече полезно в работата с линъкс...





« Последна редакция: 25 Ноември 2012, 01:40:55 от jazzman »
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
EDIT: Допуснал съм някои грешки в бързината.

1. По горе съм писал че само потребителя root и тези от неговата група могат дa пишат - което не е вярно понеже пермишъна за групата е r-x

2. Писал съм че може да промените правата от 3 или 2, което също не е вярно понеже :
r = 4 (reading)
x = 1 (execution)
w = 2 (writing)
0  = no permission
« Последна редакция: 25 Ноември 2012, 02:29:45 от jazzman »
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Реших да ви предоставя още един метод, който изключва въможноста да се пипа конфигурационният файл на сървъра. ( httpd.conf file )

Предишният ми пост е сложен за разбиране, също така съм допуснал грешки, ама....какво да се прави нямам голям опит в излагането на знанията си в писмен вид ;)

Да започнем от самото начало създавайки новата директория permission от името на root, понеже само той (освен apache) може да пише в /var/www/html/,
за тези които не знаят - това е web root directory на сървъра, за потребителите на Debian/Ubuntu тя е /var/www/ .

[root@localhost jazzman]# mkdir -p /var/www/html/permission
ls -la /var/www/html/permission/
total 8
drwxr-xr-x   2 root root 4096 Nov 25 10:34 .
drwxrwxr-x. 12 root root 4096 Nov 25 10:34 ..

От лога в конзолата виждаме, че собственика е root имащ пълни права ( rwx ), групата на root (четене и изпълнение), всички останали (четене и изпълнение).

Правим директорията "permission" собственост на "apache" (за потребителите на Debian/Ubuntu този потребител е "www-data").

[root@localhost jazzman]# chown apache:apache -Rv /var/www/html/permission/
changed ownership of `/var/www/html/permission/' to apache:apache

Ако сега се опитам да запиша файл с име index.php от името на jazzman, получавам следното:
[jazzman@localhost ~]$ touch index.php /var/www/html/permission/
touch: cannot touch `/var/www/html/permission/': Permission denied

За целта влизам като root и създавам два файла - index.php и example.txt 
[root@localhost jazzman]# vim /var/www/html/permission/index.php
[root@localhost jazzman]# vim /var/www/html/permission/example.txt
В index.php копирам съдържанието от предишният пост - това го правя с цел да разберете как php генерира нещата (ако искате може да пропуснете тази част). 
И съответно даваме правата в/у тези два файла на apache:
[root@localhost jazzman]# chown apache:apache -Rv /var/www/html/permission/
changed ownership of `/var/www/html/permission/index.php' to apache:apache

Достъпвам index.php файла през браузъра "http://localhost/permission" и виждам, че се е създал нов файл с име new.txt, генериран от copy функцията на php.
[root@localhost jazzman]# ls -la /var/www/html/permission/new.txt
-rwxr--r-- 1 apache apache 16 Nov 25 10:55 /var/www/html/permission/new.txt

Опитвайки се да run-на скрипта през конзолата на php  (php cli ) от името на jazzman, вижте какво ще получа:
[jazzman@localhost ~]$ php -f /var/www/html/permission/index.php
PHP Warning:  copy(example.txt): failed to open stream: No such file or directory in /var/www/html/permission/index.php on line 6
PHP Stack trace:
PHP   1. {main}() /var/www/html/permission/index.php:0
PHP   2. copy() /var/www/html/permission/index.php:6

Warning: copy(example.txt): failed to open stream: No such file or directory in /var/www/html/permission/index.php on line 6

Call Stack:
    0.0001     626552   1. {main}() /var/www/html/permission/index.php:0
    0.0001     626952   2. copy() /var/www/html/permission/index.php:6

Това е така поради факта, че всички потребители от групата на apache и тези извън групата, имат права само за четене: ( r-- за групата, r-- останалите)
Ако отворите файловият си менаджър (това за тези които са нови в линъкс) ще забележите, че имате права само да разглеждате файловете намиращи се там. 

За да променим всичко това трябва да се направят 2 неща:
1. Да дадем пълни права на потребителите принадлежащи към групата на apache
2. Да добавим новия потребител към тази група
3. Ще бъда драстичен, всички които са извън групата на apache, ще задам 0 permission ( с други думи без никакви права в тази директория).

За тези които са в групата на apache давам пълни права, за да могат да едитват файловете създадени от php скриптовете, които са собственост на апачи.
Всичко в php по подразбиране е собственост на apache или www-data (Debian/Ubuntu) казвам го за да бъда ясен.

[root@localhost jazzman]# chmod 0770 -Rv /var/www/html/permission/
mode of `/var/www/html/permission/' changed to 0770 (rwxrwx---)
mode of `/var/www/html/permission/index.php' changed to 0770 (rwxrwx---)
mode of `/var/www/html/permission/example.txt' changed to 0770 (rwxrwx---)
mode of `/var/www/html/permission/new.txt' changed to 0770 (rwxrwx---)

Ако jazzman се опита да разгледа файла вижте какво се случва, без никакви права - 0 permision!
[jazzman@localhost ~]$ cat /var/www/html/permission/index.php
cat: /var/www/html/permission/index.php: Permission denied

За да променим това е необходимо да го добавим към група на apache, влизаме като root и го добавяме:
[root@localhost jazzman]# usermod -a -G apache jazzman
Нека да проверим кои потребители принадлежат към групата на apache:
[root@localhost jazzman]# groups apache
apache : apache jazzman

Всичко изглежда както трябва, ако аз се опитам отново да разгледам тези файловете от името на джазмен вижте какво се случва:
[jazzman@localhost jazzman]$ cat /var/www/html/permission/index.php
cat: /var/www/html/permission/index.php: Permission denied

Е......тук вече полудях, защо след като всичко е както трябва, jazzman все още няма никакви права.
Факт е, че това нещо ми отне няколко часа търсене, дори писах в официалният форум на Centos.
Приятел, системен уиндолс админ от противниковия лагер ми помогна, след като ми каза, че при тях трябва да се даде log off, log on на юзера от новата група.

Results:

[jazzman@localhost ~]$ ls -la /var/www/html/permission/
total 24
drwxrwx---   2 apache apache  4096 Nov 25 19:06 .
drwxrwxr-x. 12 root   root    4096 Nov 25 19:03 ..
-rwxrwx---   1 apache apache     9 Nov 25 19:05 index.php
-rwxrwx---   1 apache apache     9 Nov 25 19:06 example.txt
-rwxrwx---   1 apache apache     9 Nov 25 19:10 new.txt

Опитвайки се да разгледаме директорията или файловете в нея от името на регулярният потребител, наречен dummy:

Results:

[dummy@localhost dummy]$ cat /var/www/html/permission/index.php
cat: /var/www/html/permission/index.php: Permission denied

Това е метода, който лично аз силно препоръчвам, прост и ефективен:

Успех. 

jazz....
« Последна редакция: 26 Ноември 2012, 04:45:19 от jazzman »
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

wicked92

  • Full Member
  • ***
  • Благодарности
  • -Казани: 13
  • -Получени: 7
  • Публикации: 178
Само искам да отбележа, че при мен правилният ред беше: usermod -a -G user group (ubuntu 12.04)

wuser

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 85
  • -Получени: 49
  • Публикации: 2761

gogo@debian-2:~$ man  usermod


USERMOD(8)                System Management Commands                USERMOD(8)

NAME
       usermod - modify a user account

SYNOPSIS
       usermod [options] LOGIN



OPTIONS
       The options which apply to the usermod command are:



 -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]
           A list of supplementary groups which the user is also a member of.
           Each group is separated from the next by a comma, with no
           intervening whitespace. The groups are subject to the same
           restrictions as the group given with the -g option.

           If the user is currently a member of a group which is not listed,
           the user will be removed from the group. This behaviour can be
           changed via the -a option, which appends the user to the current
           supplementary group list.



Демек няма шанс това, което казваш да е истина.
Мъдростта на патилото
Perl Monks: PHP - it's "training wheels without the bike" -- Randal L. Schwartz


Дееба... чувствам се все едно обяснявам на майка ми как да си отвори пощата
"не работи"
WTF?!?!? к'во значи че не работи?
Не ти се компилира, дава ти грешка, вади ти грешни резултати, компютърът ти се изключва като го напишеш или на целия квартал му спира тока?
Stilgar

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Само искам да отбележа, че при мен правилният ред беше: usermod -a -G user group (ubuntu 12.04)
Радвам се, че има и хора дето ги четат тези неща ;)

Всичко след флага капитал G са групи съгласно документацията на апликейшъна, например:

Код: Bash
  1.  usermod -a -G group1,group2,group3 user
  2.  
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

wicked92

  • Full Member
  • ***
  • Благодарности
  • -Казани: 13
  • -Получени: 7
  • Публикации: 178
Явно вчера съм направил друга магия. Прави сте, след -G следва група :)