Процессы, права доступа
Права доступа
В 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 |
1 |
1 |
1 |
|
1 |