Jan, 16.07.2014 18:05, Jan Friesse wrote: > Vladislav, > > >> Hi Jan, >> >> 16.07.2014 17:18, Jan Friesse wrote: >>> Vladislav, >>> again, nice idea, but. I would rather see use of CLI option + comments >>> inside. >> >> I thought about that, but decided to go the same way >> corosync_overview(8) describes. Otherwise I'd need to patch main.c for > > Honestly, I don't see any relation between corosync-keygen and > corosync_overview. In corosync_overview, it's clear: > > The *corosync executive process* uses four environment variables *during > startup*. Two btw. > > corosync-keygen is just totally different tool. You can generate key on > your own (dd) or (and this is usually the case) you just copy from other > node. > >> consistency and thus possibly change functionality someone already uses. > > I believe this is acceptable inconsistency. Actually, using key > generator with given keyfile is just ... weird. It's like dd taking > parameter from env. Ok. Are + if (geteuid() != 0 && !keyfile) { and + if (geteuid() == 0) { + res = fchown (authkey_fd, 0, 0); ok for you? > > Regards, > Honza > >> >>> >>> >>> Vladislav Bogdanov napsal(a): >>>> Signed-off-by: Vladislav Bogdanov <bubble@xxxxxxxxxxxxx> >>>> --- >>>> man/corosync-keygen.8 | 27 +++++++++++++++++++-------- >>>> tools/corosync-keygen.c | 38 ++++++++++++++++++++++---------------- >>>> 2 files changed, 41 insertions(+), 24 deletions(-) >>>> >>>> diff --git a/man/corosync-keygen.8 b/man/corosync-keygen.8 >>>> index 5dc3f45..71ca40e 100644 >>>> --- a/man/corosync-keygen.8 >>>> +++ b/man/corosync-keygen.8 >>>> @@ -39,26 +39,22 @@ corosync-keygen \- Generate an authentication key for Corosync. >>>> .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 >>>> +COROSYNC_TOTEM_AUTHKEY_FILE environment variable. >>>> .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 >>>> @@ -67,13 +63,21 @@ will ask for user input to assist in generating entropy unless the -l option is >>>> .TP >>>> .B -l >>>> Use a less secure random data source that will not require user input to help generate >>>> +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 ENVIRONMENT VARIABLES >>>> +.TP >>>> +COROSYNC_TOTEM_AUTHKEY_FILE >>>> +This specifies the fully qualified path to the shared key to create. >>>> .br >>>> -entropy. This may be useful when this utility is used from a script. >>>> + >>>> +The default is /etc/corosync/authkey. >>>> + >>>> .SH EXAMPLES >>>> .TP >>>> Generate the key. >>>> .PP >>>> -$ corosync-keygen >>>> +# corosync-keygen >>>> .br >>>> Corosync Cluster Engine Authentication key generator. >>>> .br >>>> @@ -81,6 +85,13 @@ Gathering 1024 bits for key from /dev/random. >>>> .br >>>> Press keys on your keyboard to generate entropy. >>>> .br >>>> +.PP >>>> +$ COROSYNC_TOTEM_AUTHKEY_FILE=/tmp/authkey corosync-keygen -l >>>> +.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..519e8d9 100644 >>>> --- a/tools/corosync-keygen.c >>>> +++ b/tools/corosync-keygen.c >>>> @@ -40,14 +40,13 @@ >>>> #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" >>>> - >>>> static const char usage[] = >>>> "Usage: corosync-keygen [-l]\n" >>>> " -l / --less-secure - Use a less secure random number source\n" >>>> @@ -60,6 +59,7 @@ int main (int argc, char *argv[]) >>>> { >>>> int authkey_fd; >>>> int random_fd; >>>> + const char *keyfile = getenv("COROSYNC_TOTEM_AUTHKEY_FILE"); >>>> unsigned char key[128]; >>>> ssize_t res; >>>> ssize_t bytes_read; >>>> @@ -89,14 +89,18 @@ int main (int argc, char *argv[]) >>>> } >>>> >>>> printf ("Corosync Cluster Engine Authentication key generator.\n"); >>>> - if (geteuid() != 0) { >>>> + if (geteuid() != 0 && !keyfile) { >>>> 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 = COROSYSCONFDIR "/authkey"; >>>> + if (mkdir (COROSYSCONFDIR, 0700)) { >>>> + if (errno != EEXIST) { >>>> + perror ("Failed to create directory: " COROSYSCONFDIR); >>>> + exit (errno); >>>> + } >>>> } >>>> } >>>> >>>> @@ -134,37 +138,39 @@ 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); >>>> + fprintf (stderr, "Could not create %s: %s", keyfile, strerror(errno)); >>>> 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"); >>>> - exit (errno); >>>> + if (geteuid() == 0) { >>>> + res = fchown (authkey_fd, 0, 0); >>>> + if (res == -1) { >>>> + perror ("Could not fchown key to uid 0 and gid 0\n"); >>>> + exit (errno); >>>> + } >>>> } >>>> if (fchmod (authkey_fd, 0400)) { >>>> perror ("Failed to set key file permissions to 0400\n"); >>>> 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); >>> >>> Please use err/errx (see errx(3)) instead of fprintf and exit (err does >>> this in one function, and it's standard). >>> >>> Please DO not use errno as return code. Errno (potentially) can be > >>> 127. Error code > 127 is used when signal arrived (this is not the case >>> here). >>> >>> Regards, >>> Honza >>> >>> >>>> } >>>> >>>> if (close (authkey_fd)) { >>>> - perror ("Could not write " KEYFILE); >>>> + fprintf (stderr, "Could not write %s: %s", keyfile, strerror(errno)); >>>> exit (errno); >>>> } >>>> >>>> >>> >> > _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss