Я бы ни за что не написал этот раздел, если бы он не был так важен. Сидя в пределах своей домашней директории
и занимаясь только тем,что качаете с Инета всякую херню,вы возможно и не задавались некоторыми
вопросами....а зря..........
Ведь немного надо,чтоб попортить нервы начинающему CGI -програмисту.
Одна из таких вещей это права доступа......
Начнем с того ,что в системе Unix каждый пользователь имеет свой идентификатор- число,уникально
идентифицирующее его в этой системе.(Мой логин paaa а ему соответсвует число 1818).Это число
внутреннее для операционной системы,для пользования оно представлено как логин,который и соответствует
пользователю.
Только не надо думать о пользователе,как о конкретном человеке сидящим за клавиатурой,
пользователем может быть и какой-нибудь процесс.Важно отметить что пользователь-это определенная
область прав доступа,которая ему соответствует.(Вы например не можете обычно писать и удалять файлы из каталога другого пользователя).
Это и дает возможность стабильной работы всей системы.
Итак есть идентификатор пользователя.Также имеется идентификатор группы. Группа служит для выделения пользователей по группам.
Например у пользователей группы users (Обычные пользователи) не такие права как у группы wheels (административная группа).
Каждый процесс который вами запущен(Будь то Netscape,терминал,или текстовый редактор)получают ваши идентификаторы пользователя и группы.
таким образом исполняются от вашего имени.
Теперь рассмотрим повнимательней файловую систему.В Unix с файлом связано много характеристик.
Во-первых в системе нет "ничьих" файлов ,все файлы имеют владельца-пользователя и владельца-группу.
Любой файл который вы создаете автоматически получает ваш идентификатор.По этому система очень легко отслеживает,
чьи это файлы и каталоги.
Следующее новшество по сравнению с DOS это права доступа к файлу.Их может сменить только
тот пользователь которому принадлежит файл,или супервизор.(Это в отличии от DOS где каждая дрянь типа вируса может снять атрибут readonly читать и писать все файлы ;()
Права доступа задаются обычно числом в восьмеричной записи и разбиты на 3 части по 3 бита:
Каждая часть задает права доступа для конкретной группы:
1я -права доступа для пользователя,которому принадлежит файл
2я -для группы которой принадлежит файл
3я -для всех остальных
В каждой такой категории выделяются 3 права: Право на чтение,Право на запись,и право на исполнение.
(все права и аттрибуты очень наглядно показаваютя командой ls с ключом -l)
Так как исполнять каталоги бессмыслено,то право на исполнение для них означает право обращатся к файлам из этого каталога.
Бит
Описание
8
Право на чтение для пользователя
7
Право на запись для пользователя
6
Право на исполнение для пользователя
5
Право на чтение для группы
4
Право на запись для группы
3
Право на исполнение для группы
2
Право на чтение для всех остальных
1
Право на запись для всех остальных
0
Право на исполнение для всех остальных
Изменяются права командой chmod,ее синтаксис такой: chmod [u|g|o]{+|-}{r|w|x} file chmod number file
,где u-user,g-group,o-other,r-read,w-write,x-execute;--удалить,+-установить
Примеры: chmod +r file.txt #разрешает всем право на чтения файла chmod u+w file.txt #устанавливает для владельца файла право на запись в него chmod +x gbook.cgi #право на исполнение для всех,как для ползователя,группы,и для других chmod 0777 cgi-bin #Разрешает самые широкие права доступа для cgi-bin
Приоткрытии файла программой,операционная система сравнивает идентификатор пользователя с идентификатором пользователя владельца файла,
если они равны,то действуют права пользователя,если не равны то сравниваются идентификаторы группы,если и они не равны,то действуют права доступа для остальных
остальных.В том случае если у процесса нет достаточных прав,система возвращает ошибку.
Следует заметить ,что для супервизора root права доступа не проверяются.
Можно выполнить скрипт,только если есть права на его исполнение.
Вот почему следует давать chmod +x *.cgi иначе ваши скрипты станут просто недоступными.
Но и это еще не все..... Ваш скрипт может обращатся к вашим файлам (например ведет базу данных гостевой книги).
Все выглядит нормально,но только ничего не работает,файл в который вы намеревались
писать, не открывается,знакомая проблема ;(( ?.Так вот чтобы вы не мучались в догадках
Ваш скрипт не может получить доступ к вашим файлам,потому что он выполняется не вами (не с вашим идентификатором),
а от имени nobody (непривелигированый пользователь).Это мера предосторожности направлена на то,
чтоб скрипты ,взбесившись из-за неправильно переданых параметров(или вообще от глюков) не могли ничего
повредить ценного и важного на сервере.
Поэтому к тем файлам,к которым скрипт по смыслу должен обращатся нужно присвоить самые широкие права доступа 0777
Например в случае гостевой книги chmod 0777 guestbook.dat
Если также важно чтоб скрипты могли заводить новые файлы в cgi-bin то надо дать также
права на это chmod 0777 cgi-bin
Если вы видите что ваш скрипт не может обратится к какому-то файлу,то это в 99% случаев
из-за вашей забывчивости.!!!
На самый крайний случай воспользуйтесь setuid-скриптами (к этому делу ,если вы на это решились,отнеситесь
ОЧЕНЬ серьезно,так как целые тома по безопасности в Unix посвящены именно setuid-программам).
Хочу сразу предупредить ,сам я таких не так уж много писал,да и вам не особенно советую.
Но для общего как говорится развития,имейте в виду следующую информацыю.
Кроме указания прав доступа,существуют специальные биты у файла.Это биты установки пользователя и группы.
Когда процесс выполняется(простой процесс) то его реальный и эффективныйидентификаторы пользователей совпадают,идентификаторы групп тоже.
На самом деле значение имеют как раз эффективные значения пользователя и группы,они учавствуют в сравнении прав доступа.
Нельзя ли их как-то изменить,когда уж совсем нужда заставит? Можно! .На этот вопрос дают ответ
программы с установленым битом пользователя.Когда система запускает такую программу,она присваивает новому процессу не идентификатор того пользователя,что запустил ее,
а идентификатор пользователя-владельца исполняемого файла.
Самый классический пример setuid-программ это программа passwd ,предназначеная для смены пароля пользователя.
Такие данные как пароль и прочие характеристики пользователей хранятся в специальном файле,который имеет огромное значение при входе в систему.
Так как это системный файл,то открыть к нему доступ на запись всем-значит подвергнуть ВСЮ систему риску,ведь любое неправильное изменение его повлечет
катастрофические последствия(в конце концов бывает просто хулиганство).
Поэтому доступ к этому файлу закрыт для всех пользователей.А что если надо сменить пароль?
Запускаем программу passwd! Если глянуть на ее аттрибуты ,то видно что она принадлежит root -супервизору,
и еще имеет установленый бит setuid. Так корректно обходится эта проблема.
Если вы все-же решили попытаться ,то знайте ,что сделать программу setuid можно
коммандой : chmod +s myprogramm
И как всгда Примерчик напоследок:
Эта программа выдает содержимое вашей директории public_html в том случае,если она
доступна для чтения,и для каждого файла указывает ,можно ли его читать,писать и исполнять.
Попробуйте ее сделать setuid и посмотрите как изменится результат.
#!/usr/bin/perl
#listmydir.cgi
print "Content-Type: text/html\n\n";
if(!(-r '..')){
print ".. is not allowed for reading ;)))))\n";
}
else{
@list=glob('../*');
foreach(@list){
print "<A href=\"$_\">$_</A>";
print " readable" if -r;
print " writable" if -w;
print " executable" if -x;
print "<BR>\n";
}
}