Linux ограничения на имя пользователя

Обновлено: 02.07.2024

Данная глава содержит дополнительную информацию о паролях локальных пользователей.

В главе подробно описаны три метода установки паролей; с использованием утилиты passwd , с использованием реализации алгоритма шифрования passwd из библиотеки openssl , а также с использованием функции crypt в программе на языке C.

Кроме того, в данной главе обсуждаются параметры паролей и методики отключения, аннулирования или блокировки учетных записей пользователей.

Утилита passwd

Пароли пользователей могут устанавливаться с помощью утилиты passwd . При смене паролей пользователям придется предоставлять утилите свои старые пароли перед двукратным вводом новых паролей. Как вы видите, утилита passwd может выполнять простейшую проверку с целью предотвращения использования слишком простых паролей для учетных записей пользователей. Пользователь root не должен выполнять эти правила (хотя он и будет видеть предупреждения). Также пользователь root не должен вводить старый пароль перед двукратным вводом нового пароля.

Файл shadow

Пароли пользователей хранятся в зашифрованном виде в файле /etc/shadow . Файл /etc/shadow доступен только для чтения и может читаться исключительно пользователем root. В разделе, посвященном правам доступа к файлам, мы поговорим о том, как пользователям удается изменять свои пароли. На текущий момент вам нужно знать лишь о том, что пользователи могут изменять свои пароли с помощью утилиты /usr/bin/passwd .

Файл /etc/shadow содержит таблицу с девятью разделенными двоеточиями столбцами. Эти девять столбцов (слева направо) содержат имя пользователя, зашифрованный пароль, время последнего изменения пароля (первый день соответствует 1 января 1970 года), количество дней, в течение которых пароль должен оставаться неизменным, день истечения срока действия пароля, количество дней перед истечением срока действия пароля, в течение которых должно выводиться предупреждение, количество дней после истечения срока действия пароля, по прошествии которых учетная запись должна быть отключена, а также день, когда учетная запись была отключена (также с начала 1970 года). Последнее поле пока не имеет значения.

Все пароли в примере выше являются хэшами фразы hunter2 .

Шифрование ключевых фраз с помощью утилиты passwd

Пароли пользователей системы хранятся в зашифрованном формате. Их шифрование осуществляется средствами функции crypt . Простейший (и рекомендованный) способ добавления пользователя с заданным паролем в систему заключается в добавлении пользователя в систему с помощью команды useradd -m имя_пользователя с последующей установкой пароля с помощью утилиты passwd .

Шифрование ключевых фраз с помощью утилиты openssl

Другой способ создания учетных записей пользователей с паролями заключается в использовании параметра -p утилиты useradd, но в случае использования данного параметра утилите необходимо передавать уже зашифрованный пароль. Вы можете зашифровать пароль с помощью команды openssl passwd .

Команда openssl passwd позволяет сгенерировать несколько отдельных хэшей для одного и того же пароля, причем для этой цели используется значение salt . Данное значение salt может быть выбрано произвольным образом и будет отображаться в виде двух первых символов хэша. В данном примере показана методика создания учетной записи пользователя с паролем.

Помните о том, что после выполнения данной команды ваш пароль в открытом виде будет сохранен в файле истории команд командной оболочки!

Шифрование ключевых фраз с помощью функции crypt

Третий вариант заключается в создании вашей собственной программы на языке программирования C, которая будет использовать функцию crypt с ее последующей компиляции в бинарный файл. Эта простая программа может быть скомпилирована средствами компилятора gcc с помощью команды, аналогичной следующей: При использовании описанной программы MyCrypt нам придется передавать два параметра. Первым параметром является незашифрованный пароль, а вторым - значение salt. Значение salt используется для изменения алгоритма шифрования в соответствии с одним из 4096 различных вариантов. Данная вариация используется для предотвращения ситуаций, в которых два пользователя с одним и тем же паролем могут использовать одну и ту же запись в файле /etc/shadow .

Обратили ли вы внимание на то, что первые два символа зашифрованного пароля являются значением salt ?

