LPS:Afsadm

Z HelpDesk

Afsadm

Afsadm je prostředkem, který umožňuje vybraným uživatelům provádět privilegované operace nad souborovým systémem AFS. Celek je založen na architektuře klient/server, jako autentizační mechanismus je využit Kerberos5, veškerá přenášená data jsou zabezpečena. S drobnými problémy přeloženo/rozchozeno pro IRIX, DUX, Linux a Solaris.

Klient

V současné verzi je potřeba znát jméno serveru, který zprostředkuje provedení zadaného příkazu s privilegii administrátora AFS. Tímto prostředníkem je pandora.zcu.cz. Připravena je i verze, ve které si klient zjistí jména KRB serverů, s nimiž se pokusí o navázání spojení (z obav o snížení bezpečnosti KRB serverů doposud nenasazeno). Program podporuje interaktivní i řádkový režim (vhodný do scriptů).

afrodite> afsadm -h pandora -c "backup volinfo sw" 
backup: waiting for job termination
DumpID    lvl parentID creation date     clone date       tape name
904891405 0  0         09/04/1998 08:43  09/04/1998 08:53 sw.full3.1 (904891405)
870259089 0  0         07/30/1997 12:38  07/30/1997 12:50 sw.full.1 (870259089)
855746075 0  0         02/12/1997 12:14  02/12/1997 12:14 sw.full2.1 (855746075)

Pokud výsledek snažení vypadá následovně

afrodite> afsadm -h pandora -c "vos release common"
You are not privileged to execute this command.

zkontrolujte nejprve svá oprávnění.

afrodite> klist
Ticket cache: /tmp/krb5cc_xdm_0
Default principal: chlumsky@ZCU.CZ

Valid starting      Expires             Service principal
31 Jan 01 09:47:37  31 Jan 01 19:47:36  krbtgt/ZCU.CZ@ZCU.CZ
31 Jan 01 09:47:37  31 Jan 01 19:47:36  afs@ZCU.CZ
31 Jan 01 10:08:25  31 Jan 01 19:47:36  afsadm/ody.zcu.cz@ZCU.CZ

Jako pricipal chlumsky pravděpodobně nemám oprávnění k provedení takové operace (obvykle používáme principal/root nebo principal/admin).

Pokud dosáhnete stejně žalostného výsledku i v případě, že vlastníte stoprocentně správná pověření, potom kontaktujte člověka, který je odpovědný za konfiguraci afsadm - s nejvyšší pravděpodobností nejste totiž ve skupině vyvolených jedinců.

afrodite> afsadm -h ody -c "vos release sw.proe -v"
Command doesn't match any allowed regexp.

V tomto případě nenašel server ve své konfiguraci žádný regulární výraz, který by váš příkaz uspokojil. Důvodem je, že skupina do které patříte nemá privilegia k jeho provedení, takový příkaz v konfiguraci neexistuje nebo je reg. výraz napsán tak, že neakceptuje argumenty v pořadí, ve kterém jste je napsali. Obvykle nejprve pomůže help k danému příkazu. Pokud se i po "precizním" zápisu příkazu nepovede operaci provést, kontaktujte opět správce afsadm.

Jak bylo zmíněno, lze afsadm provozovat v interaktivním režimu. Program využívá knihovnu readline, která poskytuje plný komfort při editaci příkazové řádky (historie, mazání, pohyb na řádce).

afrodite> afsadm -h ody
afsadm> help
vos release
vos remove
vos examine
pts examine
pts membership
pts adduser
pts remove
fs setacl
fs setquota
fs listquota
backup volinfo
backup volrestore
renameafsuser
quota
shforward
help [command]
quit/exit
afsadm> help fs setacl
fs setacl [-dir] directory [-acl] 
afsadm> quit
afrodite> 

Pokud jsou s afsadm nějaké potíže (server se neozývá ap.), je možné vyzkoušet debug mode.

