суббота, 11 сентября 2010 г.

Система безопасности Linux


Итак мы уже говорили о том как устанавливать приложения из исходников и пакетов, а теперь самое время поговорить о безопасности Linux. История системы безопасности Linux уходит в те времена когда Билли был всего лишь одним из кодеров IBM, а уж о Балмере вобще никто не знал, за то UNIX правила бал. И главное для ее концепции безопасности было то, что работает она в многопользовательском режиме. Система UNIX обязана обеспечить корректную работу нескольких пользователей в системе. Что мы в данном случае понимаем под корректностью работы:
а) Изменения произведенные одним пользователем не должны затрагивать другого пользователя в большинстве случаев.
б)Должна быть предусмотрена легкая система переключения активных пользователей
в) Должна быть реализована возможность назначения разным процессам, разных прав.
г) Должна быть реализована надежная система защиты аунтетификационных данных пользователя.
Ну это конечно грубый список требований. Рассмотрим как все это реализуется в Linux.
Начнем с процесса аунтентификации и идентификации пользователя. Итак определимся для начала с терминами. Пользователь это тот кто использует систему с определенным уровнем прав, то есть разрешенных действий. Ну например пользователю root можно все и немножечко больше:) А вот обычному пользователю системы можно далеко не все, например изменить системные библиотеки ему не дадут, а вежливо пошлют например фразой acess dined:).Но сама система узнать кто ее включил не может и был придуманы различные механизмы идентификации пользователя. Мы не будем говорить о такой экзотике как биометрия или что нибудь такое, а поговорим про рабоче-крестьянский пароль и логин. Это старая добрая система, используемая практически всюду.
Итак когда вы вводите пароль, то система проверяет наличие вашего имени в системе, а так же корректность введенного пароля. Но было бы слишком не осмотрительно хранить такую важную информацию как пароль открытым текстом. Что же придумали для решения этой проблемы? Пароли не хранятся в открытом виде и даже не шифруются, вместо этого хранятся их хеши. Что такое хеш? Хеш это некое контрольное значение вычисленное на основе пароля, в нашем случае, при чем по самому значение пароль невосстановим в идеальном случае кроме как подбором.То есть даже если я получу хеш, то мне придется долго сидеть и придумывать различные комбинации разных символов, в надежде что я таки угадаю пароль:) Это можно перепоручить компьютеру тогда процесс ускорится, но все ж не настолько как хотелось бы.Мы можем себя поздравить: Linux умеет надежно защищать наши пароли. Однако есть несколько проблем: если мы этим паролем будем светить везде, то... ну вы поняли). Сейчас есть довольно таки много словарей, где есть миллионы слов даже очень заковыристых, а потому слова даже сложные как пароль не годятся. Клички животных ваших, имена вас и ваших знакомых, друзей, родных то же. Слишком маленькие пароли(не более 5 символов) ломаются к сожалению довольно быстро. С другой стороны не делайте пароли суперсложными, чобы потом сами не помнили. Ну ладненько хватит нам теории перейдем ближе к практике.
1 фаза общения с системой для вас это старт загрузчика GRUB. Он позволит вам выбрать ту операционную систему, которую вы хотите загрузить сейчас. Вы можете установить пароль на доступ к GRUB, см. здесь.
2 фаза это запуск оболочки. Оболочка это процессор командной строки, который может принимать от вас текстовые команды и выполнять их. Обычно это bash. Именно через оболочку защитные механизмы системы запрашивают логин/пароль для входа.
3 фаза Запуск графической оболочки(среды) в современных дистрибутивах обычно все настроено таким образом, что сразу после запуска оболочки(шелла) происходит старт X-сервера(подсистемы графических возможностей UNIX системы), а после этого графической среды рабочего стола например GNOME или KDE.У них есть собственные системы аунтентификации пользователя и именно с ними вы и сталкиваетесь, когда система запрашивает пароль окном следующего вида:
(картинку)
4 фаза: работа в системе как обычного пользователя, а в случае выполнения каких то важных для системы действий получения прав root.
  Теперь поговорим о таком понятии как группы  и пользователи в Linux.В Linux пользователь обладает правами на выполнение определенных файлов, доступа к определенным каталогам, а вот те файлы, для которых пользователь не прописан в разрешенных ему будут не доступны. Действует жесткое правило: все что явно не разрешено, то запрещено.
Для определения кому что можно действуют так называемые ACL Posix списки, где явно прописаны  права для всех пользователей. Права есть такие: чтение, запись и выполнение. Всего есть три категории с точки зрения ACL POSIX: пользователь владелец файла, группа пользователей в которую входит пользователь -владелец файла и остальные. Права на файл можно назначать и в графическом режиме:(контекстное меню файла->свойства->права )

