Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : mitrohin a.s.                        2:5020/400     09 Jun 2005  16:37:39
 To : All
 Subject : pam_ldap + /usr/bin/passwd
 -------------------------------------------------------------------------------- 
 
 helo.
 
 /usr/src/usr.bin/passwd/passwd.c (код небольшой - поэтому inline).
 
 ... SKIP ...
 
 static void
 usage(void)
 {
   fprintf(stderr, "usage: passwd [-ly] [-d domain] [-h host] [user]\n");
   exit(1);
 }
 
 int
 main(int argc, char *argv[])
 {
   char hostname[MAXHOSTNAMELEN];
   struct passwd *pwd;
   int o, pam_err;
   uid_t uid;
 
   while ((o = getopt(argc, argv, "d:h:loy")) != -1)
    switch (o) {
    case 'd':
       yp_domain = optarg;
       break;
    case 'h':
       yp_host = optarg;
       break;
    case 'l':
    case 'o':
    case 'y':
       /* compatibility */
       break;
    default:
       usage();
    }
 
   argc -= optind;
   argv += optind;
 
   uid = getuid();
 
   switch (argc) {
   case 0:
    if ((pwd = getpwuid(uid)) == NULL)
       errx(1, "who are you?");
    break;
   case 1:
    if ((pwd = getpwnam(*argv)) == NULL)
       errx(1, "%s: no such user", *argv);
    break;
   default:
    usage();
   }
 
   if (uid != 0 && uid != pwd->pw_uid)
    errx(1, "permission denied");
 кто-нибудь знает зачем так сделано? ведь pam если не сможет поменять 
 пароль - сам об этом скажет.
 
   /* check where the user's from */
   switch (pwd->pw_fields & _PWF_SOURCE) {
   case _PWF_FILES:
    fprintf(stderr, "Changing local password for %s\n",
        pwd->pw_name);
    break;
   case _PWF_NIS:
    fprintf(stderr, "Changing NIS password for %s\n",
        pwd->pw_name);
    break;
   default:
    /* XXX: Green men ought to be supported via PAM. */
    errx(1, 
     "Sorry, `passwd' can only change passwords for local or NIS users.");
   }
 #define pam_check(func) do { \
   if (pam_err != PAM_SUCCESS) { \
    if (pam_err == PAM_AUTH_ERR || pam_err == PAM_PERM_DENIED || \
        pam_err == PAM_AUTHTOK_RECOVERY_ERR) \
       warnx("sorry"); \
    else \
       warnx("%s(): %s", func, pam_strerror(pamh, pam_err)); \
    goto end; \
   } \
 } while (0)
 
   /* initialize PAM */
   pam_err = pam_start("passwd", pwd->pw_name, &pamc, &pamh);
   pam_check("pam_start");
 
   pam_err = pam_set_item(pamh, PAM_TTY, ttyname(STDERR_FILENO));
   pam_check("pam_set_item");
   gethostname(hostname, sizeof hostname);
   pam_err = pam_set_item(pamh, PAM_RHOST, hostname);
   pam_check("pam_set_item");
   pam_err = pam_set_item(pamh, PAM_RUSER, getlogin());
   pam_check("pam_set_item");
 
   /* set YP domain and host */
   pam_err = pam_set_data(pamh, "yp_domain", yp_domain, NULL);
   pam_check("pam_set_data");
   pam_err = pam_set_data(pamh, "yp_server", yp_host, NULL);
   pam_check("pam_set_data");
 
   /* set new password */
   pam_err = pam_chauthtok(pamh, 0);
   pam_check("pam_chauthtok");
 
  end:
   pam_end(pamh, pam_err);
   exit(pam_err == PAM_SUCCESS ? 0 : 1);
 }
 
 вредительство :( прямо какой-то неестественный интеллект...
 это не дает pam_ldap поменять пароль. 
 
 вообще забавный зверек этот pam_ldap. документации на него нет. 
 в лучших традициях... ;))) кучу времени убил пытаясь понять как
 его использовать совместно с nss_ldap.so. хочется видеть всех,
 но пускать на машину выборочно...
 
 возможно это кому-нибудь сэкономит время...
 
 /usr/local/etc/ldap.conf
 pam_groupdn cn=main,ou=pam_ldap,o=bspu
 
 dn: cn=main,ou=pam_ldap,o=bspu
 objectClass: top
 objectClass: groupOfUniqueNames
 cn: main
 uniqueMember: uid=asm,ou=people,o=bspu
 uniqueMember: uid=ksd,ou=people,o=bspu
 
 принадлежность cn=main,ou=pam_ldap,o=bspu проверяется в 
 pam_sm_acct_mgmt(), поэтому в моем случае не вижу смысла добавлять 
 pam_ldap в auth.
 
 ...
 #auth     sufficient  pam_ldap.so  try_first_pass
 auth   required   pam_unix.so  try_first_pass nullok
 
 ...
 account         required        pam_ldap.so     ignore_unknown_user
 ignore_authinfo_unavail
 account         required        pam_unix.so
 
 ...
 password  sufficient  pam_ldap.so  try_first_pass
 password  required pam_unix.so try_first_pass
 
 если правильно понимаю ignore_authinfo_unavail, это должно давать
 возможность локально прописаным пользователям заходить при умершем
 ldap-сервере.
 
 в общем-то остался только один большой минус - нет поддержки loginClass-ов.
 никто не делал патчей? ;)
 
 /swp
 
 --- ifmail v.2.15dev5.3
  * Origin: BSPU InterNetNews site (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 pam_ldap + /usr/bin/passwd   mitrohin a.s.   09 Jun 2005 16:37:39 
Архивное /ru.unix.bsd/13248dad228ba.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional