]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Add flag to not change e{u,g}id on startup and run as unprivileged user
authorLou Berger <lberger@labn.net>
Tue, 6 Sep 2016 14:52:31 +0000 (10:52 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 9 Sep 2016 20:06:59 +0000 (16:06 -0400)
* bgp_main.c: add -S / --skip_runas flag to not change effective user/group
  on start up.  Enables bgpd to be run by unprivileged user.

bgpd/bgp_main.c
doc/bgpd.8

index 54e732977247391bf9864072c5607d55308ec391..5ef8154faf5f91c50690b621365ca733d81ffbf1 100644 (file)
@@ -68,6 +68,7 @@ static const struct option longopts[] =
   { "no_kernel",   no_argument,       NULL, 'n'},
   { "user",        required_argument, NULL, 'u'},
   { "group",       required_argument, NULL, 'g'},
+  { "skip_runas",  no_argument,       NULL, 'S'},
   { "version",     no_argument,       NULL, 'v'},
   { "dryrun",      no_argument,       NULL, 'C'},
   { "help",        no_argument,       NULL, 'h'},
@@ -163,6 +164,7 @@ redistribution between different routing protocols.\n\n\
 -n, --no_kernel    Do not install route to kernel.\n\
 -u, --user         User to run as\n\
 -g, --group        Group to run as\n\
+-S, --skip_runas   Skip user and group run as\n\
 -v, --version      Print program version\n\
 -C, --dryrun       Check configuration for validity and exit\n\
 -h, --help         Display this help and exit\n\
@@ -200,9 +202,12 @@ sigint (void)
   zlog_notice ("Terminating on signal");
 
   if (! retain_mode)
-    bgp_terminate ();
+    {
+      bgp_terminate ();
+      if (bgpd_privs.user)      /* NULL if skip_runas flag set */
+        zprivs_terminate (&bgpd_privs);
+    }
 
-  zprivs_terminate (&bgpd_privs);
   bgp_exit (0);
 
   exit (0);
@@ -408,6 +413,7 @@ main (int argc, char **argv)
   char *progname;
   struct thread thread;
   int tmp_port;
+  int skip_runas = 0;
 
   /* Set umask before anything for security */
   umask (0027);
@@ -421,7 +427,7 @@ main (int argc, char **argv)
   /* Command line argument treatment. */
   while (1) 
     {
-      opt = getopt_long (argc, argv, "df:i:z:hp:l:A:P:rnu:g:vC", longopts, 0);
+      opt = getopt_long (argc, argv, "df:i:z:hp:l:A:P:rnu:g:vCS", longopts, 0);
     
       if (opt == EOF)
        break;
@@ -479,6 +485,9 @@ main (int argc, char **argv)
        case 'g':
          bgpd_privs.group = optarg;
          break;
+       case 'S':   /* skip run as = override bgpd_privs */
+          skip_runas = 1;
+         break;
        case 'v':
          print_version (progname);
          exit (0);
@@ -497,7 +506,11 @@ main (int argc, char **argv)
 
   zlog_default = openzlog (progname, ZLOG_BGP, 0,
                           LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
+
+  if (skip_runas)
+    memset (&bgpd_privs, 0, sizeof (bgpd_privs));
   zprivs_init (&bgpd_privs);
+
 #if defined(HAVE_CUMULUS)
   zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl);
 #endif
index 67143c2c59f4b593c903c7a6c2edb2ea4d39664c..7e90eaec5b30c694f34377ffb005ec0b10496a78 100644 (file)
@@ -6,7 +6,7 @@ software
 .SH SYNOPSIS
 .B bgpd
 [
-.B \-dhrv
+.B \-dhrSv
 ] [
 .B \-f
 .I config-file
@@ -74,6 +74,9 @@ Specify the user to run as. Default is \fIquagga\fR.
 \fB\-r\fR, \fB\-\-retain\fR 
 When the program terminates, retain routes added by \fBbgpd\fR.
 .TP
+\fB\-S\fR, \fB\-\-skip_runas\fR
+Skip setting the process effective user and group.
+.TP
 \fB\-v\fR, \fB\-\-version\fR
 Print the version and exit.
 .SH FILES