Pam: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 20: Строка 20:
 
<BR>Т.е. на уровне PAM это конечно же работает- но ssh слишком умный <S>как утка</S> и имеет дополнительную проверку - вызывая системную ф-ю <B>getpwnam</B> которая ничего не знает про PAM (а использует дедовские методы - /etc/passwd ... ) и не пускает с ошибкой:
 
<BR>Т.е. на уровне PAM это конечно же работает- но ssh слишком умный <S>как утка</S> и имеет дополнительную проверку - вызывая системную ф-ю <B>getpwnam</B> которая ничего не знает про PAM (а использует дедовские методы - /etc/passwd ... ) и не пускает с ошибкой:
 
<PRE>
 
<PRE>
  +
Mar 5 17:52:55 test-vm-mm sshd[3378]: fatal: Internal error: PAM auth succeeded when it should have failed
  +
Mar 5 17:52:55 test-vm-mm sshd[3379]: fatal: mm_request_send: write: Broken pipe
 
</PRE>
 
</PRE>
  +
После чтения кода sshd перевести на человеческий я зык это сообщение можно так "PAM сказал что пускать можно но т.к. поверка на наличие такого пользователя в системе дала отрицательный результат то мы все равно пускаем."
 
<BR>
 
<BR>
  +
Отличный результат.
  +
  +
Для того что бы пользователь был доступен при проверке getpwnam это должен быть системный пользователь. Другого варианта нет.
  +
  +
<BR>
  +
Однако системные пользователи могут храниться не только в /etc/passwd но и в других местах<BR>
 
Тут возможно несколько вариантов
 
Тут возможно несколько вариантов
 
* LDAP
 
* LDAP

Версия 22:47, 5 марта 2015


Linix PAM

Это статья про полную хуйню ерунду - от руководства поставлена задача: заводить пользователя вида user@domain.tld на линукс-боксах. Из ограничений - такой пользователь нужен только один в системе.
В линуксе нельзя завести пользователя с символом "@" в имени стандартными средствами (--force варианты я не расматриваю). Потому для хранения пользователей нужно использовать какое-то внешнее хранилище.
Все написаное относится к CentOS 6.5 - меня интересовала именно эта система и со всякими вашими убунтами я не тестировал :)

Решение

Краткое описание сложностей


Первое что пришло в голову - использовать PAM и не заморачиваться с хранением пользователя вообще. Сделать что то вроде такого в /etc/pam.d.sshd

auth       sufficient   pam_exec.so debug  expose_authtok  log=/root/pam_exec_debug.log /root/pam_exec.sh

Естественно /root/pam_exec.sh для моего пользователя (или для теста - всегда) возвращает "успех".
Это не сработало
Т.е. на уровне PAM это конечно же работает- но ssh слишком умный как утка и имеет дополнительную проверку - вызывая системную ф-ю getpwnam которая ничего не знает про PAM (а использует дедовские методы - /etc/passwd ... ) и не пускает с ошибкой:

Mar  5 17:52:55 test-vm-mm sshd[3378]: fatal: Internal error: PAM auth succeeded when it should have failed
Mar  5 17:52:55 test-vm-mm sshd[3379]: fatal: mm_request_send: write: Broken pipe

После чтения кода sshd перевести на человеческий я зык это сообщение можно так "PAM сказал что пускать можно но т.к. поверка на наличие такого пользователя в системе дала отрицательный результат то мы все равно пускаем."
Отличный результат.

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


Однако системные пользователи могут храниться не только в /etc/passwd но и в других местах
Тут возможно несколько вариантов

  • LDAP
  • NIS
  • DB

Я остановлюсь

Links