afrodite> afsadm -h ody -c "vos exa common" -d
Trying ody ...
Connected to server
Received init msg: 4 bytes
Successfuly authenticated
Sent encrypted message: 169 bytes
Receiving encrypted stdout/stderr:
1) Expected 225 bytes, received 225/69 bytes (encr/decr)
common                            536871833 RW      17975 K  On-line
2) Expected 663 bytes, received 663/500 bytes (encr/decr)
   ori.zcu.cz /vicepc 
   RWrite  536871833 ROnly  536871834 Backup          0 
   MaxQuota      20000 K 
   Creation    Fri Apr  5 10:51:04 1996
   Last Update Wed Jan 31 02:52:14 2001
   2487 accesses in the past day (i.e., vnode references)
   
   RWrite: 536871833     ROnly: 536871834 
   number of sites -> 9
      server nic.zcu.cz partition /vicepa RO Site 
      server oknos.zcu.cz partition /vicepb RO Site 
      server ori.zcu.cz partition /vicepc RW Site 
      server ori.zcu.
3) Expected 471 bytes, received 471/299 bytes (encr/decr)
 cz partition /vicepc RO Site 
      server oneus.zcu.cz partition /vicepa RO Site 
      server ariane.zcu.cz partition /vicepb RO Site 
      server hp-2.zcu.cz partition /vicepa RO Site 
      server fennel.zcu.cz partition /vicepa RO Site 
      server dce.zcu.cz partition /vicepa RO Site 
End of stdout/stderr [Total: 1359/868 bytes (encr/decr) in 2s]

Server

Služba afsadm je vázána na port 35353/tcp (viz /etc/services). Server je spouštěn daemonem inetd.

afsadm stream tcp nowait root /usr/sbin/tcpd /software/krb5/sbin/afsadmd -S /var/afsadm/afsadm.keytab -c /var/afsadm -d

Parametr -d dovoluje spuštění v debug modu, -S specifikuje uložení klíče (keytab), -c pak adresář s patřičnou konfigurací. Jak je patrné, tato služba využívá k autentizaci Kerberos5. Keytab by měl tedy obsahovat klíč pro afsadm/HOSTNAME@REALM.

ody> klist -k /var/afsadm/afsadm.keytab 
Keytab name: FILE:/var/afsadm/afsadm.keytab
KVNO Principal
---- -------------------------------------------------------------------------
   3 afsadm/ody.zcu.cz@ZCU.CZ

V případě potřeby lze využít i jiné jméno služby (než afsadm), to však vyžaduje na straně klienta i serveru použít parametr -s servicename a do keytabu umístit patřičný klíč (POZOR ! Netestováno !!!) Konfigurační soubor nese název afsadm.conf a je umístěn v určeném adresáři. Ten obsahuje podadresář bin, ve kterém jsou programy, jež může server spustit. Ve chvíli spuštění příkazu je proměnná PATH nastavena pouze do tohoto adresáře (potenciální problémy ve scriptech).

