Designdokument for Passordtjenester

Passordtjenester er en nettapplikasjon som lar brukere bytte passordet sitt ved Universitetet i Oslo. Tjenesten fungerer også for brukere som har glemt sitt gamle passord, eller har fått sin brukerkonto sperret på grunn av manglende passordbytte.

<style type="text/css">/* :Author: David Goodger (goodger@python.org) :Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { overflow: hidden; } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin: 0 0 0.5em 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left, .figure.align-left, object.align-left { clear: left ; float: left ; margin-right: 1em } img.align-right, .figure.align-right, object.align-right { clear: right ; float: right ; margin-left: 1em } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left } .align-center { clear: both ; text-align: center } .align-right { text-align: right } /* reset inner alignment in figures */ div.align-right { text-align: inherit } /* div.align-center * { */ /* text-align: left } */ ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font: inherit } pre.literal-block, pre.doctest-block, pre.math { margin-left: 2em ; margin-right: 2em } span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; padding-left: 0 } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } ul.auto-toc { list-style-type: none } </style> <div class="document" id="mal-for-designdokumenter"> <div class="section" id="innledning"> <h2>1 Innledning</h2> <p class="elm-has-own-text">Passordbytte er en årlig plikt for samtlige brukere ved universitetet - dette betyr at en passordbyttetjeneste har et stort nedslagsfelt.</p> <p class="elm-has-own-text">Den nye passordtjenesten skal gi et enkelt og brukervennlig henvendelsespunkt for å sette passord, uavhengig av om brukeren kjenner til sitt tidligere passord, eller setter passord for første gang. En egen tjeneste <span>- "Passordtjenester" </span>(passord.uio.no), gir et tydelig henvendelsespunkt, uten å pakke på annen funksjonalitet som bidrar til å trekke oppmerksomhet bort fra hensikten med tjenesten.</p> Tjenesten tilbyr funksjonalitet for: <ol> <li>Tradisjonelt passordbytte, hvor brukeren logger inn med sitt nåværende brukernavn og passord, for så å sette nytt passord.</li> <li>Glemt passord, hvor brukeren kan sette passord med en engangskode sendt på SMS til sin mobiltelefon eller ved å logge seg inn via ID-porten. Dette tillater brukere å bytte passord selv om de ikke kjenner sitt nåværende passord.</li> <li>Liste brukerkontoer, hvor brukeren kan liste ut alle sine brukernavn. Dette tillater brukere å bytte passord, selv om vedkommende har glemt hvilket brukernavn de har blitt tildelt.</li> </ol> <p>Tjenesten er generell, og kan også tilbys til andre organisasjoner i og utenfor UH-sektoren. Ved å splitte ut brukergrensesnitt (frontend) fra applikasjonen, tilrettelegges det for å tilpasse grensesnittet til organisasjonen, eller integrere brukergrensesnitt i organisasjonens applikasjoner. Backend-applikasjonen er modulær, slik at tjenesten kan benyttes mot andre systemer enn Cerebrum og UiO sin SMS-gateway.</p> <h3>Kontaktpunkt for tjenesten</h3> <ul> <li><strong class="elm-has-own-text">Systemeier:</strong><em> </em><a href="/om/organisasjon/bnt/usitint/">Seksjon for integrasjon og elektroniske identiteter (USITINT)</a></li> <li><strong>Driftskontakt: </strong><a href="/om/organisasjon/iti/app/index.html">Seksjon for applikasjon- og integrasjonsplattformer (API)</a></li> </ul> </div> <div class="section" id="redegjorelse"> <h2>2 Redegjørelse</h2> <p class="elm-has-own-text">Behovet for en utbedret passordopplevelse ble belyst av en brukerundersøkelse gjennomført ved UiO. Valget om å utvikle en helt ny tjeneste for passordbytte oppstod i lys av dette, for å unngå problematikk rundt teknisk gjeld i eksisterende tjenester (Brukerinfo, Glemt Passord og Cerebrum). I tillegg er den nye tjenesten utviklet i tråd med sjekkliste for utviklingsaktiviteter. Dette har gitt oss en applikasjon…</p> <ul class="content-list"> <li class="elm-has-own-text">med god informasjon og mye innsyn</li> <li class="elm-has-own-text">som er enkel å sette opp og drifte</li> <li class="elm-has-own-text">som er enkel å vedlikeholde og videreutvikle</li> <li class="elm-has-own-text">som er brukervennlig og attraktiv å bruke</li> </ul> <p class="elm-has-own-text">For mer bakgrunnsinformasjon, se <a href="/om/organisasjon/iti/int/aktiviteter/endret-passordtjeneste.html">dokument om forslag til endret tjeneste</a>.</p> <h3>2.1 Mål</h3> <ol> <li class="elm-has-own-text"><strong>Ansatte og studenter skal oppleve at passordtjenesten er enkel og brukervennlig.</strong> Dette kan måles i brukerundersøkelser og ved hjelp av statistikk som samles inn gjennom løsningen.</li> <li class="elm-has-own-text"><strong>Gjennomsnittstiden som brukes på å skifte passord skal reduseres.</strong> Ny tjeneste vil produsere statistikk på dette, og noe statistikk vil være tilgjengelig fra den gamle tjenesten. Vi har også noe statistikk fra brukerundersøkelse som kan brukes som sammenligningsgrunnlag.</li> <li class="elm-has-own-text"><strong>Antall brukere som avbryter prosessen med å skifte passord skal reduseres.</strong> Ny tjeneste vil produsere statistikk på dette, og noe statistikk vil være tilgjengelig fra gammel tjeneste. Vi har også noe statistikk fra brukerundersøkelse som kan brukes som sammenligningsgrunnlag.</li> <li class="elm-has-own-text">Passordtjenesten erstatter passordbytte-funksjonalitet i alle andre applikasjoner ved UiO og ved alle andre universiteter og høgskoler som er partnere i Cerebrum-samarbeidet.</li> </ol> <p class="elm-has-own-text">Tjenesten vil også være i tråd med <a href="/om/prosjekter/uio-integrasjonsarkitektur/forprosjekt/leveranser/ia-prinsipper/index.html">prinsipper for ny integrasjonsarkitektur ved UiO</a>:</p> <ol> <li class="elm-has-own-text">Ved å skreddersy en løsning for <em>et formål,</em> passordbytte, får vi en tjeneste som har dette målet i fokus. Applikasjonen er fleksibel, og kan tilpasses systemendringer og brukerbehov.</li> <li class="elm-has-own-text">Tjenesten benytter løse koblinger mot andre systemer. Alle integrasjoner kan byttes ut uten å omskrive hele applikasjonen.</li> <li class="elm-has-own-text">Tjenesten tilbyr et åpent API som kan benyttes av ulike front-ends for passordbytte, og fordrer et åpent API i Cerebrum for passordfunksjonalitet</li> <li class="elm-has-own-text">Tjenesten er skalerbar. Den kan tilpasses og tilbys andre interessenter, og den kan skaleres <em>vertikalt </em>i perioder med høy pågang.</li> </ol> <h3>2.2 Sikkerhet</h3> <h4>2.2.1 Lekkasje av personinformasjon</h4> <p>Personinformasjon benyttes i den delen av tjenesten hvor man benytter sitt fødselsnummer eller studentnummer for å liste ut brukernavn, samt for å få tilsendt SMS med engangskode. Dette steget lekker personinformasjon: En hvilken som helst bruker kan gå inn i tjenesten og prøve et fødselsnummer eller studentnummer for å se om det finnes brukere ved universitetet tilknyttet denne informasjonen.</p> <p>For å redusere problemet, vil man kunne reservere seg mot treff i denne tjenesten. Dersom man er reservert mot visning på nett i Cerebrum, vil man få samme feilmelding fra tjenesten som om man ikke var tilknyttet universitetet. Merk at dette også forhinderer disse brukerene fra å bruke denne delen av tjenesten.</p> <p>Reservasjon mot visning på nett er funksjonalitet knyttet direkte til Cerebrum. Denne funksjonaliteten er derfor implementert i modulen som kommuniserer med Cerebrum.</p> <h4>2.2.2 Misbruk av SMS-utsending</h4> <p>For å hindre misbruk av SMS-utsendingen, krever vi at brukeren kjenner til sitt eget mobilnummer. For å kunne sende en engangskode på SMS må brukeren altså kjenne til et av mobilnummerene som er registrert på brukeren i IGA-systemet (Cerebrum).</p> <h4>2.2.3 Tillit til kildedata</h4> <p>For å hindre at engangskoder kommer på avveie, stiller vi en del krav til mobilnummeret som det sendes til.</p> <ul> <li>Mobilnummeret må finnes i Cerebrum, og komme fra et kildesystem (SAP eller FS), slik at vi vet at det vedlikeholdes.</li> <li>Mobilnummeret må enten: <ul> <li>være eldre en <em>N </em>dager</li> <li>tilhøre en <em>ny</em> person</li> </ul> </li> </ul> <p>Hvilke kildesystemer man benytter telefonnummer fra, og hva som er minimal alder på telefonnummer, kan konfigureres i tjenesten. Denne funksjonaliteten er implementert i modulen som kommuniserer med Cerebrum.</p> <h3>2.3 Passordregler</h3> <p>Siden det finnes eksisterende løsninger for bytte av passord, beholdes kontroll av passordstyrke i Cerebrum. Backend-applikasjon er derfor ukjent med passordregler, og overlater dette til IGA-systemet.</p> <h4>Nye passordregler</h4> <p>For å imøtekomme kritikk av passordregler, har INT gjort en gjennomgang av de eksisterende krav til passord ved universitetet. Denne gjennomgangen viste at eksisterende krav hverken bidrar til å styrke passord, eller hjelper sluttbruker å lage gode passord. Dette resulterte i et <a href="http://www.usit.uio.no/om/tjenestegrupper/cerebrum/utvikling/dokumentasjon/utredninger/passwords.html">forslag til nye, enklere krav</a>.</p> <p>Den nye passordtjenesten utvikles primært for å støtte disse nye kravene. Frontend-applikasjonen presenterer eksisterende krav og gjør sanntidsvalidering av krav den kan validere selv. Resten av kravene (passordhistorikk, brukernavn og navn) valideres i backend-applikasjonen og eventuelle feil videreformidles til frontend-applikasjonen.</p> </div> <div class="section" id="detaljebeskrivelse"> <h2>3 Detaljebeskrivelse</h2> Passord lever i Cerebrum, som passord-hasher og GPG-kryptert data, og distribueres herfra til andre systemer. Løsningen består av: <ol> <li>Grensesnitt mot Cerebrum: Funksjonalitet for bytte av passord i API</li> <li>En backend-applikasjon som kommuniserer med Cerebrum, SMS-gateway og / eller ID-porten</li> <li>En frontend-applikasjon som presenterer brukergrensesnitt til sluttbrukeren</li> </ol> <p>For å benytte tjenesten, går brukeren til nettadressen https://passord.uio.no, som viser frontend-applikasjonen. Frontend-applikasjonen presenterer følgende valg:</p> <ol> <li>Logg inn med brukernavn og passord</li> <li>Glemt eller utgått passord</li> <li>Glemt brukernavn</li> <li>Ny bruker</li> </ol> </div> <div class="section" id="teknisk-formal"> <h3>3.1 Teknisk formål</h3> <p>Tjenesten gir sluttbrukere to hovedfunksjoner: listing av brukernavn, og bytte av passord.</p> <ol/> <h4>Liste brukernavn</h4> <p>Dette er en støttefunksjon som kan hjelpe brukere som typisk har glemt sitt brukernavn og trenger å bytte passord (eller, som av en eller annen grunn har glemt sitt brukernavn, men husker sitt passord).</p> <ol> <li>Applikasjonen ber bruker om å fylle inn person-identifikasjon (fødselsnummer eller studentnummer)</li> <li>Dersom informasjonen finnes i Cerebrum (med forbehold), viser applikasjonen en liste med brukernavnene</li> </ol> <p>Studenter som har reservert seg mot publisering av personinformasjon på nett er unntatt denne funksjonen. Disse personene vil ikke kunne liste sine brukernavn.</p> <h4>Bytte av passord</h4> <p>Brukere som har fått autorisasjon, kan bytte sitt passord. For å få autorisasjon til dette, må brukeren gjøre en av en av følgende:</p> <ul> <li>logge inn med sitt nåværende brukernavn og passord</li> <li>bekrefte sin identitet med en engangskode som sendes per SMS</li> <li>logge seg inn via ID-porten</li> </ul> <h5>Brukernavn og passord</h5> <ol> <li>Brukeren logger inn med sitt vanlige brukernavn og passord.</li> <li>Dersom innlogging lykkes, får brukeren tilgang til å bytte passord, og passordbytte-applikasjonen vises</li> </ol> <h5>Engangskode på SMS</h5> <ol> <li>Applikasjonen ber bruker om å fylle inn person-id (fødselsnummer eller studentnummer), samt tilhørende brukernavn og mobilnummer</li> <li>Dersom informasjonen finnes i Cerebrum, og brukeren kan benytte SMS-tjenesten, vil det sendes en SMS med engangskode til mobilnummeret. Applikasjonen vil vise et felt for utfylling av engangskode.</li> <li>Dersom brukeren taster inn en gyldig engangskode, får brukeren tilgang til å endre passord, og passord-applikasjonen vises.</li> </ol> <p>Studenter som har reservert seg mot publisering av personinformasjon på nett er unntatt denne funksjonen. Disse personene vil ikke kunne motta SMS-kode. I tillegg stilles det en del krav til mobilnummeret og brukernavnet som tastes inn:</p> <ul> <li>Brukernavnet må tilhøre personen</li> <li>Brukernavnet må ikke være reservert fra tjenesten</li> <li>Mobilnummeret må tilhøre personen</li> <li>Mobilnummeret må være pålitelig <ul> <li>Det må  komme fra et kildesystem (typisk SAP eller FS)</li> <li>Det må ikke være endret nylig (med mindre personen er en helt ny ansatt/student)</li> </ul> </li> </ul> <h5>Innlogging via ID-porten</h5> <p>Applikasjonen videresender brukeren til ID-porten der vedkommende har mulighet til å benytte seg av flere typer elektronisk id som "Bankid", "Bankid på mobil", osv.</p> <p>Dersom fødselsnummeret som blir sendt fra ID-porten etter en vellykket autentisering finnes i Cerebrum, vil en liste av brukere som tilhører denne personen presenteres.</p> <p>En vil da kunne velge hvilken bruker en vil bytte passordet til.</p> </div> <div class="section" id="hoynivadesign-overordnet-design"> <h3>3.2 Høynivådesign (Overordnet design)</h3> <p>Tjenesten er skrudd sammen av tre hovedkomponenter: Cerebrum, backend-applikasjon og frontend-applikasjon. En vil også bli vederesendt til ID-porten dersom en velger å autentisere seg via ID-porten (glemt eller utgått passord, ny bruker).</p> <p>Passord lever i Cerebrum, og endring av passord skjer derfor i Cerebrum. For å gjennomføre passordbytte i Cerebrum, blir det eksponert et API for oppdatering av passord, som lar eksterne systemer endre passord på brukere. Dette endepunktet låses ned til passordbytte-tjenesten, og eventuelt andre systemer som skal gjennomføre passordbytte.</p> <p>Backend består av et API som lar frontend gjennomføre autentisering og passordbytte. Det meste av forretningslogikk i applikasjonen hører hjemme her. Applikasjonen kommuniserer med Cerebrum for uthenting av person- og brukerinformasjon, samt gjennomføre passordbytte.</p> <p>Frontend består av statiske nettsider og en Javascript-applikasjon. Applikasjonen utfører sanntidsvalidering av passord, samt kommunikasjon med backend-applikasjon.</p> <p> </p> <figure class="image"><img alt="" height="482" src="/om/organisasjon/iti/int/aktiviteter/endret-passordtjeneste-forslag.svg" width="1520" loading="lazy"/></figure> </div> <div class="section" id="lavnivadesign-design-av-enkeltkomponenter"> <h3>3.3 Lavnivådesign (Design av enkeltkomponenter)</h3> <p> </p> <h4>3.3.1 Cerebrum</h4> <p>For å gjøre det mulig for eksterne systemer å gjennomføre passordbytte, har Cerebrum fått utvidet API med noe funksjonalitet:</p> <ul> <li>Eksport av tidspunkter for endring av persondata. Dette kan benyttes av passordtjenesten for å regulere om persondata er pålitelig nok for å tillatte passordbytte vha. SMS-tjenesten.</li> <li>Funksjonalitet for å kontrollere nåværende passord, for å tillatte passordbytte dersom brukeren kjenner sitt nåværende passord.</li> <li>Funksjonalitet for å kontrollere at nytt passord er "godt nok". Dette gjør at applikasjonen kan gi tilbakemeldinger om passordregler som kun Cerebrum kan kontrollere (sammenligne med tidligere passord-hasher, brukernavn og navn).</li> <li>Funksjonalitet for å sette et nytt passord</li> </ul> <h4>3.3.2 Backend</h4> <p>Backend-tjenesten er en web-service som videre kommuniserer med de ulike andre tjenestene (Cerebrum, SMS-gateway og ID-porten), og implementerer business-logikken i passordbytte-tjenesten.</p> <p>Selve passord-tjenesten er en <a href="http://flask.pocoo.org/">Flask</a>-applikasjon, tilrettelagt for å kjøre med applikasjonstjeneren <a href="http://gunicorn.org/">Gunicorn</a>. I tillegg benyttes <a href="http://pythonhosted.org/blinker/">blinker</a> i utstrakt grad for å tilby hooks i applikasjonen for videre utvidelse og løse koblinger mellom komponenter.</p> <h5>Autentisering og autorisasjon</h5> <p>Tjenesten benytter sesjoner. Sesjonsdata oppbevares på server siden (Redis). Flask-applikasjonen finner sesjonsdata som er tilknyttet en tidligere autentisering ved hjelp av informasjonskapsler (cookies) som inneholder sesjon-id. Disse er utstedt og kryptografisk signert av Flask-applikasjonen ved en tidligere vellykket autentisering.</p> <p>Brukerens nettleser må derfor kunne ta vare på informasjonskapsler.</p> <p>Informasjonskapsler har begrenset levetid og inneholder ikke selve sesjonsdataen.</p> <p> </p> <h5>"Rate limiting"</h5> <p>ReCAPTCHA 2 er blitt erstattet av "rate limiting". Ved feil innlogging (feil brukernavn og / eller passord) eller feil SMS-kode, vil systemet introdusere forsinkelse. Det vil si at en klient må vente x - antall sekunder (forsinkelsesperioden) til den kan forsøke med ny innlogging. Forsinkelsen vil øke ved flere mislykkede innloggingsforsøk / SMS-koder.</p> <p> </p> <h5>SMS-dispatcher</h5> <p>Applikasjonen har en modul for utsending av SMS (pofh.sms).</p> <p>Modulen benytter seg tungt av Python-modulen <a href="https://github.com/daviddrysdale/python-phonenumbers">phonenumbers</a> for å parse og validere mobilnummer. Dette gir oss mulighet for å:</p> <ul> <li>Fange opp tilfeller hvor IGA-systemet inneholder ugyldige mobilnummer</li> <li>Filtrere telefonnummer etter landkode (f.eks. kun tilby tjenesten for nordiske telefonnummer)</li> <li>Tilpasse formatering av telefonnummer for SMS-gateway</li> </ul> <p>I tillegg benytter modulen <em>hooks</em> for å signalisere følgende hendelser:</p> <ul> <li>SMS blir forsøkt sendt</li> <li>SMS-utsending blir ikke gjennomført fordi modulen ikke kan sende til det oppgitte telefonnummeret</li> <li>SMS-utsending feilet (problem i ekstern SMS-tjeneste)</li> <li>SMS-utsending var vellykket</li> </ul> <p>Selve utsendingen er todelt, en felles komponent som verifiserer og filtrerer telefonnummer, samt en klient-spesifikk implementasjon som kommuniserer med SMS-gateway. Følgende implementasjoner finnes:</p> <ul> <li>mock/debug: Implementasjoner for testing, som simpelthen ikke sender SMS</li> <li>uio-gateway: Implementasjon som sender SMS vha. <a href="http://www.uio.no/tjenester/it/applikasjoner/sms/">USIT sin SMS-tjeneste</a></li> </ul> <p>Modulen kan enkelt utvides til å støtte andre SMS-tjenester for utsending av SMS.</p> <p>Tjenesten benytter denne modulen for utsending av engangskoder.</p> <h5>Språk og templates</h5> <p>Applikasjonen har grunnleggende støtte for språk (pofh.language) og templates (pofh.templates).</p> <p>Språk-komponenten leter etter språkinnstillinger som frontend-applikasjonen sender (Accept-Language), og gjør dette tilgjengelig for resten av applikasjonen. Videre finnes det en egen template-komponent som benytter dette, samt Flask sin innebygde støtte for Jinja2-templates, til å lete opp drop-in templates (template-filer som enkelt kan endres eller byttes ut).</p> <p>Språkvalg og templates benyttes kun til å formattere selve SMS-meldingen som sendes til sluttbruker.</p> <h5>Redis</h5> <p>Applikasjonen har en simpel Redis-komponent (pofh.redis), som kan benyttes til å lagre persistent informasjon i en Redis-database.</p> <p>Komponenten er en enkel innpakning av <a href="https://github.com/andymccurdy/redis-py">redis-py</a> og <a href="https://github.com/underyx/flask-redis">flask_redis</a>. Komponenten kan også konfigureres til å benytte <a href="https://github.com/locationlabs/mockredis">mockredispy</a>, slik at man ikke trenger en kjørende redis-database i test og utvikling. Redis benyttes til å lagre engangskodene som blir sendt med SMS, slik at disse kan verifiseres. Engangskodene benytter Redis sin TTL-funksjonalitet, slik at ubrukte engangskoder automatisk ryddes bort. Redis brukes også til å lagre sesjon-data på server-siden.</p> <h5>Statsd</h5> <p>Applikasjonen har en statsd-komponent (pofh.stats) som kan benyttes til å logge bruksstatistikk. Komponenten benytter en klient fra <a href="http://statsd.readthedocs.io/">statsd</a> for kommunikasjon med statsd, samt en mock-implementasjon av denne klienten.</p> <p>Applikasjonen fører statistikk over:</p> <ul> <li>Antall påbegynte, gjennomførte og ufullførte passordskifter</li> <li>Tidsbruk for gjennomføring av passordbytte</li> <li>Antall utsendte, verifiserte og ubrukte engangskoder</li> <li>Tidsbruk fra utsending til verifisering av engangskode</li> <li>Antall utlistinger av brukernavn</li> </ul> <p>I tillegg kan applikasjonstjeneren <a href="http://docs.gunicorn.org/en/stable/instrumentation.html">Gunicorn konfigureres opp til å føre statistikk på requests</a> mot applikasjonen.</p> <h5>IGA-klient</h5> <p>Selve kommunikasjonen med Cerebrum er implementert som en generisk IGA-komponent (pofh.idm).</p> <p>IGA-komponenten består av konfigurasjon, mock-klienter og en klient for Cerebrum-APIet.</p> <h4>3.3.3 Frontend</h4> <h5>Kjernerammeverk</h5> <p>Frontenden består av statiske nettsider, med HTML, CSS og en Javascript-applikasjon. Javascript-applikasjonen bygger på rammeverket <a href="http://redux.js.org/">Redux</a> for tilstand og workflow, mens <a href="https://facebook.github.io/react/">React</a> benyttes for brukergrensesnitt.</p> <p>En Redux-applikasjon bygger på tilstander, hendelser, og et pub-sub-mønster som kan endre i tilstand og reagere på hendelser. Nært knyttet tilstand organiseres i gjerne i mellomvare-komponenter. Nettstedene til Redux og React kan gi en bedre forståelse av hvordan en applikasjon bygget på disse rammeverkene fungerer.</p> <h5>Auth-middleware</h5> <p>Applikasjonen er utstyrt med en autentiseringsmellomvare, som ved hver brukerinteraksjon verifiserer at brukeren har gyldig autentiseringsinformasjon for handlingen som skal utføres. Dersom tilstandsmaskinen i applikasjonen på noe tidspunkt mangler autentiseringsinformasjon for å gå videre, vil brukeren sendes tilbake til den relevante startsiden for å sette i gang autentisering på nytt. Mellomvaren vil også sørge for å hente ett nytt token fra backend-applikasjonen dersom dette er i ferd med å gå ut på tid.</p> <h5>Api-middleware</h5> <p>For å kommunisere med backend-applikasjonenen, benyttes en egen mellomvare-komponent, som abstraherer denne kommunikasjonen. Alle hendelser i applikasjonen som krever informasjon fra, eller interaksjon med backend, vil automatisk omsettes til en REST-ful operasjon. Når backend svarer, vil dette endre tilstanden til informasjonen som kreves.</p> <p>For resten av applikasjonen er kommunikasjon med backend helt transparent, og foregår på akkurat samme måte som all annen oppdatering av applikasjonens tilstand.</p> <h5>Skjemaer</h5> <p>Redux-Form brukes for å håndtere innsending, validering og visning av tilbakemeldinger av de ulike skjemaene som finnes i applikasjonen.</p> <p>Validering i den grad det er mulig, blir gjort på klientsiden for momentante tilbakemeldinger til sluttbruker. Informasjon som må valideres i backend, vil først bli gjort når alle sjekker i applikasjonen passerer.</p> <p>Slike sjekker inkluderer sjekk av nye passord mot tidligere brukte passord, og sjekk om person har reservert seg fra publisering på nett (og dermed også sms-tjenesten).</p> <h5>I18n</h5> <p>For å håndtere språkvalg, brukes biblioteket "react-redux-i18n" og oversettelsesfiler.</p> <h5>Themes</h5> <p>React-komponentene som styrer brukerinteraksjon har ingen (direkte) stilisering med CSS. Alle slike tilpasninger av stilisering skreddesys i egne CSS-regler som ligger i <em>themes</em>. Dette gjør at utseende i applikasjonen kan tilpasses og skreddersys etter ønske.</p> <p>Applikasjonen bruker <a href="http://cssnext.io/">postcss-cssnext</a> og <a href="https://github.com/css-modules/css-modules">css-modules</a>, for å legge på stilinformasjon som defineres i themes. Dette gjør av man unngår globalt definerte css-regler, og det er enklere å skrive stilisering for enkeltkomponenter uten å forårsake uønskede bivirkninger andre steder i applikasjonen.</p> <h5>Bygging</h5> <p>Byggeverktøyet <a href="https://webpack.github.io/">Webpack</a> benyttes til å generere statiske filer for nettstedet. Ved bygging vil komponentene i applikasjonen slåes sammen til følgende filer:</p> <ul> <li>En Javascript-fil med alle tredjepartsbiblioteker, i minimert form.</li> <li>En Javascript-fil med selve applikasjonen, i minimert form.</li> <li>En CSS-fil med tilpasninger.</li> <li>En HTML-fil (index.html) som laster inn disse tre andre filene, og bootstrapper applikasjonen.</li> </ul> <p>Webpack kan også benyttes under utvikling, slik at endringer fortløpende kan bygges og applikasjonen oppdateres.</p> <h4>3.3.4 Videre forbedringer:</h4> <ul> <li>Svartliste brukte tokens: Etter at token har blitt benyttet, kan tokenets unike ID legges inn i en svartliste i Redis-databasen, for å forhindre at tokenet blir benyttet på nytt dersom dette skulle komme på avveie.</li> <li>IP-block: Dersom en IP skulle gjøre unormalt mange forespursler mot tjenesten, kan IP midlertidig legges inn i en svartliste i Redis-databasen, med stadig økende backoff.</li> <li>Autentiseringstjeneste: Det kan tenkes at autentiseringstjenesten i denne backenden kan generaliseres og benyttes i andre tjenester. Hvis SMS-engangskode er "godt nok" for autentisering, kan det tenkes at denne formen for autentisering kan benyttes i andre tjenester også.</li> <li>Fase ut komponenter for bruk i andre tjenester. En del av komponentene i backenden er generiske Flask-komponenter som kan gjenbrukes i andre tjenester.</li> </ul> </div> <div class="section" id="avhengigheter"> <h2>4 Avhengigheter</h2> </div> <div class="section" id="systemet-avhenger-av"> <h3>Cerebrum</h3> <p>For at passordtjenesten skal kunne benyttes, må Cerebrum være tilgjengelig. Dette inkluderer:</p> <ul> <li>Cerebrum-API</li> <li>Cerebrum-database (postgres)</li> <li>API-Gateway (når denne settes i produksjon)</li> </ul> <p>Dersom tjenesten videreutvikles til å støtte flere IGA-systemer, vil det samme gjelde for disse.</p> <h3>SMS-gateway</h3> <p>For å kunne sende ut SMS, må SMS-gateway være tilgjengelig.</p> <h3>ELK</h3> <p>Applikasjonen benytter Filebeat til å sende applikasjonslogger til Logstash. Dersom Logstash er utilgjengelig over lang tid, kan dette føre til at loggmeldinger går tapt.</p> <h3>Statsd</h3> <p>Applikasjonen sender statistikk til statsd. Dersom denne tjenesten er utilgjengelig, vil statistikk gå tapt.</p> <h3>ACE</h3> <p>Tjenesten benytter en reverse proxy for å fordele trafikk. Dersom denne proxyen er nede, vil ikke tjenesten kunne nås.</p> <h3>Redis</h3> <p>Tjenesten benytter en Redis-database for å lagre engangskoder. Dersom databasen er utilgjengelig, vil ikke engangskoder kunne lages eller verifiseres. Dersom data mistes fra Redis-databasen, så vil brukere som er i gang med passordbytte via SMS miste muligheten til å benytte engangskoden de har fått tilsendt. Brukeren vil måtte starte prosessen på nytt.</p> </div> <div class="section" id="relaterte-systemer-optional"> <h2>5 Relaterte systemer</h2> <p>Det finnes allerede flere applikasjoner for passordbytte. Disse benytter seg i hovedsak av to Cerebrum-tjenester, <em>bofhd</em> og <em>CerebrumWS.</em></p> <h3>bofhd</h3> <p>Bofhd er en Cerebrum-tjeneste som kommuniserer med klienter over XMLRPC, og tilbyr en rekke proprietære funksjoner. Av disse er noen få relatert til passord:</p> <ul> <li>login <username> <password>: Verifiserer brukernavn og passord, og starter en ny sesjon</li> <li>user_password <username> [password]: Bytter passord for en gitt bruker</li> <li>misc_list_passwords: Lister passord som er blitt satt i inneværende sesjon</li> <li>misc_print_passwords <template> <printer> <username>: Genererer et passord-ark og sende til skriver</li> <li>misc_verify_password <username> <password>: Sjekker om passord er korrekt for en bruker</li> </ul> <p>Passordfunksjonalitet er tilgjengelig i følgende klienter:</p> <ul> <li>cli-klienter (pybofh, jbofh)</li> </ul> <h3>CerebrumWS</h3> <p>CerebrumWS er Cerebrum-tjeneste som kommuniserer med en klient-applikasjon ved hjelp av REST, og tilbyr grensesnitt (API) mot Cerebrum.</p> <p> </p> </div> <div class="section" id="lenker-og-referanser"> <h2>6 Lenker og referanser</h2> <h3>Kildekode</h3> <ul> <li><a href="https://bitbucket.usit.uio.no/projects/CRB/repos/cerebrum/browse">Cerebrum</a></li> <li><a href="https://bitbucket.usit.uio.no/projects/CRB/repos/cerebrum-password-webapp-backend/browse">pofh</a> (backend-applikasjon)</li> <li><a href="https://bitbucket.usit.uio.no/projects/CRB/repos/cerebrum-password-webapp-frontend/browse">Frontend-applikasjon</a></li> </ul> <h3>Tjenester</h3> <ul> <li><a href="https://passord.uio.no">Passordtjenester</a> (UiO)</li> <li>https://www.usit.uio.no/om/tjenestegrupper/cerebrum/aktiviteter/old/passordtjenesten/passordteneste.html</li> </ul> </div> </div> </div> </div> <span class="vrtx-tags"> <span class="title">Emneord:</span> <span class="vrtx-tags-links"> <a href="https://www.usit.uio.no/?vrtx=tags&tag=passord">passord</a><span class="tag-separator">,</span> <a href="https://www.usit.uio.no/?vrtx=tags&tag=designdokument">designdokument</a><span class="tag-separator">,</span> <a href="https://www.usit.uio.no/?vrtx=tags&tag=cerebrum">cerebrum</a> </span> </span> <span class="vrtx-authors"> <span class="vrtx-authors-prefix">Av</span> fhl </span> <div class="vrtx-date-info"> <span class="published-date-label">Publisert</span> <span class="published-date">9. nov. 2016 13:24 </span> <span class="separator-date"> - </span> <span class="last-modified-date">Sist endret</span> <span class="last-modified-date">11. nov. 2024 19:53</span> </div> <div class="vrtx-social-components"> <a class="vrtx-email-friend" title='Del på e-post' href="mailto:?subject=Designdokument%20for%20Passordtjenester&body=https%3A%2F%2Fwww.usit.uio.no%2Fom%2Forganisasjon%2Fiti%2Fint%2Ffaglig%2Fdesigndokumenter%2Fdesigndokument-passordbytte.html"> Del på e-post</a> <div class="vrtx-share-at-component"> <ul> <li class="vrtx-share-at-Facebook"> <a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fwww.usit.uio.no%2Fom%2Forganisasjon%2Fiti%2Fint%2Ffaglig%2Fdesigndokumenter%2Fdesigndokument-passordbytte.html" target="_blank" class="facebook"> Del på Facebook</a> </li> <li class="vrtx-share-at-X"> <a href="https://x.com/intent/tweet?text=Designdokument+for+Passordtjenester&amp;url=https%3A%2F%2Fwww.usit.uio.no%2Fom%2Forganisasjon%2Fiti%2Fint%2Ffaglig%2Fdesigndokumenter%2Fdesigndokument-passordbytte.html" target="_blank" class="x"> Del på X</a> </li> </ul> </div> </div> </div> </div> <!--stopindex--> </main> </div> <!-- Page footer start --> <footer id="footer-wrapper" class="grid-container faculty-institute-footer"> <div id="footers" class="row"> <div class="footer-content-wrapper"> <div class="footer-title"> <a href="https://www.usit.uio.no/">IT-avdelingen</a> </div> <div class="footer-content"> <div> <h2>Kontakt</h2> <p><a href="/om/kontaktinformasjon/">Kontakt oss</a><br> <a href="/om/finn-fram/">Finn frem</a></p> </div> <div> <h2>Om nettstedet</h2> <p><a href="https://www.uio.no/om/regelverk/personvern/personvernerklering-nett.html">Bruk av informasjonskapsler</a><br> <a href=" https://uustatus.no/nb/erklaringer/publisert/9336562c-fbb2-48db-b3f2-54df3b231a44">Tilgjengelighetserklæring</a></p> </div> </div> <div class="footer-meta-admin"> <h2 class="menu-label">Ansvarlig for denne siden</h2> <p> <a href="mailto:webredaksjon@usit.uio.no">Nettredaksjonen, IT-avdelingen</a> </p> <div class="vrtx-login-manage-component"> <a href="https://www.usit.uio.no/om/organisasjon/iti/int/faglig/designdokumenter/designdokument-passordbytte.html?authTarget" class="vrtx-login-manage-link" rel="nofollow"> Logg inn </a> </div> </div> </div> </div> </footer> <nav class="grid-container grid-container-top" id="footer-wrapper-back-to-uio"> <div class="row"> <a class="back-to-uio-logo" href="https://www.uio.no/" title="Gå til uio.no"></a> </div> </nav> <script type="module" src='/vrtx/dist/resources/uio2/js/uio2.js'></script> </body> </html>