суббота, 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
                        
              

          

среда, 18 августа 2010 г.

устанавливаем PyMedia (библиотеку для работы с мультимедиа данными в Python)


Понадобилось мне провести установку вышеуказанной библиотеки и здесь я предоставляю HOWTO по установке:
Итак по горячим следам:
1) Устанавливаем: dev файлы python 2.6
2) libasound2-dev (это файлы разработчика ALSA, именно они нужны что бы установщик pymedia задетектил ALSA )
3) lame 3.98.4 (переходим в папку с исходниками lame и вводим:


./configure
make
make install

)
При чем лучше из под sudo
4) Устанавливаем faad (я сначала установил faad 2.7 из сорцов: переходим в директорию faad и пишем

./configure --with-mp4v2
make
sudo make install


)Однако после импорта pymedia она сказала не видим мы libfaad.so.2. Пришлось установить deb пакет 2.6 и "импортная" ошибка прошла
5) Теперь из консоли перейдя в папку с pymedia введем: sudo python setup.py install. Он должен показать следующее

OGG : found
VORBIS : found
FAAD : found
MP3LAME : found
VORBISENC : found
ALSA : found

Что ж на вопрос отвечаем буквой y и тут у нас могут начаться ошибки из-за того что GCC 4 не дружит с pymedia. Если так то нам придется сделать следующее:
В файле в строке 31 вводим:

#define HAVE_LRINTF
#include
#define HAVE_LRINTF
#include "libavcodec/dsputil.h"
#include "version.h"

наш #define должен быть до #include "libavcodec/dsputil.h" Это обязательно!
Однако этого шаманизма от пользователя Illusion форума на http://indashpc.org/ недостаточен
Админ того же форума jbors дополнил, что строку #define HAVE_LRINTF надо ввести и в
audio/config.h
Вот тогда сборка и установка должна пройти нормально. И инструкция

>>>from pymedia import *

Должна пройти без ошибок
Ссылки:
1) для системы устанавливаем в консоли sudo apt-get install libasound2-dev
2) Для faad: качаем здесь или
здесь
Исходники 2.7:Берем здесь
3) lame:качаем здесь
4) pymedia: качаем здесь
5) Источник поправок: здесь (по dev пакетам для alsa) и страница обсуждений инсталяции pymedia расположен здесь
6) Заголовочные файлы для python sudo apt-get install python2.6- dev
Впервые я опубликовал это HOWTO: здесь

Заметки о python в народном хозяйстве linuxoида: разбор командной строки

Linux и командная строка это единое целое, командная строка это душа Linux. В ней можно ттворить чудесные вещи  в том числе и программно. Python программист имеет возможность активного взаимодействия с командной строкой Linux. Один пример  мы уже разобрали ранее, а теперь рассмотрим тот случай, когда сам скрипт вызывают из командной строки. Самое важное для нас здесь это разбор того что ввел пользователь. Python для этого предоставляет нам модуль sys и optget. Поэтому Америки я вам не открою, если скажу что начнем мы наш скрипт строчкой:
import sys,optget      
Модуль sys предоставляет нам структуру argv. Первый ее элемент мало интересен, это имя скрипта, а вот дальше пойдет компрамат на юзверя:) Но python этим не ограничивается, в нем есть интересная фича: name option, это и позволяет нам предложить пользователю написать не myprog 1 1 2, myprog --mode 1 --depth 1 --time 2 . A как все  это реализовать на практике?
Смотрим следующий скрипт:

import sys,getopt
def Test ():
    
 options,args=getopt.getopt(sys.argv[1:],' ', ['a=', 'b=', 'c=', 'd='])
 print options
 for option,value in options: 
    if option=='--a':
        print 'a=',value
    elif option=='--b':
        print 'b',value
    elif option=='--c':
        print 'c',value
    elif option=='--d':
        print 'd',value
               
Test()      
Что происходит? Объект getopt возвращает нам аргументы командной строки в виде списка двухэлементных кортежей, где первый элемент имя параметра, а второй его значение. А далее мы проходим циклом for по списку, и в две переменные считываем по два элемента из каждого кортежа, а при помощи оператора if ...elif предпринимаем необходимые действия. В переменную option считывается имя параметра, а в переменную value само значение. А что попадает в переменную args? Там находятся все значения командной строки, которые не имеют своего ключа. Удачи в использовании Python           



  

Установка приложений в Linux: часть 2(записки Windows эмигранта)

Из 1 части мы с вами узнали как устанавливать приложения из пакетов, однако trueUNIX way в ином: сборка программы из ее исходных вот этим мы и займемся. Сначала поясним понятия базовые для всего процесса.
Исходные тексты (Source). Это текстовые файлы и другие,идущие вместе с ним, которые позволят получить рабочую версию программы. 
Бинарная сборка(файл). Тот файл который можно непосредственно запускать 
Компилятор.  Программа преобразующая исходный текст в бинарный файл, но он еще не исполняем 
Линкер. Программа, собирающая из отдельных бинарных модулей программу, в частности именно он пристыковывает к программе функции стандартной библиотеки языка программирования С или любого другого языка    
Стандартная библиотека  Набор функций, который поставляется с компилятором и позволяет решать многие задачи возникающие перед программистом. В случае языка С это так называемая LibC и она идет совместно с системным компилятором Linux: GCC.
Зачем вам понадобится сборка из исходников? Во первых многие авторы распространяют свои творения  в исходниках. Причины такого положения дел могут быть разными: проект активно развивается, исходники часто обновляются, разработчик испытывает трудности в создании пакета(на самом деле создать пакет, учитывающий все зависимости и т.д. не так то и просто ).Есть и еще одна важная деталь, т.к. при компиляции GCC оптимизирует бинарный код под особенности вашего процессора и системы, то сборка из исходников это путь к получению более эффективной программы.
    Как же проводится сборка? Вы загружаете исходники из интернета, либо через SVN. Затем обычно уже в консоли(командная строка) переходите в каталог с исходниками и набираете три заветные команды:
