Оригинал:
http://plan9.escet.urjc.es/usr/nemo/9.intro.pdfПосмотрите кусочек. Вдруг кто сможет на русский перевести :)
14.1 Безопасная система
Безопасность является темой, требующей написания отдельной книги. Здесь мы представим абстракции и службы операционной системы Plan 9, обеспечивающие безопасность компьютерной системы. Но следует понимать, что единственная по-настоящему безопасная система - это система с выключенным питанием запертая в глухой шкаф на замок. Пока система может выполнять какие-либо задачи, существует риск того, что злоумышленник сможет заставить систему выполнить нечто недозволенное.
Всегда приходится балансировать между безопасностью и удобством. Например, автономная машина с Plan 9, такая как портативный компьютер не подключённый к сети, не спрашивает пароль для того чтобы позволить вам её использовать. Любой человек, который получает доступ к компьютеру может его использовать. Если вы не должны набирать пароль для использования - это удобно. Напротив, если бы ваш портативный компьютер требовал ввода пароля - это было бы неудобно. Однако, можно подумать, что ввод пароля делает портативный компьютер более безопасным, потому что для того чтобы использовать его требуется знание пароля. Но это самообман. Пока потенциальный злоумышленник имеет физический доступ к вашему портативному компьютеру, он может получить полный доступ к системе. Вопрос только во времени и усилиях. Мы видим, что использование пароля в этом случае создало ложное чувство безопасности системы. Терминалы Plan 9, строго говоря, вообще не должны иметь никаких локальных данных требующих защиты, хотя это и обычная практика для персональных компьютеров. Plan 9 терминал является исключительно оконечной машиной для соединения со службами в сети.
Что же означает безопасность? Это зависит от ситуации. Например, архивирование файлового сервера защищает ваши файлы от случайного удаления или иных ошибок. По крайней мере, защищает их в том смысле, что вы всё ещё можете получить доступ ко вчерашней копии своих файлов, даже если сегодня они потеряны. Поскольку файлы в архиве никогда не будут переписываться, маловероятно, что какая-либо ошибка программного обеспечения уничтожит их. Архивирование сохраняет целостность данных (ваших файлов). Оно так же является частью системы безопасности, предоставляемой компьютерной системой. Обычно же под безопасностью подразумеваются следующие вопросы:
- неавторизованное использование системы (то есть запуск процессов);
- неавторизованный доступ к данным в системе (то есть чтение и изменение файлов).
Мы сосредоточимся на таком определении понятия безопасности. А именно на задаче кто может совершать какие действия над какими объектами в системе. Но всё же помните, что на самом деле понятие безопасности имеет более широкий смысл.
Мы уже сталкивались с некоторыми абстракциями системы безопасности ранее. Во-первых, персоны которые могут выполнять какие-либо действия в системе представлены как пользователи. Пользователь в системе представлен именем пользователя, как вы уже видели. Пользователи полагаются на сетевые машины чтобы сделать что-либо в компьютерной системе. Машины же запускают программы. Действительно, единственный путь для пользователя сделать что-то на машине состоит в выполнении программы (или использовании уже запущенной). Защита системы состоит в том, чтобы разрешить только зарегистрированным пользователям пользоваться запущенными программами на защищённых машинах. Например, управляя ими читать и записывать файлы.
В Plan 9 одни машины являются терминалами для пользователей, другие - серверы центрального процессора, которые принимают соединения от различных машин, чтобы выполнить команды. Кроме того, предполагаются один или более файловых серверов, исключительной целью которых является представлять файлы, с помощью программ подобных той, которую мы разрабатывали в предыдущей главе. Большинство (если не все) объекты в компьютерной системе представлены файлами. Соответственно - объекты, которые должны быть защищены системой - файлы. Защита доступа к файлам означает решить, может ли специфический процесс (действующий от имени пользователя) или не может сделать специфическую операцию над файлом.
14.2. Локальная машина
В вашей системе, скорее всего, существует множество различных машин. Но давайте сначала, рассмотрим только ту, который вы лично используете, или, вообще, единственную машину.
Пользователь может запускать программы на терминале и использовать все его устройства после загрузки и ввода имени пользователя. Терминалы Plan 9 не должны содержать локального хранилища и таким образом там нечего защищать. Более того, терминалы не должны экспортировать свои устройства в сеть, т.е. слушать запросы из сети для получения доступа к устройствам. Это означает, что никто не должен быть в состоянии получить доступ к терминалу, кроме загрузившего его пользователя. Терминал является однопользовательской машиной, не предназначенной для разделения ресурсов более чем одним пользователем. Компьютеры сегодня дёшевы.
Как же защищён ваш терминал? Локальная машина просто идентифицирует пользователя, запустившего её. Идентификация является одной из вещей необходимых для защищённой системы. Plan 9 должен знать кто пробует сделать что-то перед решением, позволить или нет это сделать. В Plan 9 пользователя, который включил машину, называют владельцем машины и разрешают делать что угодно на этой машине. Это верно не только для терминалов, но так же и для любого другого типа машин в Plan 9. Устройство консоли cons(3) имеет несколько файлов, в которых находится информация об идентификации машины и её владельца. Файл /dev/hostowner содержит имя пользователя, который является владельцем машины, а файл /dev/sysname имя самой машины.
; cat /dev/hostowner
nemo;
; cat /dev/sysname
nautilus;
Может показаться удивительным, но из соображений безопасности имя машины не имеет никакого практического значения. В реальности используется только имя владельца машины. Терминал полагает, что именем пользователя является nemo только потому, что пользователь ввёл его с клавиатуры, когда было запрошено имя пользователя. Это всё, что требуется от этой машины. Plan 9 создал процесс загрузки, описанный в boot(8), который помимо других действий запросил ввода имени пользователя и записал файл /dev/hostowner . Обратите внимание - в нашем примере может случиться, что пользователь на самом деле не nemo! Но для локальной машины это не имеет значения.
Решение того, кто в состоянии сделать что либо, называют авторизацией. Авторизация для владельца машины происходит автоматически. Ядро запрограммировано так, что владелец машины авторизован для многих вещей. Например, владение консолью и другими устройствами передаётся владельцу машины.
; ps | sed 4q
nemo 1 0:00 0:00 1276K Await bns
nemo 2 0:58 0:00 0K Wakeme genrandom
nemo 3 0:00 0:00 0K Wakeme alarm
nemo 5 0:00 0:00 0K Wakeme rxmitproc
; ls l ’#c’
--rw-rw-r-- c 0 nemo nemo 24 May 23 17:44 ’#c/bintime’
--rw-rw---- c 0 nemo nemo 0 May 23 17:44 ’#c/cons’
---w--w---- c 0 nemo nemo 0 May 23 17:44 ’#c/consctl’
--r--r--r-- c 0 nemo nemo 72 May 23 17:44 ’#c/cputime’
--r--r--r-- c 0 nemo nemo 0 May 23 17:44 ’#c/drivers’
...
В этом можно убедиться сменив владельца машины, что в обычных условиях делать не рекомендуется.
;echo n pepe >/dev/hostowner we set a new host owner...
; ls l ’#c’
rw-rw-r-- c 0 pepe pepe 24 May 23 17:44 ’#c/bintime’
rw-rw---- c 0 pepe pepe 0 May 23 17:44 ’#c/cons’
-w--w---- c 0 pepe pepe 0 May 23 17:44 ’#c/consctl’
...
; echo n nemo >/dev/hostowner ...and now restore the original one
Владелец машины может такие вещи как изменять привелегии для файлов в /proc, которые принадлежат ему. Ничего не препятствует этому пользователю производить действия от смены привилегий до посылки сообщений процессам, например, он может убивать процессы.
; ls l /proc/$pid/note
rw-r----- p 0 nemo nemo 0 May 23 17:44 /proc/1235/note
; chmod a+w /proc/$pid/note
; ls l /proc/$pid/note
rw-rw--w- p 0 nemo nemo 0 May 23 17:44 /proc/1235/note
Суть в том, что пользователей не существует (ложки не существует). Для системы процессы - это то, что может выполнить какие-либо действия. Нет такой сущности как человек. Например, человек, использующий оконную систему представлен именем пользователя процесса (ов), реализующих оконную систему. Поэтому каждый процесс привязан к имени пользователя для идентификации. В случае терминала Plan 9 каждый процесс обычно привязаны к владельцу машины. Как же это происходит?
Происходит это так - начальный процесс, boot изначально запускается под именем пользователя none, которое представляет собой неизвестного пользователя. После того, как имя пользователя введено с терминала в процессе загрузки, оно записывается в файл /dev/user и с этого момента процесс загрузки работает под именем nemo. Файл /dev/user является интерфейсом для того чтобы получать и изменять имя пользователя для текущего процесса (путём чтения или записи в файл). Имя пользователя может быть установлено только однажды, во время инициализации. Затем оно может быть прочитано, но не изменено. Например, в нашем шелле:
; cat /dev/user nemo;
; echo n pepe >/dev/user
echo: write error: permission denied
Дочерний процесс наследует имя пользователя от своего родителя. Так, с большой долей вероятности, все процессы в вашем терминале будут принадлежать вам, потому что они все происходят от процесса загрузки, который изменил свою принадлежность на ваше в начале загрузки, как мы рассказали ранее.
Мы считаем важным отметить, что это справедливо только для локальной машины. И вы, в теории, могли бы изменить ядро вашего терминала так, чтобы оно допускало делать такие сверхъестественные вещи как изменять /dev/user. Другие машины вообще не доверяют этой информации. В результате, использование своего ядра позволяющего завладеть машиной, позволит сделать это только с терминалом, на котором запущено это ядро, но не с другими машинами.
Данная схема не применима к другим архитектурам. Например, UNIX был создан в те времена, когда вычислительные системы обычно состояли из одной машины. Сети получили развитие позже, поэтому никто не предполагал, что кто-то может завладеть машиной, подключиться к сети и управляя поддельным ядром попытается получить доступ ко всей системе. В результате большинство UNIX систем оказывает завышенное доверие пользователю, управляющему ядром в различных машинах в пределах организации (прим. перев. т.е пользователю root и процессам запущенным от его имени). И это серьёзная проблема безопасности.