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.
Log aan als security officer
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 |
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.
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:~ > _ |
secoff:~ > rc_set_item TYPE 03 type_fd_name 'Executables' |
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 |
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:~ # _ |
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 |
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:~ > _ |
secoff:~ > rc_copy_role 00 03 secoff:~ > rc_set_item ROLE 03 name Greetingsmaster |
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 |
secoff:~ > rc_set_item ROLE 03 type_comp_fd 03 \
0000000000000000000000000010010000000000010010000000 |
secoff:~ >rc_set_item ROLE 3 type_comp_fd 3 SEARCH READ_OPEN EXECUTE CLOSE |
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 |