Управление пользователями
Хранение регистрационной информации
Большая часть регистрационной информации о пользователях хранится в файле /etc/passwd. Этот файл доступен на чтение всем пользователям системы, поэтому сведения о паролях (заметим в скобках, что сами пароли вообще не хранятся открытым текстом), времени их жизни и некоторые другие данные из этого файла исключены и находятся либо в файле /etc/shadow (в большинстве дистрибутивов ОС Linux), либо в /etc/tcb/имя_пользователя/shadow (в дистрибутивах ПСПО и некоторых других). И в том, и в другом случае доступ к этой информации существенно ограничен с помощью механизма разграничения прав доступа в Unix-подобных ОС.
Рассмотрим файл passwd. Каждая строка в нем соответствует одному регистрационному имени и состоит из полей, разделенных двоеточиями:
$ head /etc/passwd root:x:0:0:System Administrator:/root:/bin/bash bin:x:1:1:bin:/:/dev/null daemon:x:2:2:daemon:/:/dev/null adm:x:3:4:adm:/var/adm:/dev/null lp:x:4:7:lp:/var/spool/lpd:/dev/null mail:x:8:12:mail:/var/spool/mail:/dev/null news:x:9:13:news:/var/spool/news:/dev/null uucp:x:10:14:uucp:/var/spool/uucp:/dev/null games:x:12:100:games:/usr/games:/dev/null ftp:x:14:50:FTP User:/var/ftp:/dev/null
Опишем в двух словах, что означает каждое поле.
- Первое поле в каждой строке содержит регистрационное имя пользователя.
Второе поле ранее содержало хэш пароля, однако сейчас в подавляющем большинстве случаев содержит символ x, означающий, что соответствующая информация хранится в другом месте.
- Третье поле --- это идентификатор пользователя (User ID, UID).
Четвертое поле --- идентификатор основной (первичной) группы пользователя. Пользователь, разумеется, может входить и в другие группы, однако сведения об этом хранятся не здесь, а в файле /etc/group.
Пятое поле по историческим причинам носит имя GECOS и содержит так называемое "полное имя" пользователя. Давным-давно создателям UNIX Кену Томпсону и Деннису Ритчи нужно было хранить информацию о том, какой пароль нужно использовать при регистрации в системе, к которой был подключен принтер. Управлялся доступ к принтеру операционной системой GECOS, поэтому именно такое название получило соответствующее поле в /etc/passwd. В наше же время в этом поле чаще всего хранится разнообразная дополнительная информация о пользователе: полное имя, номер комнаты, телефон и, возможно, что-либо еще. Соответствующие "подполя" при использовании такой структуры разделяются запятыми. Отметим, что такая возможность, однако, используется не слишком часто, и обычно в это поле заносят только настоящее имя пользователя.
- Шестое поле содержит имя домашнего каталога пользователя.
- Последнее, седьмое поле содержит имя программы, запускаемой в качестве пользовательской оболочки (Shell).
Сделаем следующее важное замечание. По значению седьмого поля в /etc/passwd зарегистрированных в системе учетные записи пользователей можно разделить на три группы.
Если в качестве оболочки указан один из интерпретаторов командной строки, перечисленных в файле /etc/shells, то пользователь считается "настоящим": он может "войти" в систему и полноценно ее использовать.
Если в качестве оболочки указано специальное значение /sbin/nologin (иногда --- другое), то пользователь не сможет зарегистрироваться в системе обычным способом (с помощью программы login). Тем не менее, если это значение указать в списке допустимых оболочек (/etc/shells), то все подсистемы будут считать, что соответствующий пользователь --- "настоящий", а потому разрешат, например, подключение по SSH без запуска оболочки.
Если же в качестве оболочки указано имя несуществующей программы или, скажем, /dev/null, то зарегистрироваться в системе (с помощью программы login) пользователь не сможет вовсе. Возможность заведения в системе таких пользователей позволяет контролировать разделение прав доступа к разным частям системы. Дело в том, что при работе различных служб разумно ограничить использование учетной записи суперпользователя, а потому для каждой такой службы заводится специальная учетная запись. С одной стороны, "по-настоящему" зарегистрироваться в системе с ее помощью невозможно (нет пароля и корректной пользовательской оболочки), с другой --- в случае атаки на эту службу под угрозой окажутся лишь ее собственные файлы. Соответствующих таким учетным записям пользователей обычно называют "псевдопользователями", или "системными пользователями". Псевдопользователей в системе бывает довольно много, обычно --- более 40 (это число зависит от набора установленных служб).
Посмотрим теперь в файл /etc/group. В нем содержится список зарегистрированных в системе групп пользователей. Каждый пользователь может состоять в нескольких группах, а каждая группа --- содержать несколько пользователей:
$ head /etc/group root:x:0: bin:x:1:root daemon:x:2:root sys:x:3:root,bin,adm adm:x:4:root tty:x:5: disk:x:6:root lp:x:7: mem:x:8: kmem:x:9:
Сведения о членстве пользователей в группах оформляются следующим образом:
- Первое поле --- имя группы.
Второе --- зашифрованный пароль группы (практически никогда не используется; x, как и для соответствующего поля в passwd, означает, что сведения находятся в другом месте).
- Третье поле --- числовой идентификатор группы.
- Четвертое поле --- имена пользователей --- членов группы (через запятую).
Опишем теперь, как используется информация о членстве в группах. Каждый раз, когда от имени пользователя запускается тот или иной процесс, автоматически выясняется его "первичная" группа (обычно она соответствует полученному при входе в систему GID), а членство в процесса в остальных группах определяется с помощью просмотра файла /etc/group. Этот файл просматривается в поисках регистрационного имени (не UID!) пользователя --- подходящие строки и определяют результат. Заметим, что можно создать в системе учетные записи разных пользователей с одинаковым UID и организовать для них членство в разных наборах групп. Пользоваться этой возможностью, однако, следует с большой осторожностью.
Управление учетными записями
Создадим нового пользователя. Зададим ему регистрационное имя admin и "описание" Newly Added Admin (оно будет занесено в поле GECOS):
# usearadd -G wheel -c "Newly Added Admin" admin
Ключ -G отвечает за список "дополнительных" групп, в которые создаваемый пользователь вступает (в данном случае это группа wheel). Поскольку мы не указали ключ -g, то была создана также основная группа для нашего пользователя. Ее имя совпадает с именем пользователя (admin), а идентификатор выбирается первый из доступных (свободных). Точно так же, поскольку мы не указали ключ -u, то и идентификатор пользователя выбирается первый из доступных. Отметим, что нельзя предполагать, что идентификаторы создаваемых пользователя и группы обязательно совпадут.
Сделаем еще одно важное замечание. В современных дистрибутивах ОС Linux принято создавать для каждого "настоящего" пользователя отдельную группу, а все группы с более чем одним пользователем считать "дополнительными". Это даёт некоторые преимущества всмысле безопасности и возможность по числу строк в /etc/passwd оценивать количество пользователей.
Посмотрим, как при добавлении пользователя изменились файлы /etc/passwd и /etc/group:
$ grep admin /etc/passwd /etc/group /etc/passwd:admin:x:501:501:Newly Added Admin:/home/admin:/bin/bash /etc/group:wheel:x:10:root,user,admin /etc/group:ftpadmin:x:51: /etc/group:cvsadmin:x:53: /etc/group:netadmin:x:104: /etc/group:wineadmin:x:57: /etc/group:admin:x:501:
Как мы видим, в /etc/passwd появилась новая запись для нашего пользователя (UID = 501), а в /etc/group была создана новая группа (GID = 501). Кроме того, в соответствии с нашим указанием пользователь admin был добавлен в группу wheel. Отметим, что при заведении пользователя был также создан его домашний каталог, куда сразу же скопировались файлы из каталога /etc/skel. Данный каталог обыкновенно содержит минимальный, "базовый" набор конфигурационных файлов для создания комфортного пользовательского окружения и, естественно, может быть модифицирован администратором системы.
Заметим, что применение утилиты grep для выяснения членства пользователя в группах может дать не вполне "чистый" результат: к примеру, имя запрашиваемого пользователя может, как в нашем случае, содержаться в качестве подстроки в других именах. Чтобы избежать таких проблем, правильнее всего воспользоваться утилитой id:
$ id admin uid=501(admin) gid=501(admin) groups=501(admin),10(wheel)
Уделим теперь внимание проблеме удаления пользователей из системы. За выполнение этого действия отвечает утилита userdel, манипулирующая перечисленными выше файлами. У этой утилиты есть ключ -r, соответствующий удалению не только учетной записи пользователя, но и его домашнего каталога и почты (обычно лежащей в каталоге /var/mail). Однако всегда ли оправдано использование userdel? Работа этой утилиты приводит к освобождению идентификатора пользователя (UID), который впоследствии может быть присвоен другому, вновь созданному пользователю. Это приведет к тому, что все не удаленные из системы пользовательские данные (к примеру, содержащиеся в сохранившемся на диске домашнем каталоге) окажутся доступны новому пользователю. Понятно, что такой результат, вообще говоря, не может считаться удовлетворительным.
Как же стоит поступить в такой ситуации? Одним из решений может стать запрет на вход (логин) вместо удаления. За такое действие отвечает команда passwd(8) с ключом -l (--lock) (то же самое можно сделать при помощи usermod -L). Стоит, однако, обратить внимание, что в такой ситуации не исключается возможность входа по SSH (например, если в конфигурационном файле sshd_config отключена опция UseLogin). Разумеется, заблокированного таким способом пользователя можно впоследствии разблокировать.
Естественно, учетные данные зарегистрированного в системе пользователя могут быть модифицированы системным администратором. Некоторые из таких модификаций производятся еще не встречавшейся нам утилитой usermod. Ее ключ -e, к примеру, позволяет указать дату "отключения" учетной записи. Есть также утилита chage, модифицирующая информацию о сроках "истекания" пароля, --- с ее помощью администратор может, допустим, установить политику смены пользователями своих паролей с той или иной периодичностью.
Управление паролями
Скажем несколько слов и о пользовательских паролях. При заведении пользователей с помощью useradd пароли не создаются, поэтому, чтобы обеспечить возможность входа в систему, нужно создать (вообще говоря, сменить) пароль. Проще всего это сделать с помощью команды passwd. Заметим, что в дистрибутивах ПСПО ALT Linux существуют две утилиты с таким именем: пользовательская из /usr/bin и администраторская из /usr/sbin. Первая позволяет любому пользователю системы сменить пароль на свою учетную запись, а второй мы сейчас воспользуемся для задания пароля созданному нами пользователю admin.
Отметим, что пароль на вход команды passwd можно задать разными способами. Первый способ --- задать пароль интерактивно (с клавиатуры, по запросу самой утилиты), второй --- воспользоваться ключом -p и задать в командной строке хэш пароля. Остановимся на втором способе чуть подробнее.
Чтобы получить возможность получить BlowFish-хэш (значение именно такой функции используется для хранения паролей в дистрибутивах ПСПО), можно написать специальную программу на языке C, использующую функцию стандартной библиотеки crypt(3), а можно воспользоваться средствами Python. Пойдем по второму пути и установим пакет с модулем bcrypt:
# apt-get install python-module-bcrypt
Теперь можно воспользовать двумя нужными нам функциями из этого модуля. Первая из них --- gensalt, генерирующая salt для пароля, вторая --- hashpw, возвращающая хэш по заданным паролю и salt'у. Простейший вариант совместного использования этих функций выглядит так:
$ python -c 'import bcrypt; print bcrypt.hashpw("mypassword", bcrypt.gensalt(8))' $2a$08$FxyUan62aD2P9rWSJzEcdO1JApy8m/YHYDaHbgCiKVZAykI/XdoOC
Именно полученный таким способом хэш и задается в качестве параметра командной строки утилиты passwd (после ключа -p).
Коснемся еще одной важной темы --- автоматического задания паролей. Если требуется в автоматическом режиме создать большое количество учетных записей с паролями, то можно действовать по-разному. В случае, когда пароль для всех учетных записей один и тот же (или используется заранее известное множество паролей), имеет смысл просто "подсмотреть" хэш и подставить его в нужное место соответствующего сценария. Более изящный способ --- вычисление паролей на основании, допустим, имени пользователя и еще какой-либо информации (пусть этим занимается любая подходящая функция с "секретным" параметром). Можно также генерировать случайные пароли с помощью предназначенной для этого утилиты pwgen. В последних двух вариантах значения хэша для паролей можно получать, например, описанным выше способом.
Покажем, как работает упомянутая нами утилита pwgen. Вначале установим соответствующий пакет:
# apt-get install pwgen
А теперь просто дадим команду pwgen:
$ pwgen oi1Sieg1 Coovah3o chi1Et7t zei0Ub0A aeQua4Sh Oyei6aij aebe3Eod uafai1Pa vu1AiFiu Phe4Eep5 aZiesh4o pheeBi2a Ahvo5cu8 Jei9Efae giK2aide Nohf6bah Gi2heira eis7te6Z rai4eeSh GeeK9ui5 aesh6Ud6 nuiCe5im aphai8oX oChoo9Sh UChek0He akei6Ien Reib8ahk xooJ3sai vaeL7miu up4saeSo wiith9Es choD7iex pheV2ohf ahY0ooCh uekohv9A ood8Awae ekaiHah9 Chif5toH iF4ga1es ePhah0Ai jaiShee7 Asa6GeeB iezou1Do bie7eeRe Luxieng3 keiZee5A Pach3Voo Iish5Wie aiv5ra5O Quahgo8s deeXae2f ohVa7OhD pieh8aeH HahGhae6 eebai6Je iZooch9I Bub7pee1 ep9NaPhe Bahveiv5 Eechee8g Wae6jogh Uch8eoxe Mokaet2t ech7OeKa Aingeew8 zub1ohSo koTae2ek dohn1Ahk Ceim8Foo cee9eeTh UGho4nah Cho4aiTh shiwee8I faecie0S aKaa8uen iezei6Qu EeHiiha7 Eexiech6 muWea6du ReeYi2he vei7aiCe aiDohj0o iuSaum3f ca2queeL quaek1Ca ai5Iu3aC ieWe5We6 Cohk3ei9 mo1SeiG8 XeeN7aej GooTh0fa tie5TaeJ bah9ooSh nah2Dai7 aiCe0oeW Bah8Zuye yohv5Eet aegie5Uz iZie6ca6 iw4Jaib4 oGhee9ie taexoe5A eeY6iehu ibaew6Vu xie2Ieh8 eihe6eTa ooMe0oga ahli6eB7 ba2eaRah om7eiT2i Ie8shiWe Uiya3eew Kai9ni2d Shoh2ePh EiZ4fe9Z ieSeipo0 ahxoi5Ee uNochae9 JooXo5uu BareiV0x aa4Ishi2 jae9ohXa AeFo7Tha Zohthoo1 Ua4eeTho zo9Oa0Ph caiN7zeb bueZ2the eelui6Ue joo8Baat phee8Tae ieQue4th eiya7eiJ ahGo7tho usoh7AhK mee9Fiec au7Oow6u ohn8ohJu phij8Toh aigi1EiZ oZahmah0 quooGae3 Quaej7tu Ceexu7da Quae4huz hoPhei6s Ahp3oopu aeGh7heg sah7ahMa ahCh0iit eiquae2A eixae7Uc ingahCh5 Yai7ohve ohC3quee joth3Bay voyai8Bo shuNgoo3 wai5Kaiv ieJah3Ei
Как видно, эта утилита генерирует случайные пароли. По умолчанию они "человеко-читаемые", а не абсолютно случайные, однако можно потребовать и обратного. Разумеется, с помощью параметров командной строки можно регулировать и длину, и количество генерируемых паролей, а также использовать другие многочисленные возможности этой утилиты.
Управление группами
Отметим, что при создании нашего пользователя admin мы выбрали для него лишь одну дополнительную группу --- wheel. Было бы полезным, однако, добавить его и в другие группы. Зачем это может понадобиться? Дело в том, что при работе, например, с пользовательским десктопом, полезно выдавать первому "вошедшему" доступ к таким ресурсам, как съемные диски, аудиоустройства и пр. Такие действия обычно производятся специальным модулем PAM, меняющим права к соответствующему набору файлов из каталога /dev. В нашем случае таких файлов оказалось довольно много (более двух десятков):
$ ls -l /dev/ | grep user crw-rw---- 1 user audio 14, 12 Jul 31 2008 adsp crw-rw---- 1 user audio 14, 4 Jul 31 2008 audio crw------- 1 user root 5, 1 Jul 31 14:07 console crw-rw---- 1 user audio 14, 25 Jul 31 2008 dmmidi1 crw-rw---- 1 user audio 14, 3 Jul 31 2008 dsp crw------- 1 user root 29, 0 Jul 31 2008 fb0 brw-rw---- 1 user floppy 2, 0 Jul 31 2008 fd0 brw-rw---- 1 user floppy 2, 84 Jul 31 2008 fd0u1040 brw-rw---- 1 user floppy 2, 88 Jul 31 2008 fd0u1120 brw-rw---- 1 user floppy 2, 28 Jul 31 2008 fd0u1440 brw-rw---- 1 user floppy 2, 124 Jul 31 2008 fd0u1600 brw-rw---- 1 user floppy 2, 44 Jul 31 2008 fd0u1680 brw-rw---- 1 user floppy 2, 60 Jul 31 2008 fd0u1722 brw-rw---- 1 user floppy 2, 76 Jul 31 2008 fd0u1743 brw-rw---- 1 user floppy 2, 96 Jul 31 2008 fd0u1760 brw-rw---- 1 user floppy 2, 116 Jul 31 2008 fd0u1840 brw-rw---- 1 user floppy 2, 100 Jul 31 2008 fd0u1920 brw-rw---- 1 user floppy 2, 12 Jul 31 2008 fd0u360 brw-rw---- 1 user floppy 2, 16 Jul 31 2008 fd0u720 brw-rw---- 1 user floppy 2, 120 Jul 31 2008 fd0u800 brw-rw---- 1 user floppy 2, 52 Jul 31 2008 fd0u820 brw-rw---- 1 user floppy 2, 68 Jul 31 2008 fd0u830 srwx------ 1 user root 0 Jul 31 14:07 gpmctl brw-r----- 1 user cdrom 22, 0 Jul 31 2008 hdc crw-rw---- 1 user audio 14, 18 Jul 31 2008 midi1 crw-rw---- 1 user audio 14, 0 Jul 31 2008 mixer crw-rw---- 1 user audio 14, 16 Jul 31 2008 mixer1 crw-rw---- 1 user audio 14, 1 Jul 31 2008 sequencer crw-rw---- 1 user audio 14, 8 Jul 31 2008 sequencer2
Какое отношение это имеет к группам? Оказывается, смена UID файлам устройств удобна далеко не всегда. Во многих случаях разумнее передавать права на такие файлы не одному пользователю, а целой группе, что дает возможность настроить права доступа "заранее". В том же /dev, как несложно заметить, есть большое количество файлов, принадлежащим не группе root или wheel, а группе audio, floppy и пр. Для того, чтобы пользователи имели доступ к этим файлам, и нужно включать их в соответствующие группы:
$ id user uid=500(user) gid=500(user) groups=500(user),10(wheel),14(uucp),19(proc),22(cdrom),71(floppy),80(cdwriter),81(audio),83(radio),119(xgrp),422(camera),423(scanner)
Как же добавить пользователя в ту или иную группу? В стандарте POSIX добавление пользователя в группу (равно как и удаление его оттуда) не реализовывалось какой-либо конкретной утилитой. Предполагалось, что соответствующие действия будут производиться системным администратором путем непосредственного редактирования файла /etc/group. Была (и, разумеется, никуда не исчезла) также возможность использования утилиты usermod с ключом -G, который требует явного указания полного списка групп, в которых должен состоять пользователь. Понятно, однако, что если пользователь уже являлся членом десяти групп, то для добавления его в одиннадцатую вначале нужно было получить список первых десяти и только потом добавить к ним одиннадцатую. Такая операция, очевидно, не атомарна, а потому в дистрибутивах ALT Linux предусмотрена команда gpasswd:
# gpasswd -a admin proc Adding user admin to group proc
Как видим, ее использование позволяет избежать описанных проблем. Проверим результат:
$ id admin uid=501(admin) gid=501(admin) groups=501(admin),10(wheel),19(proc)
Сведения о ресурсах
Продолжительность (ак. ч.) |
Подготовка (календ. ч.) |
Полный текст (раб. д.) |
Предварительные знания |
Level |
1 |
1 |
1 |
|
1 |