./configure
make
make install
Первая из них подготовит инструменты сборки и настроит согласно требованиям программы
Вторая проведет сборку (компиляцию+линковку)
а третья проведет инсталляцию 
Все эти команды запускают скрипты специальным образом написанные, которые в свою очередь запрашивают действия у различных инструментов системы, формируют командную строку для GCC и т.д. Довольно часто приходится запускать процесс сборки под sudo, поскольку многие программы, особенно представляющие функции для других помещают свои компоненты  в системные папки, которые обычному пользователю недоступны, а доступны только под учетной записью root'а.Поэтому возможно полезно перед сборкой сразу переключится под root'a, введите в командной строке: sudo -i  Можно кстати все три команды объединить и записать так: sudo ./configure&& make&&make install . Конструкция && это как союз И, то есть получается: сначала выполни команду  ./configure, а потом  make. 
Какие возникнут проблемы при сборке из исходников?
1) Исходники могут содержать ошибки. Поэтому если вдруг процесс остановится внимательно смотрите вывод компилятора GCC  и линкера. Особенно там где встречаются слова error
2) Вам придется внимательно следить за тем, чтобы соблюдены все зависимости перед сборкой. К сожалению делать это все придется вручную
3) Установленная программа не будет известна утилите dpkg, которая является основой менеджера пакетов. Одним словом система контроля пакетов что RPM, что deb ничего не будет знать о программе
4) Удалять ее придется в лучшем случае через make uninstall clean или в ручную, не все программы содержат деинсталятор      
Внимательно читайте документацию к программе! Особенно файл README. Обычно там описана вся процедура сборки и необходимые зависимости.  
        

среда, 11 августа 2010 г.

Установка приложений в Linux: часть 1(записки Windows эмигранта)

Когда автор еще считал верхом поэзии невнятные звуки агу-агу на свет появилась Linux и была она младенцем с большим потенциалом, но которого надо было учить всему и вся, и собирать по кусочкам. Linux выросла из пеленок и теперь сама в некоторых странах знакомит маленьких с миром информатики(проект Edubuntu) . Одним из самых сложных процессов в младенчестве Linux была установка программ. А какая же ОСь нужна без программ? Вобщем-то никакая! Вот и поговорим мы о том, что было есть и будет в этой важной сфере любой операционной системы.
Начиналось все с сурового пути самоотречения от всех удобств и прямой сборки программ из исходников. Такой путь самурая вел к полному  контролю над  системой и собой:) Но время самураев прошло и Linux стала поворачиваться лицом и к простым смертным. И появились системы deb и rpm.
Основная суть пакетной системы в том, что deb и rpm пакет, содержит все файлы, которые нужны программе и может определить зависимости, которые необходимо соблюсти для установки приложения. Фактически deb и rpm пакеты это особые типы архивов. Еще одним важным свойством таких систем является, что они ведут базу данных установленных пакетов в системе и их зависимостей. А что такое зависимости? Все просто: зависимости это компоненты системы и сторонние компоненты, которые нужны для функционирования программы, которую вы устанавливаете.  Пакет содержит список зависимостей для программы и поэтому вас проинформирует установщик о неустановленных зависимостях. К тому же пакет может содержать в себе скрипты, проверяющие например какие либо параметры системы.Таким образом deb пакет представляет собой очень неплохой аналог различного рода установщиков из мира Windows.
Важно отметить что есть две основные системы пакетной установки: deb и rpm совпадающие в своем названии с форматами пакетов. deb система применяется во всех дистрибутивах основанных на Linux Debian(например Ubuntu), а rpm в системах базирующихся на Linux Red Hat (например Linux Fedore Core ). Между собой форматы не совместимы. Но в принципе предоставляют равные возможности. Рассмотрим установки на основе deb системы.
Можно скачать сам deb пакет и два раза по нему кликнуть, а если программа распространенная, то скорее всего она содержится в репозиториях вашего дистрибутива. Репозиторий это хранилище пакетов и исходниных текстов программ, которые позволяют устанавливать приложения по сети. С репозиториями (жаргонная "репа")  работает в deb системах приложение apt. При использовании Ubuntu вы можете использовать Центр приложений
Приложения->Центр приложений
или из командной строки
sudo apt-get install <имя пакета> . Вам придется ввести свой пароль, так как apt-get изменяет системные компоненты. Например установим читалку DjView ридер.
вводим в консоли sudo apt-get install djview, свой пароль и ждем когда все сделают за нас:) Еще нас попросят подтвердить скачивание пакетов.
Удалить пакет можно либо через Центр приложений, либо через команду sudo apt-get remove <имя пакета>.
В следующей части будем учиться сборке из исходников интересных для нас приложений.