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

Права доступа

В Linux, по умолчанию, обычный пользователь имеет право делать все что угодно с файлами в своём каталоге, работать с своими файлами в каталоге /tmp, и читать некоторые файлы в других местах, но не более того. Это специфика учитывается при создании приложений, и практически любая программа под Linux может работать, будучи запущенной обычным пользователем.

Рассмотрим подробнее систему прав доступа в Linux.

Права назначаются для каждого файла и каталога. Каталог по сути есть файл, в котором хранится список файлов и некая дополнительная информация.

Существуют три вида доступа:

Увидеть назначенные права можно при помощи команды ls -l <имя файла>. При использовании этой команды кроме имени и прав доступа будут показаны: количество имен файла, владелец, группа, размер,и время последнего изменения. Первый символ в строке прав обозначает тип файла: - для обычных файлов, d для каталогов. Для специальных файлов могут использоваться другие символы.

Пример:

[user@demo $] 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

Как и следовало ожидать, к файлам в каталоге /bin есть доступ на использование, то есть, исполнение.

Попробуем создать файл и запустить его:

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

При попытке исполнить только что созданный файл получаем ошибку --- отказано в доступе. При помощи ls -l проверим права доступа к файлу:

[user@demo $] ls -l MyExecutable
-rw-r--r-- 1 user user 24 Июл 18 16:29 MyExecutable

Как видно, права на исполнение файла ни у кого нет. Чтобы сделать возможным использование (исполнение) файла выполним команду chmod +x MyExecutable

chmod +x MyExecutable
[user@demo $] ls -l MyExecutable
-rwxr-xr-x 1 user user 24 Июл 18 16:29 MyExecutable
[user@demo $] ./MyExecutable
Hello!

Если выполнить chmod -r MyExecutable, то чтение файла станет невозможным. Доступ на запись при этом сохранится.

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

Выше рассмотрен пример программы, не состоящей из машинных кодов и не исполняемой непосредственно процессором. Такие программы (называемые скриптами, от английского script --- сценарий) выполняет интерпретатор, указанный в первой строке файла после комбинации символов #! (shabang). В вышеописанном случае был указан shell. По умолчанию (в случае, когда интерпретатор не указан) используется /bin/sh.

Процессы

Работа системы по сути заключается в том, что процессы производят некоторые действия с файлами. Увидеть список запущенных процессов можно используя команду ps. По умолчанию ps показывает список процессов, запущенных из соответствующей консоли. Увидеть все процессы позволяет опция -e. При помощи опции -f можно узнать более подробную информацию.

[user@demo $] ps
  PID TTY          TIME CMD
 4753 pts/2    00:00:00 bash
 6155 pts/2    00:00:00 ps
[user@demo $] 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
user    3836  3414  0 10:34 ?        00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc
user    3888     1  0 10:34 ?        00:00:00 /usr/bin/dbus-launch --sh-synt
user    3889     1  0 10:34 ?        00:00:00 /usr/bin/dbus-daemon --fork --
user    3892     1  0 10:34 ?        00:00:00 ssh-agent -u
user    3952  3836  0 10:34 ?        00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc
user    3953  3952  0 10:34 ?        00:00:00 xscreensaver -no-splash
user    3956  3836  0 10:34 ?        00:00:00 /usr/bin/xfce4-session
user    3960     1  0 10:34 ?        00:00:02 xfce-mcs-manager
user    3962     1  0 10:34 ?        00:00:03 xfwm4
user    3964     1  0 10:34 ?        00:00:15 xfce4-panel
user    3966     1  0 10:34 ?        00:00:00 Thunar --daemon
user    3968     1  0 10:34 ?        00:00:00 /usr/lib/gam_server
user    3970     1  0 10:34 ?        00:00:03 xfdesktop
user    3972  3964  0 10:34 ?        00:00:02 /usr/lib/xfce4/panel-plugins/x
user    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
user    4090     1  0 10:41 ?        00:00:00 /bin/sh /usr/bin/xbrowser /usr
user    4096  4090  0 10:41 ?        00:00:00 /bin/sh /usr/lib/firefox/run-m
user    4101  4096  0 10:41 ?        00:02:19 /usr/lib/firefox/firefox-bin /
user    4107     1  0 10:42 ?        00:00:00 /usr/lib/gconfd-2 14
user    4143     1  0 10:53 ?        00:00:09 /usr/bin/Terminal
user    4144  4143  0 10:53 ?        00:00:00 gnome-pty-helper
user    4146  4143  0 10:53 pts/0    00:00:00 bash
user    4273  4143  0 12:49 pts/1    00:00:00 bash
user    4311  4273  0 13:15 pts/1    00:00:00 bash
user    4751  4311  0 14:52 pts/1    00:00:00 script -t 5.script
user    4752  4751  0 14:52 pts/1    00:00:00 script -t 5.script
user    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
user    6013     1  0 15:51 ?        00:00:00 xbindkeys
user    6162  4753  0 16:41 pts/2    00:00:00 ps -ef

Каждый процессор имеет идентификатор (pid). Новые процессы порождаются существующими, поэтому в информации о процессе указывается также идентификатор родителя(ppid). Если процесс завершается, то родителем его дочерних поцессов становится init. Некоторые части ядра системы также зарегистрированы как процессы. Такие процессы указываются в квадратных скобках. Это сделано для того, чтобы предоставить возможность общаться с ядром посредством сигналов. Сигналы --- это один из способов межпроцессного взаимодействия. Список доступных сигналов показывается по команде kill -l.

[user@demo $] 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 чтобы узнать идентификатор нужного процесса, и kill непосрпедственно для завершения.

Ограничение прав доступа

Почему существуют три группы прав доступа?

Каждый пользователь системы так же имеет уникальный идентификатор (uid). В информации о процессе содержится идентификатор пользователя, запустившего процесс (или родителя процесса). Первоначально идентификатор пользователя содержится в информации, ассоциированной с login shell.

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

Пример:

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

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

Идентификатор пользователя можно узнать командой id.

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


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

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

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

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

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

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

Level

Maintainer

Start date

End date

90

1

1

1

1

MaximByshevskiKonopko, Allena, MaximByshevskiKonopko


PspoClasses/080718/03Rights (последним исправлял пользователь MaximByshevskiKonopko 2008-10-09 21:43:18)