On Monday 10 July 2006 19:03, Martin Simmons wrote:
> >>>>> On Sat, 8 Jul 2006 10:09:02 +0200, Kern Sibbald said:
> >
> > Hello,
> >
> > Well Martin turned out to be right. The order of the code in the
> > previous patch that I send did not at all work on Linux. I still think
> > this must be Linux bug, but I also don't think that Linus is going to
> > agree :-)
> >
> > This time I have tested the patch here. I don't know why such simple
> > things should be so complicated, because it is virtually impossible to
> > guarantee that it works correctly.
> >
> > However, I am fairly confident that this new code will solve (or at least
> > begin solving) the access problems we have been seeing when users run the
> > Dir and SD as less privileged users/groups.
> >
> > Feedback would be welcome.
>
> It doesn't quite work (on FreeBSD 4.9 at least). The problem is that the
> static pointer returned by getgrnam() is corrupted by the call to
> initgroups() and hence the call to setgid() sets the wrong group.
>
> Maybe you want to use the variable gid? :-)
Yes, good point. Many thanks. The same problem applies to uname (in some
cases) and to pw_uid. I've moved all those variables on to the stack.
Regards,
Kern
This patch will hopefully solve the problem of the group not
being correctly initialized when a Bacula daemon does a to
a new userid or a new groupid.
It can be applied to most all versions of 1.38.x but in particular
1.38.11 with the following:
cd <bacula-source>
patch -p0 <1.38.11-drop-3.patch
make
make install
...
Index: src/lib/bsys.c
===================================================================
RCS file: /cvsroot/bacula/bacula/src/lib/bsys.c,v
retrieving revision 1.42.2.4
diff -u -u -r1.42.2.4 bsys.c
--- src/lib/bsys.c 22 Dec 2005 21:35:24 -0000 1.42.2.4
+++ src/lib/bsys.c 10 Jul 2006 19:14:41 -0000
@@ -8,7 +8,7 @@
* Version $Id: bsys.c,v 1.42.2.4 2005/12/22 21:35:24 kerns Exp $
*/
/*
- Copyright (C) 2000-2005 Kern Sibbald
+ Copyright (C) 2000-2006 Kern Sibbald
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
@@ -600,38 +600,69 @@
/*
* Drop to privilege new userid and new gid if non-NULL
*/
-void drop(char *uid, char *gid)
+void drop(char *uname, char *gname)
{
-#ifdef HAVE_GRP_H
- if (gid) {
- struct group *group;
- gid_t gr_list[1];
-
- if ((group = getgrnam(gid)) == NULL) {
- Emsg1(M_ERROR_TERM, 0, _("Could not find specified group: %s\n"), gid);
- }
- if (setgid(group->gr_gid)) {
- Emsg1(M_ERROR_TERM, 0, _("Could not set specified group: %s\n"), gid);
- }
- gr_list[0] = group->gr_gid;
- if (setgroups(1, gr_list)) {
- Emsg1(M_ERROR_TERM, 0, _("Could not set specified group: %s\n"), gid);
- }
+#if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
+ struct passwd *passw = NULL;
+ struct group *group = NULL;
+ gid_t gid;
+ uid_t uid;
+ char username[1000];
+
+ Dmsg2(900, "uname=%s gname=%s\n", uname?uname:"NONE", gname?gname:"NONE");
+ if (!uname && !gname) {
+ return; /* Nothing to do */
}
-#endif
-#ifdef HAVE_PWD_H
- if (uid) {
- struct passwd *passw;
- if ((passw = getpwnam(uid)) == NULL) {
- Emsg1(M_ERROR_TERM, 0, _("Could not find specified userid: %s\n"), uid);
+ if (uname) {
+ if ((passw = getpwnam(uname)) == NULL) {
+ berrno be;
+ Emsg2(M_ERROR_TERM, 0, _("Could not find userid=%s: ERR=%s\n"), uname,
+ be.strerror());
}
- if (setuid(passw->pw_uid)) {
- Emsg1(M_ERROR_TERM, 0, _("Could not set specified userid: %s\n"), uid);
+ } else {
+ if ((passw = getpwuid(getuid())) == NULL) {
+ berrno be;
+ Emsg1(M_ERROR_TERM, 0, _("Could not find password entry. ERR=%s\n"),
+ be.strerror());
+ } else {
+ uname = passw->pw_name;
+ }
+ }
+ /* Any OS uname pointer may get overwritten, so save name, uid, and gid */
+ bstrncpy(username, uname, sizeof(username));
+ uid = passw->pw_uid;
+ gid = passw->pw_gid;
+ if (gname) {
+ if ((group = getgrnam(gname)) == NULL) {
+ berrno be;
+ Emsg2(M_ERROR_TERM, 0, _("Could not find group=%s: ERR=%s\n"), gname,
+ be.strerror());
}
+ gid = group->gr_gid;
+ }
+ if (initgroups(username, gid)) {
+ berrno be;
+ if (gname) {
+ Emsg3(M_ERROR_TERM, 0, _("Could not initgroups for group=%s, userid=%s: ERR=%s\n"),
+ gname, username, be.strerror());
+ } else {
+ Emsg2(M_ERROR_TERM, 0, _("Could not initgroups for userid=%s: ERR=%s\n"),
+ username, be.strerror());
+ }
+ }
+ if (gname) {
+ if (setgid(gid)) {
+ berrno be;
+ Emsg2(M_ERROR_TERM, 0, _("Could not set group=%s: ERR=%s\n"), gname,
+ be.strerror());
+ }
+ }
+ if (setuid(uid)) {
+ berrno be;
+ Emsg1(M_ERROR_TERM, 0, _("Could not set specified userid: %s\n"), username);
}
#endif
-
}
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Bacula-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bacula-users