Процессы, права доступа

Как кому разрешать и запрещать делать разные вещи. Дело вот в чём: в линуксе обычный пользователь достаточно сильно поражён в правах. Говоря простым языком, он может изменять файлы в своём каталоге и свои файлы в /tmp. Ещё он может часть файлов читать, но не больше. Поскольку такова практика работы в linux, то почти любая программа должна работать от лица обычного пользователя, и тут не имеем проблем, свойственных Windows.

Есть три вида доступа:

ls -l выведет права, количество имён у файла, пользователь, группу, размер, время изменения и имя файла. Первый символ в правах обозначает тип файла (- у обычных файлов, d у каталогов, другие символы у специальных файлов). Посмотри ls -l /bin/ | head. Можно увидеть, что файлы исполняемые.

$ ls -l /bin/ | head
итого 5204
-rwxr-xr-x 1 root root    2852 Ноя 23  2007 arch
lrwxrwxrwx 1 root root       4 Июл 15 21:23 awk -> gawk
-rwxr-xr-x 1 root root   13004 Май 22  2007 basename
-rwxr-xr-x 1 root root  470980 Окт  5  2007 bash
lrwxrwxrwx 1 root root       4 Июл 15 21:23 bash2 -> bash
lrwxrwxrwx 1 root root       5 Июл 15 21:22 bunzip2 -> bzip2
lrwxrwxrwx 1 root root       5 Июл 15 21:22 bzcat -> bzip2
-rwxr-xr-x 1 root root   30360 Май 18  2007 bzip2      
-rwxr-xr-x 1 root root   22008 Май 18  2007 bzip2recover

Создадим файл MyExecutable с простым скриптом и ппробуем запустить его.

$ cat > MyExecutable
#!/bin/sh
echo "Hello!"
$ ./MyExecutable
bash: ./MyExecutable: Отказано в доступе

Узреем, что отказано в доступе. Если скажем ls -l MyExecutable, то увидим, что у него нет бита исполнения.

$ ls -l MyExecutable
-rw-r--r-- 1 george george 24 Июл 18 16:29 MyExecutable

Если скажем chmod +x MyExecutable, то исполнение файла станет возможным.

chmod +x MyExecutable
$ ls -l MyExecutable
-rwxr-xr-x 1 george george 24 Июл 18 16:29 MyExecutable
$ ./MyExecutable
Hello!

После того, как мы скажем chmod -r MyExecutable, то мы не сможем читать, но сможем писать:

$ chmod -r MyExecutable
$ cat MyExecutable
cat: MyExecutable: Отказано в доступе
$ ls -l MyExecutable
--wx--x--x 1 george george 24 Июл 18 16:29 MyExecutable
$ ./MyExecutable
/bin/sh: ./MyExecutable: Отказано в доступе
$ cat >> MyExecutable
echo "Hello?"
$ chmod +r MyExecutable
$ ./MyExecutable
Hello!
Hello?

Как работает эта программа? Как работают бинарные, понятно, а как она Hello вывела? Наверное, её выполнил shell. Он её выполнил, потому что он указан в первой строчке файла, после #!. По умолчанию используется (для текствых файлов, у которых эта первая строчка не указана) /bin/sh.

Более хитро три вида доступа устроено применительно к каталогам. Каталог это такой список файлов, где хранится имя файла и соответствующий ему индексный дескриптор. Когда мы обращаемся к файлу по имени, то мы неявно производим поиск по этой таблице соответствий, чтобы узнать, откуда с диска брать файл. Итак, права:

По принципу прав --x делаются директории с именами файлов, известных только избранным.

Теперь разберёмся с ограничением доступа.

Вопрос: кто записывает файл, читает из файла? Вовсе не пользователь, как об этом некоторые думают, а процесс. Вся работа системы состоит в том, что процессы что-то делают с файлами. В каждый момент времени выполняется много процессов. Команда ps показывает список процессов, по умолчанию, привязанных к текущей консоли, -e --- все процессы, -f --- более полная информация.

$ ps
  PID TTY          TIME CMD
 4753 pts/2    00:00:00 bash
 6155 pts/2    00:00:00 ps
