Системы Unix издавна считаются наиболее пригодными в качестве многопользовательских сред. Концепции их построения таковы, что любой файл в системе обязательно должен принадлежать какому-нибудь пользователю. Такое положение вещей обеспечивает высокую надежность системы и безопасность ее файлов.
Все устройства системы - накопители, устройства вывода и прочая периферия - также представлены для нее в виде специальных файлов, и они также должны кому-то принадлежать. Причем, в зависимости от атрибутов каждого файла к нему могут иметь доступ либо все пользователи системы, либо только его непосредственный владелец - такая гибкая настройка позволяет избежать несанкционированного доступа к важным данным и нежелательных изменений конфигурационных файлов.
По умолчанию в любом Unix-е создается несколько привилегированных пользователей, которые владеют системными файлами и большинством процессов, запускаемых в системе. Главным и, безусловно, самым известным из таких пользователей является root (от англ. root - корень (не зла!!!)), потому что root является владельцем большинства процессов в системе, и от него зависит функциональность всей операционной системы в целом).
Именно человек, владеющий паролем root, является администратором, царем и богом каждого Unix-а, и именно ему принадлежат, среди всех прочих, права управлять остальными пользователями в системе. Об этом и пойдет речь в данной статье.
В ОС Unix очень удобно реализована поддержка пользователей. Для того, чтобы человек мог выполнять какие-то действия с системой, администратор должен зарегистрировать его в системе - выдать ему имя и пароль и создать для него каталог, в котором пользователь будет оказываться сразу же после успешного входа в систему. И если свое имя (в системе) пользователь может говорить кому угодно, то пароль не рекомендуют даже записывать на бумажках, ибо кто-то может прознать заветное слово и выдать себя за вас, что всегда чревато неприятностями.
Совокупность параметров, уникально обозначающих пользователя в системе, называется логином, или, как его еще называют - аккаунтом (account), или, по-русски, бюджетом. Полный список параметров, составляющих аккаунт в системе Unix, будет приведен ниже.
Большинство Юникс систем не имеет никаких логических ограничений на количество одновременно зарегистрированных в системе бюджетов, но некоторые коммерческие системы накладывают ограничение на количество одновременно работающих в системе аккаунтов.
Разделение по именам пользователей необходимо в целях безопасности и удобства администрирования системы. Имена пользователей фигурируют во всевозможных логах различных программ и позволяют администратору вносить в работу системы необходимые изменения. И именно для пользы администратора все аккаунты должны содержаться в идеальном порядке - иначе неприятностей не оберешься.
Имя пользователя в системе - это комбинация строчных (маленьких) английских букв и цифр. В первых системах существовали ограничения на длину имени - не более 8 символов. И хотя в современных системах таких ограничений уже нет, все же рекомендуется придерживаться этого правила в целях совместимости с более старыми системами. Также рекомендуется использовать только строчные буквы, потому что прописные могут вызвать конфликты с более старыми системами.
Помимо уникальных имен все пользователи также принадлежат выбранным администратором группам. Администратору это позволяет давать (или запрещать) доступ к каким-либо ресурсам системы, не делая изменения для каждого пользователя отдельно, а манипулируя целой группой пользователей сразу.
Собственно, для Юникс-системы ваш аккаунт - ничто иное, как два целочисленных номера - ваш личный идентификатор и идентификатор вашей группы. Им в соответствие ставятся символьные имена - для удобства, и хотя все события система регистрирует на уровне числовых идентификаторов, администратор обычно оперирует с именами пользователей и групп.
Идентификатор пользователя называется UID - User Identifier, а идентификатор его группы - GID - Group Identifier. При каждом входе пользователя в систему, ядро Юникса регистрирует его UID и GID и выполняет все последующие процессы (программы) пользователя в соответствии с назначенными его UID и GID правами доступа.
Администратор системы - пользователь root - имеет UID равный нулю (0), и на него не распространяются никакие ограничения системы. То есть, он может читать любой файл в системе, добавлять-удалять устройства, администрировать аккаунты пользователей и делать все остальные присущие администрированию системы действия.
Кроме администратора, есть еще несколько идентификаторов пользователей, которые
автоматически создаются системой при установке - такие как daemon (uid=1), bin (uid=2), sys (uid=3), adm (uid=4), lp, uucp, и nobody. Конкретные номера идентификаторов пользователей для этих имен, а также наличие приведенных здесь и других специальных системных аккаунтов зависят от конкретного Unix.
Эти системные аккаунты используются автоматически для разделения и безопасного
выполнения системных задач (т.е. чтобы многие операции можно было запускать
с полномочиями этих аккаунтов, а не суперпользовательскими).
Выжимка из файла /etc/passwd, список системных аккаунтов (взят из Solaris 9):
root:x:0:1:Super-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
smmsp:x:25:25:SendMail Message Submission Program:/:
listen:x:37:4:Network Admin:/usr/net/nls:
nobody:x:60001:60001:Nobody:/:
|
С такими же целями создаются и несколько системных групп - root (или wheel в
некоторых системах*) - с gid=0, other (gid=1), bin, sys, adm. Все эти группы
включают вышеописанных пользователей и суперпользователя.
*Примечание: группа wheel существует во всех BSD-системах, но описание различных веток развития Unix - это тема отдельной статьи.
Выжимка из файла /etc/group, список служебных групп в системе:
root::0:root
other::1:
bin::2:root,bin,daemon
sys::3:root,bin,sys,adm
adm::4:root,adm,daemon
uucp::5:root,uucp
mail::6:root
tty::7:root,adm
lp::8:root,lp,adm
nuucp::9:root,nuucp
staff::10:
daemon::12:root,daemon
sysadmin::14:
|
В данной статье мы не будем рассматривать, как именно обрабатывается ядром Юникса работа конкретного пользователя, рассмотрим лишь вопросы администрирования аккаунтов - а именно, создание и удаление оных.
Что же означает на практике создать нового пользователя системы?
Каждый зарегистрированный пользователь Юникс имеет следующие параметры:
- идентификатор пользователя (UID)
Как уже говорилось выше, это уникальное для данной системы число, однозначно указывающее на пользователя.
- идентификатор группы (GID)
Также уникальное число, однозначно указывающее на группу пользователей.
Секретная комбинация буквенных, числовых и специальных символов, которые пользователь должен вводить всякий раз при входе в систему, чтобы подтвердить свою подлинность.
- срок действия пароля (expiry date)
Во многих системах сразу же при создании аккаунта можно включать
счетчик дней - начинается отслеживание действительности аккаунта, до
наступления установленного времени, когда пользователя попросят сменить пароль.
Данный параметр доступен не на всех системах, поэтому следует проверить,
имеется ли он у вас. Наличие файла /etc/shadow указывает на то, что
параметр этот у вас поддерживается.
Данный параметр является одним из рычагов системной политики - устанавливая его, администратор заставляет тем самым пользователей регулярно менять их пароли, и, таким образом, снижает риск несанкционированного входа в систему кого-то, узнавшего чужой пароль.
- домашний каталог (home directory)
При входе в систему (то есть при указывании имени пользователя и вводе правильного пароля) пользователь попадает в свой домашний каталог - место для игрищ, где он сам себе царь и бог. Обычно пользователь имеет права на создание и удаление, запись, чтение и выполнение любых файлов в своем домашнем каталоге.
К каталогу пользователя должен иметь доступ только он сам, и, при желании, пользователи его группы (я намеренно пишу «должен», потому что это еще не факт - правила, кому и что принадлежит в системе, определяются политикой администрирования, и приводятся в исполнение пользователем root). Пользователь имеет возможность менять права на доступ к любым файлам и каталогам, расположенным в его директории, регулируя таким образом доступ других пользователей к его личным данным. Естественно, никакие установленные пользователем права доступа не применяются к пользователю root.
- полное имя (full name, или GECOS)
По символьному имени пользователя типа looser не очень-то много можно разобрать. Для этих целей предусмотрена возможность сопоставлять с именем пользователя его реальное имя и фамилию. Многие команды Unix, например, finger (см. ниже), опираются на эти данные при сборе информации о том или ином пользователе. В серьезных компаниях в этом поле пишется настоящее полное имя человека, владеющего аккаунтом.
Исторически сложилось, что это поле называют еще GECOS. В литературе, особенно
зарубежной, эта аббревиатура встречается довольно часто.
GECOS означает General Electric Comprehensive Operating System - одна из
старейших Unix-подобных систем, позднее переименованная в GCOS, где начало
активно использоваться данное поле.
Настоящее полное имя пользователя - это один из простейших вариантов заполнения данного поля. На самом деле, можно указать несколько блоков дополнительных сведений, разделяя их знаком запятой:
name полное имя
office номер офиса, где работает пользователь
wphone рабочий телефон пользователя
hphone домашний телефон пользователя
Таким образом, запись "Mr Grrr, 115, 12345678, 87654321" в этом поле будет обозначать пользователя, чье полное имя Mr Grrr, который находится в кабинете 115, с рабочим телефоном 12345678 и домашним телефоном 87654321 (понятно, что можно ввести сюда любые данные, лишь бы разделенные запятой - поэксперементируйте, когда будет время).
- командная оболочка (shell)
Специальная программа, позволяющая пользователю вводить определенные команды для выполнения необходимых действий. Именно оболочка запускается в первую очередь, давая вам приглашение к вводу дальнейших команд. Из оболочки можно вызывать другие оболочки, программы или встроенные команды оболочки для выполнения каких-либо действий. Задача выбора оболочки для каждого конкретного пользователя системы ложится на плечи администратора, и потому он обязательно должен знать несколько оболочек своего Юникса, чтобы представлять себе проблемы, которые может ему создать пользователь с той или иной оболочкой. Очень часто администратор пишет скрипт или качает из интернета усеченные версии оболочек, узко специализированные на выбранной области действий в системе. Такие оболочки называются restricted shell.
Все эти параметры о каждом пользователе записываются в специальный файл, /etc/passwd. Для пущей секретности, пароли пользователей хранится в отдельном файле, /etc/shadow или /etc/master.passwd, в зашифрованном виде.
Файл /etc/master.passwd встречается во всех BSD-системах (например: FreeBSD, NetBSD, OpenBSD, BSDi), а файл /etc/shadow можно найти, например, в таких системах как Solaris или Linux.
Следует иметь в виду, что порядок и количество полей в ваших файлах
/etc/passwd и /etc/shadow (или /etc/master.passwd) могут отличаться от изложенного в данной статье, для полной информации обращайтесь к руководствам вашей системы с помощью команды man.
Пример файла /etc/passwd
root:x:0:1:Super-User:/:/usr/bin/bash
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
listen:x:37:4:Network Admin:/usr/net/nls:
nobody:x:60001:60001:Nobody:/:
noaccess:x:60002:60002:No Access User:/:
nobody4:x:65534:65534:SunOS 4.x Nobody:/:
grrr:x:110:1::/home/grrr:/bin/bash
|
Пример файла /etc/shadow
root:f6ChQ5l9GCx1Q:6445::::::
daemon:NP:6445::::::
bin:NP:6445::::::
sys:NP:6445::::::
adm:NP:6445::::::
lp:NP:6445::::::
uucp:NP:6445::::::
nuucp:NP:6445::::::
listen:*LK*:::::::
nobody:NP:6445::::::
noaccess:NP:6445::::::
nobody4:NP:6445::::::
grrr:f6ChQ5l9GCx1Q:11658::::::
|
Таким образом, в /etc/passwd хранится большая часть информации, но зашифрованный пароль хранится в файле /etc/shadow.
Пароли - ключевой момент администрирования пользователей Юникса. К их подбору следует подходить с тщательностью и серьезностью, потому что неверно выбранный пароль может привести к непоправимым последствиям. В первую очередь, серьезным должен быть администратор - root , на котором лежит ответственность за безопасность, сохранность и функциональность всей системы. Если злоумышленник с элементарными знаниями Юникса прознает пароль суперпользователя и сумеет под ним зайти в систему, выведение ее из строя и даже стирание информации непоправимым образом может быть делом всего нескольких секунд.
При добавлении нового пользователя или изменении пароля уже существующего в системе пользователя, используется команда passwd. Она запрашивает старый (текущий) пароль и потом дает вам две попытки ввода нового пароля. При регистрации нового пользователя у вас просто спрашивают пароль два раза. Если суперпользователь использует эту команду для изменения пароля какого-то пользователя, то у него текущий пароль пользователя, естественно, тоже не спрашивается.
Синтаксис команды простой:
Две попытки ввода пароля даются для того, чтобы исключить случайно набранные неправильные буквы вашего секрета. То есть, если вы хотели ввести слово «БУРАТИНО» (неважный, кстати, пароль!), а ввели «БУРЫТИНО», то при повторном вводе правильно написанного слова passwd выдаст ошибку, что пароли не совпали, и попросит ввести их два раза снова.
Также вам убедительно советуют не делать паролей меньше 6 знаков в длину и составлять их из букв, цифр и знаков препинания, и не использовать в паролях ваших номеров телефонов, дат рождения, почтовых индексов, имен и фамилий, и другой информации, о которой легко может знать злоумышленник.
Защита паролей в Юникс
Вообще, пароли в Юниксах защищены достаточно хорошо - они шифруются с помощью известных и проверенных временем алгоритмов и потому требуют определенных усилий для их взлома.
Все пароли шифруются с помощью односторонних формул, что означает, что их просто невозможно восстановить по зашифрованному результату, хранящемуся в /etc/shadow, даже зная наверняка, как работала формула шифрации.
Простейшим примером односторонней функции является квадрат числа. Если, например, возвести числа «2» и «-2» в квадрат, то результатом обеих операций будет 4. Следовательно, даже зная, что была произведена конкретная операция - возведение в квадрат, и зная обратную ей функцию - извлечение квадратного корня - мы все равно не сможем однозначно сказать, какое же число было изначально взято, «2» или же «-2». А если функция шифрования идет немного дальше возведения числа в квадрат? А если число не одно, а их гораздо больше? Задача становится попросту неразрешимой, и единственным способом взлома паролей в Юниксе является brute-force - обычный перебор всех комбинаций символов.
В каждом Юниксе есть стандартная функция crypt, которая берет строку как параметр и возвращает ее в зашифрованном виде. Программы-взломщики паролей перебирают все комбинации букв и цифр, вызывают для каждой комбинации функцию crypt и сравнивают полученный шифр с взятым из /etc/passwd.
Компьютер класса P3-800 позволяет перебирать около 3000 паролей в секунду (данные могут быть не совсем точными, ибо взломом паролей я занимался давным-давно и только для того, чтобы убедиться, что взломать их перебором можно лишь за довольно долгий срок). И вот тут-то и начинаешь понимать, как даже одна лишняя буква в пароле может очень помешать хакеру подобрать ваш пароль.
Вот таблица примерного времени, необходимого для подбора простенького пароля, состоящего только из одного регистра английского алфавита - скажем, 26 заглавных букв - из расчета скорости перебора около 3000/сек:
3 символа - 26^3 /3000 = 5.8 секунд
4 символа - 26^4 /3000 = 152 секунды
5 символов - 26^5 / 3000 = 3960 секунд (66 минут)
6 символов - 26^6 / 3000 = 102972 секунды (28 часов)
7 символов - 26^7 / 3000 = 2677270 секунд (30 суток)
8 символов - 26^8 / 3000 = 69609021 секунд (805 суток - более 2х лет!)
Если же быть немного более серьезным, и использовать как строчные, так и заглавные буквы английского алфавита, то перебирать придется 56 символов для каждой позиции, и 5-символьный пароль, простую версию которого можно подобрать за 66 минут, может потребовать от нас гораздо большего времени - почти 35 часов. 8-символьный пароль с двумя регистрами английских букв может потребовать 560 лет беспрерывного перебора :))) А уж если вы и знаки препинания добавите к паролю, и цифры - то ломать его станет настолько невыгодно, что скорее всего его попробуют украсть или выслушать в сетевом траффике - но это уже тема отдельной статьи ;)
Добавление новых пользователей
В каждой системе Unix обязательно имеются команды администрирования пользователей - их добавления и удаления, а также изменения их свойств. Команды
добавления обычно называются mkuser или useradd, а команды удаления - rmuser
или userdel. В большинстве систем имеется также скрипт adduser, который является надстройкой над командой useradd и позволяет вам производить добавление пользователей с большим комфортом за счет интерактивности. Ниже мы рассмотрим несколько примеров применения команд useradd и userdel.
В Linux системах новых пользователей добавляют с помощью команды useradd. К слову сказать, все изложенные ниже способы вызова команды useradd можно использовать без малейших изменений в системах Solaris, потому что названия всех ключей совпадают (удобно, правда?!) Простейший ее вариант -
где looser - это имя нашего пользователя, здесь вы можете поставить любое понравившееся вам самим. Данная команда выберет автоматически очередной свободный идентификатор пользователя - UID, установит ему в качестве группы по умолчанию группу вроде others, и создаст необходимые записи в файлах /etc/passwd и /etc/shadow, оставив все поля данных пустыми, ибо мы не указываем ни домашнего каталога пользователя, ни его полного имени.
Позже информацию о пользователе можно изменять с помощью специальных команд, но лучше указать побольше информации с помощью ключей командной строки команды useradd собственно при регистрации.
выдаст вам подробную информацию обо всех ключах команды, но самые главные из них я укажу здесь. Одна из самых удобных форм - следующая:
useradd -d /home/grrr -s /bin/bash -c "Mr Grrr" grrr
|
Данная строка добавляет пользователя с именем grrr, указывая в качестве его полного имени Mr Grrr, устанавливая ему оболочку /bin/bash и показывает, что его домашним каталогом будет считаться /home/grrr. Свежесозданный пользователь будет принадлежать группе other, которая является группой по умолчанию.
При добавлении таким методом следует помнить две вещи:
1. Каталог пользователя не проверяется при создании
пользователя, и это ваша обязанность - проследить, что он существует и
принадлежит свежесозданному пользователю. Если вы создаете каталог позже
(неважная практика, кстати!), то следует создать его как можно быстрее и
проследить, что он принадлежит именно нашему пользователю:
создать каталог /home/grrr
сделать пользователя grrr владельцем каталога /home/grrr.
Если указанный домашний каталог пользователя не существует, то по умолчанию домашним каталогом система будет считать /, то есть корень. И хотя права у пользователя в этом каталоге будут птичьими, их может быть достаточно для получения информации о системе, которую не стоило бы никому говорить. Так что лучше не давать пользователям таких шансов, а и сразу создавать каталог и лишь после этого предлагать пользователю установить нужный пароль.
2. Пароль у пользователя не установлен, и потому, в зависимости от конкретной системы и ее настроек, либо пользователя при указании его имени попросят сразу же установить его пароль, либо его просто не пустят в систему (любой пароль будет считаться неверным).
Администратор со стажем укажет еще и идентификатор пользователя и группу
пользователя, в командной строке, например:
useradd -u 12345 -g newgroup -d /home/grrr -s /bin/bash -c "Mr Grrr" grrr
|
где 12345 - это UID создаваемого пользователя, а newgroup - группа, к которой он должен принадлежать. В отличие от домашнего каталога, наличие UID или группы в системе всегда проверяется. Это означает, что вам не дадут создать пользователя с
идентификатором, который уже принадлежит другому зарегистрированному
пользователю системы. И не получится добавить пользователя, указав его
принадлежность к несуществующей группе. Также вам не дадут добавить пользователя
с именем уже существующего пользователя.
Вот в общем-то и все основы создания пользователей. Как же проверить, что пользователь создан, и как именно обстоят его дела? Используйте следующие команды:
чтобы получить краткую информацию о пользователе (можно указать имя любого пользователя, а не только свежесозданного).
Получится примерно такой блок информации:
Login name: grrr In real life: Mr Grrr
Directory: /home/grrr Shell: /bin/bash
Never logged in.
|
Могут быть и другие строчки, но они нас не интересуют.
Получить информацию об идентификаторе пользователя и группам, к которым пользователь принадлежит.
Ответом будет что-то вроде:
uid=12345(grrr) gid=1(other)
|
Удаление пользователей
Удалить пользователя гораздо проще и быстрее ;) Для этого используется команда userdel (как и в предыдущем разделе, точно в таком же виде команда присутствует и используется в системе Solaris).
Простейший вариант команды:
удалит пользователя из системы, лишив его возможности входить в систему, но оставит нетронутым его домашний каталог и все файлы в нем. Так обычно поступают с
провинившимися пользователями, которых стирают из системы, но оставляют
каталоги, чтобы потом без спешки посмотреть, что же там лежало. Если же
надоедливый юзер у вас в печенках сидит, то следует использовать ключик -r,
который еще и домашний каталог потрет:
И не останется от бедного Мистера Grrr ничегошеньки :)
В следующей статье мы рассмотрим поподробнее такое понятие, как права доступа к файлам, и поговорим, как еще можно (а в большинстве случаев просто нужно) ограничивать простых смертных пользователей вашей системы.
|