И в консольном.Вот с последним разберемся подробнее.Но прежде подытожим насчет ACL POSIX общую информацию:

  1. Списки ACL POSIX позволяют назначать различные права разным пользователям на основе групп. Группа это набор пользователей, который для системы безопасности имеют одинаковые права. Система идентифицирует  принадлежность пользователя к той или иной группе при помощи специального параметра GUID. Это особый идентификатор, который хранится вместе с другой информацией об учетной записи и именно по нему подсистема безопасности в ядре узнает а к какой группе пользователей относится данный пользователей. Сам пользователь ядру известен по UID (User ID). Пользователь с UID это root, а называться он может по разному. Важно отметить что любой пользователь входит в группу, если ее не назначает администратор, то система создает группу одноименную с логином пользователя(то есть пользователь с именем exampuser будет по умолчанию входить в группу exampuser )      
  2. Система    ACL POSIX различает: пользователя-владельца, который может менять любые права у файла, вплоть до удаления из системы, группу пользователей куда входит владелец, остальных. Каждой группе может быть назначена своя комбинация прав. 
  3. Права: чтение/запись, выполнение. По поводу последнего права: UNIX система, когда решает нужно ли выполнять файл смотрит отнюдь не на расширение, расширение может быть любым, она смотрит на то выставлен ли у файла бит разрешающий выполнение, если бит выставлен то она его выполнит без лишних вопросов. Поэтому будьте внимательны при даче такого права: во первых если файл например просто текст, то система будет пытаться его выполнить, что может привести к зависанию. И второе : файл может быть вирусом. Не давайте права выполнение тем кому это не надо даже если программа безобидна, то же самое переполнение буфера правильно использованное хакером сделает из безопасной программы крайне опасный таран системы безопасности любой ОС.     
Теперь рассмотрим как в консоли выставить права для файла . Есть такая команда chmod. Вот при помощи нее такие вопросы и решаются.Для начала создадим файлик Test и напишем туда веселое  echo "Hello Linux!", а на первой строчке #!/bin/bash. Таким образом наш файлик будет таков:

#!/bin/bash
echo "Hello Linux!" 

У меня он хранится в папке /home/gur/python_compitation. Итак первое мы хотим посмотреть права, которые есть:
сделаем переход в папку:

cd /home/gur/python_compitation
 ls -l  test
-rw-r--r-- 1 gur gur 20 2010-08-31 20:28 Test
 
Допустим мы хотим наделить наш файл правом выполнения Для этого напишем
chmod +x Test

Такой командой мы добавили себе право на выполнение этого файла, а если напишем
chmod user_name +x Test  то тем самым дадим право заданному пользователю.
Вот какие права есть в Linux:
r-чтение
w-запись
x-выполнение
такая комбинация как rw означает одновременную комбинацию прав чтение и запись.
более подробно о правах на файлы можно прочесть здесь
Рассмотрим теперь вопрос о том какие есть дополнительные средства безопасности в Linux.
Есть во всех UNIX системах такая вещь как chroot.   Что это такое? Это ни что иное как средство ограничения  для определенных программ. Точнее даже их обмана. Это системный вызов, который меняет для программы корневой каталог. В обычных условиях мы знаем что это ни что иное как / . А сhroot позволяет сказать что для некоторой программой корневой папкой является myroot. Что это значит на практике? На практике это означает что программа даже и знать не будет о тех файлах и папках. которые не находятся внутри подставного корневого каталога. Так должно быть в идеале. На практике в реализации chroot, выявлялись ошибки, которые приводили к тому что программы могли сами обмануть chroot. Чаще всего сам chroot одинокий никому не интересен, он интегрируется в комплекс программ реализующих концепцию Jail(темница ). Это концепция и реализующая политика безопасности позволяет:
-Запускать программу с измененным корневым каталогом, что позволит создать изолированное окружение  для подопытной программы
-Наделять теми привилегиями, которые минимально необходимы службе или программе для выполнения
-Накладывать ограничения на расход ресурсов программой находящейся в Jail(память и процессор)
-Жестко ограничивать и контролировать сетевую активность приложения
 Правда неплохо? Да, но все же не забывайте, что все же остаются методы вырваться узнику из темницы. Например, если программа под правами root (Суперпользователя), то она может выполнить системный вызов chroot повторно, а в некоторых UNIX-системах ядро может некорректно его обработать... и темница разлетится в вдребезги.
Еще один важный механизм безопасности Linux это SElinux.Данная система позволяет создавать сложные политики безопасности, которые позволят контролировать доступ к различным системным компонентам со стороны программ. При чем здесь речь идет отнюдь не только о файлах, но и многом другом.
Последней системой безопасности, которую мы не рассмотрим в этой заметке будут системы актуализации. В чем ее суть? На физической машине имитируется виртуальная при чем все ее компоненты важные для запуска программ. Поэтому практически вы получаете в распоряжение второй компьютер, на который вам нужно установить операционную систему и вы можете работать с программами. При этом чащ всего, если только это неспециально написанный вредный код, ошибки и сбои программ никак не выходят за рамки виртуальных машин. Есть простые пользовательские решения типа Virtual Box, а есть решения, которые могут использовать целые наборы компьютеров балансировать нагрузки на них. Одно из них это XEN.Очень часто именно на нем организуют виртуальные серверы VPS.          
Ссылки:  
подсистема Jail
XEN 
SELinux