WebMaster/Programming/Perl/
Права доступа.
Я бы ни за что не написал этот раздел,если бы он
не был так важен.Сидя в пределах своей домашней директории и занимаясь
только тем,что качаете с Инета всякую херню,вы возможно и не задавались
некоторыми вопросами....а зря.......... Ведь немного надо,чтоб
попортить нервы начинающему 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";
}
}