소스 검색

Remove requirement of having uid and gid of "ais" on the system and allow
nonroot users to access ipc if their uid/gid is in the /etc/corosync/uidgid.d
directory.


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2261 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 16 년 전
부모
커밋
bc87f196f7
5개의 변경된 파일21개의 추가작업 그리고 93개의 파일을 삭제
  1. 7 8
      exec/main.c
  2. 9 44
      exec/mainconfig.c
  3. 2 15
      exec/mainconfig.h
  4. 1 18
      man/corosync.conf.5
  5. 2 8
      man/corosync_overview.8

+ 7 - 8
exec/main.c

@@ -117,8 +117,6 @@ static struct objdb_iface_ver0 *objdb = NULL;
 
 
 static struct corosync_api_v1 *api = NULL;
 static struct corosync_api_v1 *api = NULL;
 
 
-static struct ug_config ug_config;
-
 unsigned long long *(*main_clm_get_by_nodeid) (unsigned int node_id);
 unsigned long long *(*main_clm_get_by_nodeid) (unsigned int node_id);
 
 
 hdb_handle_t corosync_poll_handle;
 hdb_handle_t corosync_poll_handle;
@@ -276,9 +274,7 @@ static void confchg_fn (
 
 
 static void priv_drop (void)
 static void priv_drop (void)
 {
 {
-return; /* TODO: we are still not dropping privs */
-	setuid (ug_config.uid);
-	setegid (ug_config.gid);
+	return; /* TODO: we are still not dropping privs */
 }
 }
 
 
 static void corosync_tty_detach (void)
 static void corosync_tty_detach (void)
@@ -486,8 +482,11 @@ static int corosync_security_valid (int euid, int egid)
 		return (1);
 		return (1);
 	}
 	}
 
 
-	for (iter = ug_config.uidgid_list.next; iter != &ug_config.uidgid_list; iter = iter->next) {
-		struct uidgid_item *ugi = list_entry (iter, struct uidgid_item, list);
+	for (iter = uidgid_list_head.next; iter != &uidgid_list_head;
+		iter = iter->next) {
+
+		struct uidgid_item *ugi = list_entry (iter, struct uidgid_item,
+			list);
 
 
 		if (euid == ugi->uid || egid == ugi->gid)
 		if (euid == ugi->uid || egid == ugi->gid)
 			return (1);
 			return (1);
@@ -786,7 +785,7 @@ int main (int argc, char **argv)
 	}
 	}
 	free(config_iface);
 	free(config_iface);
 
 
