Реализация безопасности в UNIX

Когда пользователь входит в систему, программа регистрации login (которая явля­ется SETUID root) запрашивает у пользователя его имя и пароль. Затем она хэширует пароль и ищет его в файле паролей /etc/passwd, чтобы определить, соответ­ствует ли хэш-код содержащимся в нем значениям. Хэширование применяется, чтобы избежать хранения паро­ля в незашифрованном виде где-либо в системе. Если пароль введен верно, про­грамма регистрации считывает из файла /etc/passwd имя программы оболочки, которую предпочитает пользователь. Ей может быть программа sh, но это также может быть и другая оболочка, например csh или ksh. Затем программа регистрации ис­пользует системные вызовы setuld и setgid, чтобы установить для себя UID и GID. После этого программа регистрации открывает клавиатуру для стандартного ввода (файл с дескрипто­ром 0) и экран для стандартного вывода (файл с дескриптором 1), а также экран для вывода стандартного потока сообщений об ошибках (файл с дескриптором 2). Наконец, она выполняет оболочку, которую указал пользователь, таким образом, завершая свою работу.

С этого момента начинает работу оболочка с установленными UID и GID, а так­же стандартными потоками ввода, вывода и ошибок, настроенными на устройства ввода-вывода по умолчанию. Все процессы, которые она запускает при помощи системного вызова fork (то есть команды, вводимые пользователем с клавиатуры), автоматически наследуют UID и GID оболочки, поэтому у них будет верное зна­чение владельца и группы. Все файлы, создаваемые этими процессами, также будут иметь эти значения.

Когда любой процесс пытается открыть файл, система сначала проверяет биты защиты в i-узле файла для заданных значений рабочих UID и GID, чтобы опреде­лить, разрешен ли доступ для данного процесса. Если доступ разрешен, файл от­крывается и процессу возвращается дескриптор файла. В противном случае файл не открывается, а процессу возвращается значение –1. При последующих обраще­ниях к системным вызовам read и write проверка не выполняется. В результате, если режим защиты файла изменяется уже после того, как файл открыт, новый режим не повлияет на процессы, которые уже успели открыть этот файл.

В операционной системе Linux защита файлов и ресурсов осуществляется так же, как и в UNIX.