De praktijk

Laten we eens stellen dat we een speciaal systeem hebben, waarop we een aantal programma's hebben draaien die alleen maar door de gebruiker henk gestart mogen worden. Hoe kunnen we dit realiseren?

Hieronder volgt stap voor stap hoe dit kan worden gedaan. Ik maak zoveel mogelijk gebruik van command line tools, zodat u die al doende ook leert kennen.

  1. Log aan als security officer

  2. U maakt nu eerst een paar surrogaat-executables. Zet deze in een eigen directory, bijvoorbeeld /tmp/untouchables en plaats daarin twee scriptjes: daag en hallo genaamd. Beide scripts zijn identiek, zie de navolgende listing:
    #!/bin/bash
    basename $0
    exit 0  

  3. Middels een chmod +x maken we de beide scripts uitvoerbaar. Dat testen we uiteraard ook even door beide scripts te runnen. Een paar hartelijke groeten zijn het resultaat.

  4. Nu voegen we (nog steeds ingelogged als security officer) een nieuwe categorie File/Directories toe, die we binnen het RC model kunnen gebruiken. Eerst zoeken we uit welke categorieën al binnen RSBAC bekend zijn:
     
    secoff:~ > rc_get_item list_used_fd_types
    00 General_FD
    01 Security_FD
    02 System_FD
    secoff:~ > _
    We zien dat op een 'schoon' RSBAC systeem er 3 File/directory typen zijn gedefinieerd. Elk van hen wordt met een nummertje en een naam aangegeven. Het eerstvolgende vrije nummer is 3. Dat nummer gebruiken we nu om een nieuwe categorie met de door ons zelf verzonnen naam 'Executables' toe te voegen:
     
    secoff:~ > rc_set_item TYPE 03 type_fd_name 'Executables'

  5. Herinnert u zich: elke gebruiker (programma, proces) heeft binnen het RC model een bepaalde rol. Wat niet expliciet is toegestaan is verboden. Dat houdt in dat initieel geen enkele rol rechten heeft op objecten van het zojuist door ons gedefinieerde type - dus kan nu niemand meer bij deze objecten. Om dat eens te testen maken we de directory (en daarmee alle bestanden daaronder) waar onze scripts in staan nu van het type 'Executables'. Ook hier moeten we weer het nummertje gebruiken:
    secoff:~ > attr_set_fd FD rc_type_fd 03 /tmp/untouchables 

  6. Om aan te tonen dat zelfs root nu zijn (al)macht verloren heeft probeert u nu als root de scripts nog eens te runnen. Het is aardig om daarbij in een tweede sessie het logfile /var/log/messages te bekijken met een tail -f.
    root:~  # /tmp/untouchables/daag
    bash: /tmp/untouchables/daag: Operation not permitted
    root:~  # _
    Ook als welke andere gebruiker dan ook zal het niet werken, probeert u rustig zoveel u wilt. In het logfile zien we:
    Apr 29 20:41:27 localhost kernel: rsbac_adf_request(): \
        request SEARCH, caller_pid 12111, caller_prog_name bash, caller_uid 0, \
        target-type DIR, tid Device 3:1 Inode 99656 Path /tmp/untouchables, \
        attr none, value 0, result NOT_GRANTED by RC 

  7. We maken nu een nieuwe rol aan, die we 'Greetingsmaster' zullen noemen. De bedoeling is dat een subject met deze rol wel in staat zal zijn om de beide scripts uit te voeren. Daarnaast moet de Greetingsmaster de gewone rechten van een gewone gebruiker behouden: hij moet in kunnen loggen, een shell kunnen starten etc.

    Daarom maken we een kopie van een bestaande rol en voegen daar dan de mogelijkheden aan toe om onze scripts te runnen. In ons geval gebruiken we een kopie van de rol General_User (id 00) - de rol die elke normale systeemgebruiker standaard toegewezen krijgt. Rollen worden geïdentificeerd middels een uniek nummer. We moeten onze nieuwe rol dus een uniek nummer geven. Dus moeten we eerst weten welke nummers al in gebruik zijn. Een lijst hiervan kunnen we opvragen door in te toetsen:
    secoff:~ > rc_get_item list_used_roles
    00 General_User
    01 Role_Admin
    02 System_Admin
    secoff:~ > _
    We zien dat het nummer 03 nog niet in gebruik is. U maakt nu een kopie van rol '00 General_User' en geeft deze de juiste naam door achtereenvolgens in te toetsen:
    secoff:~ > rc_copy_role 00 03
    secoff:~ > rc_set_item ROLE 03 name Greetingsmaster
    We hebben nu een nieuwe rol geschapen die in alle opzichten, behalve dan de naam, identiek is aan de 'gewone' rol voor een 'gewone' gebruiker.

  8. Nu komt er een van de momenten waar de menu's toch wel heel handig zijn. Om onze scripts uit te mogen voeren moet het subject Greetingsmaster EXECUTE, SEARCH, CLOSE en READ_OPEN rechten hebben op objecten van het FD-type 'Executables'. Het is mogelijk om deze rechten middels hun naam te specificeren, maar er zijn 28 mogelijkheden. Gelukkig kunnen we een overzicht printen:
    secoff:~ > rc_get_item list_fd_rights
    Uit deze lijst kiezen we nu de gewenste opties. De rechten kunnen ook worden aangegeven door middel van een lange string van enen en nullen, maar dat is tamelijk onwerkbaar:
    secoff:~ > rc_set_item ROLE 03 type_comp_fd 03 \
               0000000000000000000000000010010000000000010010000000
    Beter is dan:
    secoff:~ >rc_set_item ROLE 3 type_comp_fd 3 SEARCH READ_OPEN EXECUTE CLOSE
    Dit is handiger te doen door rsbac_rc_role_menu op te starten, daar dan onze rol te selecteren (03, Greetingsmaster), de menuoptie Type Comp FD te kiezen, vervolgens daar dan 03 Executables te kiezen en daar dan EXECUTE, READ_OPEN en SEARCH aan te kruisen.

  9. Als laatste zetten we nu voor de gebruiker die als enige toegang krijgt tot de beide executables -- de gebruiker henk -- de default systeemrol op Greetingsmaster:
    secoff:~ > attr_set_user henk rc_def_role 03
    Als de gebruiker henk nu inlogged, zal zijn shell de rol 03 (Greetingsmaster) erven. Die rol is compatible met het FD type waar we onze untouchables op hebben gezet. En dus kan henk nu wel de beide scripts runnen.