Как временно убрать юзера (не удалить, но запретить вход)

Бывают такие ситуации, когда надо запретить юзеру пользоваться вашей машиной временно. Конечно, самый простой способ - удалить его учетную карточку, но не трогать остальные файлы. Однако, этот способ имеет кучу недостатков:
- почта на несуществующего юзера будет возвращаться отправителю,
- user ID этого юзера может достаться другому (новому юзеру),
- при возвращении юзера в систему надо будет воспроизвести в точности ту же учетную карточку,
- и т.п.

Поэтому, этот способ - самый неудачный и его даже не стоит рассматривать. Лучше рассмотрим другие возможности:

Первый способ

Этот способ (пожалуй, наиболее "цивилизованный") заключается в том, что в учетную карточку надо вписать"Account expiration time" (с помощью программы chpass), естественно, поставив там уже прошедшую дату. В этом случае, юзер как бы существует в системе - письма к нему идут, файлы сохраняются, во всех диагностиках, где может встретиться его имя, оно отображается правильно. Но, в то же время, если юзер попытается войти в систему, ему просто выдастся сообщение, что "ваш account истек".

Однако, это способ тоже не лишен недостатков. Чтобы понять - почему, надо рассмотреть подробнее, что значит "доступ в систему" юзера.

Обычный юзер может войти в систему (и пользоваться ее ресурсами) через терминал или по сети, с помощью telnet. При этом должна проработать программа login (которая проверит имя и пароль юзера и, если все правильно, запустит для него Shell). Эта же программа обычно вызывается для тех, кто заходит через модем и устанавливает IP соединение по модемной линии (PPP или SLIP). (Кстати, login'у можно запретить пропускать юзера, если прописать правильную строчку (запрещающую вход конкретному юзеру) в файле /etc/login.access. Как это правильно сделать, можно посмотреть в man login.access). Но, кроме того, юзер может (если, конечно, ваша система предоставляет такой сервис):

  • иметь доступ к своим файлам через FTP, тогда проверкой имени/пароля занимается ftpd (программа-сервер FTP);

  • читать свою почту через POP-сервер, тогда проверкой имени/пароля занимается программа popper;

  • иметь доступ к своей домашней директории через сервер "samba", тогда проверкой имени/пароля занимается программа smbd;

  • пользоваться RPC-сервисами - "удаленным запуском программ" (rlogin, rsh и т.п.), тогда проверкой имени/пароля занимаются соответствующие демоны (rlogind, rshd и т.д.);

Так вот. Проблема в том, что не все перечисленные демоны (программы-серверы), ответственные за допуск юзера к ресурсам, могут обращать внимание на "Account expiration time". И, следовательно, все равно дадут юзеру возможность воспользоваться своими услугами.

Второй способ

Другой способ "отсечь" юзера заключается в том, чтобы "испортить" ему пароль. Для этого достаточно добавить к зашифрованному паролю, хранящемуся в учетной карточке, один знак. Обычно, ставят знак "*" в начале пароля, поскольку этот знак не может встретиться в нормальном зашифрованном пароле и, во-первых, пароль в этом случае невозможно подобрать, а во-вторых, такое "искажение" пароля легче потом искать, когда вы будете возвращать юзера обратно. Сделать такую манипуляцию можно программой vipw или chpass.

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

Недостаток этого способа в том, что он менее "цивилизованный". То есть, юзер просто получит сообщение о том, что он неправильно ввел свое имя или пароль, а не о том, что ему запрещен вход.

Кроме того, есть случаи, когда этот способ не работает. Дело в том, что RPC-сервисы могут не проверять пароль, если у юзера в домашней директории в соответствующем файле (.rhosts) записаны адреса машин "пользующихся доверием" и он осуществляет доступ именно с этих машин. В этом случае, проверяется только адрес машины (и имя юзера под которым он зарегистрирован там), а пароль не запрашивается, следовательно, описанный метод не сработает. (Кстати, предыдущий метод ("account expiration") в этом случае должен работать.)

Так как же все таки надо поступить?

Способ с "испорченным" паролем более универсальный, но неправильный :-).

Самый правильный путь - подбирать всех демонов таких, которые правильно отрабатывают запрет входа (например, через "account expiration"). Кстати, те демоны, которые у вас "с раздачи" (то есть, из "родного" дистрибутива), должны правильно обрабатывать такой запрет. Проблемы могут возникнуть только с программами от других разработчиков.

Кроме того, для юзеров, запускающих "IP по модему", обычно, другой способ входа недоступен. Поэтому можно смело пользоваться "account expiration" или запретом в /etc/login.access.

Возможно, еще один способ

И, наконец, следует отметить, что в FreeBSD версии 2.2.2 появилась "база данных login-классов" (login class capability database), /etc/login.conf. Она предоставляет более гибкие возможности по ограничению входа. Можно не только полностью запретить вход юзеру, но разрешить только в определенное время суток или ограничить длительность сессии и т.п.

Но, поскольку у меня нет опыта использования этой database, я пока не могу ничего сказать о надежности и универсальности запретов через нее.

Скорее всего, о ней можно сказать все то же, что относится к методу "account expiration".

(Когда я познакомлюсь с ней поближе, я, возможно, полностью перепишу этот текст :-).

Обновлено: 12.03.2015