17cde604eSDag-Erling Smørgrav /*- 27cde604eSDag-Erling Smørgrav * Copyright (c) 2003 Networks Associates Technology, Inc. 3e84da6fbSDag-Erling Smørgrav * Copyright (c) 2004-2011 Dag-Erling Smørgrav 47cde604eSDag-Erling Smørgrav * All rights reserved. 57cde604eSDag-Erling Smørgrav * 67cde604eSDag-Erling Smørgrav * Portions of this software were developed for the FreeBSD Project by 77cde604eSDag-Erling Smørgrav * ThinkSec AS and NAI Labs, the Security Research Division of Network 87cde604eSDag-Erling Smørgrav * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 97cde604eSDag-Erling Smørgrav * ("CBOSS"), as part of the DARPA CHATS research program. 107cde604eSDag-Erling Smørgrav * 117cde604eSDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 127cde604eSDag-Erling Smørgrav * modification, are permitted provided that the following conditions 137cde604eSDag-Erling Smørgrav * are met: 147cde604eSDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 157cde604eSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer. 167cde604eSDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 177cde604eSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 187cde604eSDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 197cde604eSDag-Erling Smørgrav * 3. The name of the author may not be used to endorse or promote 207cde604eSDag-Erling Smørgrav * products derived from this software without specific prior written 217cde604eSDag-Erling Smørgrav * permission. 227cde604eSDag-Erling Smørgrav * 237cde604eSDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 247cde604eSDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 257cde604eSDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 267cde604eSDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 277cde604eSDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 287cde604eSDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 297cde604eSDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 307cde604eSDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 317cde604eSDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 327cde604eSDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 337cde604eSDag-Erling Smørgrav * SUCH DAMAGE. 347cde604eSDag-Erling Smørgrav */ 357cde604eSDag-Erling Smørgrav 367cde604eSDag-Erling Smørgrav #include <sys/cdefs.h> 377cde604eSDag-Erling Smørgrav __FBSDID("$FreeBSD$"); 387cde604eSDag-Erling Smørgrav 397cde604eSDag-Erling Smørgrav #include <sys/types.h> 407cde604eSDag-Erling Smørgrav 417cde604eSDag-Erling Smørgrav #include <grp.h> 427cde604eSDag-Erling Smørgrav #include <pwd.h> 437cde604eSDag-Erling Smørgrav #include <stdarg.h> 447cde604eSDag-Erling Smørgrav #include <stdio.h> 457cde604eSDag-Erling Smørgrav #include <string.h> 467cde604eSDag-Erling Smørgrav #include <syslog.h> 477cde604eSDag-Erling Smørgrav #include <unistd.h> 487cde604eSDag-Erling Smørgrav 497cde604eSDag-Erling Smørgrav #define PAM_SM_AUTH 50*16722cb2SDag-Erling Smørgrav #define PAM_SM_ACCOUNT 517cde604eSDag-Erling Smørgrav 527cde604eSDag-Erling Smørgrav #include <security/pam_appl.h> 537cde604eSDag-Erling Smørgrav #include <security/pam_modules.h> 547cde604eSDag-Erling Smørgrav #include <security/openpam.h> 557cde604eSDag-Erling Smørgrav 56*16722cb2SDag-Erling Smørgrav static int 57*16722cb2SDag-Erling Smørgrav pam_group(pam_handle_t *pamh) 587cde604eSDag-Erling Smørgrav { 59e84da6fbSDag-Erling Smørgrav int local, remote; 6091e93869SDag-Erling Smørgrav const char *group, *user; 6191e93869SDag-Erling Smørgrav const void *ruser; 627cde604eSDag-Erling Smørgrav char *const *list; 637cde604eSDag-Erling Smørgrav struct passwd *pwd; 647cde604eSDag-Erling Smørgrav struct group *grp; 657cde604eSDag-Erling Smørgrav 667cde604eSDag-Erling Smørgrav /* get target account */ 6748c12730SDag-Erling Smørgrav if (pam_get_user(pamh, &user, NULL) != PAM_SUCCESS || 6848c12730SDag-Erling Smørgrav user == NULL || (pwd = getpwnam(user)) == NULL) 697cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 707cde604eSDag-Erling Smørgrav if (pwd->pw_uid != 0 && openpam_get_option(pamh, "root_only")) 717cde604eSDag-Erling Smørgrav return (PAM_IGNORE); 727cde604eSDag-Erling Smørgrav 73e84da6fbSDag-Erling Smørgrav /* check local / remote */ 74e84da6fbSDag-Erling Smørgrav local = openpam_get_option(pamh, "luser") ? 1 : 0; 75e84da6fbSDag-Erling Smørgrav remote = openpam_get_option(pamh, "ruser") ? 1 : 0; 76e84da6fbSDag-Erling Smørgrav if (local && remote) { 77864cac07SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "(pam_group) " 78e84da6fbSDag-Erling Smørgrav "the luser and ruser options are mutually exclusive"); 79e84da6fbSDag-Erling Smørgrav return (PAM_SERVICE_ERR); 80e84da6fbSDag-Erling Smørgrav } else if (local) { 81e84da6fbSDag-Erling Smørgrav /* we already have the correct struct passwd */ 82e84da6fbSDag-Erling Smørgrav } else { 83e84da6fbSDag-Erling Smørgrav if (!remote) 84864cac07SDag-Erling Smørgrav openpam_log(PAM_LOG_NOTICE, "(pam_group) " 85e84da6fbSDag-Erling Smørgrav "neither luser nor ruser specified, assuming ruser"); 86e84da6fbSDag-Erling Smørgrav /* default / historical behavior */ 87e84da6fbSDag-Erling Smørgrav if (pam_get_item(pamh, PAM_RUSER, &ruser) != PAM_SUCCESS || 88e84da6fbSDag-Erling Smørgrav ruser == NULL || (pwd = getpwnam(ruser)) == NULL) 897cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 90e84da6fbSDag-Erling Smørgrav } 917cde604eSDag-Erling Smørgrav 927cde604eSDag-Erling Smørgrav /* get regulating group */ 937cde604eSDag-Erling Smørgrav if ((group = openpam_get_option(pamh, "group")) == NULL) 947cde604eSDag-Erling Smørgrav group = "wheel"; 957cde604eSDag-Erling Smørgrav if ((grp = getgrnam(group)) == NULL || grp->gr_mem == NULL) 967cde604eSDag-Erling Smørgrav goto failed; 977cde604eSDag-Erling Smørgrav 98ec5622adSDag-Erling Smørgrav /* check if user's own primary group */ 997cde604eSDag-Erling Smørgrav if (pwd->pw_gid == grp->gr_gid) 1007cde604eSDag-Erling Smørgrav goto found; 101ec5622adSDag-Erling Smørgrav 102ec5622adSDag-Erling Smørgrav /* iterate over members */ 103ec5622adSDag-Erling Smørgrav for (list = grp->gr_mem; list != NULL && *list != NULL; ++list) 1047cde604eSDag-Erling Smørgrav if (strcmp(*list, pwd->pw_name) == 0) 1057cde604eSDag-Erling Smørgrav goto found; 1067cde604eSDag-Erling Smørgrav 1077cde604eSDag-Erling Smørgrav not_found: 1087cde604eSDag-Erling Smørgrav if (openpam_get_option(pamh, "deny")) 1097cde604eSDag-Erling Smørgrav return (PAM_SUCCESS); 1107cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 1117cde604eSDag-Erling Smørgrav found: 1127cde604eSDag-Erling Smørgrav if (openpam_get_option(pamh, "deny")) 1137cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 1147cde604eSDag-Erling Smørgrav return (PAM_SUCCESS); 1157cde604eSDag-Erling Smørgrav failed: 1167cde604eSDag-Erling Smørgrav if (openpam_get_option(pamh, "fail_safe")) 1177cde604eSDag-Erling Smørgrav goto found; 1187cde604eSDag-Erling Smørgrav else 1197cde604eSDag-Erling Smørgrav goto not_found; 1207cde604eSDag-Erling Smørgrav } 1217cde604eSDag-Erling Smørgrav 1227cde604eSDag-Erling Smørgrav PAM_EXTERN int 123*16722cb2SDag-Erling Smørgrav pam_sm_authenticate(pam_handle_t *pamh, int flags __unused, 124*16722cb2SDag-Erling Smørgrav int argc __unused, const char *argv[] __unused) 125*16722cb2SDag-Erling Smørgrav { 126*16722cb2SDag-Erling Smørgrav 127*16722cb2SDag-Erling Smørgrav return (pam_group(pamh)); 128*16722cb2SDag-Erling Smørgrav } 129*16722cb2SDag-Erling Smørgrav 130*16722cb2SDag-Erling Smørgrav PAM_EXTERN int 1317cde604eSDag-Erling Smørgrav pam_sm_setcred(pam_handle_t * pamh __unused, int flags __unused, 1327cde604eSDag-Erling Smørgrav int argc __unused, const char *argv[] __unused) 1337cde604eSDag-Erling Smørgrav { 1347cde604eSDag-Erling Smørgrav 1357cde604eSDag-Erling Smørgrav return (PAM_SUCCESS); 1367cde604eSDag-Erling Smørgrav } 1377cde604eSDag-Erling Smørgrav 138*16722cb2SDag-Erling Smørgrav PAM_EXTERN int 139*16722cb2SDag-Erling Smørgrav pam_sm_acct_mgmt(pam_handle_t *pamh, int flags __unused, 140*16722cb2SDag-Erling Smørgrav int argc __unused, const char *argv[] __unused) 141*16722cb2SDag-Erling Smørgrav { 142*16722cb2SDag-Erling Smørgrav 143*16722cb2SDag-Erling Smørgrav return (pam_group(pamh)); 144*16722cb2SDag-Erling Smørgrav } 145*16722cb2SDag-Erling Smørgrav 1467cde604eSDag-Erling Smørgrav PAM_MODULE_ENTRY("pam_group"); 147