Jan,
17.07.2014 09:31, Jan Friesse wrote:
> Vladislav
>
>
>> 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?
>
> I'm not exactly sure what you mean, but I will try to express my opinion.
>
> First test of root can be removed completely. /etc/corosync directory is
> writable only for root, so non-root user will get messages about unable
> to write file. I don't understand why this code was there.
Me too.
>
> Second test + fchown seems again useless. I mean, if tool is executed by
> root, file will be owned by root. If not, then nothing happens.
Exactly.
>
> I want to make sure that you've understand that I'm not criticizing your
> work. Actually, I'm really really happy that somebody look to this code
> which was there for AGES without any change. And because you are
> changing code anyway, I would like to change it properly + remove old
> meaningless dust.
Sure, I understand. I'm in the same boat.
Stay tuned.
Best,
Vladislav
>
> Thanks,
> Honza
>
>>
>>>
>>> Regards,
>>> Honza
>>>
>>>>
>>>>>
>>>>>
>>>>> Vladislav Bogdanov napsal(a):
>>>>>> Signed-off-by: Vladislav Bogdanov <[email protected]>
>>>>>> ---
>>>>>> 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
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss