Klog på SAS seminar, december 2013 Hvordan skjules password i loggen ved brug af macro, Svend Bang, Københavns Universitet Baggrund: I et frugtbart samarbejde mellem Danmarks Statistik, Forskningsservice, og Centre for Applied Microeconometrics, Økonomisk Institut, Københavns Universitet, er der etableret en samling af tidsrækker, som stilles til rådighed for CAMs forskere. Af almindelige ordens- og sikkerhedsgrunde har hvert enkelt projekt og dets deltagere kun adgang til udvalgte registre og variabler. Problem/Udfordring: * 131203, SB: Problem - eller på nudansk: Udfordring! Data class(pw=minkode) Data class(pw=&pwd) %Macro Problem Data class(pw=&pwd) %Mend Problem Options mprint %Problem Ved afvikling af ovenstående ses det, at værdien af &pwd vises i loggen, hvilket selvfølgelig ikke er så smart! Dannelse af Views: * DanView.sas Opgave: Dan views til læsning af registre i Demo_db. I det første view skjules pw for projektet. Bemærk anvendelsen af Nosave, der sikrer at koden bag viewet ikke kan læses. Det næste view dannes med SQL. Her foretages en eventuel ændring af Rækkefølgen af variablerne samt tilknyttes et libname. 131203, SB: Første udgave %include "&Her\Begynd.sas" %include "&Her\HentDsnAkode.sas" %include "&Her\SkjulPW.sas" %Macro DanView(Reg,SortVar,VarList,ReorderList) Argumenter: Reg - Navn på register SortVar - Her sættes en sorteringsvariabel i dictionary Varlist - her udvælges eventuelt variabler. Kan være blank. ReorderList - Ændring af rækkefølgen af variabler i dictionary. Kan være * for alle.
Data bib.®.av(sortedby=&sortvar)/view=bib.®.av(source=nosave) %SkjulPW(Set fra.®(pw="<adgangskode>")) By &SortVar %If &Varlist^= %Then Keep &VarList Proc Sql Create view bib.®.v as Select &ReorderList from bib.®.av using libname fra "&Her\Demo_db" Quit %Mend DanView Options mprint mrecall msglevel=i %Begynd(R) &Batch.%include "&Her\PWencode.sas" /source2 Libname Fra "&Her\Demo_db" Libname bib "&Her\Sasbib" %DanView(class,name,,%str(Name, Age, Height, Sex, Weight)) %DanView(classfit,Name,Name predict lowermean uppermean lower upper,*) Projektets fælles data er anbragt i Demo_db, der her eksemplificerer CAMs fælles database. Brugen af views sikrer at det enkelte projekt kun har adgang til de relevante data, mens det nødvendige password forbliver skjult. Makroen SkjulPW er det eneste originale bidrag til løsningen. %Macro SkjulPW(Linie) Argumenter: Linie Skal indeholde strengen <AdgangsKode>, der omsættes til det aktuelle password. Husk ved kaldet at anvende %str(), hvis der er kommaer i Linie. Gældende makrooptions aflæses, nulstilles og sættes igen. 130718, SB: Første version %Local currmprint currsymbolgen LocalLinie %Let currmprint=%sysfunc(getoption(mprint)) %Let currsymbolgen=%sysfunc(getoption(symbolgen)) %Let LocalLinie=* &linie &LocalLinie Options nomprint nosymbolgen Hvis _pwencode er sat af Proc PWencode, anvendes denne. Ellers anvendes den indtastede kode &DsnAkode. %If %symexist(_pwencode) %then %Let LocalLinie=%sysfunc(tranwrd(&Linie,<AdgangsKode>,&_pwencode)) %Else %Let LocalLinie=%sysfunc(tranwrd(&Linie,<AdgangsKode>,&DsnAkode)) &Locallinie Options &currmprint &currsymbolgen %Mend SkjulPW
Oprettelse af eksempel og test: * Flyt.sas Opgave: Her dannes testdata i Demo_db. 131203, SB: Første udgave %include "&Her\Begynd.sas" %include "&Her\HentDsnAkode.sas" %include "&Her\SkjulPW.sas" Options mprint mrecall msglevel=i %Let FqrsteGang= %Begynd(W) Libname bib "&Her\Demo_db" %SkjulPW(Data bib.class(pw="<adgangskode>")) %SkjulPW(Proc sort data=sashelp.classfit out=bib.classfit(pw="<adgangskode>")) By name * TestView.sas Her ses et eksempel på anvendelsen af viewet. 131203, SB: TestView Options mprint mrecall msglevel=i %Macro TestView(Reg) Title "Test af view ®.v" Proc contents data=bib.®.v varnum Proc print data=bib.®.v %Mend TestView Libname bib "&Her/Sasbib" %TestView(class) %TestView(classfit) Ved kopiering af ovenstående og papirets øvrige kode kan det samlede eksempel afprøves. Læseren er også velkommen til at e-skrive til forfatteren så tilsendes der en zipfil! Administration: Det har været en udtrykkelig forudsætning, at programmeringen kunne ske i Enterprise Guide samtidigt med, at afvikling i batch stadig skulle være mulig. Løsningen er også afprøvet under 9.3. %Macro Begynd(RellerW) Argumenter: R for Read, W for Write - begge sendes videre til makroen HentDsnAkode. Variabler: Afvikling - 0 for klassisk eller Batch, 1 For EG FqrsteGang - Sættes til *, således at gentagen udførelse forhindres Batch - Sættes til * under EG 131215, SB: Tilpasset 9.3, SYSPROCESSNAME 131211, SB: Første version %Global DsnAkode FqrsteGang Afvikling Batch
%If %substr(&sysprocessname,1,3) EQ %str(dms) or %substr(&sysprocessname,1,7) EQ %str(program) %then %Let Afvikling=0 %Else %Let Afvikling=1 &FqrsteGang %HentDsnAkode(&RellerW) %If &Afvikling=0 %then %Let Batch=&Fqrstegang %Else %Let Batch=* %Let FqrsteGang=* %Mend Begynd %Macro HentDsnAkode(RellerW) Argumenter: R for Read, W for Write Ved R promptes kun én gang for adgangskoden. Ved W gøres det to gange. Funktion: Under Batch/Klassisk anvendes %Windows, men der under EG anvendes Promts. 131214, SB: KontrolKode erklæres som Local 131211, SB: Første version %Local KontrolKode %Let DsnAkode= R for Read %If &RellerW = R %Then %Do %If &Afvikling=0 %then %Do %Window AkodeR #5 @5 'Adgangskode til alle datasæt:' #5 @35 DsnAkode 8 attr=underline display=no required=yes %Display AkodeR %Else %Do %Let DsnAkode=&AkodeR_password W for Write %Else %Do %If &Afvikling=0 %then %Do %Do %Until(&DsnAkode = &KontrolKode) %Window AkodeW #5 @5 'Adgangskode til alle datasæt:' #5 @35 DsnAkode 8 attr=underline display=no required=yes #7 @5 'Indtast koden igen:' #7 @25 KontrolKode 8 attr=underline display=no required=yes %Display AkodeW %Else %Do %Let DsnAkode=&AkodeR_PASSWORD %Let KontrolKode=&Kontrol_PASSWORD %If &DsnAkode NE &KontrolKode %Then %Do %Put Fejl i Password - Kør programmet igen!!!
%ABORT ABEND %Mend HentDsnAkode Nedenstående er et eksempel på brug af proceduren Pwencode: * 131203, SB: Test af PWencode Proc pwencode in="&pwd" Filename klip clipbrd Proc pwencode in="&pwd" out=klip Forfatter: Svend Bang, Systemkonsulent Center for Samfundsvidenskabelig IT, Københavns Universitet Øster Farimagsgade 5, 1353 København K. Kontor: CSS, 5.0.20 Tlf.: 3532 3237 - E-post: svend.bang@samf-it.ku.dk Læseren er meget velkommen til at e-skrive eller ringe for at afklare de mystiske detaljer I makrokoden! Kilder: Art Carpenter, 2004. "Carpenter's Complete Guide to the SAS Macro Language, Second Edition". SAS Institute. Det er en fremragende bog både til læsning og til opslag. Den kan købes ved henvendelse til den hjælpsomme Ane Gerken, Sas Institute, DK. Brugen af blank elelr * i makrovariablerne FqrsteGang og Batch er hentet fra &debug side 14 16. Paul D Sherman & Arthur L. Carpenter, 2009. "Secret Sequel: Keeping Your Password Away From the LOG". Artiklen giver et godt overblik over brug af password og dets undertrykkelse i loggen. Teknikken til undertrykkelse og efterfølgende genoplivning af makrooptions er hentet herfra. Leanne Tang, 2012. "Encoding the Password - A low maintenance way to secure your data access". Artiklen er en læseværdig gennemgang af Proc Pwencode.