From: Stanislav Ievlev <inger@altlinux.ru> To: devel@altlinux.ru, ab@altlinux.ru Subject: [devel] RSBAC. Dynamic RC Switching Date: Mon, 18 Jun 2001 16:20:28 +0400 Message-ID: <3B2DF20C.6040601@altlinux.ru> (raw) [-- 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);
next reply other threads:[~2001-06-18 12:20 UTC|newest] Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top 2001-06-18 12:20 Stanislav Ievlev [this message] 2001-06-18 13:57 ` Alexander Bokovoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=3B2DF20C.6040601@altlinux.ru \ --to=inger@altlinux.ru \ --cc=ab@altlinux.ru \ --cc=devel@altlinux.ru \ --cc=devel@linux.iplabs.ru \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
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