$ ps -ef                            
UID        PID  PPID  C STIME TTY          TIME CMD    
root         1     0  0 10:28 ?        00:00:00 init [5]
root         2     1  0 10:28 ?        00:00:00 [migration/0]
root         3     1  0 10:28 ?        00:00:00 [ksoftirqd/0]
root         4     1  0 10:28 ?        00:00:00 [watchdog/0]
root         5     1  0 10:28 ?        00:00:00 [events/0]
root         6     1  0 10:28 ?        00:00:00 [khelper]
root         7     1  0 10:28 ?        00:00:00 [kthread]
root        10     7  0 10:28 ?        00:00:00 [kblockd/0]
root        11     7  0 10:28 ?        00:00:00 [kacpid]
root        92     7  0 10:28 ?        00:00:00 [cqueue/0]
root        93     7  0 10:28 ?        00:00:00 [kseriod]
root       132     7  0 10:28 ?        00:00:00 [pdflush]
root       133     7  0 10:28 ?        00:00:00 [pdflush]
root       134     7  0 10:28 ?        00:00:00 [kswapd0]
root       135     7  0 10:28 ?        00:00:00 [aio/0]
root       635     7  0 10:28 ?        00:00:00 [kjournald]
root       733     1  0 10:28 ?        00:00:00 /sbin/udevd --daemon
root       953     7  0 10:28 ?        00:00:00 [khubd]
root      1039     7  0 10:28 ?        00:00:00 [kgameportd]
root      1052     7  0 10:28 ?        00:00:00 [kpsmoused]
root      2448     1  0 10:29 ?        00:00:00 /sbin/auditd
root      2450  2448  0 10:29 ?        00:00:00 /sbin/audispd
root      2451     7  0 10:29 ?        00:00:00 [kauditd]
rpc       2481     1  0 10:29 ?        00:00:00 /sbin/portmap -l
syslogd   2607     1  0 10:29 ?        00:00:00 /sbin/syslogd -u syslogd -j /v
klogd     2636     1  0 10:29 ?        00:00:00 /sbin/klogd -c 1 -x -u klogd -
100       2938     1  0 10:29 ?        00:00:00 /usr/bin/dbus-daemon --system
root      2990     1  0 10:29 ?        00:00:00 /usr/sbin/acpid
110       3030     1  0 10:29 ?        00:00:00 /usr/sbin/hald
root      3031  3030  0 10:29 ?        00:00:00 hald-runner
root      3036  3031  0 10:29 ?        00:00:00 hald-addon-input: Listening on
110       3044  3031  0 10:29 ?        00:00:00 hald-addon-acpi: listening on
root      3049  3031  0 10:29 ?        00:00:01 hald-addon-storage: polling /d
root      3186     1  0 10:29 ?        00:00:00 /usr/sbin/gpm -m /dev/psaux -t
root      3216     1  0 10:29 ?        00:00:00 /usr/sbin/crond
root      3270     1  0 10:29 ?        00:00:00 /usr/sbin/atieventsd
root      3299     1  0 10:29 ?        00:00:00 /usr/sbin/rundm /dev/tty1 /dev
root      3310  3299  0 10:29 ?        00:00:00 xdm -nodaemon
root      3401  3310  3 10:29 tty7     00:13:21 X -nolisten tcp -auth /etc/X11
root      3414  3310  0 10:29 ?        00:00:00 -:0    
root      3415     1  0 10:29 ?        00:00:00 /usr/sbin/cupsd
dhcpd     3471     1  0 10:29 ?        00:00:00 /usr/sbin/dhcpd
root      3733     1  0 10:29 ?        00:00:00 /usr/libexec/postfix/master
postfix   3750  3733  0 10:29 ?        00:00:00 qmgr -l -t fifo -u -c
root      3807     1  0 10:29 tty1     00:00:00 /bin/login
root      3808     1  0 10:29 tty2     00:00:00 /sbin/mingetty tty2
root      3809     1  0 10:29 tty3     00:00:00 /sbin/mingetty tty3
root      3810     1  0 10:29 tty4     00:00:00 /sbin/mingetty tty4
root      3811     1  0 10:29 tty5     00:00:00 /sbin/mingetty tty5
root      3812     1  0 10:29 tty6     00:00:00 /sbin/mingetty tty6
george    3836  3414  0 10:34 ?        00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc
george    3888     1  0 10:34 ?        00:00:00 /usr/bin/dbus-launch --sh-synt
george    3889     1  0 10:34 ?        00:00:00 /usr/bin/dbus-daemon --fork --
george    3892     1  0 10:34 ?        00:00:00 ssh-agent -u
george    3952  3836  0 10:34 ?        00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc
george    3953  3952  0 10:34 ?        00:00:00 xscreensaver -no-splash
george    3956  3836  0 10:34 ?        00:00:00 /usr/bin/xfce4-session
george    3960     1  0 10:34 ?        00:00:02 xfce-mcs-manager
george    3962     1  0 10:34 ?        00:00:03 xfwm4  
george    3964     1  0 10:34 ?        00:00:15 xfce4-panel
george    3966     1  0 10:34 ?        00:00:00 Thunar --daemon
george    3968     1  0 10:34 ?        00:00:00 /usr/lib/gam_server
george    3970     1  0 10:34 ?        00:00:03 xfdesktop
george    3972  3964  0 10:34 ?        00:00:02 /usr/lib/xfce4/panel-plugins/x
george    3973  3964  0 10:34 ?        00:00:00 /usr/lib/xfce4/panel-plugins/x
root      3977  3807  0 10:34 tty1     00:00:00 -bash  
george    4090     1  0 10:41 ?        00:00:00 /bin/sh /usr/bin/xbrowser /usr
george    4096  4090  0 10:41 ?        00:00:00 /bin/sh /usr/lib/firefox/run-m
george    4101  4096  0 10:41 ?        00:02:19 /usr/lib/firefox/firefox-bin /
george    4107     1  0 10:42 ?        00:00:00 /usr/lib/gconfd-2 14
george    4143     1  0 10:53 ?        00:00:09 /usr/bin/Terminal
george    4144  4143  0 10:53 ?        00:00:00 gnome-pty-helper
george    4146  4143  0 10:53 pts/0    00:00:00 bash   
george    4273  4143  0 12:49 pts/1    00:00:00 bash   
george    4311  4273  0 13:15 pts/1    00:00:00 bash   
george    4751  4311  0 14:52 pts/1    00:00:00 script -t 5.script
george    4752  4751  0 14:52 pts/1    00:00:00 script -t 5.script
george    4753  4752  0 14:52 pts/2    00:00:00 bash -i
postfix   4909  3733  0 15:29 ?        00:00:00 pickup -l -t fifo -u -c
george    6013     1  0 15:51 ?        00:00:00 xbindkeys
george    6162  4753  0 16:41 pts/2    00:00:00 ps -ef