ody> ls -lR /var/afsadm/
total 128
-rw-------    1 root     sys         6636 Jan 29 14:38 afsadm.conf
-rw-------    1 root     sys         3011 Oct  3 12:18 afsadm.conf.03-10-2000
-rw-------    1 root     sys         3841 Oct  6 07:47 afsadm.conf.06-10-2000
-rw-------    1 root     sys         1667 Sep  7 13:55 afsadm.conf.07-09-00
-rw-------    1 root     sys         2392 Sep 12 06:43 afsadm.conf.12-09-00
-rw-------    1 root     sys         6073 Dec 19 14:58 afsadm.conf.19-12-2000
-rw-------    1 root     sys         6294 Jan 26 07:13 afsadm.conf.26-01-2001
-rw-------    1 root     sys         5621 Oct 31 06:41 afsadm.conf.31-10-2000
-rw-------    1 root     sys         2364 Sep  8 15:44 afsadm.conf.new
-rw-------    1 root     sys         1663 Aug  9 16:05 afsadm.conf.problem
-rw-------    1 root     sys         1664 Aug  9 16:03 afsadm.conf.sav
-rw-------    1 root     sys           57 Jul 20  2000 afsadm.keytab
drwx------    2 root     sys          113 Nov 16 12:28 bin
/var/afsadm/bin:
total 24
lrwx------    1 root     sys           21 Oct  6 07:54 backup -> /usr/afsws/etc/backup
lrwx------    1 root     sys           17 Sep  7 15:44 fs -> /usr/afsws/bin/fs
lrwx------    1 root     sys           18 Jul 21  2000 pts -> /usr/afsws/bin/pts
-rwx------    1 root     sys         1392 Sep 26 10:59 quota
-rwx------    1 root     sys         3267 Dec  1 14:14 renameafsuser
-rwx------    1 root     sys          470 Sep 26 10:59 shforward
lrwx------    1 root     sys           18 Jul 20  2000 vos -> /usr/afsws/etc/vos

Aby byl celý mechanismus funkční, musí být principal afsadm.HOSTNAME (v tomto případě tedy afsadm.pandora.zcu.cz) členem AFS skupiny system:administrators a privilegovaným uživatelem v souboru /usr/afs/etc/UserList na každém fileserveru (viz příkazy pts mem system:administrators, bos listusers servername).

Pro svou činnost využívá server knihovnu libkafs.so, která pochází z krb implementace Heimdal. Z té využívá 3 funkce pro práci s PAGem (k_hasafs, k_setpag, k_unlog) tak, aby byl privilegované pověření dostupné aktuálnímu běžícímu procesu a ne všem uživatelům se stejným UID. Pro překlad na Solaris 5.9 jsme knihovnu vysekali ze stávajících zdrojů Heimdalu a přidali ke zdrojovým kódům projektu. Pro právný běh, je při překladu potřebná správně nastavená definice AFS_SYSCALL, číslo syscallu je k nalezení v /etc/name_to_sysnum. Zřejmě by chtělo tuto část dále přepsat podobně jako to ma AIX (tj. automatické vyhledání ID syscallu) ... TODO

Veškeré aktivity jsou logovány standardním způsobem - syslog().

Jan 31 10:41:52 7X:ody afsadmd[608203]: connect from afrodite.zcu.cz
Jan 31 10:41:52 7D:ody afsadmd: Parsing configfile /var/afsadm/afsadm.conf
Jan 31 10:41:52 7D:ody afsadmd: Principal chlumsky/root@ZCU.CZ
Jan 31 10:41:53 7D:ody afsadmd: Received 169 bytes
Jan 31 10:41:53 7D:ody afsadmd: Principal chlumsky/root@ZCU.CZ is trying to
execute command vos exa common
Jan 31 10:41:53 7D:ody afsadmd: Principal chlumsky/root@ZCU.CZ :
system(/var/afsadm/bin/vos exa common)
Jan 31 10:41:55 7D:ody afsadmd: Sent 1359 bytes in 2s [3 fragment(s)]
Jan 31 10:46:07 7X:ody afsadmd[608382]: connect from eryx1.zcu.cz
Jan 31 10:46:07 7D:ody afsadmd: Parsing configfile /var/afsadm/afsadm.conf
Jan 31 10:46:07 7D:ody afsadmd: Principal sustr/admin@ZCU.CZ
Jan 31 10:46:08 7D:ody afsadmd: Received 177 bytes
Jan 31 10:46:08 7D:ody afsadmd: Principal sustr/admin@ZCU.CZ is trying to 
execute command vos rel sw.nt40.is.avast
Jan 31 10:46:08 7D:ody afsadmd: Principal sustr/admin@ZCU.CZ :
system(/var/afsadm/bin/vos rel sw.nt40.is.avast)
Jan 31 10:46:19 7D:ody afsadmd: Sent 201 bytes in 11s [1 fragment(s)]