Стандартный вывод функции crypt генерируется с использованием алгоритма DES, который давно устарел и может быть взломан за считанные минуты. Более предпочтительным алгоритмом для шифрования паролей является алгоритм md5 , который может быть распознан по начальным символам значения salt $1$. Длина значения salt для алгоритма md5 может достигать восьми символов. Значения salt хранятся в открытом виде в строках файла /etc/shadow между вторым и третьим символами $, поэтому никогда не используйте строку пароля в качестве значения salt!

Файл /etc/login.defs

Файл /etc/login.defs содержит некоторые стандартные значения параметров паролей пользователей, таких, как период устаревания паролей или ограничения длины паролей. (Там же вы можете обнаружить числовые ограничения идентификаторов пользователей и идентификаторов групп, а также указание на то, должна ли создаваться домашняя директория пользователя по умолчанию).

Утилита chage

Утилита chage может использоваться для установки даты истечения срока действия пользовательской учетной записи (-E), установки минимального (-m) и максимального (-M) срока действия пароля, даты истечения срока действия пароля, а также установки количества дней, в течение которых выводятся предупреждения об истечении срока действия пароля. Многие из этих функций реализованы также и в рамках утилиты passwd . Параметр -l утилиты chage позволяет ознакомиться с текущими значениями этих параметров для указанного пользователя.

Блокировка учетных записей

Пароли из файла /etc/shadow не могут начинаться с символа восклицательного знака. Если второе поле в строке из файла /etc/passwd начинается с символа восклицательного знака, пароль не может использоваться.

Использование данной особенности обычно называется блокировкой , деактивацией или отключением пользовательской учетной записи. Помимо текстового редактора vi (или vipw) вы можете использовать утилиту usermod для этой цели.

Первая команда из следующего примера предназначена для вывода хэшированного пароля пользователя laura из файла /etc/shadow . Следующая команда позволяет деактивировать пароль пользователя laura , после чего Laura не сможет пройти фазу аутентификации при условии использования данного пароля. Как видно в примере ниже, в результате перед хэшем пароля просто добавляется символ восклицательного знака. Пользователь root (а также пользователи с доступом к команде su посредством sudo ) все так же будут иметь возможность использовать команду su для работы с учетной записью пользователя laura (так как в этом случае пароль пользователя не требуется). Кроме того, следует учитывать тот факт, что Laura все еще сможет войти в систему в том случае, если она заранее настроила доступ по ssh без использования пароля! Вы можете снова разблокировать учетную запись с помощью команды usermod -U .

Следует подходить с осторожностью к работе и учитывать различия параметров интерфейса командной строки утилит passwd , usermod и useradd в различных дистрибутивах Linux. Проверяйте содержимое локальных файлов при использовании таких возможностей, как "деактивация, отключение или блокировка" учетных записей пользователей и их паролей.

Редактирование локальных файлов

В том случае, если вы все еще хотите отредактировать вручную файл /etc/passwd или /etc/shadow , располагая информацией о командах для управления паролями, используйте утилиту vipw вместо непосредственного использования текстового редактора vi(m). Утилита vipw осуществляет корректную блокировку данного файла.

Практическое задание: пароли пользователей

1. Установите пароль hunter2 для пользователя serena .

2. Также установите пароль для пользователя venus , после чего заблокируйте учетную запись пользователя venus с помощью утилиты usermod . Проверьте наличие признаков блокировки в файле /etc/shadow до и после осуществления блокировки.

3. Используйте команду passwd -d для деактивации пароля пользователя serena . Проверьте наличие строки для пользователя serena в файле /etc/shadow до и после осуществления деактивации.

4. Каковы различия между операцией блокировки пользовательской учетной записи и операцией деактивации пароля пользовательской учетной записи, которые мы только что осуществляли с помощью команд usermod -L и passwd -d ?

5. Попытайтесь изменить пароль serena на пароль serena as serena.

6. Сделайте так, чтобы пользователь serena был обязан изменять пароль через каждые 10 дней.

7. Сделайте так, чтобы каждый новый пользователь был обязан изменять свой пароль через каждые 10 дней.

8. Воспользуйтесь учетной записью пользователя root для создания резервной копии файла /etc/shadow . Используйте текстовый редактор vi для копирования хэша пароля hunter2 из строки пользователя venus в строку пользователя serena . Может ли после этого пользователь serena войти в систему с паролем hunter2 ?

9. В каких случаях следует использовать утилиту vipw вместо vi ? Какая проблема может возникнуть при использовании текстового редактора vi или vim для редактирования файла паролей?

10. Используйте команду chsh для вывода списка доступных командных оболочек (данная команда будет работать исключительно в дистрибутивах RHEL/CentOS/Fedora) и сравните вывод с выводом команды cat /etc/shells .

11. Какой параметр утилиты useradd позволяет установить имя домашней директории пользователя?

12. Как можно определить, заблокирован или разблокирован пароль пользователя serena ? Предложите решение на основе утилиты grep , а также решение на основе утилиты passwd .

Корректная процедура выполнения практического задания: пароли пользователей

1. Установите пароль hunter2 для пользователя serena .

2. Также установите пароль для пользователя venus , после чего заблокируйте учетную запись пользователя venus с помощью утилиты usermod . Проверьте наличие признаков блокировки в файле /etc/shadow до и после осуществления блокировки.

Обратите внимание на то, что в результате выполнения команды usermod -L перед хэшем пароля добавляется символ восклицательного знака.

3. Используйте команду passwd -d для деактивации пароля пользователя serena . Проверьте наличие строки для пользователя serena в файле /etc/shadow до и после осуществления деактивации.

4. Каковы различия между операцией блокировки пользовательской учетной записи и операцией деактивации пароля пользовательской учетной записи, которые мы только что осуществляли с помощью команд usermod -L и passwd -d ?

Блокировка предотвратит вход пользователя в систему с использованием установленного пароля благодаря добавлению символа ! перед хэшем пароля в файле /etc/shadow .

Деактивация с помощью утилиты passwd приведет к удалению хэша пароля из файла /etc/shadow .

5. Попытайтесь изменить пароль serena на пароль serena as serena.

Войдите в систему с именем пользователя serena , после чего выполните команду: passwd serena . Исполнение команды должно завершиться неудачей!

6. Сделайте так, чтобы пользователь serena был обязан изменять пароль через каждые 10 дней.

7. Сделайте так, чтобы каждый новый пользователь был обязан изменять свой пароль через каждые 10 дней.

8. Воспользуйтесь учетной записью пользователя root для создания резервной копии файла /etc/shadow . Используйте текстовый редактор vi для копирования хэша пароля hunter2 из строки пользователя venus в строку пользователя serena . Может ли после этого пользователь serena войти в систему с паролем hunter2 ?

9. В каких случаях следует использовать утилиту vipw вместо vi ? Какая проблема может возникнуть при использовании текстового редактора vi или vim для редактирования файла паролей?

Утилита vipw выведет предупреждение в том случае, если кто-либо еще в данный момент редактирует данный файл (с помощью утилиты vipw ).

10. Используйте команду chsh для вывода списка доступных командных оболочек (данная команда будет работать исключительно в дистрибутивах RHEL/CentOS/Fedora) и сравните вывод с выводом команды cat /etc/shells .

11. Какой параметр утилиты useradd позволяет установить имя домашней директории пользователя?

12. Как можно определить, заблокирован или разблокирован пароль пользователя serena ? Предложите решение на основе утилиты grep , а также решение на основе утилиты passwd .

Может ли имя linux-пользователя содержать в себе символы кирилицы?
adduser вот не позволяет создавать таких пользователей. Нужно, чтобы пользователи samba могли заходить на этот комп. Вот useradd создал не ругаясь, но только он одну запись в /etc/passwd cоздал, без создания профиля. А мне бы хотелось под этим пользователем ещё и локально работать.


Может ли имя linux-пользователя содержать в себе символы кирилицы?

Может, но так делать не надо.

Но это не нужно - даже сама Windows категорически рекомендует создавать пользователей с регистрационными именами, содержащими только латиницу и цифры.


sunny1983

Может ли имя linux-пользователя содержать в себе символы кирилицы?

Usernames must start with a lower case letter or an underscore, followed by lower case letters, digits, underscores, or dashes. They can end with a dollar sign. In regular expression terms: [a-z_][a-z0-9_-]*[$]?

Ну вот только что ради прикола прописал руками юзера в кириллице.
В kdm крякозябры вместо имени, но зашел без проблем. В консоли не проверял, но su в konsole работает.


Вопрос, кто там у вас рулевой, кто за штурвалом. Ты, секретарша шефа, или главбух? Определись. Если ты рулишь, так забей на неправельные имена, это явно не твоя проблема. А с бухгалтерией борись их-же методами. Кучей докладных по любому поводу. Если в первый месяц не уволят по наклёпу, значит ты суперофисный суперадмин. =)


Galant

Ну вот только что ради прикола прописал руками юзера в кириллице.

теперь поднимись на крышу 9го этажа (можно выше), и спрыгни с неё. Докажи мне, что это тоже возможно. Ради прикола.

теперь поднимись на крышу 9го этажа (можно выше), и спрыгни с неё. Докажи мне, что это тоже возможно. Ради прикола.

Я тебе вообще ничего не собирался и не собираюсь доказывать.

А по теме: странно слышать об ограничениях на кириллицу во времена юникода. (про винду молчу, хотя самба в домене у меня работает с кириллицей в именах уже несколько лет, тьфу-тьфу :) )

А по теме: странно слышать об ограничениях на кириллицу во времена юникода.

Плюсую, рабы латиницы - неявные рабы бритоссии / пиндоссии.


Galant

А по теме: странно слышать об ограничениях на кириллицу во времена юникода.

ты про эпичные дыры юникода не слышал? про несимволы, которые не матчатся точкой? тогда всё ясно.


anonymous

Плюсую, рабы латиницы - неявные рабы бритоссии / пиндоссии.

не говори. А музыканты рабы итальяшек. А вот доктора вообще у какого-то мёртвого народа в рабстве.

какие эпичные костыли. вы не прграммируете на php?

Плюсую, рабы латиницы - неявные рабы бритоссии / пиндоссии.

Пишешь с калькулятора МК-61 или сразу с березовой табуретки? Вообще-то, учитывая, что 80% софта и железа разрабатываются в США, то по твоей логике, ты их самый верный раб. А учитывая, что производят потом это железо в Китае\Тайване, то и их раб тоже.


anonymous

какие эпичные костыли. вы не прграммируете на php?

вы так говорите, как будто в этом есть что-то плохое. На самом деле, на php нормальный код писать несколько сложнее, чем на С++.

а система будет использовать безопасный идентификатор, который юзер никогда и не увидит.

А по теме: странно слышать об ограничениях на кириллицу во времена юникода

Ага: у одного - юникод, у второго - КОИ, у третьего - 1251…


Многопользовательская ОС допускает использование ресурсов компьютера несколькими пользователями одновременно.

Система UNIX изначально проектировалась как многопользовательская ОС. Уже первая версия, выпущенная в 1971 году, была многопользовательской. К терминалам tty0 — tty5 могли подключаться несколько человек.

Системы MS-DOS и Windows 95 были однопользовательскими. Настоящий многопользовательский режим появился в Windows NT.

Пользователи и группы

Кроме числового id, используется имя пользователя в виде строки. По сути дела, имя пользователя — это его короткий и легко запоминаемый псевдоним, который используется при входе в систему. Классические ограничения на имя пользователя:

  • используются маленькие латинские буквы, цифры, знаки - и _,
  • имя должно начинаться на букву или на _,
  • общая длина — до 31 включительно.

Пользователи могут организовываться в группы, которые также нумеруются 16-битными целыми числами, называемыми GID (Group ID — идентификатор группы). Назначение пользователя в группу выполняется вручную системным администратором и заключается в создании нескольких записей (в системной базе данных), в которых содержится информация о том, какой пользователь к какой группе принадлежит. Пользователь может одновременно принадлежать к нескольким группам.

Команда id позволяет выводить UID и GID.

root — суперпользователь

