Intereting Posts
Как изменить домашний каталог FTP в Centos 6 Как настроить Unbound для использования DNSSEC? Апричность ОС не отображается в grub Как настроить все CNAME на Ubuntu Linux с помощью BIND 9 Как изменить часовой пояс в UTC без перезагрузки AIX предоставление заданий для получения трех узлов, выполняющих параллельные казни Строка состояния экрана несколько строк Linux предоставляет только возможность установки на USB, а не на компьютер Ошибка ldapsearch «Недопустимое общее имя параметра» для каждой опции Неверный код выхода awk Как установить последнюю версию Node js для элементарной ОС (ubuntu) Что мне нужно сделать дополнительно, чтобы запустить X, чтобы не заканчиваться на черном экране? Загрузка с оболочки на HTTP-сервер Может ли суперпользователь (с «корневым» доступом) манипулировать данными в базе данных, установленной на сервере? Переместить веб-каталог в Raid Array

dyanamically создание каталогов с pam_mkhomedir и mysql для vsftpd

Я Linux noob, так что, надеюсь, кто-то сможет помочь мне запустить это. Я установил vsftpd, используя следующие инструкции

http://www.camcloud.com/blog/setup-vsftpd-with-virtual-users-using-mysql

Я пытаюсь автоматически / динамически создавать каталоги для каждого пользователя при входе в ftp-сервер.

У меня есть следующий /etc/pam.d/vsftpd который не создает автоматически каталог.

Код конфигурации статического каталога

 session optional pam_keyinit.so force revoke auth required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0 account required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0 

Мой вопрос в том, как правильно использовать pam_mkhomedir для создания каталога с именем пользователя из mysql. Я нашел эту документацию https://www.dalemacartney.com/2012/07/30/auto-creation-of-user-home-directories-in-linux/

Мне интересно, если это правильная конфигурация, я также хотел бы знать, как его имя пользователя установлено для каталога. Я не вижу нигде в коде, где используется имя пользователя, или это то, что просто происходит за кулисами?

Код конфигурации динамического каталога

 session optional pam_keyinit.so force revoke auth required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0 account required pam_mysql.so verbose=1 user=mydbusername passwd=mydbpass host=localhost db=mydb table=mydb_table usercolumn=username passwdcolumn=password crypt=0 session required pam_mkhomedir.so skel=/etc/ftp/ umask=0022 

 session required pam_mkhomedir.so skel=/etc/ftp/ umask=0022 

Как вы можете видеть, pam_mkhomedir.so действует на уровне сеанса . Это означает, что он действует после аутентификации пользователя (с помощью средства auth ). Для этого он определяет следующую функцию PAM:

 PAM_EXTERN int pam_sm_open_session(pam_handle_t * pamh, int flags, int argc, const char **argv); 

Как я уже сказал, эта функция вызывается, когда пользователь аутентифицирован. Поэтому, когда он извлекает пользовательский дескриптор PAM …

 /* Determine the user name so we can get the home directory */ retval = pam_get_item(pamh, PAM_USER, (const void **)&user); 

… он получает доступ к имени аутентифицированного , существующего пользователя. С помощью этой информации модуль сможет получить то, что ему нужно (путь к домашнему каталогу) с помощью простого вызова библиотеки getpwnam(3) :

 /* Get the password entry */ pwd = getpwnam(user); 

Это вернет следующую структуру, заполненную информацией о пользователе:

 struct passwd { char *pw_name; /* username */ char *pw_passwd; /* user password */ uid_t pw_uid; /* user ID */ gid_t pw_gid; /* group ID */ char *pw_gecos; /* user information */ char *pw_dir; /* home directory */ char *pw_shell; /* shell program */ }; 

Теперь, если вы задаетесь вопросом, откуда эта информация, посмотрите на /etc/nsswitch.conf . Коммутатор служб имен (NSS) здесь, чтобы предоставить информацию об именах вообще (которые могут быть именами пользователей, алиасами, группами, хостами, … подробнее см. nsswitch.conf(5) ). Если руководство, которым вы следовали, достаточно полно, оно должно было настроить как PAM, так и NSS: сначала обрабатывается проверка подлинности и управление учетной записью / сеансом, а другая – только для предоставления информации о имени. Другими словами, первый может выполнять операции чтения / записи, а второй – только для чтения.

Как только pam_mkhomedir.so путь к домашнему каталогу пользователя, все, что ему нужно сделать, это проверить, существует ли он или нет, и создать его, если это не так:

 /* Stat the home directory, if something exists then we * assume it is correct and return a success. */ if(stat(pwd->pw_dir, &st) == 0) return PAM_SUCCESS; return create_homedir(..., pwd, ...); 

Функция create_homedir определяется самим модулем, и мне слишком сложно вставить его здесь. Просто рассматривайте его как большой вызов mkdir(2) , который обрабатывает конкретные случаи и гарантирует, что все пройдет гладко. Если вас интересует более подробная информация, посмотрите исходный код pam_mkhomedir.so . Я использовал эту версию для моего ответа (он был написан Джейсоном Гунторпом , чье имя также находится на моей pam_mkhomedir.so ).

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

 +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | username | varchar(30) | NO | UNI | NULL | | | pass | varchar(50) | NO | | NULL | | +----------+-------------+------+-----+---------+----------------+ 

Возможно, эта таблица достаточно подробно описана для работы VSFTPd. Поскольку он настроен на домашний корень, он может легко определить домашний каталог пользователя: $ftp_root/username . Это фактически задается параметром local_root :

 local_root=/home/vsftpd/$USER 

Однако pam_mkhomedir.so не является VSFTPd. Он не использует этот механизм, но полагается на NSS (через getpwnam(3) ). Проблема в том, что ваша таблица MySQL не предоставляет достаточной информации для NSS, чтобы заполнить struct passwd мы видели ранее. Чтобы NSS использовал MySQL в качестве источника, вам нужно установить nss-mysql , для чего требуется большая таблица MySQL. Это потребует корректировок в вашей конфигурации VSFTPd, но у вас не должно быть проблем с совместным проживанием VSFTPd и nss-mysql.

В этом каталоге приведен пример минимальной настройки nss-mysql. Таблица MySQL для пользователей определяется следующим образом:

 +-----------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | username | varchar(255) | NO | | NULL | | | username_canonical | varchar(255) | NO | UNI | NULL | | | email | varchar(255) | NO | | NULL | | | email_canonical | varchar(255) | NO | UNI | NULL | | | enabled | tinyint(1) | NO | | NULL | | | salt | varchar(255) | NO | | NULL | | | password | varchar(255) | NO | | NULL | | | last_login | datetime | YES | | NULL | | | locked | tinyint(1) | NO | | NULL | | | expired | tinyint(1) | NO | | NULL | | | expires_at | datetime | YES | | NULL | | | confirmation_token | varchar(255) | YES | | NULL | | | password_requested_at | datetime | YES | | NULL | | | roles | longtext | NO | | NULL | | | credentials_expired | tinyint(1) | NO | | NULL | | | credentials_expire_at | datetime | YES | | NULL | | +-----------------------+--------------+------+-----+---------+----------------+ 

Теперь вам могут не понадобиться все эти поля самостоятельно, но имейте в виду struct passwd мы видели ранее, и убедитесь, что nss-mysql имеет достаточно данных, чтобы заполнить ее. Кроме того, файлы конфигурации nss-mysql достаточно гибки для вас использовать значения по умолчанию для чего угодно.