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 -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 -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 -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
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 -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]

Pro lepsi prehled jsme vyrobili jednoduchy wrapper afsadm.sh, ktery posle mail zadanym lidem (osklive a jednoduse).

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.

pandora:/usr/local/afsadm# klist -k /usr/local/afsadm/pandora.keytab 
Keytab name: WRFILE:/usr/local/afsadm/pandora.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   3 afsadm/pandora.zcu.cz@ZCU.CZ
   3 afsadm/pandora.zcu.cz@ZCU.CZ
   3 afsadm/pandora.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).

pandora:/usr/local/afsadm# ls -lR
.:
total 58
-rw-------   1 root     other      12603 Aug 20 21:57 afsadm.conf
-rw-------   1 root     other      12603 Aug 24 15:32 afsadm.conf.20090811
drwxr-xr-x   2 root     other        512 Aug 24 11:35 bin
drwxr-xr-x   2 root     other       1024 Aug 24 15:33 lib
-rw-------   1 root     other        219 Aug 10 20:14 pandora.keytab

./bin:
total 7698
-rwxr-xr-x   1 root     other     168128 Aug 24 15:26 afsadmd
-rwxr-xr-x   1 root     other     475276 Aug 21 15:21 aklog
-rwxr-xr-x   1 root     other    1198300 Jan 26  2005 fs
-rwxr-xr-x   1 root     other     170836 Aug 11 14:31 pagsh
-rwxr-xr-x   1 root     other     183100 Aug 10 14:10 tokens
-rwxr-xr-x   1 root     other     222248 Aug 11 00:18 unlog
-rwxr-xr-x   1 root     other    1426872 Aug 10 14:08 vos

./lib:
total 16
-rwxr-xr-x   1 root     other       7968 Aug 21 15:52 libkafs.so

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).

Na DB serverech je treba take pridat ruco superuzivatele afsadm.HOSTNAME, protoze tam nebezi upclient.

bos adduser srv afsadm.HOSTNAME

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(). V roce 2009 na pandore je to ve /var/adm/daemon.

Aug 24 15:28:29 pandora afsadmd[5895]: [ID 927837 mail.info] connect from bodik.zcu.cz
Aug 24 15:28:29 pandora afsadmd[5895]: [ID 479126 daemon.debug] Parsing configfile /usr/local/afsadm/afsadm.conf
Aug 24 15:28:29 pandora afsadmd[5895]: [ID 273315 daemon.debug] Principal bodik/root@ZCU.CZ
Aug 24 15:28:29 pandora afsadmd[5895]: [ID 522531 daemon.debug] Received 195 bytes
Aug 24 15:28:29 pandora afsadmd[5896]: [ID 513530 daemon.info] Principal bodik/root@ZCU.CZ is trying to execute command vos rel project.kiosky -v
Aug 24 15:28:29 pandora afsadmd[5896]: [ID 225413 daemon.info] Principal bodik/root@ZCU.CZ : system(/usr/local/afsadm/bin/vos rel project.kiosky -v)
Aug 24 15:28:35 pandora afsadmd[5896]: [ID 705303 daemon.debug] Principal bodik/root@ZCU.CZ : system(/usr/local/afsadm/bin/vos rel project.kiosky -v) returns with 0
Aug 24 15:28:36 pandora afsadmd[5895]: [ID 186288 daemon.debug] Sent 1559 bytes in 7s [3 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 -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