<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF108%3ADrBraun3</id>
		<title>LXF108:DrBraun3 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF108%3ADrBraun3"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF108:DrBraun3&amp;action=history"/>
		<updated>2026-05-13T03:53:16Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF108:DrBraun3&amp;diff=9031&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF108:DrBraun3&amp;diff=9031&amp;oldid=prev"/>
				<updated>2009-11-02T08:19:29Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==''AppArmor''==&lt;br /&gt;
: Посадите свои приложения на карантин – для их же блага и чтобы защитить систему.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Другие дистрибутивы|Содержание=Я запускал свой пример на Ubuntu 8.04, но профили и команды ''AppArmor'' должны выглядеть&lt;br /&gt;
почти так же в любом другом дистрибутиве. В SUSE добавлен ряд графических оболочек вокруг утилит ''AppArmor'', работающих из командной строки;&lt;br /&gt;
они доступны через ''YaST''. Ниже показан экранный снимок ''YaST'' из OpenSUSE 10.3, идентичный описанному здесь диалогу ''Genprof''.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Один из проектов, основанных на черновиках Posix – это ''AppArmor''. Изначально разработанный Immunix и купленный Novell в 2005 г., он был включен в SUSE Linux, а также поддерживается в Ubuntu и Mandriva (Red Hat вместо этого выбрал ''SELinux''). По сути, ''AppArmor'' – это профиль на базе ядра, закрывающий программе доступ к не относящимся к ней ресурсам и указывающий, какие возможности POSIX ей требуются для нормальной работы.&lt;br /&gt;
Профили хранятся в текстовых файлах в каталоге '''/etc/apparmor.d'''. Имя профиля совпадает с именем исполняемого файла, к которому он&lt;br /&gt;
относится, но слэши заменены точками. Например, профиль для '''/usr/sbin/traceroute''' (сетевой утилиты, выводящей путь, по которому проходит пакет, чтобы достичь заданного адреса в Интернете) находится в файле '''/etc/apparmor.d/usr.sbin.traceroute'''. Давайте заглянем в него:&lt;br /&gt;
&lt;br /&gt;
  1. #include &amp;lt;tunables/global&amp;gt;&lt;br /&gt;
  2. /usr/sbin/traceroute flags=(complain) {&lt;br /&gt;
  3. #include &amp;lt;abstractions/base&amp;gt;&lt;br /&gt;
  4. #include &amp;lt;abstractions/consoles&amp;gt;&lt;br /&gt;
  5. #include &amp;lt;abstractions/nameservice&amp;gt;&lt;br /&gt;
  6. capability net_raw,&lt;br /&gt;
  7. /usr/sbin/traceroute rmix,&lt;br /&gt;
  8. @{PROC}/net/route r,&lt;br /&gt;
  10. }&lt;br /&gt;
