Добрый день!
Нужет совет знатоков. Постановка задачи следующая:
Делаем потихоньку сервер то-ли терминальный, то-ли приложений... Как получится. А получиться должно следующее: когда пользователь заходит на сервер (не важно как, по ssh или по VNC), то есть когда проходит аутентификацию на этом сервере ему должны быть смонтированы [в его домашний каталог] ремутные шары с различных файловых ресурсов, на которых он имеет свои учетные записи. В общем случае имена в аккаунтах могут и не совпадать. Однако регистрироваться на этих файловых серверах юзер должен под своим уникальным там именем.
Курим на эту тему pam_mount. Но, видимо, табак слишком крепкий или я чего не понимаю. А именно:
1. вписываем в /etc/security/pam_mount.conf.xml заветные строки:
<volume user="alex" fstype="cifs" server="fileserver" path="BD" mountpoint="/home/%(USER)/Net/BD" options="user=user1,rw,wine,nounix,noperm,pass=user1_pass" />
<volume user="ivan" fstype="cifs" server="fileserver" path="BD" mountpoint="/home/%(USER)/Net/BD" options="user=stepan,rw,wine,nounix,noperm" />
<volume user="stepan" fstype="cifs" server="fileserver" path="BD" mountpoint="/home/%(USER)/Net/BD" options="user=stepan,rw,wine,nounix,noperm" />
То есть имеем трех юзерей:
a. Имя на шаре не совпадает с регистрационным именем и есть пароль на шару
б. Имя на шаре не совпадает с регистрационным именем. Пароля на шаре нет.
в. Имя на шаре совпадает с регистрационным именем. Пароля на шаре нет.
И добавляем команду монтирования по cifs следующего вида
<cifsmount>mount -t cifs //%(SERVER)/%(VOLUME) %(MNTPT) -o %(OPTIONS)"</cifsmount>2. Корректируем /etc/pam.d/su (с него начать проще) добавляя в него следующие строки:
auth optional pam_mount.so use_first_pass
session optional pam_mount.so3.1. даем команду su alex и получаем:
# su alex
reenter password for pam_mount:
pam_mount(mount.c:64): Errors from underlying mount program:
pam_mount(mount.c:68): password specified twice, ignoring second
HX_exit: reference count is already zero!Во первых, непонятно зачем оно переспрашивает у меня пароль. Ведь его задача (и которую он честно выполняет судя по отладочному выводу) сформировать и исполнить нужную команду mount -t... И он её и формирут впоследствии. Но зачем он спрашивает у меня этот пароль??? Его задача исполнить сформированную команду, так как она записана. Пусть она пароль и спрашивает, если что...
Источник ошибок примерно понятен - в пароле есть символ "!" - как его заэкранировать? Если я просто даю команду mount.cifs, то она в командной строке (из скрипта) прекрасно скушивает этот символ. Если убираю запись "pass=user1_pass" - то и ошибок нет, вывод - как ниже. Или он ругается на "pass="?
3.2. Тренируем беспарольного юзера su ivan (stepan):
# su ivan
reenter password for pam_mount:
HX_exit: reference count is already zero!опять же спрашивает пароль... А его нет...
=========================================================================
Итак вопрос первый: как отучить pam_mount спрашивать про пароли и как правильно задать эти пароли в OPTIONS?
И вопрос второй - а какие именно файлы нужно подправить в /etc/pam.d для того, чтобы каталоги монтировались юзеру при входе его в систему?
Ну и третий вопрос - А что есть такое "HX_exit: reference count is already zero!"? Это сильно страшно или просто так сообщение?
************************************
Путь решения:
1. не стоит вписывасть имя пользователя и его пароль на ремутном файловом сервере в строку
<volume user="alex" fstype="cifs" server="fileserver" path="BD" mountpoint="/home/%(USER)/Net/BD" options="user=user1,rw,wine,nounix,noperm,pass=user1_pass" />Вместо этого надо создать в удобном месте соответствующий credential-файл (man mount.cifs) и вписать его в поле options. Естественно, права на этот файл исключительно рутовые...
2 скопировать файлы /etc/pam.d/system-auth-ac и /etc/pam.d/password-auth-ac в, например, /etc/pam.d/system-auth-ac-mount и /etc/pam.d/password-auth-ac-mount, и создать на них соответствующие симлинки. С этими последними файлами и будем настраивать работу с pam_mount в нужных нам программах ( если su, то в /etc/pam.d/su меняем имя стандартного симлика на свое). Для нормальной работы надо исправить файлы /etc/pam.d/login /etc/pam.d/sshd, /etc/gdm и /etc/gdm-password. Использование pam_mount в команде su для меня остется под вопросом. Так как мне пока не удалось отучить pam_mount от запросе пароля юзера, если он привязан к su и "su user" вызывается от рута.
3. Должным образом новые файлы /etc/pam.d/system-auth-ac-mount и /etc/pam.d/password-auth-ac-mount вставляя в них, в нужных местах (это важно!, нужно попасть в правильное места стека pam'ов) вызовы pam_mount.so.
4. Получаем удовольствие от проделанной работы. Никаких повторных запросов паролей нет. Точнее главный запрос пароля будет заменен запросом пароля от pam_mount. Может и есть возможность измениния этой фразы (чтобы свою кухню юзерам не светить попусту) но я её не знаю.
Правда, в логах не совсем чисто:
Aug 26 16:38:01 admin-lvs kernel: type=1400 audit(1282826281.585:15): avc: denied { module_request } for pid=3539 comm="sshd" kmod="net-pf-10" scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:system_r:kernel_t:s0 tclass=system
Aug 26 16:38:04 admin-lvs sshd[3539]: pam_mount(pam_mount.c:172): conv->conv(...): Conversation error
Aug 26 16:38:04 admin-lvs sshd[3539]: pam_mount(pam_mount.c:476): warning: could not obtain password interactively either
Aug 26 16:38:04 admin-lvs sshd[3539]: pam_mount(pam_mount.c:172): conv->conv(...): Conversation error
Aug 26 16:38:04 admin-lvs sshd[3539]: pam_mount(pam_mount.c:476): warning: could not obtain password interactively either
Aug 26 16:38:07 admin-lvs kernel: type=1400 audit(1282826287.278:16): avc: denied { getattr } for pid=3539 comm="sshd" path="/home/ivan/Net/BD" dev=cifs ino=524289 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:cifs_t:s0 tclass=dirКоллеги, знатоки SELinux, подскажите, как SE надо подточить, чтобы эти (admin-lvs kernel) сообщения? Я в SE не силен совершенно.