Пользователь, UID которого равен 0, является особым пользователем и называется суперпользователем (superuser или root). Суперпользователь может читать и писать все файлы в системе независимо от того, кто ими владеет и как они защищены. Процессы с UID = 0 также имеют возможность использовать небольшую группу защищённых системных вызовов (например mknod()), доступ к которым запрещён обычным пользователям.

На самом деле пользователь с нулевым UID не обязательно имеет имя root, имя может быть любым. Важен UID, а не имя. В коде ядра делаются проверки на равенство нулю. Имя root — это просто соглашение.

su и sudo

Sandwich.jpg

Исторически первой была команда su.

Запущенная без параметров, она запрашивает пароль суперпользователя, и в случае успеха просто подменяет текущее имя пользователя на root, оставляя почти все переменные окружения от старого пользователя (кроме PATH, USER и еще пары-тройки). Более корректно запускать её как su - — в таком случае оболочка получает также и правильный environment (как будто root вошёл в систему напрямую).

Затем появилась команда sudo, и это был прорыв.

Программа sudo настраивается через файл /etc/sudoers.

В Debian-based-дистрибутивах пользователь root не имеет пароля, вместо этого все административные действия должны производиться через sudo.

  • При использовании sudo пользователь вводит свой пароль, а не пароль root'а.
  • По умолчанию sudo записывает всю пользовательскую активность в лог.
  • В случае с su администратор системы не может ограничить команды, выполняемые пользователями, а в sudo — может.
  • Если пользователь должен быть лишен права администрирования, в случае с su он должен забыть пароль root'а; если используется sudo, достаточно вынести его из соответствующей группы.
  • sudo может запоминать факт правильно введённого пароля и не спрашивать в дальнейшем. В Ubuntu пароль запоминается на 15 минут. Это тоже можно настроить. Программа sudo хранит свои служебные данные в каталоге /var/run/sudo/.

Редактирование файлов от root

