I tried to use pam_group to grant access to imap(dovecot) only for users in certain group (users/groups stored in AD and checked out via LDAP/Kerberos), but pam_group is checking applicant's group membership. I'm sure, that in many cases is more useful to check group membership of target (authenticating) user, but not applicant. I added check_target option to pam_group to allow checks for authenticating user if needed. I'm very bad with diff, so it's modified/original pam_group.c and pam_group.8 (FreeBSD 6.2). Can it be included in the system? -- ? ?????????, ?????? ????? ??? "???????" : ?????????? ??, WEB-?????????? http://www.elantech.ru +7 (495) 589 68 81 +7 (926) 779 07 05 -------------- next part -------------- .\" Copyright (c) 2003 Networks Associates Technology, Inc. .\" All rights reserved. .\" .\" Portions of this software were developed for the FreeBSD Project by .\" ThinkSec AS and NAI Labs, the Security Research Division of Network .\" Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 .\" ("CBOSS"), as part of the DARPA CHATS research program. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. The name of the author may not be used to endorse or promote .\" products derived from this software without specific prior written .\" permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $FreeBSD: src/lib/libpam/modules/pam_group/pam_group.8,v 1.31 2004/07/02 23:52:17 ru Exp $ .\" .Dd March 30, 2007 .Dt PAM_GROUP 8 .Os .Sh NAME .Nm pam_group .Nd Group PAM module .Sh SYNOPSIS .Op Ar service-name .Ar module-type .Ar control-flag .Pa pam_group .Op Ar arguments .Sh DESCRIPTION The group service module for PAM accepts or rejects users based on their membership in a particular file group. .Pp The following options may be passed to the .Nm module: .Bl -tag -width ".Cm check_target" .It Cm check_target By default module checks applicat's membership in certain group. With this option all checks are made for target user. .It Cm deny Reverse the meaning of the test, i.e., reject the user if and only if he or she is a member of the specified group. This can be useful to exclude certain groups of users from certain services. .It Cm fail_safe If the specified group does not exist, or has no members, act as if it does exist and the user is a member. .It Cm group Ns = Ns Ar groupname Specify the name of the group to check. The default is .Dq Li wheel . .It Cm root_only Skip this module entirely if user is not the superuser account. .El .Sh SEE ALSO .Xr pam.conf 5 , .Xr pam 8 .Sh AUTHORS The .Nm module and this manual page were developed for the .Fx Project by ThinkSec AS and NAI Labs, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program. -------------- next part -------------- .\" Copyright (c) 2003 Networks Associates Technology, Inc. .\" All rights reserved. .\" .\" Portions of this software were developed for the FreeBSD Project by .\" ThinkSec AS and NAI Labs, the Security Research Division of Network .\" Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 .\" ("CBOSS"), as part of the DARPA CHATS research program. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. The name of the author may not be used to endorse or promote .\" products derived from this software without specific prior written .\" permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $FreeBSD: src/lib/libpam/modules/pam_group/pam_group.8,v 1.3 2004/07/02 23:52:17 ru Exp $ .\" .Dd February 6, 2003 .Dt PAM_GROUP 8 .Os .Sh NAME .Nm pam_group .Nd Group PAM module .Sh SYNOPSIS .Op Ar service-name .Ar module-type .Ar control-flag .Pa pam_group .Op Ar arguments .Sh DESCRIPTION The group service module for PAM accepts or rejects users based on their membership in a particular file group. .Pp The following options may be passed to the .Nm module: .Bl -tag -width ".Cm fail_safe" .It Cm deny Reverse the meaning of the test, i.e., reject the applicant if and only if he or she is a member of the specified group. This can be useful to exclude certain groups of users from certain services. .It Cm fail_safe If the specified group does not exist, or has no members, act as if it does exist and the applicant is a member. .It Cm group Ns = Ns Ar groupname Specify the name of the group to check. The default is .Dq Li wheel . .It Cm root_only Skip this module entirely if the target account is not the superuser account. .El .Sh SEE ALSO .Xr pam.conf 5 , .Xr pam 8 .Sh AUTHORS The .Nm module and this manual page were developed for the .Fx Project by ThinkSec AS and NAI Labs, the Security Research Division of Network Associates, Inc.\& under DARPA/SPAWAR contract N66001-01-C-8035 .Pq Dq CBOSS , as part of the DARPA CHATS research program. -------------- next part -------------- /*- * Copyright (c) 2003 Networks Associates Technology, Inc. * All rights reserved. * * Portions of this software were developed for the FreeBSD Project by * ThinkSec AS and NAI Labs, the Security Research Division of Network * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 * ("CBOSS"), as part of the DARPA CHATS research program. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include <sys/cdefs.h> __FBSDID("$FreeBSD: src/lib/libpam/modules/pam_group/pam_group.c,v 1.41 2003/12/11 13:55:15 des Exp $"); #include <sys/types.h> #include <grp.h> #include <pwd.h> #include <stdarg.h> #include <stdio.h> #include <string.h> #include <syslog.h> #include <unistd.h> #define PAM_SM_AUTH #include <security/pam_appl.h> #include <security/pam_modules.h> #include <security/openpam.h> PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags __unused, int argc __unused, const char *argv[] __unused) { const char *group, *user; const void *ruser; char *const *list; struct passwd *pwd; struct group *grp; /* get target account */ if (pam_get_user(pamh, &user, NULL) != PAM_SUCCESS || user == NULL || (pwd = getpwnam(user)) == NULL) return (PAM_AUTH_ERR); if(!openpam_get_option(pamh, "check_target")) { /* get applicant */ if (pam_get_item(pamh, PAM_RUSER, &ruser) != PAM_SUCCESS || ruser == NULL || (pwd = getpwnam(ruser)) == NULL) return (PAM_AUTH_ERR); } if (pwd->pw_uid != 0 && openpam_get_option(pamh, "root_only")) return (PAM_IGNORE); /* get regulating group */ if ((group = openpam_get_option(pamh, "group")) == NULL) group = "wheel"; if ((grp = getgrnam(group)) == NULL || grp->gr_mem == NULL) goto failed; /* check if the group is empty */ if (*grp->gr_mem == NULL) goto failed; /* check membership */ if (pwd->pw_gid == grp->gr_gid) goto found; for (list = grp->gr_mem; *list != NULL; ++list) if (strcmp(*list, pwd->pw_name) == 0) goto found; not_found: if (openpam_get_option(pamh, "deny")) return (PAM_SUCCESS); return (PAM_AUTH_ERR); found: if (openpam_get_option(pamh, "deny")) return (PAM_AUTH_ERR); return (PAM_SUCCESS); failed: if (openpam_get_option(pamh, "fail_safe")) goto found; else goto not_found; } PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh __unused, int flags __unused, int argc __unused, const char *argv[] __unused) { return (PAM_SUCCESS); } PAM_MODULE_ENTRY("pam_group"); -------------- next part -------------- /*- * Copyright (c) 2003 Networks Associates Technology, Inc. * All rights reserved. * * Portions of this software were developed for the FreeBSD Project by * ThinkSec AS and NAI Labs, the Security Research Division of Network * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 * ("CBOSS"), as part of the DARPA CHATS research program. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include <sys/cdefs.h> __FBSDID("$FreeBSD: src/lib/libpam/modules/pam_group/pam_group.c,v 1.4 2003/12/11 13:55:15 des Exp $"); #include <sys/types.h> #include <grp.h> #include <pwd.h> #include <stdarg.h> #include <stdio.h> #include <string.h> #include <syslog.h> #include <unistd.h> #define PAM_SM_AUTH #include <security/pam_appl.h> #include <security/pam_modules.h> #include <security/openpam.h> PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags __unused, int argc __unused, const char *argv[] __unused) { const char *group, *user; const void *ruser; char *const *list; struct passwd *pwd; struct group *grp; /* get target account */ if (pam_get_user(pamh, &user, NULL) != PAM_SUCCESS || user == NULL || (pwd = getpwnam(user)) == NULL) return (PAM_AUTH_ERR); if (pwd->pw_uid != 0 && openpam_get_option(pamh, "root_only")) return (PAM_IGNORE); /* get applicant */ if (pam_get_item(pamh, PAM_RUSER, &ruser) != PAM_SUCCESS || ruser == NULL || (pwd = getpwnam(ruser)) == NULL) return (PAM_AUTH_ERR); /* get regulating group */ if ((group = openpam_get_option(pamh, "group")) == NULL) group = "wheel"; if ((grp = getgrnam(group)) == NULL || grp->gr_mem == NULL) goto failed; /* check if the group is empty */ if (*grp->gr_mem == NULL) goto failed; /* check membership */ if (pwd->pw_gid == grp->gr_gid) goto found; for (list = grp->gr_mem; *list != NULL; ++list) if (strcmp(*list, pwd->pw_name) == 0) goto found; not_found: if (openpam_get_option(pamh, "deny")) return (PAM_SUCCESS); return (PAM_AUTH_ERR); found: if (openpam_get_option(pamh, "deny")) return (PAM_AUTH_ERR); return (PAM_SUCCESS); failed: if (openpam_get_option(pamh, "fail_safe")) goto found; else goto not_found; } PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh __unused, int flags __unused, int argc __unused, const char *argv[] __unused) { return (PAM_SUCCESS); } PAM_MODULE_ENTRY("pam_group");