I'm really sorry for the noise I make, didn't completely awake yet... This one is the correct one. 17.07.2014 10:29, Vladislav Bogdanov wrote: > Allow it to create keyfile not in the hardcoded location. > Drop root checks. > Minor cosmetic fixes to the man-page. > > Signed-off-by: Vladislav Bogdanov <bubble@xxxxxxxxxxxxx> > --- > man/corosync-keygen.8 | 29 +++++++++++++++++--------- > tools/corosync-keygen.c | 51 +++++++++++++++++++++------------------------- > 2 files changed, 42 insertions(+), 38 deletions(-) > > diff --git a/man/corosync-keygen.8 b/man/corosync-keygen.8 > index 5dc3f45..5aaae93 100644 > --- a/man/corosync-keygen.8 > +++ b/man/corosync-keygen.8 > @@ -35,45 +35,47 @@ > .SH NAME > corosync-keygen \- Generate an authentication key for Corosync. > .SH SYNOPSIS > -.B "corosync-keygen [\-l]" > +.B "corosync-keygen [\-k <filename>] [\-l]" > .SH DESCRIPTION > > If you want to configure corosync to use cryptographic techniques to ensure authenticity > -.br > and privacy of the messages, you will need to generate a private key. > .PP > .B corosync-keygen > -creates this key and writes it to /etc/corosync/authkey. > +creates this key and writes it to /etc/corosync/authkey or to file specified by > +-k option. > .PP > This private key must be copied to every processor in the cluster. If the > -.br > private key isn't the same for every node, those nodes with nonmatching private > -.br > keys will not be able to join the same configuration. > .PP > Copy the key to some security transportable storage or use ssh to transmit the > -.br > key from node to node. Then install the key with the command: > .PP > unix#: install -D --group=0 --owner=0 --mode=0400 /path_to_authkey/authkey /etc/corosync/authkey > .PP > If a message "Invalid digest" appears from the corosync executive, the keys > -.br > are not consistent between processors. > .PP > .B Note: corosync-keygen > will ask for user input to assist in generating entropy unless the -l option is used. > .SH OPTIONS > .TP > +.B -k <filename> > +This specifies the fully qualified path to the shared key to create. > +.br > +The default is /etc/corosync/authkey. > +.TP > .B -l > Use a less secure random data source that will not require user input to help generate > -.br > -entropy. This may be useful when this utility is used from a script. > +entropy. This may be useful when this utility is used from a script or hardware random number > +generator is not available (f.e. in virtual machine). > + > .SH EXAMPLES > .TP > Generate the key. > .PP > -$ corosync-keygen > +# corosync-keygen > .br > Corosync Cluster Engine Authentication key generator. > .br > @@ -81,6 +83,13 @@ Gathering 1024 bits for key from /dev/random. > .br > Press keys on your keyboard to generate entropy. > .br > +.PP > +$ corosync-keygen -l -k /tmp/authkey > +.br > +Corosync Cluster Engine Authentication key generator. > +.br > +Writing corosync key to /tmp/authkey. > +.br > .SH SEE ALSO > .BR corosync_overview (8), > .BR corosync.conf (5), > diff --git a/tools/corosync-keygen.c b/tools/corosync-keygen.c > index 71ea9d8..112ebaf 100644 > --- a/tools/corosync-keygen.c > +++ b/tools/corosync-keygen.c > @@ -40,16 +40,19 @@ > #include <unistd.h> > #include <fcntl.h> > #include <errno.h> > +#include <string.h> > #include <getopt.h> > #include <sys/types.h> > #include <sys/stat.h> > > #include <netinet/in.h> > > -#define KEYFILE COROSYSCONFDIR "/authkey" > +#define DEFAULT_KEYFILE COROSYSCONFDIR "/authkey" > > static const char usage[] = > - "Usage: corosync-keygen [-l]\n" > + "Usage: corosync-keygen [-k <keyfile>] [-l]\n" > + " -k / --key-file=<filename> - Write to the specified keyfile\n" > + " instead of the default " DEFAULT_KEYFILE ".\n" > " -l / --less-secure - Use a less secure random number source\n" > " (/dev/urandom) that is guaranteed not to require user\n" > " input for entropy. This can be used when this\n" > @@ -60,6 +63,7 @@ int main (int argc, char *argv[]) > { > int authkey_fd; > int random_fd; > + char *keyfile = NULL; > unsigned char key[128]; > ssize_t res; > ssize_t bytes_read; > @@ -67,14 +71,18 @@ int main (int argc, char *argv[]) > int option_index; > int less_secure = 0; > static struct option long_options[] = { > - { "less-secure", no_argument, NULL, 'l' }, > - { "help", no_argument, NULL, 'h' }, > - { 0, 0, NULL, 0 }, > + { "key-file", required_argument, NULL, 'k' }, > + { "less-secure", no_argument, NULL, 'l' }, > + { "help", no_argument, NULL, 'h' }, > + { 0, 0, NULL, 0 }, > }; > > - while ((c = getopt_long (argc, argv, "lh", > + while ((c = getopt_long (argc, argv, "k:lh", > long_options, &option_index)) != -1) { > switch (c) { > + case 'k': > + keyfile = optarg; > + break; > case 'l': > less_secure = 1; > break; > @@ -89,18 +97,13 @@ int main (int argc, char *argv[]) > } > > printf ("Corosync Cluster Engine Authentication key generator.\n"); > - if (geteuid() != 0) { > - printf ("Error: Authorization key must be generated as root user.\n"); > - exit (errno); > - } > - if (mkdir (COROSYSCONFDIR, 0700)) { > - if (errno != EEXIST) { > - perror ("Failed to create directory: " COROSYSCONFDIR); > - exit (errno); > - } > + > + if (!keyfile) { > + keyfile = (char *)DEFAULT_KEYFILE; > } > > if (less_secure) { > + printf ("Gathering %lu bits for key from /dev/urandom.\n", (unsigned long)(sizeof (key) * 8)); > random_fd = open ("/dev/urandom", O_RDONLY); > } else { > printf ("Gathering %lu bits for key from /dev/random.\n", (unsigned long)(sizeof (key) * 8)); > @@ -134,17 +137,9 @@ retry_read: > /* > * Open key > */ > - authkey_fd = open (KEYFILE, O_CREAT|O_WRONLY, 600); > + authkey_fd = open (keyfile, O_CREAT|O_WRONLY, 0600); > if (authkey_fd == -1) { > - perror ("Could not create " KEYFILE); > - exit (errno); > - } > - /* > - * Set security of authorization key to uid = 0 gid = 0 mode = 0400 > - */ > - res = fchown (authkey_fd, 0, 0); > - if (res == -1) { > - perror ("Could not fchown key to uid 0 and gid 0\n"); > + fprintf (stderr, "Could not create %s: %s", keyfile, strerror(errno)); > exit (errno); > } > if (fchmod (authkey_fd, 0400)) { > @@ -152,19 +147,19 @@ retry_read: > exit (errno); > } > > - printf ("Writing corosync key to " KEYFILE ".\n"); > + printf ("Writing corosync key to %s.\n", keyfile); > > /* > * Write key > */ > res = write (authkey_fd, key, sizeof (key)); > if (res != sizeof (key)) { > - perror ("Could not write " KEYFILE); > + fprintf (stderr, "Could not write %s: %s", keyfile, strerror(errno)); > exit (errno); > } > > if (close (authkey_fd)) { > - perror ("Could not write " KEYFILE); > + fprintf (stderr, "Could not close %s: %s", keyfile, strerror(errno)); > exit (errno); > } > > _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss