From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <3B2DF20C.6040601@altlinux.ru> From: Stanislav Ievlev User-Agent: Mozilla/5.0 (X11; U; Linux 2.4.5-alt3-up i686; en-US; rv:0.9) Gecko/20010522 X-Accept-Language: en MIME-Version: 1.0 To: devel@altlinux.ru, ab@altlinux.ru Content-Type: multipart/mixed; boundary="------------080809070009020600080409" Subject: [devel] RSBAC. Dynamic RC Switching Sender: devel-admin@linux.iplabs.ru Errors-To: devel-admin@linux.iplabs.ru X-BeenThere: devel@linux.iplabs.ru X-Mailman-Version: 2.0 Precedence: bulk Reply-To: devel@linux.iplabs.ru List-Help: List-Post: List-Subscribe: , List-Id: IPLabs Linux Team Developers mailing list List-Unsubscribe: , List-Archive: X-Original-Date: Mon, 18 Jun 2001 16:20:28 +0400 Date: Mon, 18 Jun 2001 16:20:28 +0400 Archived-At: List-Archive: List-Post: This is a multi-part message in MIME format. --------------080809070009020600080409 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit Были разговоры о возможности динамического изменения ролей процессами (это требуется например 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:" ---------------------------------- Удачных исследований. Станислав Иевлев. --------------080809070009020600080409 Content-Type: text/plain; name="test.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="test.c" #include #include #include #include #include #include #include #include #include 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); } } --------------080809070009020600080409 Content-Type: text/plain; name="rsbac-rcswitch.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="rsbac-rcswitch.patch" --- 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); --------------080809070009020600080409-- _______________________________________________ Devel mailing list Devel@linux.iplabs.ru http://www.logic.ru/mailman/listinfo/devel