Ver Fonte

Slightly rework corosync-keygen.

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@hoster-ok.com>
Reviewed-by: Jan Friesse <jfriesse@redhat.com>
Vladislav Bogdanov há 11 anos atrás
pai
commit
520fe686c5
2 ficheiros alterados com 42 adições e 38 exclusões
  1. 19 10
      man/corosync-keygen.8
  2. 23 28
      tools/corosync-keygen.c

+ 19 - 10
man/corosync-keygen.8

@@ -35,45 +35,47 @@
 .SH NAME
 .SH NAME
 corosync-keygen \- Generate an authentication key for Corosync.
 corosync-keygen \- Generate an authentication key for Corosync.
 .SH SYNOPSIS
 .SH SYNOPSIS
-.B "corosync-keygen [\-l]"
+.B "corosync-keygen [\-k <filename>] [\-l]"
 .SH DESCRIPTION
 .SH DESCRIPTION
 
 
 If you want to configure corosync to use cryptographic techniques to ensure authenticity
 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.
 and privacy of the messages, you will need to generate a private key.
 .PP
 .PP
 .B corosync-keygen
 .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
 .PP
 This private key must be copied to every processor in the cluster.  If the
 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
 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.
 keys will not be able to join the same configuration.
 .PP
 .PP
 Copy the key to some security transportable storage or use ssh to transmit the
 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:
 key from node to node.  Then install the key with the command:
 .PP
 .PP
 unix#: install -D --group=0 --owner=0 --mode=0400 /path_to_authkey/authkey /etc/corosync/authkey
 unix#: install -D --group=0 --owner=0 --mode=0400 /path_to_authkey/authkey /etc/corosync/authkey
 .PP
 .PP
 If a message "Invalid digest" appears from the corosync executive, the keys
 If a message "Invalid digest" appears from the corosync executive, the keys
-.br
 are not consistent between processors.
 are not consistent between processors.
 .PP
 .PP
 .B Note: corosync-keygen
 .B Note: corosync-keygen
 will ask for user input to assist in generating entropy unless the -l option is used.
 will ask for user input to assist in generating entropy unless the -l option is used.
 .SH OPTIONS
 .SH OPTIONS
 .TP
 .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
 .B -l
 Use a less secure random data source that will not require user input to help generate
 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
 .SH EXAMPLES
 .TP
 .TP
 Generate the key.
 Generate the key.
 .PP
 .PP
-$ corosync-keygen
+# corosync-keygen
 .br
 .br
 Corosync Cluster Engine Authentication key generator.
 Corosync Cluster Engine Authentication key generator.
 .br
 .br
@@ -81,6 +83,13 @@ Gathering 1024 bits for key from /dev/random.
 .br
 .br
 Press keys on your keyboard to generate entropy.
 Press keys on your keyboard to generate entropy.
 .br
 .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
 .SH SEE ALSO
 .BR corosync_overview (8),
 .BR corosync_overview (8),
 .BR corosync.conf (5),
 .BR corosync.conf (5),

+ 23 - 28
tools/corosync-keygen.c

@@ -40,16 +40,19 @@
 #include <unistd.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <errno.h>
+#include <string.h>
 #include <getopt.h>
 #include <getopt.h>
 #include <sys/types.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/stat.h>
 
 
 #include <netinet/in.h>
 #include <netinet/in.h>
 
 
-#define KEYFILE COROSYSCONFDIR "/authkey"
+#define DEFAULT_KEYFILE COROSYSCONFDIR "/authkey"
 
 
 static const char usage[] =
 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"
 	"     -l / --less-secure -  Use a less secure random number source\n"
 	"            (/dev/urandom) that is guaranteed not to require user\n"
 	"            (/dev/urandom) that is guaranteed not to require user\n"
 	"            input for entropy.  This can be used when this\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 authkey_fd;
 	int random_fd;
 	int random_fd;
+	char *keyfile = NULL;
 	unsigned char key[128];
 	unsigned char key[128];
 	ssize_t res;
 	ssize_t res;
 	ssize_t bytes_read;
 	ssize_t bytes_read;
@@ -67,14 +71,18 @@ int main (int argc, char *argv[])
 	int option_index;
 	int option_index;
 	int less_secure = 0;
 	int less_secure = 0;
 	static struct option long_options[] = {
 	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) {
 			long_options, &option_index)) != -1) {
 		switch (c) {
 		switch (c) {
+		case 'k':
+			keyfile = optarg;
+			break;
 		case 'l':
 		case 'l':
 			less_secure = 1;
 			less_secure = 1;
 			break;
 			break;
@@ -89,18 +97,13 @@ int main (int argc, char *argv[])
 	}
 	}
 
 
 	printf ("Corosync Cluster Engine Authentication key generator.\n");
 	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) {
 	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);
 		random_fd = open ("/dev/urandom", O_RDONLY);
 	} else {
 	} else {
 		printf ("Gathering %lu bits for key from /dev/random.\n", (unsigned long)(sizeof (key) * 8));
 		printf ("Gathering %lu bits for key from /dev/random.\n", (unsigned long)(sizeof (key) * 8));
@@ -134,17 +137,9 @@ retry_read:
 	/*
 	/*
 	 * Open key
 	 * Open key
 	 */
 	 */
-	authkey_fd = open (KEYFILE, O_CREAT|O_WRONLY, 600);
+	authkey_fd = open (keyfile, O_CREAT|O_WRONLY, 0600);
 	if (authkey_fd == -1) {
 	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);
 		exit (errno);
 	}
 	}
 	if (fchmod (authkey_fd, 0400)) {
 	if (fchmod (authkey_fd, 0400)) {
@@ -152,19 +147,19 @@ retry_read:
 		exit (errno);
 		exit (errno);
 	}
 	}
 
 
-	printf ("Writing corosync key to " KEYFILE ".\n");
+	printf ("Writing corosync key to %s.\n", keyfile);
 
 
 	/*
 	/*
 	 * Write key
 	 * Write key
 	 */
 	 */
 	res = write (authkey_fd, key, sizeof (key));
 	res = write (authkey_fd, key, sizeof (key));
 	if (res != sizeof (key)) {
 	if (res != sizeof (key)) {
-		perror ("Could not write " KEYFILE);
+		fprintf (stderr, "Could not write %s: %s", keyfile, strerror(errno));
 		exit (errno);
 		exit (errno);
 	}
 	}
 
 
 	if (close (authkey_fd)) {
 	if (close (authkey_fd)) {
-		perror ("Could not write " KEYFILE);
+		fprintf (stderr, "Could not close %s: %s", keyfile, strerror(errno));
 		exit (errno);
 		exit (errno);
 	}
 	}