-	res = corosync_main_config_read (objdb, &error_string, &ug_config);
+	res = corosync_main_config_read (objdb, &error_string);
 	if (res == -1) {
 	if (res == -1) {
 		/*
 		/*
 		 * if we are here, we _must_ flush the logsys queue
 		 * if we are here, we _must_ flush the logsys queue

+ 9 - 44
exec/mainconfig.c

@@ -55,8 +55,12 @@
 #include "mainconfig.h"
 #include "mainconfig.h"
 
 
 static char error_string_response[512];
 static char error_string_response[512];
+
 static struct objdb_iface_ver0 *global_objdb;
 static struct objdb_iface_ver0 *global_objdb;
 
 
+DECLARE_LIST_INIT(uidgid_list_head);
+
+
 /* This just makes the code below a little neater */
 /* This just makes the code below a little neater */
 static inline int objdb_get_string (
 static inline int objdb_get_string (
 	const struct objdb_iface_ver0 *objdb,
 	const struct objdb_iface_ver0 *objdb,
@@ -642,8 +646,7 @@ static void add_logsys_config_notification(
 
 
 static int corosync_main_config_read_uidgid (
 static int corosync_main_config_read_uidgid (
 	struct objdb_iface_ver0 *objdb,
 	struct objdb_iface_ver0 *objdb,
-	const char **error_string,
-	struct ug_config *ug_config)
+	const char **error_string)
 {
 {
 	hdb_handle_t object_find_handle;
 	hdb_handle_t object_find_handle;
 	hdb_handle_t object_service_handle;
 	hdb_handle_t object_service_handle;
@@ -651,8 +654,6 @@ static int corosync_main_config_read_uidgid (
 	int uid, gid;
 	int uid, gid;
 	struct uidgid_item *ugi;
 	struct uidgid_item *ugi;
 
 
-	list_init (&ug_config->uidgid_list);
-
 	objdb->object_find_create (
 	objdb->object_find_create (
 		OBJECT_PARENT_HANDLE,
 		OBJECT_PARENT_HANDLE,
 		"uidgid",
 		"uidgid",
@@ -680,7 +681,8 @@ static int corosync_main_config_read_uidgid (
 			}
 			}
 			ugi->uid = uid;
 			ugi->uid = uid;
 			ugi->gid = gid;
 			ugi->gid = gid;
-			list_add (&ugi->list, &ug_config->uidgid_list);
+			list_init (&ugi->list);
+			list_add (&ugi->list, &uidgid_list_head);
 		}
 		}
 	}
 	}
 	objdb->object_find_destroy (object_find_handle);
 	objdb->object_find_destroy (object_find_handle);
@@ -690,53 +692,16 @@ static int corosync_main_config_read_uidgid (
 
 
 int corosync_main_config_read (
 int corosync_main_config_read (
 	struct objdb_iface_ver0 *objdb,
 	struct objdb_iface_ver0 *objdb,
-	const char **error_string,
-	struct ug_config *ug_config)
+	const char **error_string)
 {
 {
-	hdb_handle_t object_service_handle;
-	char *value;
 	const char *error_reason = error_string_response;
 	const char *error_reason = error_string_response;
-	hdb_handle_t object_find_handle;
-
-	memset (ug_config, 0, sizeof (struct ug_config));
 
 
 	if (corosync_main_config_read_logging(objdb, error_string) < 0) {
 	if (corosync_main_config_read_logging(objdb, error_string) < 0) {
 		error_reason = *error_string;
 		error_reason = *error_string;
 		goto parse_error;
 		goto parse_error;
 	}
 	}
 
 
-	ug_config->uid = -1;
-	ug_config->gid = -1;
-
-	objdb->object_find_create (
-		OBJECT_PARENT_HANDLE,
-		"aisexec",
-		strlen ("aisexec"),
-		&object_find_handle);
-
-	if (objdb->object_find_next (
-		object_find_handle,
-		&object_service_handle) == 0) {
-
-		if (!objdb_get_string (objdb,object_service_handle, "user", &value)) {
-			ug_config->uid = uid_determine(value);
-		}
-
-		if (!objdb_get_string (objdb,object_service_handle, "group", &value)) {
-			ug_config->gid = gid_determine(value);
-		}
-	}
-
-	objdb->object_find_destroy (object_find_handle);
-
-	if (ug_config->uid < 0) {
-		ug_config->uid = uid_determine("ais");
-	}
-	if (ug_config->gid < 0) {
-		ug_config->gid = gid_determine("ais");
-	}
-
-	corosync_main_config_read_uidgid (objdb, error_string, ug_config);
+	corosync_main_config_read_uidgid (objdb, error_string);
 
 
 	add_logsys_config_notification(objdb);
 	add_logsys_config_notification(objdb);
 
 

+ 2 - 15
exec/mainconfig.h

@@ -59,23 +59,10 @@ struct uidgid_item {
 	int gid;
 	int gid;
 };
 };
 
 
-struct ug_config {
-	/*
-	 * user/group to run as
-	 */
-	int uid;
-	int gid;
-
-	/*
-	 * Allowed users/group to connect. This is of type uidgid item.
-	 */
-	struct list_head uidgid_list;
-};
-
+extern struct list_head uidgid_list_head;
 
 
 extern int corosync_main_config_read (
 extern int corosync_main_config_read (
 	struct objdb_iface_ver0 *objdb,
 	struct objdb_iface_ver0 *objdb,
-	const char **error_string,
-	struct ug_config *ug_config);
+	const char **error_string);
 
 
 #endif /* MAINCONFIG_H_DEFINED */
 #endif /* MAINCONFIG_H_DEFINED */

+ 1 - 18
man/corosync.conf.5

@@ -1,6 +1,6 @@
 .\"/*
 .\"/*
 .\" * Copyright (c) 2005 MontaVista Software, Inc.
 .\" * Copyright (c) 2005 MontaVista Software, Inc.
-.\" * Copyright (c) 2006 Red Hat, Inc.
+.\" * Copyright (c) 2006-2009 Red Hat, Inc.
 .\" *
 .\" *
 .\" * All rights reserved.
 .\" * All rights reserved.
 .\" *
 .\" *
@@ -55,9 +55,6 @@ This top level directive contains configuration options for logging.
 .TP
 .TP
 event { }
 event { }
 This top level directive contains configuration options for the event service.
 This top level directive contains configuration options for the event service.
-.TP
-aisexec { }
-This top level directive contains configuration options for user privilegies.
 
 
 .PP
 .PP
 .PP
 .PP
@@ -537,20 +534,6 @@ This specifies the subsystem identity (name) for which logging is specified. Thi
 name used by a service in the log_init () call. E.g. 'CKPT'. This directive is
 name used by a service in the log_init () call. E.g. 'CKPT'. This directive is
 required.
 required.
 
 
-.PP
-Within the
-.B aisexec
-directive, there are two configuration options which are all optional:
-.TP
-user
-.TP
-group
-These specify the user and group, which is able to run and use corosync.
-In any case, this is able to do root:root. But if you don't want run
-corosync as root, you can use this directives.
-
-The default is ais.
-
 .SH "FILES"
 .SH "FILES"
 .TP
 .TP
 /etc/corosync.conf
 /etc/corosync.conf

+ 2 - 8
man/corosync_overview.8

@@ -1,6 +1,6 @@
 .\"/*
 .\"/*
 .\" * Copyright (c) 2005 MontaVista Software, Inc.
 .\" * Copyright (c) 2005 MontaVista Software, Inc.
-.\" * Copyright (c) 2006 Red Hat, Inc.
+.\" * Copyright (c) 2006-2009 Red Hat, Inc.
 .\" *
 .\" *
 .\" * All rights reserved.
 .\" * All rights reserved.
 .\" *
 .\" *
@@ -86,7 +86,7 @@ which make virtual synchrony ideal for developing distributed applications.
 
 
 .SH QUICKSTART
 .SH QUICKSTART
 The corosync executive must be configured.  In the directory conf in the
 The corosync executive must be configured.  In the directory conf in the
-source distribution are several files that must be copied to the /etc/ais
+source distribution are several files that must be copied to the /etc/corosync
 directory.  If corosync is packaged by a distro, this may be complete.
 directory.  If corosync is packaged by a distro, this may be complete.
 
 
 The directory contains the file corosync.conf.  Please read the corosync.conf(5)
 The directory contains the file corosync.conf.  Please read the corosync.conf(5)
@@ -94,12 +94,6 @@ man page for details on the configuration options.  The corosync project will
 work out of the box with the default configuration options, although the
 work out of the box with the default configuration options, although the
 administrator may desire different options.
 administrator may desire different options.
 
 
-An user and group of the name "ais" must be added to the system.  If corosync
-is packaged from a distro, this step should already be completed.
-This can be achieved by executing:
-
-[root@slickdeal root]# adduser ais -g ais
-
 The corosync executive uses cryptographic techniques to ensure authenticity
 The corosync executive uses cryptographic techniques to ensure authenticity
 and privacy of the messages.  In order for corosync to be secure and operate,
 and privacy of the messages.  In order for corosync to be secure and operate,
 a private key must be generated and shared to all processors.
 a private key must be generated and shared to all processors.