OpenSSH 4.7p1 - support the use of netgroups in AllowUsers and DenyUsers configuration options
Peter W. Osel
pwo at qimonda.com
Fri Sep 21 05:05:17 EST 2007
Hello,
I have attached a small patch that enables OpenSSH 4.7p1 to use
netgroups for users and hosts entries in the AllowUsers and DenyUsers
configuration options in sshd_config.
This has the following advantages:
* hostnames or ip addresses don't have to be maintained in sshd_config,
but you can use meaningful names for groups of users and groups of
hosts.
* large scale installations can manage user groups and host groups in a
central name service like NIS, NIS+, LDAP.
* sshd_config files no longer change when users and/or hosts are
added/removed from the groups of users/hosts.
* administration effort for large installations is reduced
* maintaining a consistent setup across a large set of systems is much
easier.
* systems without PAM support (that cannot use e.g. pam_list or
pam_access) can now use netgroup based access restrictions.
* the patch uses innetgr(3c) so netgroups can be stored in NIS, NIS+ or
LDAP, or any other directory service that is plugged into nsswitch and
that has a netgroup back end.
The changes were developed by Albert Fluegel af at muc.de and he has given
me permission to submit them to OpenSSH. I have ported them to the
current OpenSSH version, 4.7p1. I also want to thank Darren J Moffat
for proposing to use innetgr(3c). Any errors in the attached code
though are strictly mine.
While the syntax is not the nicest one (@myusers@@myhosts is a valid
entry), but using @ as a netgroup name prefix seems to be fairly common
(e.g. Linux NFS exports, shosts/rhosts, ...). It also avoids that user
or host names are accidentally interpreted as netgroups or vice versa.
Cheers
--pwo
--
Peter W. Osel -- http://pwo.de/ -- pwo at pwo.de
---snip--snap-------------------------------------------------------------------
diff -ru openssh-4.7p1/match.c openssh-4.7p1_pwo0/match.c
--- openssh-4.7p1/match.c Fri Aug 4 22:39:40 2006
+++ openssh-4.7p1_pwo0/match.c Mon Sep 17 15:49:57 2007
@@ -204,6 +204,39 @@
}
/*
+ * match user in @netgroup
+ */
+int
+match_user_or_netgroup(const char *user, char *pattern)
+{
+ if(pattern[0] != '@')
+ return match_pattern(user, pattern);
+
+#ifdef HAVE_INNETGR
+ return innetgr(pattern + 1, NULL, user, NULL);
+#else
+ return 0;
+#endif
+}
+
+/*
+ * match host in @netgroup
+ */
+int
+match_host_and_ip_or_netgroup(const char *host, const char * ipaddr, char *pattern)
+{
+ if(pattern[0] != '@')
+ return match_host_and_ip(host, ipaddr, pattern);
+
+#ifdef HAVE_INNETGR
+ return innetgr(pattern + 1, host, NULL, NULL)
+ || innetgr(pattern + 1, ipaddr, NULL, NULL);
+#else
+ return 0;
+#endif
+}
+
+/*
* match user, user at host_or_ip, user at host_or_ip_list against pattern
*/
int
@@ -213,15 +246,18 @@
char *p, *pat;
int ret;
- if ((p = strchr(pattern,'@')) == NULL)
- return match_pattern(user, pattern);
+ if (strlen(pattern) < 1)
+ return 0;
+ if ((p = strchr(pattern + 1, '@')) == NULL)
+ return match_user_or_netgroup(user, pattern);
+
pat = xstrdup(pattern);
- p = strchr(pat, '@');
+ p = strchr(pat + 1, '@');
*p++ = '\0';
- if ((ret = match_pattern(user, pat)) == 1)
- ret = match_host_and_ip(host, ipaddr, p);
+ if ((ret = match_user_or_netgroup(user, pat)) == 1)
+ ret = match_host_and_ip_or_netgroup(host, ipaddr, p);
xfree(pat);
return ret;
diff -ru openssh-4.7p1/sshd_config.5 openssh-4.7p1_pwo0/sshd_config.5
--- openssh-4.7p1/sshd_config.5 Mon Jun 11 00:07:13 2007
+++ openssh-4.7p1_pwo0/sshd_config.5 Mon Sep 17 16:04:55 2007
@@ -130,7 +130,10 @@
By default, login is allowed for all users.
If the pattern takes the form USER at HOST then USER and HOST
are separately checked, restricting logins to particular
-users from particular hosts.
+users from particular hosts. If NIS or LDAP
+is available and netgroup querying is built in, either USER and
+HOST can be the name of a netgroup of users or hosts, respectively,
+prefixed with a @. Then @myusers@@myhosts is a valid entry here.
The allow/deny directives are processed in the following order:
.Cm DenyUsers ,
.Cm AllowUsers ,
@@ -268,8 +271,11 @@
By default, login is allowed for all users.
If the pattern takes the form USER at HOST then USER and HOST
are separately checked, restricting logins to particular
-users from particular hosts.
-The allow/deny directives are processed in the following order:
+users from particular hosts. If NIS or LDAP is available and
+netgroup querying is built in, either USER and HOST can be the
+name of a netgroup of users or hosts, respectively, prefixed with
+the character @ . Then e.g. @myusers@@myhosts is a valid entry
+here. The allow/deny directives are processed in the following order:
.Cm DenyUsers ,
.Cm AllowUsers ,
.Cm DenyGroups ,
---snip--snap-------------------------------------------------------------------
More information about the openssh-unix-dev
mailing list