Konfigurace

Konfigurační soubor afsadm.conf je tvořen ze dvou částí. První obsahuje definici skupin, druhá pak přiřazení skupin a regulárních výrazů. Při vytváření skupin lze využít vnořování, vnořená skupina musí být ale nejprve definována, jinak je považována za jméno principala. Předdefinovanou skupinou je anyuser (libovolný autentizovaný uživatel).

#
# Groups
#
# ( Predefined groups: anyuser )
#
# define group GrpName {
#                               Principal1
#                               Principal2
#                               ...
#                               GrpName1
#                               GrpName2
#                               ...
#                       }
#
define group administrators {
                               chlumsky/root@ZCU.CZ
                               kejzlar/root@ZCU.CZ
                               sitera/root@ZCU.CZ
                            }
define group ISS {
                        pulc/root@ZCU.CZ
                        urbanec/root@ZCU.CZ
                        indy/root@ZCU.CZ
                        administrators
                 }


Definice povolených příkazů a přiřazení ke skupinám může vypadat např. takto:

#
# Commands
#
# define command CmdSuite {
#       GroupName1 "regexp1"
#       Groupname2 "regexp2"
#       ...
#       } { "Command name" "Usage" }
#

#
# vos release
#
define command vos_release {
  # vos rel sw.nt40*
  admswNT "^vos[ ]+rel(ease)?[ ]+(-id )?[ ]*(sw\.)?nt40[.a-zA-Z0-9_-]*[ ]*([ ]+-f)?([ ]+-v(erbose)?)?$"
  # vos rel common*
  lpsadmin "^vos[ ]+rel(ease)?[ ]+(-id )?[ ]*common[.a-zA-Z0-9_]*[ ]*([ ]+-f)?([ ]+-v(erbose)?)?$"
} { "vos release" "vos release [-id] volID [-f] [-v|-verbose]" }
#
# pts examine
#
define command pts_examine {
  anyuser "^pts[ ]+e(xa(mine)?)?[ ]+(-na(meorid)? )?[ ]*[:.a-zA-Z0-9_-]+$"
} { "pts examine" "pts examine [-nameorid] user or group" }

#
# backup volrestore
#
define command backup_volr {
  backuprestore "^backup[ ]+volr(estore)?[ ]+(-s(erver)? )?[ ]*[a-zA-Z0-9.-]+[ ]
+(-pa(rtition)? )?[/a-z]+[ ]+(-v(olume)? )?[:.a-zA-Z0-9_-]+(( -e | -extension )?
   )[a-zA-Z0-9.-_:]+)?(( -d | -date )?[0-9/]+)?([ ]+-n)?$"
   } { "backup volrestore" "backup volrestore [-server] server [-partition] partiti
   on [-volume] volumename [-extension] new_volume_name_extension [-date] date_from
   _which_to_restore [-n]" }


Pokud je v konfiguračním souboru chyba, měl by server na toto místo upozornit. Klient v dané chvíli reaguje následovně:

afrodite> afsadm -h ody -c help
Received init msg: 0 bytes

V logu pak nalezneme:

Jan 31 11:39:56 7X:ody afsadmd[124858]: connect from afrodite.zcu.cz
Jan 31 11:39:56 7D:ody afsadmd: Parsing configfile /tmp/afsadm/afsadm.conf
Jan 31 11:39:56 3D:ody afsadmd: Quoted "string" expected at line 118

V konfiguračním souboru na řádce 118 chybí uvozovky:

#
# pts examine
#
define command pts_examine {
  anyuser "^pts[ ]+exa(mine)*[ ]+(-nameorid )*[ ]*[:.a-zA-Z0-9]+$"
} { "pts examine" "pts examine [-nameorid] user or group }

Záloha konfigurací a zdrojový kód je dostupný na AFS v adresáři /afs/zcu.cz/project/software/afs/afsadm