ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] RSBAC. Dynamic RC Switching
@ 2001-06-18 12:20 Stanislav Ievlev
  2001-06-18 13:57 ` Alexander Bokovoy
  0 siblings, 1 reply; 2+ messages in thread
From: Stanislav Ievlev @ 2001-06-18 12:20 UTC (permalink / raw)
  To: devel, ab

[-- Attachment #1: Type: text/plain, Size: 1299 bytes --]

Были разговоры о возможности динамического изменения ролей процессами 
(это требуется например apache)

Вот первый вариант.

Ранеепри попытке смены роли у процесса проверялось:
1.) Есть ли право на  изменение?( Право R_MODIFY_ATTRIBUTE - Type Comp 
Process/General Process)
1.1) Если есть, то состоит ли назначаемая роль в списке Assign Roles у 
назначающей роли? Если да, то можно.
2. )Является данная роль администрирующей? Если да, то можно

3. )Если ничего не проходит - нельзя.

Добавляется следующая возможность:
1.2.) Если производится смена роли у процесса (и только у процесса) и 
процесс меняет роль у себя (и только у себя) и если новая роль числится 
в списке Assign Roles - то можно.

----------------------
Прилагается тестовый пример (чтобы процесс мог прочитать свою роль - 
необходимо включить право READ_ATTRIBUTE вType Comp  Process/General 
Process) - собирается с "CFLAGS = -I/usr/src/linux/include -DCONFIG_RSBAC"

Проверяется:
a)установка допустимой роли
b)установка недопустимой проли
c)установка роли на недопустимый процесс.
------------------------
Прилагается патч к последнему RSBAC'чному ядру. Патчится   функция 
rsbac_adf_request_rc в районе проверки "R_MODIFY_ATTRIBUTE:/case A_rc_role:"

----------------------------------
Удачных исследований.

Станислав Иевлев.


[-- Attachment #2: test.c --]
[-- Type: text/plain, Size: 2731 bytes --]

#include <stdio.h>
#include <stdlib.h>
#include <rsbac/types.h>
#include <rsbac/rc_data_structures.h>
#include <rsbac/getname.h>
#include <rsbac/rc_getname.h>
#include <rsbac/syscalls.h>
#include <rsbac/error.h>
#include <rsbac/helpers.h>
main()
{
    int res,parent_pid,child_pid;
    int new_role=4,old_role,wrong_role=0;
    union rsbac_attribute_value_t value;
    union rsbac_target_id_t tid;
    enum rsbac_attribute_t attr;
      
    /*get current process's role ID*/
    parent_pid=getpid();
    tid.process=parent_pid;
    res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
    old_role=value.u_char_dummy;
    printf("%i My RC Role: %u\n",res,value.u_char_dummy);
    
    /*try to set new role*/
    value.dummy=new_role;
    res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
    printf("Setting new role %u to process - (GRANTED)\n",value);
    /*get current process role ID*/
    res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
    printf("%i My RC Role: %u\n",res,value.u_char_dummy);
    
    /*try to set wrong role*/
    value.dummy=wrong_role;
    res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
    printf("Setting new role %u to process - (NOT GRANTED)\n",value);
    /*get current process role ID*/
    res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
    printf("%i My RC Role: %u\n",res,value.u_char_dummy);
    
    /*try to set previous role*/
    value.dummy=old_role;
    res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
    printf("Setting previos role %u to process - (GRANTED)\n",value);
    /*get current process role ID*/
    res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
    printf("%i My RC Role: %u\n",res,value.u_char_dummy);
    
    if(fork()==0)
    {	
	child_pid=getpid();
	/*this is a child process*/
	printf("child pid: %u parent pid: %u\n",child_pid,parent_pid);
	
	/*get current settings*/
	tid.process=child_pid;
	res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
	printf("%i Child RC Role: %u\n",res,value.u_char_dummy);

	/*try to set new role to father*/
	tid.process=parent_pid;
	value.dummy=new_role;
	res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
	printf("Setting new role %u to Father - (NOT GRANTED)\n",value);
	/*get current process role ID*/
	res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
	printf("%i Parent RC Role: %u\n",res,value.u_char_dummy);

	/*try to set own new role */
	tid.process=child_pid;
	value.dummy=new_role;
	res=rsbac_set_attr(T_PROCESS,&tid,A_rc_role,&value);
	printf("Setting own new role %u  - (GRANTED)\n",value);
	/*get current process role ID*/
	res=rsbac_get_attr(T_PROCESS,&tid,A_rc_role,&value,0);
	printf("%i Child RC Role: %u\n",res,value.u_char_dummy);
    }else{
	wait(&res);
    }
}

[-- Attachment #3: rsbac-rcswitch.patch --]
[-- Type: text/plain, Size: 730 bytes --]

--- linux/rsbac/adf/rc/rc_main.c.orig	Fri Apr 27 17:09:34 2001
+++ linux/rsbac/adf/rc/rc_main.c	Mon Jun 18 14:41:24 2001
@@ -981,6 +981,12 @@
                         if (!(err=rsbac_rc_test_assign_roles(target, tid, attr, attr_val.rc_role)))
                           return(GRANTED);
                       }
+		    /*New checks for Dynamic Role Switching*/
+		    if ( (target==T_PROCESS)&&(tid.process==caller_pid) )
+		      {
+		        if (!(err=rsbac_rc_test_assign_roles(target, tid, attr, attr_val.rc_role)))
+                          return(GRANTED);
+		      }
                     /* Classical admin_type check */
                     if (rsbac_rc_test_role_admin(TRUE))
                       return(NOT_GRANTED);

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [devel] RSBAC. Dynamic RC Switching
  2001-06-18 12:20 [devel] RSBAC. Dynamic RC Switching Stanislav Ievlev
@ 2001-06-18 13:57 ` Alexander Bokovoy
  0 siblings, 0 replies; 2+ messages in thread
