1 (26.08.2010 17:50:55 отредактировано Cruiser78)

Добрый день!

Нужет совет знатоков. Постановка задачи следующая:

Делаем потихоньку сервер то-ли терминальный, то-ли приложений... Как получится. А получиться должно следующее: когда пользователь заходит на сервер (не важно как, по 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.so

3.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 не силен совершенно.

2

Я бы вообще посмотрел в сторону autofs
http://linux.lg.ua/wiki/index.php/%D0%A … %B0_autofs
http://www.howtoforge.com/accessing_win … ing_autofs

3

Hrafn пишет:

Я бы вообще посмотрел в сторону autofs

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

ssh -С -X user@server "script" 

и в этом скрипте происходит динамическое монтирование ремутных файловых шар на _сервер_ в какой либо (например, в домашний) каталог юзера на этом сервере и, что важно, с юзерским аккаунтом, далее зпускается нужное X-приложение этому юзеру (с выводом на его рабочий стол), а по завершению работы - всё размонтируется взад.

То есть некое подобие статического монтирования сетевых папок в WinXP от имени юзера надо сотворить.

Я не хочу монтировать шары на сервере перманентно и давать на эти точки монтирования "коллективный" доступ.

Если бы я знал, как запустить mount от имени юзера, а не от рута, то и проблем бы не было. А так - на помощь приходит pam_mount. И он почти работает. По крайней мере в команде su... Значит и в других процедурах должен отрабатывать.

4

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

5

Hrafn пишет:

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

Насколько я понял из второй ссылки - эта вещь хороша, если точим её на рабочую станцию, на _персональный_ компьютер.  Где работает только _один_ юзер, заранее известный. Здесь нет проблемы. Запиши вообще нужные шары в fstab, mount -a и вообще можно не париться. У меня задача несколько иная. Юзера будут работать на _сервере_. Одновременно. И при этом на этом сервере каждому юзеру надо получить ремутные шары с третьего сервера, каждому свой набор. И регистрироваться на этом третьем сервере они должны под своими уникальными именами. Каждый под своим. И вот здесь как раз pam_mount и хорош. Позволяет настроить как раз такое персональное монтирование для одновременно работающих на сервере юзерей. Каждому в свои персональные точки монтирования. И он у меня почти работает. Но только для su. И я, пока, не знаю двух вещей:
1. Как сказать pam_mount'у, чтобы он не спрашивал у юзера пароли, пусть полагается на то, что в конфигурации записано, пусть, если надо, mount спросит пароль.
2. Как научить работать с pam_mount остальные приложения. У меня, почему-то запись в /etc/pam.d/login соответсвующих слов из man'a эффекта не вызывает. Юзер по ssh как коннектился, так и коннектится, а шары, при этом, ему не монтируются.

Это первое. А второе - попытался повторить то, что во второй ссылке прописано (в принципе там несложно скрипты развить в нужную сторону). Увы, Собралась в каталоге /cifs только файловая структура тех шар, что эксопортирует ремутный файловый сервер. Но сами шары - не смонтировались и в каталоги - не зайти...  Разбираться пока не стал.

6

Вообщем, я свое предложение описал. Когда-то с помощью autofs делал монтирование например домашнего каталога пользователя по нфс при входе в систему, при этом учетка была в лдапе на другой машине. Поэтому принципиальной невозможности использовать autofs в Вашем случае не вижу. Но решать Вам, в конце концов.