Add some more pam modules:
authorPeter Avalos <pavalos@theshell.com>
Sun, 28 Dec 2008 22:19:37 +0000 (17:19 -0500)
committerPeter Avalos <pavalos@theshell.com>
Fri, 2 Jan 2009 05:56:30 +0000 (00:56 -0500)
pam_echo(8)         Display args to user.
pam_exec(8)         Execute a program.
pam_ftpusers(8)     Enforces /etc/ftpusers.
pam_group(8)        Accept/reject a user based on their group.
pam_guest(8)        Allow guest logins.
pam_ksu(8)          Kerberos 5 auth for su(1).
pam_lastlog(8)      Record sessions in utmp/wtmp/lastlog.
pam_login_access(8) Enforces /etc/login.access.
pam_rhosts(8)       See rhosts(5).
pam_rootok(8)       Succeeds if root.
pam_securetty(8)    Succeeds if use is on a secure tty.
pam_self(8)         Checks if local and remote user names are equal.

Obtained-from: FreeBSD

40 files changed:
lib/pam_module/Makefile
lib/pam_module/pam_echo/Makefile [new file with mode: 0644]
lib/pam_module/pam_echo/pam_echo.8 [new file with mode: 0644]
lib/pam_module/pam_echo/pam_echo.c [new file with mode: 0644]
lib/pam_module/pam_exec/Makefile [new file with mode: 0644]
lib/pam_module/pam_exec/pam_exec.8 [new file with mode: 0644]
lib/pam_module/pam_exec/pam_exec.c [new file with mode: 0644]
lib/pam_module/pam_ftpusers/Makefile [new file with mode: 0644]
lib/pam_module/pam_ftpusers/pam_ftpusers.8 [new file with mode: 0644]
lib/pam_module/pam_ftpusers/pam_ftpusers.c [new file with mode: 0644]
lib/pam_module/pam_group/Makefile [new file with mode: 0644]
lib/pam_module/pam_group/pam_group.8 [new file with mode: 0644]
lib/pam_module/pam_group/pam_group.c [new file with mode: 0644]
lib/pam_module/pam_guest/Makefile [new file with mode: 0644]
lib/pam_module/pam_guest/pam_guest.8 [new file with mode: 0644]
lib/pam_module/pam_guest/pam_guest.c [new file with mode: 0644]
lib/pam_module/pam_ksu/Makefile [new file with mode: 0644]
lib/pam_module/pam_ksu/pam_ksu.8 [new file with mode: 0644]
lib/pam_module/pam_ksu/pam_ksu.c [new file with mode: 0644]
lib/pam_module/pam_lastlog/Makefile [new file with mode: 0644]
lib/pam_module/pam_lastlog/pam_lastlog.8 [new file with mode: 0644]
lib/pam_module/pam_lastlog/pam_lastlog.c [new file with mode: 0644]
lib/pam_module/pam_login_access/Makefile [new file with mode: 0644]
lib/pam_module/pam_login_access/login.access.5 [new file with mode: 0644]
lib/pam_module/pam_login_access/login_access.c [new file with mode: 0644]
lib/pam_module/pam_login_access/pam_login_access.8 [new file with mode: 0644]
lib/pam_module/pam_login_access/pam_login_access.c [new file with mode: 0644]
lib/pam_module/pam_login_access/pam_login_access.h [new file with mode: 0644]
lib/pam_module/pam_rhosts/Makefile [new file with mode: 0644]
lib/pam_module/pam_rhosts/pam_rhosts.8 [new file with mode: 0644]
lib/pam_module/pam_rhosts/pam_rhosts.c [new file with mode: 0644]
lib/pam_module/pam_rootok/Makefile [new file with mode: 0644]
lib/pam_module/pam_rootok/pam_rootok.8 [new file with mode: 0644]
lib/pam_module/pam_rootok/pam_rootok.c [new file with mode: 0644]
lib/pam_module/pam_securetty/Makefile [new file with mode: 0644]
lib/pam_module/pam_securetty/pam_securetty.8 [new file with mode: 0644]
lib/pam_module/pam_securetty/pam_securetty.c [new file with mode: 0644]
lib/pam_module/pam_self/Makefile [new file with mode: 0644]
lib/pam_module/pam_self/pam_self.8 [new file with mode: 0644]
lib/pam_module/pam_self/pam_self.c [new file with mode: 0644]

index e5b94c6..2cf0269 100644 (file)
@@ -3,17 +3,28 @@
 SUBDIR=        pam_chroot \
        pam_cleartext_pass_ok \
        pam_deny \
+       pam_echo \
+       pam_exec \
+       pam_ftpusers \
+       pam_group \
+       pam_guest \
+       pam_lastlog \
+       pam_login_access \
        pam_nologin \
        pam_opie \
        pam_opieaccess \
        pam_permit \
        pam_radius \
+       pam_rhosts \
+       pam_rootok \
+       pam_securetty \
+       pam_self \
        pam_ssh \
        pam_tacplus \
        pam_unix
 
 .if defined(WANT_KERBEROS) && !defined(NO_CRYPT) && !defined(NO_OPENSSL)
-SUBDIR+=pam_krb5
+SUBDIR+=pam_krb5 pam_ksu
 .endif
 
 .include <bsd.subdir.mk>
diff --git a/lib/pam_module/pam_echo/Makefile b/lib/pam_module/pam_echo/Makefile
new file mode 100644 (file)
index 0000000..5b123d5
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/lib/libpam/modules/pam_echo/Makefile,v 1.2 2003/03/09 20:06:35 obrien Exp $
+
+LIB=   pam_echo
+SRCS=  pam_echo.c
+MAN=   pam_echo.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_echo/pam_echo.8 b/lib/pam_module/pam_echo/pam_echo.8
new file mode 100644 (file)
index 0000000..0ba8578
--- /dev/null
@@ -0,0 +1,93 @@
+.\" Copyright (c) 2001,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_echo/pam_echo.8,v 1.4 2004/07/02 23:52:16 ru Exp $
+.\"
+.Dd February 6, 2003
+.Dt PAM_ECHO 8
+.Os
+.Sh NAME
+.Nm pam_echo
+.Nd Echo PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_echo
+.Op Ar arguments
+.Sh DESCRIPTION
+The echo service module for PAM displays its arguments to the user,
+separated by spaces, using the current conversation function.
+.Pp
+If the
+.Cm %
+character occurs anywhere in the arguments to
+.Nm ,
+it is assumed to introduce one of the following escape sequences:
+.Bl -tag -width 4n
+.It Cm %H
+The name of the host on which the client runs
+.Pq Dv PAM_RHOST .
+.\".It Cm %h
+.\"The name of the host on which the server runs.
+.It Cm %s
+The current service name
+.Pq Dv PAM_SERVICE .
+.It Cm %t
+The name of the controlling tty
+.Pq Dv PAM_TTY .
+.It Cm %U
+The applicant's user name
+.Pq Dv PAM_RUSER .
+.It Cm %u
+The target account's user name
+.Pq Dv PAM_USER .
+.El
+.Pp
+Any other two-character sequence beginning with
+.Cm %
+expands to the character following the
+.Cm %
+character.
+.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.
diff --git a/lib/pam_module/pam_echo/pam_echo.c b/lib/pam_module/pam_echo/pam_echo.c
new file mode 100644 (file)
index 0000000..d1c0ce0
--- /dev/null
@@ -0,0 +1,150 @@
+/*-
+ * Copyright (c) 2001,2003 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * This software was 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_echo/pam_echo.c,v 1.4 2003/12/11 13:55:15 des Exp $
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/openpam.h>
+
+static int
+_pam_echo(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+       char msg[PAM_MAX_MSG_SIZE];
+       const void *str;
+       const char *p, *q;
+       int err, i, item;
+       size_t len;
+
+       if (flags & PAM_SILENT)
+               return (PAM_SUCCESS);
+       for (i = 0, len = 0; i < argc && len < sizeof(msg) - 1; ++i) {
+               if (i > 0)
+                       msg[len++] = ' ';
+               for (p = argv[i]; *p != '\0' && len < sizeof(msg) - 1; ++p) {
+                       if (*p != '%' || p[1] == '\0') {
+                               msg[len++] = *p;
+                               continue;
+                       }
+                       switch (*++p) {
+                       case 'H':
+                               item = PAM_RHOST;
+                               break;
+                       case 'h':
+                               /* not implemented */
+                               item = -1;
+                               break;
+                       case 's':
+                               item = PAM_SERVICE;
+                               break;
+                       case 't':
+                               item = PAM_TTY;
+                               break;
+                       case 'U':
+                               item = PAM_RUSER;
+                               break;
+                       case 'u':
+                               item = PAM_USER;
+                               break;
+                       default:
+                               item = -1;
+                               msg[len++] = *p;
+                               break;
+                       }
+                       if (item == -1)
+                               continue;
+                       err = pam_get_item(pamh, item, &str);
+                       if (err != PAM_SUCCESS)
+                               return (err);
+                       if (str == NULL)
+                               str = "(null)";
+                       for (q = str; *q != '\0' && len < sizeof(msg) - 1; ++q)
+                               msg[len++] = *q;
+               }
+       }
+       msg[len] = '\0';
+       return (pam_info(pamh, "%s", msg));
+}
+
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_echo(pamh, flags, argc, argv));
+}
+
+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_EXTERN int
+pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_echo(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_echo(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_close_session(pam_handle_t *pamh, int flags,
+                    int argc, const char *argv[])
+{
+
+       return (_pam_echo(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       if (flags & PAM_PRELIM_CHECK)
+               return (PAM_SUCCESS);
+       return (_pam_echo(pamh, flags, argc, argv));
+}
+
+PAM_MODULE_ENTRY("pam_echo");
diff --git a/lib/pam_module/pam_exec/Makefile b/lib/pam_module/pam_exec/Makefile
new file mode 100644 (file)
index 0000000..d54c31b
--- /dev/null
@@ -0,0 +1,9 @@
+# $FreeBSD: src/lib/libpam/modules/pam_exec/Makefile,v 1.2 2003/03/09 20:06:35 obrien Exp $
+
+LIB=   pam_exec
+SRCS=  pam_exec.c
+MAN=   pam_exec.8
+
+WARNS?=        1
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_exec/pam_exec.8 b/lib/pam_module/pam_exec/pam_exec.8
new file mode 100644 (file)
index 0000000..47f3a96
--- /dev/null
@@ -0,0 +1,75 @@
+.\" Copyright (c) 2001,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_exec/pam_exec.8,v 1.6 2005/06/15 19:04:04 ru Exp $
+.\"
+.Dd February 1, 2005
+.Dt PAM_EXEC 8
+.Os
+.Sh NAME
+.Nm pam_exec
+.Nd Exec PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_exec
+.Op Ar arguments
+.Sh DESCRIPTION
+The exec service module for PAM executes the program designated by its
+first argument, with its remaining arguments as command-line
+arguments.
+The child's environment is set to the current PAM environment list,
+as returned by
+.Xr pam_getenvlist 3 .
+In addition, the following PAM items are exported as environment
+variables:
+.Ev PAM_RHOST ,
+.Ev PAM_RUSER ,
+.Ev PAM_SERVICE ,
+.Ev PAM_TTY ,
+and
+.Ev PAM_USER .
+.Sh SEE ALSO
+.Xr pam_get_item 3 ,
+.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.
diff --git a/lib/pam_module/pam_exec/pam_exec.c b/lib/pam_module/pam_exec/pam_exec.c
new file mode 100644 (file)
index 0000000..47466af
--- /dev/null
@@ -0,0 +1,194 @@
+/*-
+ * Copyright (c) 2001,2003 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * This software was 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_exec/pam_exec.c,v 1.6 2006/11/10 23:33:25 des Exp $
+ */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/openpam.h>
+
+#define ENV_ITEM(n) { (n), #n }
+static struct {
+       int item;
+       const char *name;
+} env_items[] = {
+       ENV_ITEM(PAM_SERVICE),
+       ENV_ITEM(PAM_USER),
+       ENV_ITEM(PAM_TTY),
+       ENV_ITEM(PAM_RHOST),
+       ENV_ITEM(PAM_RUSER),
+};
+
+static int
+_pam_exec(pam_handle_t *pamh __unused, int flags __unused,
+         int argc, const char *argv[])
+{
+       int envlen, i, nitems, pam_err, status;
+       char **envlist, **tmp;
+       volatile int childerr;
+       pid_t pid;
+
+       if (argc < 1)
+               return (PAM_SERVICE_ERR);
+
+       /*
+        * XXX For additional credit, divert child's stdin/stdout/stderr
+        * to the conversation function.
+        */
+
+       /*
+        * Set up the child's environment list.  It consists of the PAM
+        * environment, plus a few hand-picked PAM items.
+        */
+       envlist = pam_getenvlist(pamh);
+       for (envlen = 0; envlist[envlen] != NULL; ++envlen)
+               /* nothing */ ;
+       nitems = sizeof(env_items) / sizeof(*env_items);
+       tmp = realloc(envlist, (envlen + nitems + 1) * sizeof(*envlist));
+       if (tmp == NULL) {
+               openpam_free_envlist(envlist);
+               return (PAM_BUF_ERR);
+       }
+       envlist = tmp;
+       for (i = 0; i < nitems; ++i) {
+               const void *item;
+               char *envstr;
+
+               pam_err = pam_get_item(pamh, env_items[i].item, &item);
+               if (pam_err != PAM_SUCCESS || item == NULL)
+                       continue;
+               asprintf(&envstr, "%s=%s", env_items[i].name, item);
+               if (envstr == NULL) {
+                       openpam_free_envlist(envlist);
+                       return (PAM_BUF_ERR);
+               }
+               envlist[envlen++] = envstr;
+               envlist[envlen] = NULL;
+       }
+
+       /*
+        * Fork and run the command.  By using vfork() instead of fork(),
+        * we can distinguish between an execve() failure and a non-zero
+        * exit code from the command.
+        */
+       childerr = 0;
+       if ((pid = vfork()) == 0) {
+               execve(argv[0], (char * const *)argv, (char * const *)envlist);
+               childerr = errno;
+               _exit(1);
+       }
+       openpam_free_envlist(envlist);
+       if (pid == -1) {
+               openpam_log(PAM_LOG_ERROR, "vfork(): %m");
+               return (PAM_SYSTEM_ERR);
+       }
+       if (waitpid(pid, &status, 0) == -1) {
+               openpam_log(PAM_LOG_ERROR, "waitpid(): %m");
+               return (PAM_SYSTEM_ERR);
+       }
+       if (childerr != 0) {
+               openpam_log(PAM_LOG_ERROR, "execve(): %m");
+               return (PAM_SYSTEM_ERR);
+       }
+       if (WIFSIGNALED(status)) {
+               openpam_log(PAM_LOG_ERROR, "%s caught signal %d%s",
+                   argv[0], WTERMSIG(status),
+                   WCOREDUMP(status) ? " (core dumped)" : "");
+               return (PAM_SYSTEM_ERR);
+       }
+       if (!WIFEXITED(status)) {
+               openpam_log(PAM_LOG_ERROR, "unknown status 0x%x", status);
+               return (PAM_SYSTEM_ERR);
+       }
+       if (WEXITSTATUS(status) != 0) {
+               openpam_log(PAM_LOG_ERROR, "%s returned code %d",
+                   argv[0], WEXITSTATUS(status));
+               return (PAM_SYSTEM_ERR);
+       }
+       return (PAM_SUCCESS);
+}
+
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_exec(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_exec(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_exec(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_exec(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_close_session(pam_handle_t *pamh, int flags,
+                    int argc, const char *argv[])
+{
+
+       return (_pam_exec(pamh, flags, argc, argv));
+}
+
+PAM_EXTERN int
+pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char *argv[])
+{
+
+       return (_pam_exec(pamh, flags, argc, argv));
+}
+
+PAM_MODULE_ENTRY("pam_exec");
diff --git a/lib/pam_module/pam_ftpusers/Makefile b/lib/pam_module/pam_ftpusers/Makefile
new file mode 100644 (file)
index 0000000..2219dad
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/lib/libpam/modules/pam_ftpusers/Makefile,v 1.2 2003/03/09 20:06:35 obrien Exp $
+
+LIB=   pam_ftpusers
+SRCS=  pam_ftpusers.c
+MAN=   pam_ftpusers.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_ftpusers/pam_ftpusers.8 b/lib/pam_module/pam_ftpusers/pam_ftpusers.8
new file mode 100644 (file)
index 0000000..69642cc
--- /dev/null
@@ -0,0 +1,99 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\" Copyright (c) 2002 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_ftpusers/pam_ftpusers.8,v 1.2 2004/07/02 23:52:17 ru Exp $
+.\"
+.Dd April 17, 2002
+.Dt PAM_FTPUSERS 8
+.Os
+.Sh NAME
+.Nm pam_ftpusers
+.Nd ftpusers PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_ftpusers
+.Op Ar options
+.Sh DESCRIPTION
+The
+.Pa ftpusers
+service module for PAM,
+.Nm
+provides functionality for only one PAM category:
+account management.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li account
+feature.
+.Ss Ftpusers Account Management Module
+The
+.Pa ftpusers
+account management component
+.Pq Fn pam_sm_acct_mgmt ,
+succeeds if and only if the user is listed in
+.Pa /etc/ftpusers .
+.Pp
+The following options may be passed to the authentication module:
+.Bl -tag -width ".Cm disallow"
+.It Cm debug
+.Xr syslog 3
+debugging information at
+.Dv LOG_DEBUG
+level.
+.It Cm no_warn
+suppress warning messages to the user.
+These messages include reasons why the user's authentication attempt
+was declined.
+.It Cm disallow
+reverse the semantics;
+.Nm
+will succeed if and only if the user is not listed in
+.Pa /etc/ftpusers .
+.El
+.Sh SEE ALSO
+.Xr ftpusers 5 ,
+.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.
diff --git a/lib/pam_module/pam_ftpusers/pam_ftpusers.c b/lib/pam_module/pam_ftpusers/pam_ftpusers.c
new file mode 100644 (file)
index 0000000..8244a38
--- /dev/null
@@ -0,0 +1,114 @@
+/*-
+ * Copyright (c) 2001 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * This software was 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_ftpusers/pam_ftpusers.c,v 1.1 2002/05/08 00:30:10 des Exp $
+ */
+
+#include <ctype.h>
+#include <grp.h>
+#include <paths.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define PAM_SM_ACCOUNT
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+#include <security/openpam.h>
+
+PAM_EXTERN int
+pam_sm_acct_mgmt(pam_handle_t *pamh, int flags __unused,
+                int argc __unused, const char *argv[] __unused)
+{
+       struct passwd *pwd;
+       struct group *grp;
+       const char *user;
+       int pam_err, found, allow;
+       char *line, *name, **mem;
+       size_t len, ulen;
+       FILE *f;
+
+       pam_err = pam_get_user(pamh, &user, NULL);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+       if (user == NULL || (pwd = getpwnam(user)) == NULL)
+               return (PAM_SERVICE_ERR);
+
+       found = 0;
+       ulen = strlen(user);
+       if ((f = fopen(_PATH_FTPUSERS, "r")) == NULL) {
+               PAM_LOG("%s: %m", _PATH_FTPUSERS);
+               goto done;
+       }
+       while (!found && (line = fgetln(f, &len)) != NULL) {
+               if (*line == '#')
+                       continue;
+               while (len > 0 && isspace(line[len - 1]))
+                       --len;
+               if (len == 0)
+                       continue;
+               /* simple case first */
+               if (*line != '@') {
+                       if (len == ulen && strncmp(user, line, len) == 0)
+                               found = 1;
+                       continue;
+               }
+               /* member of specified group? */
+               asprintf(&name, "%.*s", (int)len - 1, line + 1);
+               if (name == NULL) {
+                       fclose(f);
+                       return (PAM_BUF_ERR);
+               }
+               grp = getgrnam(name);
+               free(name);
+               if (grp == NULL)
+                       continue;
+               for (mem = grp->gr_mem; mem && *mem && !found; ++mem)
+                       if (strcmp(user, *mem) == 0)
+                               found = 1;
+       }
+ done:
+       allow = (openpam_get_option(pamh, "disallow") == NULL);
+       if (found)
+               pam_err = allow ? PAM_SUCCESS : PAM_AUTH_ERR;
+       else
+               pam_err = allow ? PAM_AUTH_ERR : PAM_SUCCESS;
+       if (f != NULL)
+               fclose(f);
+       return (pam_err);
+}
+
+PAM_MODULE_ENTRY("pam_ftpusers");
diff --git a/lib/pam_module/pam_group/Makefile b/lib/pam_module/pam_group/Makefile
new file mode 100644 (file)
index 0000000..7607450
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/lib/libpam/modules/pam_group/Makefile,v 1.1 2003/02/06 14:27:48 des Exp $
+
+LIB=           pam_group
+SRCS=          pam_group.c
+MAN=           pam_group.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_group/pam_group.8 b/lib/pam_module/pam_group/pam_group.8
new file mode 100644 (file)
index 0000000..1ee17e8
--- /dev/null
@@ -0,0 +1,83 @@
+.\" 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.
diff --git a/lib/pam_module/pam_group/pam_group.c b/lib/pam_module/pam_group/pam_group.c
new file mode 100644 (file)
index 0000000..d9e44f3
--- /dev/null
@@ -0,0 +1,116 @@
+/*-
+ * 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.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");
diff --git a/lib/pam_module/pam_guest/Makefile b/lib/pam_module/pam_guest/Makefile
new file mode 100644 (file)
index 0000000..a174e84
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/lib/libpam/modules/pam_guest/Makefile,v 1.1 2003/05/31 16:52:58 des Exp $
+
+LIB=           pam_guest
+SRCS=          pam_guest.c
+MAN=           pam_guest.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_guest/pam_guest.8 b/lib/pam_module/pam_guest/pam_guest.8
new file mode 100644 (file)
index 0000000..29cf852
--- /dev/null
@@ -0,0 +1,98 @@
+.\" 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_guest/pam_guest.8,v 1.4 2004/07/05 06:39:03 ru Exp $
+.\"
+.Dd May 26, 2003
+.Dt PAM_GUEST 8
+.Os
+.Sh NAME
+.Nm pam_guest
+.Nd Guest PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_guest
+.Op Ar arguments
+.Sh DESCRIPTION
+The guest service module for PAM allows guest logins.
+If successful, the
+.Nm
+module sets the PAM environment variable
+.Ev GUEST
+to the login name.
+The application can check this variable using
+.Xr pam_getenv 3
+to differentiate guest logins from normal logins.
+.Pp
+The following options may be passed to the
+.Nm
+module:
+.Bl -tag -width ".Cm pass_as_ruser"
+.It Cm guests Ns = Ns Ar list
+Comma-separated list of guest account names.
+The default is
+.Dq Li guest .
+A typical value for
+.Xr ftpd 8
+would be
+.Dq Li anonymous,ftp .
+.It Cm nopass
+Omits the password prompt if the target account is on the list of
+guest accounts.
+.It Cm pass_as_ruser
+The password typed in by the user is exported as the
+.Dv PAM_RUSER
+item.
+This is useful for applications like
+.Xr ftpd 8
+where guest users are encouraged to use their email address as
+password.
+.It Cm pass_is_user
+Requires the guest user to type in the guest account name as password.
+.El
+.Sh SEE ALSO
+.Xr pam_getenv 3 ,
+.Xr pam_get_item 3 ,
+.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.
diff --git a/lib/pam_module/pam_guest/pam_guest.c b/lib/pam_module/pam_guest/pam_guest.c
new file mode 100644 (file)
index 0000000..54b80d0
--- /dev/null
@@ -0,0 +1,113 @@
+/*-
+ * 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_guest/pam_guest.c,v 1.1 2003/05/31 16:52:58 des Exp $
+ */
+
+#include <string.h>
+
+#define PAM_SM_AUTH
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/openpam.h>
+
+#define DEFAULT_GUESTS "guest"
+
+static int
+lookup(const char *str, const char *list)
+{
+       const char *next;
+       size_t len;
+
+       len = strlen(str);
+       while (*list != '\0') {
+               while (*list == ',')
+                       ++list;
+               if ((next = strchr(list, ',')) == NULL)
+                       next = strchr(list, '\0');
+               if (next - list == (ptrdiff_t)len &&
+                   strncmp(list, str, len) == 0)
+                       return (1);
+               list = next;
+       }
+       return (0);
+}
+
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
+                   int argc __unused, const char *argv[] __unused)
+{
+       const char *authtok, *guests, *user;
+       int err, is_guest;
+
+       /* get target account */
+       if (pam_get_user(pamh, &user, NULL) != PAM_SUCCESS || user == NULL)
+               return (PAM_AUTH_ERR);
+
+       /* get list of guest logins */
+       if ((guests = openpam_get_option(pamh, "guests")) == NULL)
+               guests = DEFAULT_GUESTS;
+
+       /* check if the target account is on the list */
+       is_guest = lookup(user, guests);
+
+       /* check password */
+       if (!openpam_get_option(pamh, "nopass")) {
+               err = pam_get_authtok(pamh, PAM_AUTHTOK, &authtok, NULL);
+               if (err != PAM_SUCCESS)
+                       return (err);
+               if (openpam_get_option(pamh, "pass_is_user") &&
+                   strcmp(user, authtok) != 0)
+                       return (PAM_AUTH_ERR);
+               if (openpam_get_option(pamh, "pass_as_ruser"))
+                       pam_set_item(pamh, PAM_RUSER, authtok);
+       }
+
+       /* done */
+       if (is_guest) {
+               pam_setenv(pamh, "GUEST", user, 1);
+               return (PAM_SUCCESS);
+       }
+       return (PAM_AUTH_ERR);
+}
+
+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_guest");
diff --git a/lib/pam_module/pam_ksu/Makefile b/lib/pam_module/pam_ksu/Makefile
new file mode 100644 (file)
index 0000000..c000e19
--- /dev/null
@@ -0,0 +1,34 @@
+# Copyright 2002 FreeBSD, Inc.
+# All rights reserved.
+#
+# 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.
+#
+# 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_ksu/Makefile,v 1.6 2004/08/06 07:27:04 cperciva Exp $
+
+LIB=   pam_ksu
+SRCS=  pam_ksu.c
+MAN=   pam_ksu.8
+
+DPADD= ${LIBKRB5} ${LIBASN1} ${LIBROKEN} ${LIBCOM_ERR} ${LIBCRYPT} ${LIBCRYPTO}
+LDADD= -lkrb5 -lasn1 -lroken -lcom_err -lcrypt -lcrypto
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_ksu/pam_ksu.8 b/lib/pam_module/pam_ksu/pam_ksu.8
new file mode 100644 (file)
index 0000000..08322b7
--- /dev/null
@@ -0,0 +1,122 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\" Copyright (c) 2001 Networks Associates Technology, Inc.
+.\" All rights reserved.
+.\"
+.\" This software was 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_ksu/pam_ksu.8,v 1.3 2002/12/12 08:19:47 ru Exp $
+.\"
+.Dd May 15, 2002
+.Dt PAM_KSU 8
+.Os
+.Sh NAME
+.Nm pam_ksu
+.Nd Kerberos 5 SU PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_ksu
+.Op Ar options
+.Sh DESCRIPTION
+The Kerberos 5 SU authentication service module for PAM,
+.Nm
+for only one PAM category: authentication.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li auth
+feature.
+The module is specifically designed to be used with the
+.Xr su 1
+utility.
+.\" It also provides a null function for session management.
+.Ss Kerberos 5 SU Authentication Module
+The Kerberos 5 SU authentication component provides functions to verify
+the identity of a user
+.Pq Fn pam_sm_authenticate ,
+and determine whether or not the user is authorized to obtain the
+privileges of the target account.
+If the target account is
+.Dq root ,
+then the Kerberos 5 principal used
+for authentication and authorization will be the
+.Dq root
+instance of
+the current user, e.g.\&
+.Dq Li user/root@REAL.M .
+Otherwise, the principal will simply be the current user's default
+principal, e.g.\&
+.Dq Li user@REAL.M .
+.Pp
+The user is prompted for a password if necessary.
+Authorization is performed
+by comparing the Kerberos 5 principal with those listed in the
+.Pa .k5login
+file in the target account's home directory
+(e.g.\&
+.Pa /root/.k5login
+for root).
+.Pp
+The following options may be passed to the authentication module:
+.Bl -tag -width ".Cm use_first_pass"
+.It Cm debug
+.Xr syslog 3
+debugging information at
+.Dv LOG_DEBUG
+level.
+.It Cm use_first_pass
+If the authentication module
+is not the first in the stack,
+and a previous module
+obtained the user's password,
+that password is used
+to authenticate the user.
+If this fails,
+the authentication module returns failure
+without prompting the user for a password.
+This option has no effect
+if the authentication module
+is the first in the stack,
+or if no previous modules
+obtained the user's password.
+.It Cm try_first_pass
+This option is similar to the
+.Cm use_first_pass
+option,
+except that if the previously obtained password fails,
+the user is prompted for another password.
+.El
+.Sh SEE ALSO
+.Xr su 1 ,
+.Xr syslog 3 ,
+.Xr pam.conf 5 ,
+.Xr pam 8
diff --git a/lib/pam_module/pam_ksu/pam_ksu.c b/lib/pam_module/pam_ksu/pam_ksu.c
new file mode 100644 (file)
index 0000000..8194cad
--- /dev/null
@@ -0,0 +1,257 @@
+/*-
+ * Copyright (c) 2002 Jacques A. Vidrine <nectar@FreeBSD.org>
+ * All rights reserved.
+ *
+ * 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.
+ *
+ * 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_ksu/pam_ksu.c,v 1.5 2004/02/10 10:13:21 des Exp $
+ */
+
+#include <sys/param.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <krb5.h>
+
+#define PAM_SM_AUTH
+#define PAM_SM_CRED
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+
+static const char superuser[] = "root";
+
+static long    get_su_principal(krb5_context, const char *, const char *,
+                   char **, krb5_principal *);
+static int     auth_krb5(pam_handle_t *, krb5_context, const char *,
+                   krb5_principal);
+
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
+                   int argc __unused, const char *argv[] __unused)
+{
+       krb5_context     context;
+       krb5_principal   su_principal;
+       const char      *user;
+       const void      *ruser;
+       char            *su_principal_name;
+       long             rv;
+       int              pamret;
+
+       pamret = pam_get_user(pamh, &user, NULL);
+       if (pamret != PAM_SUCCESS)
+               return (pamret);
+       PAM_LOG("Got user: %s", user);
+       pamret = pam_get_item(pamh, PAM_RUSER, &ruser);
+       if (pamret != PAM_SUCCESS)
+               return (pamret);
+       PAM_LOG("Got ruser: %s", (const char *)ruser);
+       rv = krb5_init_context(&context);
+       if (rv != 0) {
+               PAM_LOG("krb5_init_context failed: %s",
+                       krb5_get_err_text(context, rv));
+               return (PAM_SERVICE_ERR);
+       }
+       rv = get_su_principal(context, user, ruser, &su_principal_name, &su_principal);
+       if (rv != 0)
+               return (PAM_AUTH_ERR);
+       PAM_LOG("kuserok: %s -> %s", su_principal_name, user);
+       rv = krb5_kuserok(context, su_principal, user);
+       pamret = rv ? auth_krb5(pamh, context, su_principal_name, su_principal) : PAM_AUTH_ERR;
+       free(su_principal_name);
+       krb5_free_principal(context, su_principal);
+       krb5_free_context(context);
+       return (pamret);
+}
+
+PAM_EXTERN int
+pam_sm_setcred(pam_handle_t *pamh __unused, int flags __unused,
+              int ac __unused, const char *av[] __unused)
+{
+
+       return (PAM_SUCCESS);
+}
+
+/* Authenticate using Kerberos 5.
+ *   pamh              -- The PAM handle.
+ *   context           -- An initialized krb5_context.
+ *   su_principal_name -- The target principal name, used only for password prompts.
+ *              If NULL, the password prompts will not include a principal
+ *              name.
+ *   su_principal      -- The target krb5_principal.
+ * Note that a valid keytab in the default location with a host entry
+ * must be available, and that the PAM application must have sufficient
+ * privileges to access it.
+ * Returns PAM_SUCCESS if authentication was successful, or an appropriate
+ * PAM error code if it was not.
+ */
+static int
+auth_krb5(pam_handle_t *pamh, krb5_context context, const char *su_principal_name,
+         krb5_principal su_principal)
+{
+       krb5_creds       creds;
+       krb5_get_init_creds_opt gic_opt;
+       krb5_verify_init_creds_opt vic_opt;
+       const char      *pass;
+       char            *prompt;
+       long             rv;
+       int              pamret;
+
+       prompt = NULL;
+       krb5_get_init_creds_opt_init(&gic_opt);
+       krb5_verify_init_creds_opt_init(&vic_opt);
+       if (su_principal_name != NULL)
+               asprintf(&prompt, "Password for %s:", su_principal_name);
+       else
+               asprintf(&prompt, "Password:");
+       if (prompt == NULL)
+               return (PAM_BUF_ERR);
+       pass = NULL;
+       pamret = pam_get_authtok(pamh, PAM_AUTHTOK, &pass, prompt);
+       free(prompt);
+       if (pamret != PAM_SUCCESS)
+               return (pamret);
+       rv = krb5_get_init_creds_password(context, &creds, su_principal,
+           pass, NULL, NULL, 0, NULL, &gic_opt);
+       if (rv != 0) {
+               PAM_LOG("krb5_get_init_creds_password: %s",
+                       krb5_get_err_text(context, rv));
+               return (PAM_AUTH_ERR);
+       }
+       krb5_verify_init_creds_opt_set_ap_req_nofail(&vic_opt, 1);
+       rv = krb5_verify_init_creds(context, &creds, NULL, NULL, NULL,
+           &vic_opt);
+       krb5_free_cred_contents(context, &creds);
+       if (rv != 0) {
+               PAM_LOG("krb5_verify_init_creds: %s",
+                      krb5_get_err_text(context, rv));
+               return (PAM_AUTH_ERR);
+       }
+       return (PAM_SUCCESS);
+}
+
+/* Determine the target principal given the current user and the target user.
+ *   context           -- An initialized krb5_context.
+ *   target_user       -- The target username.
+ *   current_user      -- The current username.
+ *   su_principal_name -- (out) The target principal name.
+ *   su_principal      -- (out) The target krb5_principal.
+ * When the target user is `root', the target principal will be a `root
+ * instance', e.g. `luser/root@REA.LM'.  Otherwise, the target principal
+ * will simply be the current user's default principal name.  Note that
+ * in any case, if KRB5CCNAME is set and a credentials cache exists, the
+ * principal name found there will be the `starting point', rather than
+ * the ruser parameter.
+ *
+ * Returns 0 for success, or a com_err error code on failure.
+ */
+static long
+get_su_principal(krb5_context context, const char *target_user,
+                const char *current_user, char **su_principal_name,
+                krb5_principal *su_principal)
+{
+       krb5_principal   default_principal;
+       krb5_ccache      ccache;
+       char            *principal_name, *ccname, *p;
+       long             rv;
+       uid_t            euid, ruid;
+
+       *su_principal = NULL;
+       default_principal = NULL;
+       /* Unless KRB5CCNAME was explicitly set, we won't really be able
+        * to look at the credentials cache since krb5_cc_default will
+        * look at getuid().
+        */
+       ruid = getuid();
+       euid = geteuid();
+       rv = seteuid(ruid);
+       if (rv != 0)
+               return (errno);
+       p = getenv("KRB5CCNAME");
+       if (p != NULL)
+               ccname = strdup(p);
+       else
+               asprintf(&ccname, "%s%lu", KRB5_DEFAULT_CCROOT, (unsigned long)ruid);
+       if (ccname == NULL)
+               return (errno);
+       rv = krb5_cc_resolve(context, ccname, &ccache);
+       free(ccname);
+       if (rv == 0) {
+               rv = krb5_cc_get_principal(context, ccache, &default_principal);
+               krb5_cc_close(context, ccache);
+               if (rv != 0)
+                       default_principal = NULL; /* just to be safe */
+       }
+       rv = seteuid(euid);
+       if (rv != 0)
+               return (errno);
+       if (default_principal == NULL) {
+               rv = krb5_make_principal(context, &default_principal, NULL, current_user, NULL);
+               if (rv != 0) {
+                       PAM_LOG("Could not determine default principal name.");
+                       return (rv);
+               }
+       }
+       /* Now that we have some principal, if the target account is
+        * `root', then transform it into a `root' instance, e.g.
+        * `user@REA.LM' -> `user/root@REA.LM'.
+        */
+       rv = krb5_unparse_name(context, default_principal, &principal_name);
+       krb5_free_principal(context, default_principal);
+       if (rv != 0) {
+               PAM_LOG("krb5_unparse_name: %s",
+                   krb5_get_err_text(context, rv));
+               return (rv);
+       }
+       PAM_LOG("Default principal name: %s", principal_name);
+       if (strcmp(target_user, superuser) == 0) {
+               p = strrchr(principal_name, '@');
+               if (p == NULL) {
+                       PAM_LOG("malformed principal name `%s'", principal_name);
+                       free(principal_name);
+                       return (rv);
+               }
+               *p++ = '\0';
+               *su_principal_name = NULL;
+               asprintf(su_principal_name, "%s/%s@%s", principal_name, superuser, p);
+               free(principal_name);
+       } else
+               *su_principal_name = principal_name;
+
+       if (*su_principal_name == NULL)
+               return (errno);
+       rv = krb5_parse_name(context, *su_principal_name, &default_principal);
+       if (rv != 0) {
+               PAM_LOG("krb5_parse_name `%s': %s", *su_principal_name,
+                   krb5_get_err_text(context, rv));
+               free(*su_principal_name);
+               return (rv);
+       }
+       PAM_LOG("Target principal name: %s", *su_principal_name);
+       *su_principal = default_principal;
+       return (0);
+}
+
+PAM_MODULE_ENTRY("pam_ksu");
diff --git a/lib/pam_module/pam_lastlog/Makefile b/lib/pam_module/pam_lastlog/Makefile
new file mode 100644 (file)
index 0000000..911be91
--- /dev/null
@@ -0,0 +1,34 @@
+# Copyright 2001 Mark R V Murray
+# All rights reserved.
+#
+# 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.
+#
+# 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_lastlog/Makefile,v 1.5 2003/03/09 20:06:36 obrien Exp $
+
+LIB=   pam_lastlog
+SRCS=  pam_lastlog.c
+MAN=   pam_lastlog.8
+
+DPADD= ${LIBUTIL}
+LDADD= -lutil
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_lastlog/pam_lastlog.8 b/lib/pam_module/pam_lastlog/pam_lastlog.8
new file mode 100644 (file)
index 0000000..0e0415f
--- /dev/null
@@ -0,0 +1,106 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\" Copyright (c) 2001 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_lastlog/pam_lastlog.8,v 1.7 2005/01/21 10:38:42 ru Exp $
+.\"
+.Dd January 24, 2002
+.Dt PAM_LASTLOG 8
+.Os
+.Sh NAME
+.Nm pam_lastlog
+.Nd login accounting PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_lastlog
+.Op Ar options
+.Sh DESCRIPTION
+The login accounting service module for PAM,
+.Nm
+provides functionality for only one PAM category:
+session management.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li session
+feature.
+.Ss Login Accounting Session Management Module
+The login accounting session management component provides functions
+to initiate
+.Pq Fn pam_sm_open_session
+and terminate
+.Pq Fn pam_sm_close_session
+sessions.
+The
+.Fn pam_sm_open_session
+function records the session in the
+.Xr utmp 5 ,
+.Xr wtmp 5
+and
+.Xr lastlog 5
+databases.
+The
+.Fn pam_sm_close_session
+function does nothing.
+.Pp
+The following options may be passed to the authentication module:
+.Bl -tag -width ".Cm no_warn"
+.It Cm debug
+.Xr syslog 3
+debugging information at
+.Dv LOG_DEBUG
+level.
+.It Cm no_warn
+suppress warning messages to the user.
+.It Cm no_fail
+Ignore I/O failures.
+.El
+.Sh SEE ALSO
+.Xr last 1 ,
+.Xr w 1 ,
+.Xr login 3 ,
+.Xr logout 3 ,
+.Xr pam.conf 5 ,
+.Xr utmp 5 ,
+.Xr lastlogin 8 ,
+.Xr pam 8
+.Sh AUTHORS
+The
+.Nm
+module and this manual page 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
+.Pq Dq CBOSS ,
+as part of the DARPA CHATS research program.
diff --git a/lib/pam_module/pam_lastlog/pam_lastlog.c b/lib/pam_module/pam_lastlog/pam_lastlog.c
new file mode 100644 (file)
index 0000000..5cb931c
--- /dev/null
@@ -0,0 +1,201 @@
+/*-
+ * Copyright (c) 1980, 1987, 1988, 1991, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 2001 Mark R V Murray
+ * All rights reserved.
+ * Copyright (c) 2001 Networks Associates Technology, Inc.
+ * All rights reserved.
+ * Copyright (c) 2004 Joe R. Doupnik
+ * 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.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may 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_lastlog/pam_lastlog.c,v 1.23 2007/07/22 15:17:29 des Exp $
+ */
+
+#define _BSD_SOURCE
+
+#include <sys/param.h>
+
+#include <fcntl.h>
+#include <libutil.h>
+#include <paths.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <time.h>
+#include <unistd.h>
+#include <utmp.h>
+
+#define PAM_SM_SESSION
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+
+PAM_EXTERN int
+pam_sm_open_session(pam_handle_t *pamh, int flags,
+                   int argc __unused, const char *argv[] __unused)
+{
+       struct passwd *pwd;
+       struct utmp utmp;
+       struct lastlog ll;
+       time_t t;
+       const char *user;
+       const void *rhost, *tty;
+       off_t llpos;
+       int fd, pam_err;
+
+       pam_err = pam_get_user(pamh, &user, NULL);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+       if (user == NULL || (pwd = getpwnam(user)) == NULL)
+               return (PAM_SERVICE_ERR);
+       PAM_LOG("Got user: %s", user);
+
+       pam_err = pam_get_item(pamh, PAM_RHOST, &rhost);
+       if (pam_err != PAM_SUCCESS) {
+               PAM_LOG("No PAM_RHOST");
+               goto err;
+       }
+       pam_err = pam_get_item(pamh, PAM_TTY, &tty);
+       if (pam_err != PAM_SUCCESS) {
+               PAM_LOG("No PAM_TTY");
+               goto err;
+       }
+       if (tty == NULL) {
+               PAM_LOG("No PAM_TTY");
+               pam_err = PAM_SERVICE_ERR;
+               goto err;
+       }
+       if (strncmp(tty, _PATH_DEV, strlen(_PATH_DEV)) == 0)
+               tty = (const char *)tty + strlen(_PATH_DEV);
+       if (*(const char *)tty == '\0')
+               return (PAM_SERVICE_ERR);
+
+       fd = open(_PATH_LASTLOG, O_RDWR|O_CREAT, 0644);
+       if (fd == -1) {
+               PAM_LOG("Failed to open %s", _PATH_LASTLOG);
+               goto file_err;
+       }
+
+       /*
+        * Record session in lastlog(5).
+        */
+       llpos = (off_t)(pwd->pw_uid * sizeof(ll));
+       if (lseek(fd, llpos, L_SET) != llpos)
+               goto file_err;
+       if ((flags & PAM_SILENT) == 0) {
+               if (read(fd, &ll, sizeof ll) == sizeof ll && ll.ll_time != 0) {
+                       t = ll.ll_time;
+                       if (*ll.ll_host != '\0')
+                               pam_info(pamh, "Last login: %.*s from %.*s",
+                                   24 - 5, ctime(&t),
+                                   (int)sizeof(ll.ll_host), ll.ll_host);
+                       else
+                               pam_info(pamh, "Last login: %.*s on %.*s",
+                                   24 - 5, ctime(&t),
+                                   (int)sizeof(ll.ll_line), ll.ll_line);
+               }
+               if (lseek(fd, llpos, L_SET) != llpos)
+                       goto file_err;
+       }
+
+       bzero(&ll, sizeof(ll));
+       ll.ll_time = time(NULL);
+
+       /* note: does not need to be NUL-terminated */
+       strncpy(ll.ll_line, tty, sizeof(ll.ll_line));
+       if (rhost != NULL && *(const char *)rhost != '\0')
+               /* note: does not need to be NUL-terminated */
+               strncpy(ll.ll_host, rhost, sizeof(ll.ll_host));
+
+       if (write(fd, (char *)&ll, sizeof(ll)) != sizeof(ll) || close(fd) != 0)
+               goto file_err;
+
+       PAM_LOG("Login recorded in %s", _PATH_LASTLOG);
+
+       /*
+        * Record session in utmp(5) and wtmp(5).
+        */
+       bzero(&utmp, sizeof(utmp));
+       utmp.ut_time = time(NULL);
+       /* note: does not need to be NUL-terminated */
+       strncpy(utmp.ut_name, user, sizeof(utmp.ut_name));
+       if (rhost != NULL && *(const char *)rhost != '\0')
+               strncpy(utmp.ut_host, rhost, sizeof(utmp.ut_host));
+       strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line));
+       login(&utmp);
+
+       return (PAM_SUCCESS);
+
+file_err:
+       syslog(LOG_ERR, "%s: %m", _PATH_LASTLOG);
+       if (fd != -1)
+               close(fd);
+       pam_err = PAM_SYSTEM_ERR;
+err:
+       if (openpam_get_option(pamh, "no_fail"))
+               return (PAM_SUCCESS);
+       return (pam_err);
+}
+
+PAM_EXTERN int
+pam_sm_close_session(pam_handle_t *pamh __unused, int flags __unused,
+                    int argc __unused, const char *argv[] __unused)
+{
+       const void *tty;
+       int pam_err;
+
+       pam_err = pam_get_item(pamh, PAM_TTY, (const void **)&tty);
+       if (pam_err != PAM_SUCCESS)
+               goto err;
+       if (strncmp(tty, _PATH_DEV, strlen(_PATH_DEV)) == 0)
+               tty = (const char *)tty + strlen(_PATH_DEV);
+       if (*(const char *)tty == '\0')
+               return (PAM_SERVICE_ERR);
+       if (logout(tty) != 1)
+               syslog(LOG_ERR, "%s(): no utmp record for %s",
+                   __func__, (const char *)tty);
+       logwtmp(tty, "", "");
+       return (PAM_SUCCESS);
+
+ err:
+       if (openpam_get_option(pamh, "no_fail"))
+               return (PAM_SUCCESS);
+       return (pam_err);
+}
+
+PAM_MODULE_ENTRY("pam_lastlog");
diff --git a/lib/pam_module/pam_login_access/Makefile b/lib/pam_module/pam_login_access/Makefile
new file mode 100644 (file)
index 0000000..1d5d959
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright 2001 Mark R V Murray
+# All rights reserved.
+#
+# 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.
+#
+# 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_login_access/Makefile,v 1.6 2006/03/06 12:31:25 yar Exp $
+
+LIB=   pam_login_access
+SRCS=  pam_login_access.c login_access.c
+MAN=   login.access.5 pam_login_access.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_login_access/login.access.5 b/lib/pam_module/pam_login_access/login.access.5
new file mode 100644 (file)
index 0000000..dfdca19
--- /dev/null
@@ -0,0 +1,57 @@
+.\"
+.\" $FreeBSD: src/lib/libpam/modules/pam_login_access/login.access.5,v 1.17 2006/09/13 18:34:32 joel Exp $
+.\"
+.Dd September 13, 2006
+.Dt LOGIN.ACCESS 5
+.Os
+.Sh NAME
+.Nm login.access
+.Nd login access control table
+.Sh DESCRIPTION
+The
+.Nm
+file specifies (user, host) combinations and/or (user, tty)
+combinations for which a login will be either accepted or refused.
+.Pp
+When someone logs in, the
+.Nm
+is scanned for the first entry that
+matches the (user, host) combination, or, in case of non-networked
+logins, the first entry that matches the (user, tty) combination.
+The
+permissions field of that table entry determines whether the login will
+be accepted or refused.
+.Pp
+Each line of the login access control table has three fields separated by a
+.Ql \&:
+character:
+.Ar permission : Ns Ar users : Ns Ar origins
+.Pp
+The first field should be a "+" (access granted) or "-" (access denied)
+character.
+The second field should be a list of one or more login names,
+group names, or ALL (always matches).
+The third field should be a list
+of one or more tty names (for non-networked logins), host names, domain
+names (begin with "."), host addresses, internet network numbers (end
+with "."), ALL (always matches) or LOCAL (matches any string that does
+not contain a "." character).
+If you run NIS you can use @netgroupname
+in host or user patterns.
+.Pp
+The EXCEPT operator makes it possible to write very compact rules.
+.Pp
+The group file is searched only when a name does not match that of the
+logged-in user.
+Only groups are matched in which users are explicitly
+listed: the program does not look at a user's primary group id value.
+.Sh FILES
+.Bl -tag -width /etc/login.access -compact
+.It Pa /etc/login.access
+login access control table
+.El
+.Sh SEE ALSO
+.Xr login 1 ,
+.Xr pam_login_access 8
+.Sh AUTHORS
+.An Guido van Rooij
diff --git a/lib/pam_module/pam_login_access/login_access.c b/lib/pam_module/pam_login_access/login_access.c
new file mode 100644 (file)
index 0000000..e4125ab
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ * This module implements a simple but effective form of login access
+ * control based on login names and on host (or domain) names, internet
+ * addresses (or network numbers), or on terminal line names in case of
+ * non-networked logins. Diagnostics are reported through syslog(3).
+ *
+ * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
+ *
+ * $FreeBSD: src/lib/libpam/modules/pam_login_access/login_access.c,v 1.13 2007/05/25 07:50:18 des Exp $
+ */
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <errno.h>
+#include <grp.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
+
+#include "pam_login_access.h"
+
+#define _PATH_LOGACCESS                "/etc/login.access"
+
+ /* Delimiters for fields and for lists of users, ttys or hosts. */
+
+static char fs[] = ":";                        /* field separator */
+static char sep[] = ", \t";            /* list-element separator */
+
+ /* Constants to be used in assignments only, not in comparisons... */
+
+#define YES             1
+#define NO              0
+
+static int     from_match(const char *, const char *);
+static int     list_match(char *, const char *,
+                          int (*)(const char *, const char *));
+static int     netgroup_match(const char *, const char *, const char *);
+static int     string_match(const char *, const char *);
+static int     user_match(const char *, const char *);
+
+/* login_access - match username/group and host/tty with access control file */
+
+int
+login_access(const char *user, const char *from)
+{
+    FILE   *fp;
+    char    line[BUFSIZ];
+    char   *perm;                      /* becomes permission field */
+    char   *users;                     /* becomes list of login names */
+    char   *froms;                     /* becomes list of terminals or hosts */
+    int     match = NO;
+    int     end;
+    int     lineno = 0;                        /* for diagnostics */
+
+    /*
+     * Process the table one line at a time and stop at the first match.
+     * Blank lines and lines that begin with a '#' character are ignored.
+     * Non-comment lines are broken at the ':' character. All fields are
+     * mandatory. The first field should be a "+" or "-" character. A
+     * non-existing table means no access control.
+     */
+
+    if ((fp = fopen(_PATH_LOGACCESS, "r")) != NULL) {
+       while (!match && fgets(line, sizeof(line), fp)) {
+           lineno++;
+           if (line[end = strlen(line) - 1] != '\n') {
+               syslog(LOG_ERR, "%s: line %d: missing newline or line too long",
+                      _PATH_LOGACCESS, lineno);
+               continue;
+           }
+           if (line[0] == '#')
+               continue;                       /* comment line */
+           while (end > 0 && isspace(line[end - 1]))
+               end--;
+           line[end] = 0;                      /* strip trailing whitespace */
+           if (line[0] == 0)                   /* skip blank lines */
+               continue;
+           if (!(perm = strtok(line, fs))
+               || !(users = strtok((char *) 0, fs))
+               || !(froms = strtok((char *) 0, fs))
+               || strtok((char *) 0, fs)) {
+               syslog(LOG_ERR, "%s: line %d: bad field count", _PATH_LOGACCESS,
+                      lineno);
+               continue;
+           }
+           if (perm[0] != '+' && perm[0] != '-') {
+               syslog(LOG_ERR, "%s: line %d: bad first field", _PATH_LOGACCESS,
+                      lineno);
+               continue;
+           }
+           match = (list_match(froms, from, from_match)
+                    && list_match(users, user, user_match));
+       }
+       fclose(fp);
+    } else if (errno != ENOENT) {
+       syslog(LOG_ERR, "cannot open %s: %m", _PATH_LOGACCESS);
+    }
+    return (match == 0 || (line[0] == '+'));
+}
+
+/* list_match - match an item against a list of tokens with exceptions */
+
+static int
+list_match(char *list, const char *item,
+          int (*match_fn)(const char *, const char *))
+{
+    char   *tok;
+    int     match = NO;
+
+    /*
+     * Process tokens one at a time. We have exhausted all possible matches
+     * when we reach an "EXCEPT" token or the end of the list. If we do find
+     * a match, look for an "EXCEPT" list and recurse to determine whether
+     * the match is affected by any exceptions.
+     */
+
+    for (tok = strtok(list, sep); tok != 0; tok = strtok((char *) 0, sep)) {
+       if (strcasecmp(tok, "EXCEPT") == 0)     /* EXCEPT: give up */
+           break;
+       if ((match = (*match_fn)(tok, item)) != 0)      /* YES */
+           break;
+    }
+    /* Process exceptions to matches. */
+
+    if (match != NO) {
+       while ((tok = strtok((char *) 0, sep)) && strcasecmp(tok, "EXCEPT"))
+            /* VOID */ ;
+       if (tok == 0 || list_match((char *) 0, item, match_fn) == NO)
+           return (match);
+    }
+    return (NO);
+}
+
+/* netgroup_match - match group against machine or user */
+
+static int
+netgroup_match(const char *group, const char *machine, const char *user)
+{
+    char domain[1024];
+    unsigned int i;
+
+    if (getdomainname(domain, sizeof(domain)) != 0 || *domain == '\0') {
+       syslog(LOG_ERR, "NIS netgroup support disabled: no NIS domain");
+       return (NO);
+    }
+
+    /* getdomainname() does not reliably terminate the string */
+    for (i = 0; i < sizeof(domain); ++i)
+       if (domain[i] == '\0')
+           break;
+    if (i == sizeof(domain)) {
+       syslog(LOG_ERR, "NIS netgroup support disabled: invalid NIS domain");
+       return (NO);
+    }
+
+    if (innetgr(group, machine, user, domain) == 1)
+       return (YES);
+    return (NO);
+}
+
+/* user_match - match a username against one token */
+
+static int
+user_match(const char *tok, const char *string)
+{
+    struct group *group;
+    int     i;
+
+    /*
+     * If a token has the magic value "ALL" the match always succeeds.
+     * Otherwise, return YES if the token fully matches the username, or if
+     * the token is a group that contains the username.
+     */
+
+    if (tok[0] == '@') {                       /* netgroup */
+       return (netgroup_match(tok + 1, (char *) 0, string));
+    } else if (string_match(tok, string)) {    /* ALL or exact match */
+       return (YES);
+    } else if ((group = getgrnam(tok)) != NULL) {/* try group membership */
+       for (i = 0; group->gr_mem[i]; i++)
+           if (strcasecmp(string, group->gr_mem[i]) == 0)
+               return (YES);
+    }
+    return (NO);
+}
+
+/* from_match - match a host or tty against a list of tokens */
+
+static int
+from_match(const char *tok, const char *string)
+{
+    int     tok_len;
+    int     str_len;
+
+    /*
+     * If a token has the magic value "ALL" the match always succeeds. Return
+     * YES if the token fully matches the string. If the token is a domain
+     * name, return YES if it matches the last fields of the string. If the
+     * token has the magic value "LOCAL", return YES if the string does not
+     * contain a "." character. If the token is a network number, return YES
+     * if it matches the head of the string.
+     */
+
+    if (tok[0] == '@') {                       /* netgroup */
+       return (netgroup_match(tok + 1, string, (char *) 0));
+    } else if (string_match(tok, string)) {    /* ALL or exact match */
+       return (YES);
+    } else if (tok[0] == '.') {                        /* domain: match last fields */
+       if ((str_len = strlen(string)) > (tok_len = strlen(tok))
+           && strcasecmp(tok, string + str_len - tok_len) == 0)
+           return (YES);
+    } else if (strcasecmp(tok, "LOCAL") == 0) {        /* local: no dots */
+       if (strchr(string, '.') == 0)
+           return (YES);
+    } else if (tok[(tok_len = strlen(tok)) - 1] == '.' /* network */
+              && strncmp(tok, string, tok_len) == 0) {
+       return (YES);
+    }
+    return (NO);
+}
+
+/* string_match - match a string against one token */
+
+static int
+string_match(const char *tok, const char *string)
+{
+
+    /*
+     * If the token has the magic value "ALL" the match always succeeds.
+     * Otherwise, return YES if the token fully matches the string.
+     */
+
+    if (strcasecmp(tok, "ALL") == 0) {         /* all: always matches */
+       return (YES);
+    } else if (strcasecmp(tok, string) == 0) { /* try exact match */
+       return (YES);
+    }
+    return (NO);
+}
diff --git a/lib/pam_module/pam_login_access/pam_login_access.8 b/lib/pam_module/pam_login_access/pam_login_access.8
new file mode 100644 (file)
index 0000000..e7e5e94
--- /dev/null
@@ -0,0 +1,89 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\" Copyright (c) 2001 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_login_access/pam_login_access.8,v 1.6 2006/03/06 13:15:12 yar Exp $
+.\"
+.Dd January 24, 2002
+.Dt PAM_LOGIN_ACCESS 8
+.Os
+.Sh NAME
+.Nm pam_login_access
+.Nd login.access PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_login_access
+.Op Ar options
+.Sh DESCRIPTION
+The
+.Pa login.access
+service module for PAM,
+.Nm
+provides functionality for only one PAM category:
+account management.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li account
+feature.
+.Ss Login.access Account Management Module
+The
+.Pa login.access
+account management component
+.Pq Fn pam_sm_acct_mgmt ,
+returns success if and only the user is allowed to log in on the
+specified tty (in the case of a local login) or from the specified
+remote host (in the case of a remote login), according to the
+restrictions listed in
+.Xr login.access 5 .
+.Sh SEE ALSO
+.Xr login.access 5 ,
+.Xr pam.conf 5 ,
+.Xr pam 8
+.Sh AUTHORS
+The
+.Xr login.access 5
+access control scheme was designed and implemented by
+.An Wietse Venema .
+.Pp
+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.
diff --git a/lib/pam_module/pam_login_access/pam_login_access.c b/lib/pam_module/pam_login_access/pam_login_access.c
new file mode 100644 (file)
index 0000000..ae79dea
--- /dev/null
@@ -0,0 +1,100 @@
+/*-
+ * Copyright (c) 2001 Mark R V Murray
+ * All rights reserved.
+ * Copyright (c) 2001 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_login_access/pam_login_access.c,v 1.11 2004/02/10 10:13:21 des Exp $
+ */
+
+#define _BSD_SOURCE
+
+#include <sys/param.h>
+
+#include <syslog.h>
+#include <unistd.h>
+
+#define PAM_SM_ACCOUNT
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+
+#include "pam_login_access.h"
+
+PAM_EXTERN int
+pam_sm_acct_mgmt(pam_handle_t *pamh, int flags __unused,
+                int argc __unused, const char *argv[] __unused)
+{
+       const void *rhost, *tty, *user;
+       char hostname[MAXHOSTNAMELEN];
+       int pam_err;
+
+       pam_err = pam_get_item(pamh, PAM_USER, &user);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+
+       if (user == NULL)
+               return (PAM_SERVICE_ERR);
+
+       PAM_LOG("Got user: %s", (const char *)user);
+
+       pam_err = pam_get_item(pamh, PAM_RHOST, &rhost);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+
+       pam_err = pam_get_item(pamh, PAM_TTY, &tty);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+
+       gethostname(hostname, sizeof hostname);
+
+       if (rhost == NULL || *(const char *)rhost == '\0') {
+               PAM_LOG("Checking login.access for user %s on tty %s",
+                   (const char *)user, (const char *)tty);
+               if (login_access(user, tty) != 0)
+                       return (PAM_SUCCESS);
+               PAM_VERBOSE_ERROR("%s is not allowed to log in on %s",
+                   user, tty);
+       } else {
+               PAM_LOG("Checking login.access for user %s from host %s",
+                   (const char *)user, (const char *)rhost);
+               if (login_access(user, rhost) != 0)
+                       return (PAM_SUCCESS);
+               PAM_VERBOSE_ERROR("%s is not allowed to log in from %s",
+                   user, rhost);
+       }
+
+       return (PAM_AUTH_ERR);
+}
+
+PAM_MODULE_ENTRY("pam_login_access");
diff --git a/lib/pam_module/pam_login_access/pam_login_access.h b/lib/pam_module/pam_login_access/pam_login_access.h
new file mode 100644 (file)
index 0000000..95f7dc1
--- /dev/null
@@ -0,0 +1,39 @@
+/*-
+ * Copyright (c) 2001 Mark R V Murray
+ * All rights reserved.
+ * Copyright (c) 2001 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_login_access/pam_login_access.h,v 1.2 2002/03/14 23:27:57 des Exp $
+ */
+
+extern int login_access(const char *, const char *);
diff --git a/lib/pam_module/pam_rhosts/Makefile b/lib/pam_module/pam_rhosts/Makefile
new file mode 100644 (file)
index 0000000..4aa7731
--- /dev/null
@@ -0,0 +1,7 @@
+# $FreeBSD: src/lib/libpam/modules/pam_rhosts/Makefile,v 1.2 2003/03/09 20:06:37 obrien Exp $
+
+LIB=   pam_rhosts
+SRCS=  pam_rhosts.c
+MAN=   pam_rhosts.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_rhosts/pam_rhosts.8 b/lib/pam_module/pam_rhosts/pam_rhosts.8
new file mode 100644 (file)
index 0000000..fa8b802
--- /dev/null
@@ -0,0 +1,95 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\" Copyright (c) 2001 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_rhosts/pam_rhosts.8,v 1.3 2004/07/02 23:52:18 ru Exp $
+.\"
+.Dd December 5, 2001
+.Dt PAM_RHOSTS 8
+.Os
+.Sh NAME
+.Nm pam_rhosts
+.Nd Rhosts PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_rhosts
+.Op Ar options
+.Sh DESCRIPTION
+The rhosts authentication service module for PAM,
+.Nm
+provides functionality for only one PAM category:
+authentication.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li auth
+feature.
+.Ss Rhosts Authentication Module
+The Rhosts authentication component
+.Pq Fn pam_sm_authenticate ,
+returns success if and only if the target user's UID is not 0 and the
+remote host and user are listed in
+.Pa /etc/hosts.equiv
+or in the target user's
+.Pa ~/.rhosts .
+.Pp
+The following options may be passed to the authentication module:
+.Bl -tag -width ".Cm allow_root"
+.It Cm debug
+.Xr syslog 3
+debugging information at
+.Dv LOG_DEBUG
+level.
+.It Cm no_warn
+suppress warning messages to the user.
+These messages include reasons why the user's authentication attempt
+was declined.
+.It Cm allow_root
+do not automatically fail if the target user's UID is 0.
+.El
+.Sh SEE ALSO
+.Xr hosts.equiv 5 ,
+.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.
diff --git a/lib/pam_module/pam_rhosts/pam_rhosts.c b/lib/pam_module/pam_rhosts/pam_rhosts.c
new file mode 100644 (file)
index 0000000..ae68c6d
--- /dev/null
@@ -0,0 +1,94 @@
+/*-
+ * Copyright (c) 2002 Danny Braniss
+ * All rights reserved.
+ * Copyright (c) 2001,2002 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_rhosts/pam_rhosts.c,v 1.3 2003/12/11 13:55:16 des Exp $
+ */
+
+#include <pwd.h>
+#include <stddef.h>
+#include <string.h>
+#include <unistd.h>
+
+#define PAM_SM_AUTH
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+
+#define OPT_ALLOW_ROOT "allow_root"
+
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
+                   int argc __unused, const char *argv[] __unused)
+{
+       struct passwd *pw;
+       const char *user;
+       const void *ruser, *rhost;
+       int err, superuser;
+
+       err = pam_get_user(pamh, &user, NULL);
+       if (err != PAM_SUCCESS)
+               return (err);
+
+       if ((pw = getpwnam(user)) == NULL)
+               return (PAM_USER_UNKNOWN);
+       if (pw->pw_uid == 0 &&
+           openpam_get_option(pamh, OPT_ALLOW_ROOT) == NULL)
+               return (PAM_AUTH_ERR);
+
+       err = pam_get_item(pamh, PAM_RUSER, &ruser);
+       if (err != PAM_SUCCESS)
+               return (PAM_AUTH_ERR);
+
+       err = pam_get_item(pamh, PAM_RHOST, &rhost);
+       if (err != PAM_SUCCESS)
+               return (PAM_AUTH_ERR);
+
+       superuser = (strcmp(user, "root") == 0);
+       err = ruserok(rhost, superuser, ruser, user);
+       if (err != 0)
+               return (PAM_AUTH_ERR);
+
+       return (PAM_SUCCESS);
+}
+
+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_rhosts");
diff --git a/lib/pam_module/pam_rootok/Makefile b/lib/pam_module/pam_rootok/Makefile
new file mode 100644 (file)
index 0000000..12860fe
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright 2001 Mark R V Murray
+# All rights reserved.
+#
+# 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.
+#
+# 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_rootok/Makefile,v 1.6 2003/03/09 20:06:37 obrien Exp $
+
+LIB=   pam_rootok
+SRCS=  pam_rootok.c
+MAN=   pam_rootok.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_rootok/pam_rootok.8 b/lib/pam_module/pam_rootok/pam_rootok.8
new file mode 100644 (file)
index 0000000..ced6cf4
--- /dev/null
@@ -0,0 +1,75 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\"
+.\" 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.
+.\"
+.\" 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_rootok/pam_rootok.8,v 1.4 2001/08/15 20:05:31 markm Exp $
+.\"
+.Dd July 8, 2001
+.Dt PAM_ROOTOK 8
+.Os
+.Sh NAME
+.Nm pam_rootok
+.Nd RootOK PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_rootok
+.Op Ar options
+.Sh DESCRIPTION
+The RootOK authentication service module for PAM,
+.Nm
+provides functionality for only one PAM category:
+authentication.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li auth
+feature.
+It also provides a null function for session management.
+.Ss RootOK Authentication Module
+The RootOK authentication component
+.Pq Fn pam_sm_authenticate ,
+always returns success for the superuser;
+i.e.,
+if
+.Xr getuid 2
+returns 0.
+.Pp
+The following options may be passed to the authentication module:
+.Bl -tag -width ".Cm no_warn"
+.It Cm debug
+.Xr syslog 3
+debugging information at
+.Dv LOG_DEBUG
+level.
+.It Cm no_warn
+suppress warning messages to the user.
+These messages include
+reasons why the user's
+authentication attempt was declined.
+.El
+.Sh SEE ALSO
+.Xr getuid 2 ,
+.Xr pam.conf 5 ,
+.Xr pam 8
diff --git a/lib/pam_module/pam_rootok/pam_rootok.c b/lib/pam_module/pam_rootok/pam_rootok.c
new file mode 100644 (file)
index 0000000..d95f065
--- /dev/null
@@ -0,0 +1,72 @@
+/*-
+ * Copyright (c) 2001 Mark R V Murray
+ * All rights reserved.
+ * Copyright (c) 2001 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_rootok/pam_rootok.c,v 1.8 2002/04/12 22:27:23 des Exp $
+ */
+
+#define _BSD_SOURCE
+
+#include <unistd.h>
+#include <syslog.h>
+
+#define PAM_SM_AUTH
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
+                   int argc __unused, const char *argv[] __unused)
+{
+
+       if (getuid() == 0)
+               return (PAM_SUCCESS);
+
+       PAM_VERBOSE_ERROR("Refused; not superuser");
+       PAM_LOG("User is not superuser");
+
+       return (PAM_AUTH_ERR);
+}
+
+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_rootok");
diff --git a/lib/pam_module/pam_securetty/Makefile b/lib/pam_module/pam_securetty/Makefile
new file mode 100644 (file)
index 0000000..ad0a563
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright 2001 Mark R V Murray
+# All rights reserved.
+#
+# 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.
+#
+# 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_securetty/Makefile,v 1.5 2003/03/09 20:06:37 obrien Exp $
+
+LIB=   pam_securetty
+SRCS=  pam_securetty.c
+MAN=   pam_securetty.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_securetty/pam_securetty.8 b/lib/pam_module/pam_securetty/pam_securetty.8
new file mode 100644 (file)
index 0000000..66e92a1
--- /dev/null
@@ -0,0 +1,92 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\" Copyright (c) 2002 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_securetty/pam_securetty.8,v 1.6 2002/03/14 23:27:58 des Exp $
+.\"
+.Dd July 8, 2001
+.Dt PAM_SECURETTY 8
+.Os
+.Sh NAME
+.Nm pam_securetty
+.Nd SecureTTY PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_securetty
+.Op Ar options
+.Sh DESCRIPTION
+The SecureTTY service module for PAM,
+.Nm
+provides functionality for only one PAM category:
+account management.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li account
+feature.
+It also provides null functions for authentication and session
+management.
+.Ss SecureTTY Account Management Module
+The SecureTTY account management component
+.Pq Fn pam_sm_acct_mgmt ,
+returns failure if the user is attempting to authenticate as superuser,
+and the process is attached to an insecure TTY.
+In all other cases, the module returns success.
+.Pp
+A TTY is considered secure if it is listed in
+.Pa /etc/ttys
+and has the
+.Dv TTY_SECURE
+flag set.
+.Pp
+The following options may be passed to the authentication module:
+.Bl -tag -width ".Cm no_warn"
+.It Cm debug
+.Xr syslog 3
+debugging information at
+.Dv LOG_DEBUG
+level.
+.It Cm no_warn
+suppress warning messages to the user.
+These messages include
+reasons why the user's
+authentication attempt was declined.
+.El
+.Sh SEE ALSO
+.Xr getttynam 3 ,
+.Xr syslog 3 ,
+.Xr pam.conf 5 ,
+.Xr ttys 5 ,
+.Xr pam 8
diff --git a/lib/pam_module/pam_securetty/pam_securetty.c b/lib/pam_module/pam_securetty/pam_securetty.c
new file mode 100644 (file)
index 0000000..d746f94
--- /dev/null
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2001 Mark R V Murray
+ * All rights reserved.
+ * Copyright (c) 2001 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_securetty/pam_securetty.c,v 1.13 2004/02/10 10:13:21 des Exp $
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <pwd.h>
+#include <ttyent.h>
+#include <string.h>
+
+#define PAM_SM_ACCOUNT
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+
+#define TTY_PREFIX     "/dev/"
+
+PAM_EXTERN int
+pam_sm_acct_mgmt(pam_handle_t *pamh __unused, int flags __unused,
+                int argc __unused, const char *argv[] __unused)
+{
+       struct passwd *pwd;
+       struct ttyent *ty;
+       const char *user;
+       const void *tty;
+       int pam_err;
+
+       pam_err = pam_get_user(pamh, &user, NULL);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+       if (user == NULL || (pwd = getpwnam(user)) == NULL)
+               return (PAM_SERVICE_ERR);
+
+       PAM_LOG("Got user: %s", user);
+
+       /* If the user is not root, secure ttys do not apply */
+       if (pwd->pw_uid != 0)
+               return (PAM_SUCCESS);
+
+       pam_err = pam_get_item(pamh, PAM_TTY, &tty);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+
+       PAM_LOG("Got TTY: %s", (const char *)tty);
+
+       /* Ignore any "/dev/" on the PAM_TTY item */
+       if (tty != NULL && strncmp(TTY_PREFIX, tty, sizeof(TTY_PREFIX)) == 0) {
+               PAM_LOG("WARNING: PAM_TTY starts with " TTY_PREFIX);
+               tty = (const char *)tty + sizeof(TTY_PREFIX) - 1;
+       }
+
+       if (tty != NULL && (ty = getttynam(tty)) != NULL &&
+           (ty->ty_status & TTY_SECURE) != 0)
+               return (PAM_SUCCESS);
+
+       PAM_VERBOSE_ERROR("Not on secure TTY");
+       return (PAM_AUTH_ERR);
+}
+
+PAM_MODULE_ENTRY("pam_securetty");
diff --git a/lib/pam_module/pam_self/Makefile b/lib/pam_module/pam_self/Makefile
new file mode 100644 (file)
index 0000000..1aecd82
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright 2001 Mark R V Murray
+# All rights reserved.
+#
+# 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.
+#
+# 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_self/Makefile,v 1.4 2003/03/09 20:06:37 obrien Exp $
+
+LIB=   pam_self
+SRCS=  pam_self.c
+MAN=   pam_self.8
+
+.include <bsd.lib.mk>
diff --git a/lib/pam_module/pam_self/pam_self.8 b/lib/pam_module/pam_self/pam_self.8
new file mode 100644 (file)
index 0000000..8dd9e14
--- /dev/null
@@ -0,0 +1,96 @@
+.\" Copyright (c) 2001 Mark R V Murray
+.\" All rights reserved.
+.\" Copyright (c) 2001 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_self/pam_self.8,v 1.11 2004/07/02 23:52:18 ru Exp $
+.\"
+.Dd December 5, 2001
+.Dt PAM_SELF 8
+.Os
+.Sh NAME
+.Nm pam_self
+.Nd Self PAM module
+.Sh SYNOPSIS
+.Op Ar service-name
+.Ar module-type
+.Ar control-flag
+.Pa pam_self
+.Op Ar options
+.Sh DESCRIPTION
+The Self authentication service module for PAM,
+.Nm
+provides functionality for only one PAM category:
+authentication.
+In terms of the
+.Ar module-type
+parameter, this is the
+.Dq Li auth
+feature.
+.Ss Self Authentication Module
+The Self authentication component
+.Pq Fn pam_sm_authenticate ,
+returns success if and only if the target user's user ID is identical
+with the current real user ID.
+If the current real user ID is zero, authentication will fail,
+unless the
+.Cm allow_root
+option was specified.
+.Pp
+The following options may be passed to the authentication module:
+.Bl -tag -width ".Cm allow_root"
+.It Cm debug
+.Xr syslog 3
+debugging information at
+.Dv LOG_DEBUG
+level.
+.It Cm no_warn
+suppress warning messages to the user.
+These messages include reasons why the user's authentication attempt
+was declined.
+.It Cm allow_root
+do not automatically fail if the current real user ID is 0.
+.El
+.Sh SEE ALSO
+.Xr getuid 2 ,
+.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.
diff --git a/lib/pam_module/pam_self/pam_self.c b/lib/pam_module/pam_self/pam_self.c
new file mode 100644 (file)
index 0000000..279f9e6
--- /dev/null
@@ -0,0 +1,88 @@
+/*-
+ * Copyright (c) 2001 Mark R V Murray
+ * All rights reserved.
+ * Copyright (c) 2001,2002 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_self/pam_self.c,v 1.9 2002/04/12 22:27:24 des Exp $
+ */
+
+#define _BSD_SOURCE
+
+#include <pwd.h>
+#include <unistd.h>
+#include <syslog.h>
+
+#define PAM_SM_AUTH
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+#include <security/pam_mod_misc.h>
+
+#define OPT_ALLOW_ROOT "allow_root"
+
+PAM_EXTERN int
+pam_sm_authenticate(pam_handle_t *pamh, int flags __unused,
+                   int argc __unused, const char *argv[] __unused)
+{
+       struct passwd *pwd;
+       const char *luser;
+       int pam_err;
+       uid_t uid;
+
+       pam_err = pam_get_user(pamh, &luser, NULL);
+       if (pam_err != PAM_SUCCESS)
+               return (pam_err);
+       if (luser == NULL || (pwd = getpwnam(luser)) == NULL)
+               return (PAM_AUTH_ERR);
+
+       uid = getuid();
+       if (uid == 0 && !openpam_get_option(pamh, OPT_ALLOW_ROOT))
+               return (PAM_AUTH_ERR);
+
+       if (uid == (uid_t)pwd->pw_uid)
+               return (PAM_SUCCESS);
+
+       PAM_VERBOSE_ERROR("Refused; source and target users differ");
+
+       return (PAM_AUTH_ERR);
+}
+
+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_self");