From: Alexander Bokovoy @ 2001-06-18 13:57 UTC (permalink / raw)
  To: devel

On Mon, Jun 18, 2001 at 04:20:28PM +0400, Stanislav Ievlev wrote:
> Были разговоры о возможности динамического изменения ролей процессами 
> (это требуется например apache)
> 
> Вот первый вариант.
> 
> Ранеепри попытке смены роли у процесса проверялось:
> 1.) Есть ли право на  изменение?( Право R_MODIFY_ATTRIBUTE - Type Comp 
> Process/General Process)
> 1.1) Если есть, то состоит ли назначаемая роль в списке Assign Roles у 
> назначающей роли? Если да, то можно.
> 2. )Является данная роль администрирующей? Если да, то можно
> 
> 3. )Если ничего не проходит - нельзя.
> 
> Добавляется следующая возможность:
> 1.2.) Если производится смена роли у процесса (и только у процесса) и 
> процесс меняет роль у себя (и только у себя) и если новая роль числится 
> в списке Assign Roles - то можно.
Навскидку это не добавляет неприятностей, но по крайней мере позволяет
Апачу переключаться. К сожалению, пока что протестировать предложенный
вариант у меня нет возможности, но обязательно это сделаю, как только
разберусь с системой на новом месте :-)

--
Sincerely yours, Alexander Bokovoy 
  The Midgard Project   | www.midgard-project.org | ALT Linux Team
Minsk Linux Users Group |    www.minsk-lug.net    | www.altlinux.ru
-- Life is the childhood of our immortality.
		-- Goethe
_______________________________________________
Devel mailing list
Devel@linux.iplabs.ru
http://www.logic.ru/mailman/listinfo/devel


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2001-06-18 13:57 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-06-18 12:20 [devel] RSBAC. Dynamic RC Switching Stanislav Ievlev
2001-06-18 13:57 ` Alexander Bokovoy

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git