[samba] Samba autentification

Alexandr R. Ogurtzoff aogurtsov на hostopia.com
Вт Мар 1 18:14:14 MSK 2005


Приветвую коллеги, снова я со своими глупостями. Благодарю всех отозвавшихся 
на предыдущий пост как в топике так и за границами рассылки. Понял что 
кашерно это делается через NSSб но увы не успеваю с ним разобраться 
deadline :-(
Ещё раз суть задачи с добавлениями и уточнениями которые мне донесли буквально 
вчера
итак Samba2.2.12
Overview: Currently the SAMBA program uses the /etc/passwd file to look
up the uid/gid and homedir of a domain and then switches to this uid, to
serve the content.
We need to change this scheme so that the uid,gid,homedir for the domain
is discovered in the following way.
e.g.
lookup(dirk.com)
homedir = /services/webpages/d/i/dirk.com
UID = take the uid off the homedir (defined above)
GID = 100 (set statically)
Don't allow any uids below 1000.
При чём мне намекнули что пользователей с таким UID может в системе не 
оказаться, они де пытаються сэкономить с заведением пользователей в системе и 
автоизовать их будут как то там ещё, для пользователей будут создаваться 
каталоги с нужным UID и вроде как всё...
Увы не успеваю разобраться с NSS, хотя основную мысль понял, надо сдать 
проект сегодня :-(

Пока доковырялся до такого:

С HOME поступил по варварски ;-) переопределил их в smb.conf
Добавил в smb.conf свои параметры
 force account = Yes
 force account min UID = 1000 (к примеру)
 force account GID = 100

После чего поковырял
samba-2.2.12/source/pam_smbpass/pam_smb_acct.c в таком направлении
(собираю самбу с configure --with-pam_smbpass) 
Добавил перед  return PAM_SUCCESS;

        if(lp_force_account()) включена ли моя опция в конфиге
        {
        struct stat *home_buf;
        struct passwd *passw_rec;

        home_buf=calloc(1,sizeof(struct stat));
         if(stat(sampass->home_dir,home_buf))

 Получаю нужный домашний каталог из конфига, и снимаю статистику по нему
         {
                _log_err( LOG_ALERT, "Cannot access home 
directory",sampass->home_dir);
                free(home_buf);
                 return PAM_AUTHINFO_UNAVAIL;
         }
         else
         {
                 if (home_buf->uid_t < lp_force_account_min_uid())
Проверяю что с UID(владелец домашнего каталога) меньше нужного не пройдут
{  
                        if (on( SMB_DEBUG, ctrl )) {
                                _log_err( LOG_DEBUG, "acct: account with id 
less when %d is 
administratively disabled", lp_foce_account_min_uid() );
                        }
                         make_remark( pamh, ctrl, PAM_ERROR_MSG, "Your account 
has been 
disabled;"
                       "please see your system administrator." );
                         free(home_buf);  
                        return PAM_ACCT_EXPIRED;
                 }
Пытаюсь получить UNIX имя для этого UID, мне сказали что имени может не 
оказаться, то есть этот UID  может отсутвовать в /etc/passwd  
и getpwuid ничего не вернёт :-(

                        passw_rec=calloc(1,sizeof(struct passwd));
                        passw_rec=getpwuid(home_buf->uid_t);
                        if(passw_rec) 
Если имя есть то присваиваю, если нет присваю только UID и фиксированый GID из 
конфига
                                 pdb_set_username(sampass,passw_rec->pw_name);
                pdb_set_uid(sampass,home_buf->uid_t);
                pdb_set_gid(sampass,lp_force_account_gid());
          }
            free(home_buf); 
            free(passw_rec); 
        }

Ну тут соответвенно return PAM_SUCCESS;
Покритикуете? Будет ли вообще всё это работать, как этой Самбе сказать чтоб 
для аккаутна она использовала всё вот это или вышеуказаной опции при сборке 
будет достаточно?
Вообщем жду советов, извините за сумбур :-(
-- 
Best regards
Alexandr R. Ogurtzoff
{
UNIX is user friendly, it's just picky about who its friends are
}


Подробная информация о списке рассылки Samba