sudoedit — проверяет, можно ли этому пользователю изменять данный файл, затем копирует указанный файл во временный каталог, открывает его в редакторе согласно переменной окружения EDITOR (который наследует права пользователя, а не root'а), а после редактирования, если файл был изменён, с особыми предосторожностями копирует его обратно.

Файлы с данными о пользователях

Соответствие идентификаторов и символьных имен, а также другая информация о пользователях и группах в системе (учетные записи), как и большинство другой информации о конфигурации системы UNIX, по традиции, представлена в виде текстовых файлов.

/etc/passwd

Каждая строка файла описывает одного пользователя и содержит семь полей, разделённых двоеточиями. Пример записи:

  1. регистрационное имя или логин;
  2. хеш пароля;
  3. идентификатор пользователя;
  4. идентификатор группы по умолчанию;
  5. информационное поле GECOS (полное имя, телефон, . );
  6. начальный (он же домашний) каталог;
  7. регистрационная оболочка, или shell.

Поле GECOS хранит вспомогательную информацию о пользователе (номер телефона, адрес, полное имя и так далее). Оно не имеет чётко определённого синтаксиса. История поля GECOS начинается в Bell labs. Традиционно там такие поля через запятую:

  • Полное имя
  • Адрес офиса или домашний адрес
  • Рабочий телефон
  • Домашний телефон

/etc/group

/etc/group содержит записи обо всех группах в системе. Каждая его строка содержит

Здесь сообщается, что группа bin имеет GID=1, а входят в неё пользователи root, bin и daemon.

/etc/shadow

Wikipedia: Shadow file - в частности, объясняет, зачем этот файл существует отдельно. Обычно этим файлом владеет суперпользователь, и он недоступен для чтения обычным пользователям.

  • имя пользователя,
  • хеш пароля,
  • дата последнего изменения пароля,
  • через сколько дней можно будет поменять пароль,
  • через сколько дней пароль устареет,
  • за сколько дней до того, как пароль устареет, начать напоминать о необходимости смены пароля,
  • через сколько дней после того, как пароль устареет, заблокировать учётную запись пользователя,
  • дата, при достижении которой учётная запись блокируется,
  • зарезервированное поле.

Scheme id Schema Example
DES Kyq4bCxAXJkbg
_ Berkeley Software Design _EQ0.jzhSVeUyoSqLupI
1 MD5 $1$etNnh7FA$OlM7eljE/B7F1J4XYNnk81
2, 2a, 2x, 2y bcrypt $2a$10$VIhIOofSMqgdGlL4wzE//e.77dAQGqntF/1dT7bqCrVtquInWy2qi
3 NTLM Authentication $3$$8846f7eaee8fb117ad06bdd830b7586c
5 SHA-256 $5$9ks3nNEqv31FX.F$gdEoLFsCRsn/WRN3wxUnzfeZLoooVlzeF4WjLomTRFD
6 SHA-512 $6$qoE2letU$wWPRl.PVczjzeMVgjiA8LLy2nOyZbf7Amj3qLIL978o18gbMySdKZ7uepq9tmMQXxyTIrS12Pln.2Q/6Xscao0
md5 Solaris MD5 $md5,rounds=5000$GUBv0xjJ$$mSwgIswdjlTY0YxV7HBVm0
sha1 PBKDF1 with SHA-1 $sha1$40000$jtNX3nZ2$hBNaIXkt4wBI2o5rsi8KejSjNqIq

Для MD5 используют 1000 раундов, для SHA — 5000.

Пример: у alice стоит пароль 111.

/etc/sudoers

Правильно его редактировать командой visudo. Он проверяет корректность синтаксиса перед сохранением файла. Иначе можно испортить sudo и потерять контроль над происходящим.

Например, чтобы отключить запрос пароля при sudo, можно дописать в конец строку

Доступ к информации о пользователях

Можно вручную читать информацию из текстовых файлов и парсить — неудобно.

Есть утилита getent, которая помогает получить информацию из разных текстовых файлов: ahosts, ahostsv4, ahostsv6, aliases, ethers, group, gshadow, hosts, netgroup, networks, passwd, protocols, rpc, services, shadow. Общий синтаксис такой:

Есть набор C-функций, которые позволяют получать информацию о пользователях.

Работают они медленно, так как выполняют чтение из файликов. Если вам нужно быстро, придётся организовывать кеширование своими силами.

Управление пользователями

Утилиты useradd, userdel и usermod бинарные и низкоуровневые, существуют во всех дистрибутивах.

Учётная запись заблокирована, пока не задан пароль.

Для запуска администратором рекомендуется использовать более высокоуровневые обёртки adduser/deluser. Это скрипты, написанные на perl.

Пример: добавить пользователя в группу:

Права доступа к файлам

Основной механизм безопасности в операционной системе Linux прост. Каждый процесс несет на себе UID и GID своего владельца. Когда создается файл, он получает UID и GID создающего его процесса. Файл также получает набор разрешений доступа, определяемых создающим процессом. Эти разрешения определяют доступ к этому файлу

  • для владельца файла,
  • для других членов группы владельца файла,
  • для всех прочих пользователей.

Для каждой из этих трех категорий определяется три вида доступа:

  • чтение (read, r),
  • запись (write, w),
  • исполнение файла (execute, x).

Поскольку существуют три категории пользователей и три бита для каждой категории, все режимы доступа к файлу можно закодировать 9 битами.

К счастью, у владельца файла всегда есть способ изменить в дальнейшем режим доступа к файлу, даже если ему будет запрещен всякий доступ к самому файлу.

Три варианта записи прав пользователя
двоичная восьмеричная символьная права на файл права на директорию
000 0 --- нет нет
001 1 --x выполнение чтение файлов и их свойств
010 2 -w- запись нет
011 3 -wx запись и выполнение всё, кроме чтения списка файлов
100 4 r-- чтение чтение имён файлов
101 5 r-x чтение и выполнение доступ на чтение
110 6 rw- чтение и запись чтение имён файлов
111 7 rwx все права все права

Вывод прав доступа

Файлы

Право на запись (w) даёт пользователю возможность записывать или изменять файл.

Если на бинарном исполняемом файле выставлены права на выполнение, то программу можно будет выполнить, даже если нет права на чтение.

Право на запись может существовать при отсутствии права на чтение.

Каталоги

Каталоги — это файлы, они обладают теми же самыми режимами защиты, что и обычные файлы.

Отличие состоит в том, что бит x интерпретируется для каталогов как разрешение не исполнения, а входа в каталог, доступа к inode'ам файлов. Чтобы сделать cd в каталог, нужно, чтобы он имел бит x.

Бит r разрешает получение списка файлов в каталоге.

Символические ссылки

Биты доступа, выставленные на символических ссылках, в UNIX-системах игнорируются (исключением является macOS). Имеют значение установки прав, выставленные для файла, на который линк указывает.

На Linux команда ls -l всегда печатает lrwxrwxrwx (777) для символических ссылок.

Жёсткие ссылки

У жёстких ссылок, указывающих на один inode, одинаковые владелец и права доступа. Чтобы иметь возможность создать хардлинк на файл, нужно быть или его владельцем, или иметь как минимум rw-доступ.

chmod

Синтаксис

Аргумент команды chmod, задающий разрешения, может быть записан в двух форматах: в числовом и в символьном.

Использование команды в символьном виде

В символьном виде использование команды chmod позволяет более гибко добавлять, устанавливать или убирать права на файл(ы) или каталоги.

References определяют пользователей, которым будут меняться права. References определяются одной или несколькими буквами:

Operator определяет операцию, которую будет выполнять chmod:

Operator Описание
+ добавить определенные права
- удалить определенные права
= установить определенные права

Modes определяет какие именно права будут установлены, добавлены или удалены:

Mode Name Описание
r read чтение файла или содержимого каталога
w write запись в файл или в каталог
x execute выполнение файла или чтение содержимого каталога
X special execute выполнение, если файл является каталогом или уже имеет право на выполнение для какого-нибудь пользователя
s setuid/gid установленные атрибуты SUID или SGID позволяют запускать файл на выполнение с правами владельца файла или группы соответственно
t sticky устанавливая t-бит на директорию, мы меняем это правило таким образом, что удалить файл может только владелец этого файла

Примеры использования команды в символьном виде

Установить права «rwxr-xr-x» (0755) для файла:

chmod u=rwx,g=rx,o=rx filename

Установить права на выполнение для владельца файла, удалить права на выполнение у группы, удалить права на запись и выполнение у остальных пользователей:

chmod u+x,g-x,o-wx filename

Установить рекурсивно права на чтение для всех пользователей:

chmod -R a+r directory

Рекурсивно удалить атрибуты SUID и SGID:

chmod -R u-s,g-s directory

Право на запуск chmod

chmod может выполнять владелец файла или root.

chown

Право на запуск chown

Владение файлом может быть изменено только суперпользователем. Обычный пользователь не может "отдать" свой файл другому пользователю.

chgrp

Казалось бы, зачем нужна отдельная команда

если можно сделать

В отличие от команды chown, chgrp может использоваться непривилегированными пользователями для изменения группы файлов. Команда позволяет рядовым пользователям изменять группы, но только те, членами которых они являются.

setuid и setgid

Проблемы. Как пользователю сменить пароль? Как пользователям получать управляемый доступ ко всем устройствам ввода-вывода и другим системным ресурсам?

Введён дополнительный бит защиты — бит SETUID. Бит был изобретён Деннисом Ритчи и запатентован в США компанией AT&T в 1979 году.

У процесса есть два UID:

  • реальный (real);
  • действительный или рабочий (effective).

Когда выполняется программа с установленным битом SETUID, то рабочим UID этого процесса становится не UID вызвавшего её пользователя, а UID владельца исполняемого файла.

Из-за возможности состояния гонки многие операционные системы игнорируют установленный атрибут к shell-скриптам. См. [1]

Установка битов suid/sgid на неисполняемых файлах, как правило, бессмысленна.

Установка sgid для директории приведёт к установке принадлежности каждого нового создаваемого файла к той же группе, к которой принадлежит сама директория, а не к основной группе владельца, как это происходит по умолчанию. suid для директории не имеет смысла.

Пример: печать uid

Пример: чтение /etc/shadow

Как известно, обычному пользователю читать этот файл не позволено.

Выставим suid-бит и проверим. Для запуска sudo уже будет не нужно.

Запуск оболочки от имени root без sudo

Так делать в реальной жизни не надо, это только учебный демонстрационный пример.

Используем системный вызов setuid(), чтобы выставить нашему процессу реальный uid суперпользователя.

setuid() sets the effective user ID of the calling process. If the effective UID of the caller is root (more precisely: if the caller has the CAP_SETUID capability), the real UID and saved set-user-ID are also set.

Sticky bit

Устанавливается для каталогов. Только владелец файла, владелец каталога или root может переименовать или удалить файл. Без выставленного sticky bit, любой пользователь, имеющий wx-права на каталог, может удалить или переименовать содержащиеся в нём файлы независимо от владельца файлов.

Сегодня sticky bit используется в основном для каталогов, чтобы защитить в них файлы. Из такого каталога пользователь может удалить только те файлы, владельцем которых он является. Примером может служить каталог /tmp, в который запись открыта для всех пользователей, но нежелательно удаление чужих файлов. Установка атрибута производится утилитой chmod.

umask

Котик

Как то раз появилась следующая задача: создать локального пользователя в ОС Linux, с ограниченным доступом к папкам и файлам, включая не только редактирование, но и просмотр, а также возможность использовать только разрешенные утилиты. Предусматривается только локальный доступ, сетевого доступа нет.

Что бы не изобретать велосипед, первым делом начал копать интернет, в результате чего были найдены следующие варианты:

  • ограничения доступа через сетевые службы ssh, sftp (не подошло)
  • разграничение прав доступа самой операционной системой linux (не подошло, хотелось бы универсальное решение)
  • использование chroot (не подошло)
  • использование сторонних утилит, например SELinux (не подошло, усложняет систему).
  • нет возможности смены каталога командой cd
  • нельзя сбрасывать или изменять значения переменных SHELL, PATH, ENV, BASH_ENV
  • запрещено указывать команды содержащие / (косую черту)
  • запрещено импортировать функции из основной оболочки
  • запрещено перенаправлять вывод с использованием операторов >, <, |, <>, >&, &>, >>
  • запрещено использовать команду exec для подмены команды и пр.

Конечно rbash из коробки, всех задач не решает, поэтому на примере рассмотрим создание пользователя и настройка его окружения для полного решения нашей задачи.

Далее все операции выполняются от суперпользователя (root).

1. Создаем ограниченную оболочку


2. Создаем пользователя


3. Изменяем права директории


4. Переходим в директорию и очищаем ее


5. Настраиваем оболочку и права


Файл .bashrc определяет поведение командной оболочки, в данный файл можно добавить alias для команд или дополнительные опции.

Для обеспечения безопасности выполните следующие команды:


Данный список можно продолжать…

6. Проверяем работу


7. Добавляем допустимые команды


Важно, пути в команде ln необходимо указывать полностью.

8. Для ограничения опций команды можно использовать обертки


9. Для работы с файлами и папками можно также создать обертку
с черным списком (разрешить все, кроме):
— создаем файл


blacklist — переменная содержащая черный список директорий или файлов (через пробел)
— добавляем команду для пользователя zuser


Данный скрипт разрешает выполнять команду ls с любыми ключами для каталогов и файлов не совпадающих с черным списком

с белым списком (запретить все, кроме):
— создаем файл


whitelist — переменная содержащая белый список директорий или файлов (через пробел)
— добавляем команду для пользователя zuser


Данный скрипт разрешает выполнять команду cat с указанными файлами в белом списке

Готово, в итоге получили следующий результат:

  • мы создали пользователя zuser с оболочкой rbash
  • отключили возможность использования автодополнения в консоли
  • zuser может запускать утилиты только из директории /home/zuser/bin
  • добавили пользователю zuser команду ping
  • добавили пользователю zuser собственную команду user-info
  • пользователю zuser ограничили через обертку выполнение команд ls и cat

Данный способ к сожалению не гарантирует 100% безопасность, и при определенных знаниях и квалификации пользователь может покинуть данную оболочку. Спасибо Jouretz arheops YaDr они в комментариях привели примеры обхода ограничений оболочки.

Читайте также: