]> andersk Git - openssh.git/commitdiff
- dtucker@cvs.openbsd.org 2006/08/14 12:40:25
authordjm <djm>
Fri, 18 Aug 2006 14:23:15 +0000 (14:23 +0000)
committerdjm <djm>
Fri, 18 Aug 2006 14:23:15 +0000 (14:23 +0000)
     [servconf.c servconf.h sshd_config.5]
     Add ability to match groups to Match keyword in sshd_config.  Feedback
     djm@, stevesk@, ok stevesk@.

ChangeLog
servconf.c
servconf.h
sshd_config.5

index 9d812b5a04574ff84a16ce725276cb68aee4e47d..3aa8305731965ec27b91a89fce13f9af073546a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
      Revert previous include file ordering change, for ssh to compile under
      gcc2 (or until openssl include files are cleaned of parameter names
      in function prototypes)
+   - dtucker@cvs.openbsd.org 2006/08/14 12:40:25
+     [servconf.c servconf.h sshd_config.5]
+     Add ability to match groups to Match keyword in sshd_config.  Feedback
+     djm@, stevesk@, ok stevesk@.
 
 20060817
  - (dtucker) [openbsd-compat/fake-rfc2553.c openbsd-compat/setproctitle.c]
index 5884b95bebd75f00ddc6dbbbe55140256d12d0f2..1f80de22d3ecefb3a53d66d0ba2b6d37c996a6b3 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: servconf.c,v 1.164 2006/08/03 03:34:42 deraadt Exp $ */
+/* $OpenBSD: servconf.c,v 1.165 2006/08/14 12:40:25 dtucker Exp $ */
 /*
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
@@ -16,6 +16,7 @@
 #include <sys/socket.h>
 
 #include <netdb.h>
+#include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -37,6 +38,7 @@
 #include "mac.h"
 #include "match.h"
 #include "channels.h"
+#include "groupaccess.h"
 
 static void add_listen_addr(ServerOptions *, char *, u_short);
 static void add_one_listen_addr(ServerOptions *, char *, u_short);
@@ -496,6 +498,51 @@ add_one_listen_addr(ServerOptions *options, char *addr, u_short port)
  *             PermittedChannelRequests session,forwarded-tcpip
  */
 
+static int
+match_cfg_line_group(const char *grps, int line, const char *user)
+{
+       int result = 0;
+       u_int ngrps = 0;
+       char *arg, *p, *cp, *grplist[MAX_MATCH_GROUPS];
+       struct passwd *pw;
+
+       /*
+        * Even if we do not have a user yet, we still need to check for
+        * valid syntax.
+        */
+       arg = cp = xstrdup(grps);
+       while ((p = strsep(&cp, ",")) != NULL && *p != '\0') {
+               if (ngrps >= MAX_MATCH_GROUPS) {
+                       error("line %d: too many groups in Match Group", line);
+                       result = -1;
+                       goto out;
+               }
+               grplist[ngrps++] = p;
+       }
+
+       if (user == NULL)
+               goto out;
+
+       if ((pw = getpwnam(user)) == NULL) {
+               debug("Can't match group at line %d because user %.100s does "
+                   "not exist", line, user);
+       } else if (ga_init(pw->pw_name, pw->pw_gid) == 0) {
+               debug("Can't Match group because user %.100s not in any group "
+                   "at line %d", user, line);
+       } else if (ga_match(grplist, ngrps) != 1) {
+               debug("user %.100s does not match group %.100s at line %d",
+                   user, arg, line);
+       } else {
+               debug("user %.100s matched group %.100s at line %d", user,
+                   arg, line);
+               result = 1;
+       }
+out:
+       ga_free();
+       xfree(arg);
+       return result;
+}
+
 static int
 match_cfg_line(char **condition, int line, const char *user, const char *host,
     const char *address)
@@ -527,6 +574,13 @@ match_cfg_line(char **condition, int line, const char *user, const char *host,
                        else
                                debug("user %.100s matched 'User %.100s' at "
                                    "line %d", user, arg, line);
+               } else if (strcasecmp(attrib, "group") == 0) {
+                       switch (match_cfg_line_group(arg, line, user)) {
+                       case -1:
+                               return -1;
+                       case 0:
+                               result = 0;
+                       }
                } else if (strcasecmp(attrib, "host") == 0) {
                        if (!host) {
                                result = 0;
index 2593b1cd1f322a163d874ff5ac8fcd8c0ced7eed..ad496f64b9ba7cefad59e7befe8563437c38e675 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: servconf.h,v 1.78 2006/08/03 03:34:42 deraadt Exp $ */
+/* $OpenBSD: servconf.h,v 1.79 2006/08/14 12:40:25 dtucker Exp $ */
 
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -25,6 +25,7 @@
 #define MAX_SUBSYSTEMS         256     /* Max # subsystems. */
 #define MAX_HOSTKEYS           256     /* Max # hostkeys. */
 #define MAX_ACCEPT_ENV         256     /* Max # of env vars. */
+#define MAX_MATCH_GROUPS       256     /* Max # of groups for Match. */
 
 /* permit_root_login */
 #define        PERMIT_NOT_SET          -1
index ff5457dff0d999085e8cc003f44eb9cfa985de23..3c20c1faa13407a05a2128b2a3606e018400d67b 100644 (file)
@@ -34,7 +34,7 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\" $OpenBSD: sshd_config.5,v 1.68 2006/07/21 12:43:36 dtucker Exp $
+.\" $OpenBSD: sshd_config.5,v 1.69 2006/08/14 12:40:25 dtucker Exp $
 .Dd September 25, 1999
 .Dt SSHD_CONFIG 5
 .Os
@@ -488,6 +488,7 @@ The arguments to
 are one or more criteria-pattern pairs.
 The available criteria are
 .Cm User ,
+.Cm Group ,
 .Cm Host ,
 and
 .Cm Address .
This page took 0.057628 seconds and 5 git commands to generate.