Каждому процессу соответствует идентификатор процесса. Среди процессов есть куски ядра, зарегистрированные как процессы (имена таких процессов взяты в квадратные скобки; они существуют для того, чтобы ядру можно было посылать сигналы). Процессы порождают друг друга, поэтому в выдаче указан не только идентификатор процесса, но и его папы. Если родительский процесс умер, а сын живёт, то их усыновляет init.

Программы могут обмениваться разным способами, один из них --- сигналы. В программе kill -l приведён список всех сигналов, поддерживаемых ОС.

$ kill -l                           
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

С данного терминала можно запускать много процессов, но только один может занимать терминал --- foreground-процесс (по вводу один, по выводу много). Для запуска процесса в фоне нужно дописать в конце команды &. Если процесс в фоне, то можно его перевести в fg и убить, или сказать ps -H, посмотреть номер процесса и убить ненужный.

Почему групп прав три штуки?

Работа происходит следующим образом: после логина запускается логин шелл. Этому первому процессу присваивается id процесса и ему присваивается некий идентификатор пользователя, который зарегистрировался в системе. Все процессы обязательно принадлежат какому-то пользователю. Пользователь определяется по номеру (UID). То есть программа, обеспечивающая авторизацию пользователя в системе, при логине лезет в базу пользователей, проверяет пароль, создаёт новый процесс, меняет ему UID и выполняет (exec) в этом процессе шелл.

Все файлы также принадлежат какому-то пользователю. Сразу возникает вопрос --- как определять, какой процесс может иметь доступ к какому файлу? Интуитивно получается две категории уровня доступа: первый уровень доступа (u) --- какие права имеет процессы пользователя-владельца по отношению к файлу. Третье (o) --- определяет, какие права имеют процессы других пользователей.

В такой дихотомии есть слабое звено, с которым часто приходится сталкиваться во время совместной работы --- если надо, чтобы одни имели доступ, а другие --- не имели. Для этого существует множественный субъект, группа пользователей. Для того, чтобы вводить соотношение между несколькими пользователями вместе и файлом, вводится понятие группа. Что такое группа? У каждого файла прописан не только пользователь, но и группа. Например, ls -ld /etc/tcb.

$ ls -ld /etc/tcb
drwx--x--- 41 root shadow 4096 Июл 17 13:15 /etc/tcb

Любой пользователь может принадлежать любому количеству групп. Эта информация отчасти лежит в файле /etc/passwd (основная группа). Информация о других вхождениях в группы есть в /etc/group. Для того, чтобы узнать, у кого какой id, можно воспользоваться командой id.

$ id
uid=500(george) gid=500(george) группы=10(wheel),14(uucp),19(proc),22(cdrom),71(floppy),80(cdwriter),81(audio),83(radio),119(xgrp),422(camera),423(scanner),500(george)

Таким образом, мы получаем не два уровня доступа, а три, второй триплет rwx (g) определяет права доступа для группы.


Сведения о ресурсах

Готовность (%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

20

1

1

1

1

MaximByshevskiKonopko, Allena, MaximByshevskiKonopko