17cde604eSDag-Erling Smørgrav /*- 2*5e53a4f9SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*5e53a4f9SPedro F. Giffuni * 47cde604eSDag-Erling Smørgrav * Copyright (c) 2003 Networks Associates Technology, Inc. 5e84da6fbSDag-Erling Smørgrav * Copyright (c) 2004-2011 Dag-Erling Smørgrav 67cde604eSDag-Erling Smørgrav * All rights reserved. 77cde604eSDag-Erling Smørgrav * 87cde604eSDag-Erling Smørgrav * Portions of this software were developed for the FreeBSD Project by 97cde604eSDag-Erling Smørgrav * ThinkSec AS and NAI Labs, the Security Research Division of Network 107cde604eSDag-Erling Smørgrav * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 117cde604eSDag-Erling Smørgrav * ("CBOSS"), as part of the DARPA CHATS research program. 127cde604eSDag-Erling Smørgrav * 137cde604eSDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 147cde604eSDag-Erling Smørgrav * modification, are permitted provided that the following conditions 157cde604eSDag-Erling Smørgrav * are met: 167cde604eSDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 177cde604eSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer. 187cde604eSDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 197cde604eSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 207cde604eSDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 217cde604eSDag-Erling Smørgrav * 3. The name of the author may not be used to endorse or promote 227cde604eSDag-Erling Smørgrav * products derived from this software without specific prior written 237cde604eSDag-Erling Smørgrav * permission. 247cde604eSDag-Erling Smørgrav * 257cde604eSDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 267cde604eSDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 277cde604eSDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 287cde604eSDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 297cde604eSDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 307cde604eSDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 317cde604eSDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 327cde604eSDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 337cde604eSDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 347cde604eSDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 357cde604eSDag-Erling Smørgrav * SUCH DAMAGE. 367cde604eSDag-Erling Smørgrav */ 377cde604eSDag-Erling Smørgrav 387cde604eSDag-Erling Smørgrav #include <sys/cdefs.h> 397cde604eSDag-Erling Smørgrav __FBSDID("$FreeBSD$"); 407cde604eSDag-Erling Smørgrav 417cde604eSDag-Erling Smørgrav #include <sys/types.h> 427cde604eSDag-Erling Smørgrav 437cde604eSDag-Erling Smørgrav #include <grp.h> 447cde604eSDag-Erling Smørgrav #include <pwd.h> 457cde604eSDag-Erling Smørgrav #include <stdarg.h> 467cde604eSDag-Erling Smørgrav #include <stdio.h> 477cde604eSDag-Erling Smørgrav #include <string.h> 487cde604eSDag-Erling Smørgrav #include <syslog.h> 497cde604eSDag-Erling Smørgrav #include <unistd.h> 507cde604eSDag-Erling Smørgrav 517cde604eSDag-Erling Smørgrav #define PAM_SM_AUTH 5216722cb2SDag-Erling Smørgrav #define PAM_SM_ACCOUNT 537cde604eSDag-Erling Smørgrav 547cde604eSDag-Erling Smørgrav #include <security/pam_appl.h> 557cde604eSDag-Erling Smørgrav #include <security/pam_modules.h> 567cde604eSDag-Erling Smørgrav #include <security/openpam.h> 577cde604eSDag-Erling Smørgrav 5816722cb2SDag-Erling Smørgrav static int 5916722cb2SDag-Erling Smørgrav pam_group(pam_handle_t *pamh) 607cde604eSDag-Erling Smørgrav { 61e84da6fbSDag-Erling Smørgrav int local, remote; 6291e93869SDag-Erling Smørgrav const char *group, *user; 6391e93869SDag-Erling Smørgrav const void *ruser; 647cde604eSDag-Erling Smørgrav char *const *list; 657cde604eSDag-Erling Smørgrav struct passwd *pwd; 667cde604eSDag-Erling Smørgrav struct group *grp; 677cde604eSDag-Erling Smørgrav 687cde604eSDag-Erling Smørgrav /* get target account */ 6948c12730SDag-Erling Smørgrav if (pam_get_user(pamh, &user, NULL) != PAM_SUCCESS || 7048c12730SDag-Erling Smørgrav user == NULL || (pwd = getpwnam(user)) == NULL) 717cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 727cde604eSDag-Erling Smørgrav if (pwd->pw_uid != 0 && openpam_get_option(pamh, "root_only")) 737cde604eSDag-Erling Smørgrav return (PAM_IGNORE); 747cde604eSDag-Erling Smørgrav 75e84da6fbSDag-Erling Smørgrav /* check local / remote */ 76e84da6fbSDag-Erling Smørgrav local = openpam_get_option(pamh, "luser") ? 1 : 0; 77e84da6fbSDag-Erling Smørgrav remote = openpam_get_option(pamh, "ruser") ? 1 : 0; 78e84da6fbSDag-Erling Smørgrav if (local && remote) { 79864cac07SDag-Erling Smørgrav openpam_log(PAM_LOG_ERROR, "(pam_group) " 80e84da6fbSDag-Erling Smørgrav "the luser and ruser options are mutually exclusive"); 81e84da6fbSDag-Erling Smørgrav return (PAM_SERVICE_ERR); 82e84da6fbSDag-Erling Smørgrav } else if (local) { 83e84da6fbSDag-Erling Smørgrav /* we already have the correct struct passwd */ 84e84da6fbSDag-Erling Smørgrav } else { 85e84da6fbSDag-Erling Smørgrav if (!remote) 86864cac07SDag-Erling Smørgrav openpam_log(PAM_LOG_NOTICE, "(pam_group) " 87e84da6fbSDag-Erling Smørgrav "neither luser nor ruser specified, assuming ruser"); 88e84da6fbSDag-Erling Smørgrav /* default / historical behavior */ 89e84da6fbSDag-Erling Smørgrav if (pam_get_item(pamh, PAM_RUSER, &ruser) != PAM_SUCCESS || 90e84da6fbSDag-Erling Smørgrav ruser == NULL || (pwd = getpwnam(ruser)) == NULL) 917cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 92e84da6fbSDag-Erling Smørgrav } 937cde604eSDag-Erling Smørgrav 947cde604eSDag-Erling Smørgrav /* get regulating group */ 957cde604eSDag-Erling Smørgrav if ((group = openpam_get_option(pamh, "group")) == NULL) 967cde604eSDag-Erling Smørgrav group = "wheel"; 977cde604eSDag-Erling Smørgrav if ((grp = getgrnam(group)) == NULL || grp->gr_mem == NULL) 987cde604eSDag-Erling Smørgrav goto failed; 997cde604eSDag-Erling Smørgrav 100ec5622adSDag-Erling Smørgrav /* check if user's own primary group */ 1017cde604eSDag-Erling Smørgrav if (pwd->pw_gid == grp->gr_gid) 1027cde604eSDag-Erling Smørgrav goto found; 103ec5622adSDag-Erling Smørgrav 104ec5622adSDag-Erling Smørgrav /* iterate over members */ 105ec5622adSDag-Erling Smørgrav for (list = grp->gr_mem; list != NULL && *list != NULL; ++list) 1067cde604eSDag-Erling Smørgrav if (strcmp(*list, pwd->pw_name) == 0) 1077cde604eSDag-Erling Smørgrav goto found; 1087cde604eSDag-Erling Smørgrav 1097cde604eSDag-Erling Smørgrav not_found: 1107cde604eSDag-Erling Smørgrav if (openpam_get_option(pamh, "deny")) 1117cde604eSDag-Erling Smørgrav return (PAM_SUCCESS); 1127cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 1137cde604eSDag-Erling Smørgrav found: 1147cde604eSDag-Erling Smørgrav if (openpam_get_option(pamh, "deny")) 1157cde604eSDag-Erling Smørgrav return (PAM_AUTH_ERR); 1167cde604eSDag-Erling Smørgrav return (PAM_SUCCESS); 1177cde604eSDag-Erling Smørgrav failed: 1187cde604eSDag-Erling Smørgrav if (openpam_get_option(pamh, "fail_safe")) 1197cde604eSDag-Erling Smørgrav goto found; 1207cde604eSDag-Erling Smørgrav else 1217cde604eSDag-Erling Smørgrav goto not_found; 1227cde604eSDag-Erling Smørgrav } 1237cde604eSDag-Erling Smørgrav 1247cde604eSDag-Erling Smørgrav PAM_EXTERN int 12516722cb2SDag-Erling Smørgrav pam_sm_authenticate(pam_handle_t *pamh, int flags __unused, 12616722cb2SDag-Erling Smørgrav int argc __unused, const char *argv[] __unused) 12716722cb2SDag-Erling Smørgrav { 12816722cb2SDag-Erling Smørgrav 12916722cb2SDag-Erling Smørgrav return (pam_group(pamh)); 13016722cb2SDag-Erling Smørgrav } 13116722cb2SDag-Erling Smørgrav 13216722cb2SDag-Erling Smørgrav PAM_EXTERN int 1337cde604eSDag-Erling Smørgrav pam_sm_setcred(pam_handle_t * pamh __unused, int flags __unused, 1347cde604eSDag-Erling Smørgrav int argc __unused, const char *argv[] __unused) 1357cde604eSDag-Erling Smørgrav { 1367cde604eSDag-Erling Smørgrav 1377cde604eSDag-Erling Smørgrav return (PAM_SUCCESS); 1387cde604eSDag-Erling Smørgrav } 1397cde604eSDag-Erling Smørgrav 14016722cb2SDag-Erling Smørgrav PAM_EXTERN int 14116722cb2SDag-Erling Smørgrav pam_sm_acct_mgmt(pam_handle_t *pamh, int flags __unused, 14216722cb2SDag-Erling Smørgrav int argc __unused, const char *argv[] __unused) 14316722cb2SDag-Erling Smørgrav { 14416722cb2SDag-Erling Smørgrav 14516722cb2SDag-Erling Smørgrav return (pam_group(pamh)); 14616722cb2SDag-Erling Smørgrav } 14716722cb2SDag-Erling Smørgrav 1487cde604eSDag-Erling Smørgrav PAM_MODULE_ENTRY("pam_group"); 149