&lt;br /&gt;
Строка 2 говорит, что данный профиль принадлежит программе '''/usr/sbin/traceroute''', и что при загрузке его в ядро он будет работать&lt;br /&gt;
в неактивном режиме '''complain''' [англ. «жалоба»]. Другими словами, ''AppArmor'' не будет принуждать к выполнению политики, но занесет в&lt;br /&gt;
файл журнала все ее нарушения. Это также называется режимом обучения – почему, узнаем чуть позже. В строках 3, 4 и 5 подключаются&lt;br /&gt;
правила из трех других файлов в каталоге '''abstractions'''. Будь мы «в объектно-ориентированном настроении», мы сказали бы, что профиль&lt;br /&gt;
''traceroute'' наследуется от этих трех базовых классов. ''AppArmor'' охотно&lt;br /&gt;
подключает файлы, чтобы «вынести за скобку» общие наборы ресурсов; например, в файле '''abstractions/nameservice''' содержатся правила&lt;br /&gt;
для разрешения DNS, LDAP, NIS, SMB, поиска реквизитов пользователей и групп в парольных файлах, которые являются общими для многих программ.&lt;br /&gt;
&lt;br /&gt;
Самое сердце профиля ''traceroute'' – строки 6 и 7. Шестая строка говорит, что программа может использовать возможность '''net_raw'''. Это одна из тех возможностей POSIX, о которых мы говорили выше; там она называется '''CAP_NET_RAW'''. Данная возможность разрешает&lt;br /&gt;
программе использовать raw-сокеты, то есть собирать собственные IP-датаграммы. (Ей это необходимо: при работе ''traceroute'' корректирует&lt;br /&gt;
поле TTL – «время жизни» – заголовка IP-пакета.) Строка 7 сообщает, что программе нужен доступ к файлу '''/usr/bin/traceroute – rmix'''' определяет требуемое сочетание режимов доступа и по существу выдает программе права на чтение и выполнение этого файла. Строка 8 говорит,&lt;br /&gt;
что программе нужен доступ на чтение к '''/proc/net/route'''. (Обозначение '''@{PROC}''' ссылается на переменную, определенную в '''&amp;lt;tunables/global&amp;gt;'''&lt;br /&gt;
и задающую точку монтирования файловой системы '''procfs'''. В любом Linux это почти наверняка '''/proc'''.)&lt;br /&gt;
&lt;br /&gt;
В каждую мелочь можно не вникать, но общая идея понятна: профиль определяет, к каким ресурсам программа должна иметь доступ.&lt;br /&gt;
Подчеркнем, что профили ''AppArmor'' не заменяют и не обходят основной механизм управления правами в Linux. Например, включение&lt;br /&gt;
'''net_raw''' в профиль ''traceroute'' не предоставит программе данной привилегии, если ей уже отказано в этом. Но ИСКЛЮЧЕНИЕ возможности&lt;br /&gt;
'''net_raw''' из профиля ОТКЛЮЧИТ эту возможность, даже если она имелась ранее (например, программа была запущена пользователем root).&lt;br /&gt;
&lt;br /&gt;
Для активации профиля нужно принудительно загрузить его в ядро. Сделайте это с помощью команды ''enforce'':&lt;br /&gt;
&lt;br /&gt;
   $ enforce traceroute&lt;br /&gt;
   Setting /etc/apparmor.d/usr.sbin.traceroute to enforce mode.&lt;br /&gt;
&lt;br /&gt;
Обычно это происходит во время старта в init-скриптах. Обратно в режим '''complain''' профиль переключается командой ''complain'':&lt;br /&gt;
&lt;br /&gt;
   $ complain traceroute&lt;br /&gt;
   Setting /etc/apparmor.d/usr.sbin.traceroute to complain mode.&lt;br /&gt;
&lt;br /&gt;
Чтобы увидеть, какие профили сейчас загружены, выполните скрипт запуска ''apparmor'' с аргументом “'''status'''”. Вот несколько строк&lt;br /&gt;
из этого примера:&lt;br /&gt;
&lt;br /&gt;
   $ sudo /etc/init.d/apparmor status&lt;br /&gt;
   apparmor module is loaded.&lt;br /&gt;
   14 profiles are loaded.&lt;br /&gt;
   4 profiles are in enforce mode.&lt;br /&gt;
   /home/chris/kilroy&lt;br /&gt;
   /bin/date&lt;br /&gt;
   /usr/sbin/traceroute&lt;br /&gt;
   /usr/sbin/avahi-daemon&lt;br /&gt;
   10 profiles are in complain mode.&lt;br /&gt;
   /usr/sbin/ntpd&lt;br /&gt;
   /usr/sbin/identd&lt;br /&gt;
   /usr/sbin/nmbd&lt;br /&gt;
   ... СТРОКИ ОПУЩЕНЫ ...&lt;br /&gt;
&lt;br /&gt;
===Откуда берутся профили?===&lt;br /&gt;
&lt;br /&gt;
Да, откуда же они берутся? Ну, можно усесться за исходный код программы, обмотав голову мокрым полотенцем, определить, какие ресурсы требуются и создать профиль «вручную»: ведь это всего лишь текстовый файл. А можно поискать готовый вариант среди включенных в ваш дистрибутив Linux. Например, в Ubuntu в пакете '''AppArmor-profiles''' их около ста. Имеется также «биржа» профилей (сайт http://apparmor.opensuse.org). Но всего интереснее, что ''AppArmor'' умеет создавать профили сам, если приложения запускаются в режиме «обучения». Чтобы показать, как это работает, создадим профиль для несложной программы на ''C'':&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание= [[Изображение:LXF108_47_1.jpg|300px]] В SUSE Linux есть графический мастер для управления профилями ''AppArmor'', как часть ''YaST''.| Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 int main(int argc, char *argv[])&lt;br /&gt;
 {&lt;br /&gt;
   int i;&lt;br /&gt;
   FILE *fd;&lt;br /&gt;
   for (i=1; i&amp;lt;argc; i++) {&lt;br /&gt;
     fd = fopen(argv[i], “w”);&lt;br /&gt;
     if (fd == NULL) {&lt;br /&gt;
       fprintf(stderr, “failed to open %s\n”, argv[i]);&lt;br /&gt;
       return 1;&lt;br /&gt;
     }&lt;br /&gt;
     fprintf(fd, “kilroy was here”); fclose(fd);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если вы не знаете ''C'', ничего страшного. Программа названа '''kilroy.c''', потому что она просто выводит строку “kilroy was here” ['''по-нашему, «Здесь был Вася», – прим. ред.'''] во все файлы, имена которых ей передаются. Я скомпилировал программу:&lt;br /&gt;
&lt;br /&gt;
  $ cc kilroy.c -o kilroy&lt;br /&gt;
&lt;br /&gt;
и если запустить ее так:&lt;br /&gt;
&lt;br /&gt;
  $./kilroy foo bar&lt;br /&gt;
&lt;br /&gt;
то она откроет файлы '''foo''' и '''bar''' и запишет в них строку. В терминах&lt;br /&gt;
''AppArmor'', сейчас программа работает «свободно», так как для нее нет&lt;br /&gt;
профиля, загруженного в ядро. Она подчиняется только традиционному контролю доступа к файлам в Linux.&lt;br /&gt;
&lt;br /&gt;
Чтобы сгенерировать профиль для ''kilroy'', выполните команду ''genprof'' (как root) с именем программы в качестве аргумента:&lt;br /&gt;
&lt;br /&gt;
  # genprof /home/chris/kilroy&lt;br /&gt;
&lt;br /&gt;
''Genprof'' загрузит профиль в ядро в режиме '''complain''' и предложит «Запустить программу в новом окне и проявить ее функционал»&lt;br /&gt;
(“Start the application to be profiled in another window and exercise its&lt;br /&gt;
functionality now”). Идея состоит в том, чтобы сейчас выполнить полный набор обычных действий программы. Для своего игрушечного&lt;br /&gt;
примера я просто наберу команду:&lt;br /&gt;
&lt;br /&gt;
  $ ./kilroy foo bar.txt&lt;br /&gt;
&lt;br /&gt;
Так как ''kilroy'' запущена в режиме '''complain''', то все действия, запрещенные программе, заносятся в журнал. (Поскольку профиля пока нет,&lt;br /&gt;
заносятся вообще все действия.) Итак, в журнале сейчас три записи:&lt;br /&gt;
маркер и открытие на запись файлов '''foo''' и '''bar.txt'''. Когда я решу, что&lt;br /&gt;
«проявление функционала» завершено, я вернусь в окно, где запущена ''genprof. genprof'' пройдется по записям в журнале (для этого вызывается вспомогательная программа ''logprof'') и спросит меня, разрешить или запретить каждую из них, а также предоставит возможность обобщить&lt;br /&gt;
записи с помощью шаблонов. Весь диалог длинный, поэтому привожу фрагмент:&lt;br /&gt;
&lt;br /&gt;
  # genprof /home/chris/kilroy&lt;br /&gt;
  Writing updated profile for /home/chris/kilroy.&lt;br /&gt;
  Setting /home/chris/kilroy to complain mode.&lt;br /&gt;
&lt;br /&gt;
Пожалуйста, запустите приложение, профиль которого нужно создать, в другом окне и выполните все обычные действия. Потом нажмите на кнопку '''Сканировать''' (Scan), чтобы найти события ''AppArmor'' в системных журналах. Для каждого из них можно будет разрешить или&lt;br /&gt;
запретить доступ.&lt;br /&gt;
&lt;br /&gt;
  Profiling: /home/chris/kilroy&lt;br /&gt;
  [(S)can system log for SubDomain events] / (F)inish&lt;br /&gt;
  Reading log entries from /var/log/messages.&lt;br /&gt;
 Updating AppArmor profiles in /etc/apparmor.d.&lt;br /&gt;
 Enforce-mode changes:&lt;br /&gt;
  .. СТРОКИ ОПУЩЕНЫ ...&lt;br /&gt;
  Profile: /home/chris/kilroy&lt;br /&gt;
  Path: /home/chris/bar.txt&lt;br /&gt;
 Mode: w&lt;br /&gt;
  Severity: 6&lt;br /&gt;
  1 - /home/chris/bar.txt&lt;br /&gt;
  2 - /home/*/bar.txt&lt;br /&gt;
  [3 - /home/chris/*.txt]&lt;br /&gt;
  (A)llow / [(D)eny] / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t /&lt;br /&gt;
  (F)inish&lt;br /&gt;
 Adding /home/chris/*.txt w to profile.&lt;br /&gt;
 ... МНОГО СТРОК ОПУЩЕНО ...&lt;br /&gt;
&lt;br /&gt;
Во второй половине листинга ''Genprof'' сообщает, что ''kilroy'' открыл файл '''/home/chris/bar.txt''' на запись, и я решил обобщить это правило, позволив ему записывать данные в любой файл с именем '''/home/chris/*.txt'''. В данном случае мое решение было произвольным; но на&lt;br /&gt;
практике нужно хорошенько подумать!&lt;br /&gt;
&lt;br /&gt;
По завершении работы ''Genprof'' новый профиль сохраняется и автоматически переходит в режим '''enforce'''. Результат наших трудов ('''/etc/apparmor.d/home.chris.kilroy''') выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Карантин компьютера|Содержание=В исходной документации ''AppArmor'' говорилось об «иммунизации» приложений, но для предотвращения&lt;br /&gt;
взлома ничего не делается; скорее, ограничивается возможный ущерб на случай такой беды. «Карантин», пожалуй, более уместная медицинская метафора. Представьте, что ''AppArmor'' дает программе большой белый носовой платок – чихать в него, чтоб не сеять вокруг себя микробы.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
  # Last Modified: Mon Apr 7 16:17:04 2008&lt;br /&gt;
  #include &amp;lt;tunables/global&amp;gt;&lt;br /&gt;
  /home/chris/kilroy {&lt;br /&gt;
  #include &amp;lt;abstractions/base&amp;gt;&lt;br /&gt;
  /home/chris/*.txt w,&lt;br /&gt;
  /home/chris/foo w,&lt;br /&gt;
  /home/chris/kilroy mr,&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Теперь программа ''kilroy'' ограничена своим профилем и может делать не все. Например,&lt;br /&gt;
&lt;br /&gt;
  $ ./kilroy foo apple.txt banana.txt&lt;br /&gt;
&lt;br /&gt;
работает отлично, а&lt;br /&gt;
&lt;br /&gt;
  $ ./kilroy orange.txt cabbage&lt;br /&gt;
  failed to open cabbage&lt;br /&gt;
&lt;br /&gt;
не пройдет, так как открытие файла '''cabbage''' на запись не разрешено&lt;br /&gt;
профилем, и вызов '''fopen()''' завершится неудачно.&lt;br /&gt;
&lt;br /&gt;
Это игрушечный пример. Чтобы создать профиль для настоящей&lt;br /&gt;
программы, придется продумать, какие ситуации прокрутить, чтобы&lt;br /&gt;
задействовать все ее возможности. Обычно сперва с помощью ''genprof''&lt;br /&gt;
создается начальный профиль, затем он на несколько дней переключается в режим '''complain'''. Потом запускается ''logprof'', чтобы отследить&lt;br /&gt;
все нарушения и решить, стоит ли добавлять их в профиль. Наконец, профиль переключается в режим '''enforce'''.&lt;br /&gt;
&lt;br /&gt;
В чем же тут польза? Допустим, программу ''kilroy'' каким-то образом&lt;br /&gt;
взломали – например, атакой с переполнением буфера – и вынуждают ее сделать нечто такое, для чего она не предназначалась. Но она&lt;br /&gt;
не сможет выйти за пределы своего профиля! ''AppArmor'' лучше всего&lt;br /&gt;
работает с теми программами, чей набор операций четко ограничен.&lt;br /&gt;
Например, почтовый сервер оперирует строго определенными файлами и каталогами, и с помощью профиля ''AppArmor'' его можно эффективно контролировать. Особенно полезен ''AppArmor'' в ограничении тех программ, которые являются «посредниками в передаче прав», т.е. приложений, которых вы просите сделать что-то от своего имени, но с правами другого пользователя. В эту категорию входит большинство сетевых серверов. Для более подробной информации прочтите ''man'' для ''apparmor, apparmor.d'' (описывает синтаксис профилей), ''genprof, logprof, enforce'' и ''complain'', или зайдите на сайт  ttp://en.opensuse.org/Apparmor. '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>