Theme:
Blue (Default)
Green
Yellow
Light
Purple
Dark
Enable High Contrast
Your name:
Set Name
Documentation System
Simple file-based documentation
🔒
Read-Only Mode
- Editing and creating documents is disabled.
📋 View Activity Log
🔍
All Documents
test2
Helge
test
Gitlab-markup
Fail2ban
Wordpress
Skjemaker
Wiki
8
Documents
Last updated: 2026-01-13 11:20:42
Document Name
Content
Create Document
Cancel
test2
2026-01-13 11:20:42
test4
Save
Cancel
Helge
2026-01-12 15:17:55
[Backup av Regelsamlingen * https://regler.h.uib.no docker container bak apache vhost reverseproxy. Nattlig bygging. Tiltak for oppetid. B-tjenesten ## Send vedlegg med mutt fra Linux ``` echo "Please find the attached CSV file." | mutt -s "CSV report" -a UiB_Felles_ny_liste_med_epost4.csv -- helge.opedal@uib.no ``` ## Plukke farge palett ut fra et bilde * https://coolors.co/image-picker Nyttig om en skal kopiere en nettside sitt farge tema uten å måtte lese i css koden ## Hvilken IP var mest aktiv de siste 7 dagene om du har multiple access_log filer Først kanskje se på hvilken trafikk en har: ``` tail -f /var/log/httpd/*_access_log ``` deretter: ``` awk -v d="$(date -d '7 days ago' '+%d/%b/%Y')" '$4 >= "[" d {print $1}' /var/log/httpd/*_access_log | sort | uniq -c | sort -nr | head -10 ``` ## fail2ban DDOS rules Med disse reglene så kan du stoppe et DDOS angrep mot HTTP, såkalte burst bot index et eller annet: ```python [botscan-burst](##)(:File:EL-KRO.pdf](:File:EL-KRO.pdf)) enabled = true filter = botscan action = iptables-multiport[protocol=tcp](port="http,https",)(name=botscan-burst,) logpath = /var/log/httpd/*_access_log maxretry = 1200 findtime = 60 bantime = 3600 ignoreip = 127.0.0.1/8 129.177.6.149 ``` For å nullstille en ip: ``` fail2ban-client set botscan-burst unbanip 129.177.147.126 ``` # fail2ban på Kro fail2ban er nå lagt inn på Kro. For å sjekke hvilke jails som er i sving: ``` fail2ban-client status ``` og detaljer om en spesifikk jail: ``` fail2ban-client status botscan ``` som da gir ut i dag: ``` Currently banned: 5 Total banned: 5 Banned IP list: 74.7.241.13 74.7.227.154 74.7.227.63 74.7.227.11 74.7.227.160 ``` # Teste et lokalt PHP program uten docker En bruker gjerne docker for å fyre opp en docker container lokalt, slik at en kan teste på http://localhost:8080 Men, en trenger ikke docker for å kjøre en kjapp test. Om en har php-cli installert, så en enkelt å greit kjøre: ``` php -S localhost:8080 ``` # Fjerne w2 fil fra www.uib.no? Logg inn på: ``` p1w3app02 ``` sjekk: * https://itwiki2025.app.uib.no/Eksternweb#Sletting_av_W2_filer # Teste en nettside om CSRF er på plass ``` curl -sI https://vis.uib.no/ | grep -E "Referrer-Policy|X-Frame-Options|Content-Security-Policy|X-Content-Type-Options|X-XSS-Protection|Strict-Transport-Security|Permissions-Policy|Set-Cookie" ``` Da skal en få ut noe ala: ``` Referrer-Policy: strict-origin-when-cross-origin X-Frame-Options: SAMEORIGIN Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; frame-ancestors 'self'; form-action 'self'; X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Strict-Transport-Security: max-age=31536000; includeSubDomains Permissions-Policy: geolocation=(), microphone=(), camera=(), payment=() Referrer-Policy: ``` som da indikerer at nettsiden er sikret. Om en derimot ikke får noe ut, så er den sårbar for CSRF (Cross-Site Request Forgery) # git pull/push problemer? Da kan noe som dette være løsningen: ``` git stash -u git pull --rebase git stash pop git push ``` # Oppdatere Mariadb databasen til Corviz i RAIL Logg inn på RAIL-PROD: ``` #!/bin/bash RAIL_PORT=$(ssh helgeo@login-01.bgo1.prod.rail.uhdc.no grep -- --listen-address=127.0.0.1: .kube/config | cut -d: -f2) ssh -L$RAIL_PORT:localhost:$RAIL_PORT helgeo@login-01.bgo1.prod.rail.uhdc.no kubectl get pods firefox http://localhost:22008 ssh helgeo@login-01.bgo1.prod.rail.uhdc.no ``` Logg inn på poden: ``` kubectl exec -it mariadb-statefulset-0 -n adm-it-pub-mariadb -- sh ``` Deretter: ``` mysql -u root -p ``` Om du har glemt root passordet, som en nesten helt sikkert har gjort :-) så må kan en finne det ved å kjøre: ``` kubectl get secret db-user-pass -o jsonpath="{.data.password}" -n adm-it-pub-mariadb | base64 --decode; echo ``` Og så igjen: ``` mysql -u root -p ``` og så: ``` use corviz; ``` Og så på oppdrag fra Niall (nettside eier til https://corviz.h.uib.no) ``` UPDATE `convar_letters` SET `public`='N' WHERE `collection` NOT IN ("Carlow-Coogan Letters" , "Irish Emigration Database", "Argentina - Pettit", "Argentina - Murphy"); ``` # Turspor i RAIL * https://turspor.bgo1.test.rail.uib.no/ # SOPS Lag "secret" yaml fil. Krypter denne med: ``` sops -e secret.yaml > secret.enc.yaml ``` Lag turspor-postgres-db.yaml db cluster med ref til secret.yaml variable Deretter git commit og git push. # Lærdom brannmur på Linux RHEL Ikke installer firewalld sammen med iptables! Da tar firewalld over, flusher iptables reglene, legger til sine egne defaulte regler, som da innebærer SSH DROP from anywhere, og vips så er du ute. Som skjedde i dag. Lærte noe nytt der. # Github pages * https://github.com/org-uib * https://github.com/helgeopedal/org-uib/ ``` Go to GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic) Or use this direct link: https://github.com/settings/tokens ``` Eller: gå til: * https://github.com/settings/personal-access-tokens/new velg Contents: og videre Read/Write Og nettsiden kommer da ut her: * https://org-uib.github.io/docs/ # Starte Cisco VPN fra kommandolinje ``` /opt/cisco/secureclient/bin ``` og så: ``` ./vpnui ``` skriv inn: vpn3.uib.no # Sende ut en Test epost fra wordpress multisite med wp-cli ``` wp eval 'wp_mail("helge.opedal@uib.no", "Testmail fra WP-CLI", "Hei! Dette er en test av wp_mail().");' ``` # Sikre uploads kataloger slik at .php og andre filer ikke kan kjøres Legg dette inn i .htaccess ``` <FilesMatch "\.(php|php3|php4|php5|php7|phtml|phps|py|pyc|pyo|pl|cgi|sh|bash|rb|exe|dll|com|bat|cmd|jsp|jspx|asp|aspx|shtml|shtm|fcgi)$"> ``` ``` ``` ``` Order Allow,Deny ``` ``` Deny from all ``` ``` ``` ``` </FilesMatch> ``` # Finne alle .no domenene til UiB Gå til: * https://www.norid.no/no/dine-domenenavn/hva-er-registrert/ Skriv inn: ``` 874789542 ``` # Alternativ html publisering utenfor UiB? I og med at vi prøver å få avviklet folk.uib.no så kan det være en mulighet for brukerne å publisere på github.io i stedenfor. Beskrivelse er lagt ut her: * https://folk.uib.no/ # Lage grafer på Linux ``` pip install matplotlib ``` Lag en pie.py fil med: <syntaxhighlight lang=python line> import matplotlib.pyplot as plt # Your data labels = ['Skjemaker', 'Mediawiki', ``` ``` ``` ``` 'Brukerstøtte', 'Avviklingsarbeid', 'Diverse']('Wordpress',)('Kubernetes/Docker',) ``` ``` ``` ``` sizes = [10, 10, 20, 20, 10](10,)(20,) colors = ['#e74c3c', '#f39c12', '#2ecc71', '#1abc9c', '#34495e']('#9b59b6',)('#3498db',) # Create pie chart plt.figure(figsize=(10, 7)) plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', ``` ``` ``` ``` startangle=90, pctdistance=0.85) ``` ``` ``` ``` plt.title('Oppgaver Helge Årshjul') plt.axis('equal') plt.savefig('helge_piechart.png', dpi=300, bbox_inches='tight') plt.show() ``` Kjør! ``` python3 pie.py ``` og så voila får du en flott pie chart. Som ligger under: # Arbeidsoppgaver 2025/2026 (estimert, samt pledge) Brukerstøtte, drift, forvaltning, videreutvikling og avvikling I tillegg til saker på https://hjelp.uib.no så registreres drift og forvaltnings oppgaver her: * https://itgit.app.uib.no/it/dpv/daf/pub/backlog/-/issues/?sort=updated_desc&state=opened&first_page_size=100 [Oppgave | Timer per uke | Dager per måned | Dager per år | **Sum** || **40,25** || **19** || **229** | | --- | --- | --- | --- | --- | | Kubernetes/Docker | 7,5 | 3,8 | 45 | | | BetalMeg-skjema | 0,25 | 0,1 | 1,5 | | | Møter | 1,5 | 0,8 | 9 | | | Wikihost (drift/forvaltning/oppgr./avvikling) | 3 | 1,5 | 18 | | | Skjemaker (drift/forvaltning/oppgr./avvikling) | 4 | 2 | 24 | | | WordPress (drift/forvaltning/oppgr./avvikling) | 4 | 2 | 24 | | | Webhotell (egendrift, avvikling) (https://vis.uib.no, birkeland.uib.no m.m.) | 2 | 1 | 12 | | | Grind (https://kringom.no) | 0,25 | 0,1 | 1,5 | | | Egenutvikling (KI, Interactiv+, Docker, Kubernetes, og andre kurs (Udemy online)) | 3 | 1,5 | 18 | | | Bash og PHP-utvikling | 1 | 0,5 | 6 | | | Turing-server i Dikult-kurser https://kursserver.k.uib.no/ | 0,25 | 0,1 | 1,5 | | | Apache Apex Reverse-proxy (https://reg.app.uib.no/kinobilletter, velferdshytter m.m.) | 0,5 | 0,3 | 3 | | | Generell brukerstøtte | 7,5 | 3,8 | 45 | | | Heldagssamlinger | 0,5 | 0,3 | 3 | | | Prating og diskusjoner | 2 | 1 | 12 | | | Støtte for Regelsamlingen https://regler.app.uib.no (Mona Viksøy) | 0,25 | 0,1 | 1,5 | | | Workshops | 0,5 | 0,3 | 3 | | | Workshops | 0,5 | 0,3 | 3 | | # Oppgaver mer detaljer # System- og applikasjonsdrift * Apache/Nginx, VirtualHosts, SSL, PHP-FPM * Logger, feilsøking, cron, brannmur/IP-restriksjoner * Linux-tilgangsstyring og brukeradministrasjon # Databaser * MariaDB/PostgreSQL: oppsett, brukere, backup/gjenoppretting * phpMyAdmin, phpPgAdmin, 2FA * SQL-spørringer, ytelse og overvåking # Webapplikasjoner og CMS * WordPress (multisite), MediaWiki * Plugins/temaer, PHP-feilsøking, autentisering (SAML/LDAP) * Filrettigheter og sikkerhet # Avvikling og arkivering * Planlegging og gjennomføring av avvikling * Arkivering av filer/databaser (TSM/Billy), dokumentasjon * Håndtering av sensitive data og brukerkommunikasjon # Docker og containere * Dockerfiles, docker-compose, GitLab Registry * Databasekobling, secrets, miljøvariabler * Feilsøking og optimalisering # Kubernetes og CI/CD * YAML for Deployment, Service, PVC, Ingress * kubectl/k9s, pods og secrets * GitLab CI/CD pipelines # Utvikling og automatisering * Bash- og PHP-skript, Git/GitLab * Automatisering i drift og CI/CD # Sikkerhet og autentisering * Passord/hemmeligheter, 2FA, IP-tilgang * Sikker sletting og gjenoppretting * Samarbeid med IT-sikkerhet/IRT # Forvaltning og kommunikasjon * Drift, rutiner, dokumentasjon * Bruker- og ledelseskommunikasjon * Tverrgruppe-samarbeid # Overvåkning og vedlikehold * Systemytelse (CPU/RAM/disk), logganalyse * Rydding og vedlikehold av filer og logger # Legge på passord på pdf ``` qpdf --encrypt secret1234 owner-password 256 -- input.pdf output_encrypted.pdf ``` # Oversikt og søk i Wordpress databasen, multisite-wordpress Helge har passordet: * https://helge.w.uib.no/docs/index.php # Oversikt og søk i Skjemaker skjema og skjema eiere På oppdrag fra Brita har jeg laget følgende: * https://skjemaker.app.uib.no/docs/user_forms_sok.php og * https://skjemaker.app.uib.no/docs/user_forms.php Passord får en av meg. # Kikke i andre Topdesk gruppers saker Gå til denne, og søk etter: "IT-" skroll i listen * https://hjelp.uib.no/tas/secure/naturalselectionslist?action=showselection&unid=694a66b1868849058eb37e6ef43ec723&editable=false # Kjøre cron for lokal bruker på p1kro01 Brukere på p1kro01 kan kjøre egne cronjobber lokalt ``` crontab -e ``` og legg inn typisk: ``` 10 15 * * * /home/mihho/test.sh ``` Om det er en enkelt test, så kan en f.eks sende en epost: ```bash #!/bin/bash # Variables TO_EMAIL="helge.opedal@uib.no" SUBJECT="Cron Test" BODY="This is a test email from cron at $(date)." # Send email using mutt echo "$BODY" | mutt -s "$SUBJECT" "$TO_EMAIL" ``` eller om en skal kjøre en rsync jobb: ```bash #!/bin/bash ``` ``` # Variables REMOTE_USER="ubuntu" REMOTE_HOST="158.37.64.60" REMOTE_DIR="/path/on/remote" LOCAL_DIR="/path/to/local" SSH_KEY="/home/youruser/.ssh/id_rsa_test" # replace with your private key path ``` ``` # Run rsync rsync -avz -e "ssh -i $SSH_KEY -o StrictHostKeyChecking=no" "$LOCAL_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR" ``` # Bruke login.uib.no som jumphost for å nå andre interne ressurser uten VPN ``` ssh -J mihho@login.uib.no helgeo@p1kro01.uib.no ``` eller for scp: ``` scp -J mihho@login.uib.no /path/to/local/file helgeo@p1kro01.uib.no:/path/to/remote/ ``` eller kanskje bare rute alt: ``` sshuttle -r username@login.uib.no 0/0 --dns ``` eller bare Uib: ``` sshuttle -r username@login.uib.no 129.177.0.0/16 ``` Det skal også være mulig å endre .ssh/config fila slik at en kan kjøre kommandoene enklere: ``` Host login ``` ``` ``` ``` HostName login.uib.no User mihho ``` ``` ``` ``` Host p1kro01 ``` ``` ``` ``` HostName p1kro01.uib.no User helgeo ProxyJump login ``` ``` ``` ``` ``` og så kun: ``` scp /path/to/local/file p1kro01:/path/to/remote/ ``` # Logge inn som admin i mso.uib.no Drupalen ``` ssh helgeo@p1kro01 cd /var/www/sites/mso/htdocs drush/drush user-login ``` som da gir ut typisk noe ala: * http://default/user/reset/1/1760099127/i8MQLaKAWcHGmSUpJRTHxVJ3tFDDN34H6xSDhs_WsOzgD_OBJh9Xrc/login Husk å endre "default" til domenenavnet mso.uib.no # Kopiere en fil over jumphosten til server Noen servere ligger bak en jumphost, og det er av til litt herk med å kopiere filer fra en server til en annen. En kan da gjøre det direkte med følgende scp kommando: ``` scp -o ProxyJump=mihho@p1publogin minfil.txt helgeo@p1skjemaker04:/tmp ``` Så her kopieres minfil.txt over Jumphost p1publogin til /tmp mappen på p1skjemaker04 som ligger bak Jumphosten. NB: husk at nøkler må være på plass i id_rsa og id_rsa.pub # Lei av Docker containerne dine? Slett de rått og brutalt ``` docker stop $(docker ps -q) docker rm $(docker ps -aq) docker system prune -a --volumes ``` # Spinne opp Regelsamlingen på lokal maskin En må ha en lokal Docker CE kjørende. Deretter: ``` git clone git@git.app.uib.no:it/site/regler.app.uib.no.git cd regler.app.uib.no ``` deretter: ``` docker build -t regelsamlingen . docker run -p 8080:80 regelsamlingen ``` og så voila! * http://localhost:8080/regler/Del-4-OEkonomi-eiendom-og-IKT/ # Skjemaker SAML SSO i Azure Gå til: * https://portal.azure.com Deretter søk etter: Enterprise applications Da får en opp alt mulig. Da kan en søke i neste søkefelt etter: skjemaker Da skal to innslag komme opp. Trykk på en av de. Deretter i venstre meny: Manage-Properties # Interact+ kurs stikkord Logg inn: * https://interact-production.acossky.no/client/ * https://dialog.test.uib.no/client/ Sett anbefalt norsk i nettleseren. Settings i Chrome Lag først en mal, legg til Stegene Referanse nummer: Krøllalfa funksjon, eksempel: @Dialogue.Referenceid Fjern til @, deretter liste, velge ved: CTRL click Elementer: Gruppe, felter i gruppe. Tips: autocomplete-type Predefinerte verdier, eks: @Login.FirstName Nyttig for brukeren, nettleser-lagrede data Tips: @Data.OrganizationName Logikktyper: Synlighet, Validering og Verdiformel Steg - Avvlevering: Integrasjoner: websak, epost skjemaadmin, Integrasjoner kan ikke kopieres fra et skjema til et annet ## hjelp Ineract community: * https://interact.community.no # Mer site ripping ``` yt-dlp --write-pages --no-video "https://birkeland.uib.no/" ``` og: ``` scrapy startproject birkeland_scraper # Then create a spider to crawl the site ``` # Sortere logg fil på dato og tid Om du har logg linjer som dette: ``` 129.177.6.11 - - [06/Sep/2025:20:28:02 +0200](|)(Fil:Helge-årshjul.png](Fil:Helge-årshjul.png)) "GET /data/form_13410848/files/element_1_2e57f0276bd0567a0373317ea20372e8-e1xzln6r-15hrzzpu.pdf.tmp HTTP/1.0" 200 104791 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.7204.183 Mobile Safari/537.36 (compatible; GoogleOther)" ``` så kan du sortere de på dato på følgende måte: ``` sort -k4,4 -t'[``` # httrack på Kro ``` /usr/local/bin/httrack ``` # Wordpress wp-cli * [Wordpress wp-cli](access.log)(')(Wordpress wp-cli) # Site rippe birkeland.uib.no og andre wordpress siter Om en PHP site ikke blir oppdatert på innhold lenger, så kan en site-rip være aktuelt. Da får en en html kopi av nettsiden, og den kan i praksis leve i evig tid uten at en trenger å tenke på core/plugin oppgraderinger, sikkerhetshull osv. Den blir da 100% sikker. Legger ved under noen eksempler med wget og httrack. Måler er å finne et verktøy med riktige opsjoner som lager en siterip så lik som mulig original nettsiden. ## wget ``` wget --mirror --convert-links --adjust-extension --page-requisites \ ``` ``` ``` --no-parent --user-agent="Mozilla/5.0" \ --wait=1 --random-wait \ "https://turspor.h.uib.no" ``` ``` ``` ``` ``` httrack https://birkeland.uib.no/ -O /home/helge/Httrack/birkeland -%v -N100 ``` En kan også se på en plugin for å eksportere alt innhold over til statisk html: ``` simple-static ``` En mer utvidet httrack kommando: ``` httrack "https://expearth.uib.no/" -O "/home/helge/Httrack/expearth" \ ``` ``` --ext-depth=2 \ --near \ --test \ --robots=0 \ --timeout=60 \ --retries=3 \ --max-rate=200000 \ --user-agent="Mozilla/5.0" \ -*.css.map \ -*.js.map \ +*.css* +*.js* +*.png* +*.jpg* +*.jpeg* +*.gif* +*.svg* +*.webp* \ --assume css=text/css,js=application/javascript \ --disable-security-limits \ --keep-alive ``` ``` ``` og kanskje denne går fortere: ``` httrack "https://vis.uib.no/" -O "/home/helge/Httrack/vis.uib.no" \ ``` ``` --ext-depth=1 \ # only follow external links 1 level away --robots=0 \ # ignore robots.txt to avoid skipped resources --timeout=30 \ # faster timeout for slow URLs --retries=1 \ # only retry once on failure --sockets=12 \ # download 12 files in parallel --max-rate=0 \ # no bandwidth limit --user-agent="Mozilla/5.0" \ # pretend to be a browser --update \ # resume / only download new or changed files --keep-alive \ # reuse connections for faster transfers --assume css=text/css,js=application/javascript \ --disable-security-limits \ # allow aggressive downloading --wait=0 --random-wait \ # minimal wait between requests -*.css.map -*.js.map -*v=* \ # skip unnecessary versioned or source map files -*.php?* -*/wp-login.php -*/wp-admin/* \ # skip backend / login pages +*.css* +*.js* +*.png* +*.jpg* +*.jpeg* +*.gif* +*.svg* +*.webp* \ ``` ``` ``` Etter en del tester, så ser jeg at wget av og til ikke får meg seg noen bilder. Det er mulig at denne wget kommandoen er noe bedre. Men samtidig, en bør kjøre wget'en et par ganger, det hender den får meg seg bildene i runde 2. ``` wget --mirror --convert-links --adjust-extension --page-requisites \ ``` ``` ``` ``` --no-parent --span-hosts --robots=off \ --accept=jpg,jpeg,png,gif,svg,webp \ --user-agent="Mozilla/5.0" \ --wait=1 --random-wait \ "https://turspor.h.uib.no" ``` ``` ``` ``` ``` # Matomo Dashboard for Medieval wiki'en * https://stats.uib.no/index.php?module=CoreHome&action=index&date=yesterday&period=day&idSite=94&updated=1#?idSite=94&period=day&date=yesterday&segment=&category=Dashboard_Dashboard&subcategory=1 # Søke etter feil i html koden din? ``` tidy -errors -q index.html ``` # Hente ut LDAP detaljer på din UiB konto * https://montana.app.uib.no/UiB-loginside-test/ # Teste ut Powershell på Linux? Kjør opp en docker container. Dockerfile: ``` # Use the official PowerShell image from Microsoft FROM mcr.microsoft.com/powershell:latest # Set working directory WORKDIR /scripts # Start PowerShell by default ENTRYPOINT [Deretter: ``` docker build -t my-powershell . ``` og ``` docker run -it my-powershell ``` og så: ``` $PSVersionTable.PSVersion ``` # Mounte opp til hjemmeområde Voss og Billy Legg inn i /etc/fstab: ``` //voss.uib.no\mihho /home/helge/voss cifs credentials=/root/secret.txt,suid,sec=ntlmsspi,rw 0 0 //klient.uib.no\FELLES\BILLY\ADM\IT\Publisering\Backupwebkat /home/helge/billy cifs credentials=/root/secret.txt,suid,sec=ntlmsspi,rw 0 0 ``` Og i filen secret.txt ``` username=mihho password= domain=UIB ``` Skriv inn passordet ditt, lagre filen. Deretter: ``` mount -a ``` Deretter fjern passordet fra secret.txt fila Så kan du se filene i en vanlig katalog på din Linux maskin: ``` /home/helge/voss ``` # Teste og fikse kubernetes yaml kode * https://git.app.uib.no/Helge.Opedal/etc/-/blob/master/RAIL_Kubernetes/fix-yaml.sh?ref_type=heads # Teste kjapt med docker på laptop ``` docker build -t hacked2 . docker run -d --name hacked2 -p 8080:80 hacked2 docker exec -it hacked2 /bin/bash ``` og så: * http://localhost:8080 Deretter ``` docker stop hacked2 docker rm hacked2 ``` # Finne filer innenfor en tidsperiode ``` find . -type f -newermt "2024-01-01" ! -newermt "2024-03-01" -ls ``` # Konvertere en video fil til et annet format ``` ffmpeg -i input.mkv -c:v libx264 -c:a mp3 -b:a 192k output.mp4 ``` # Delte dockerimages på tvers for alle * https://git.app.uib.no/itpublic/dockerimages # RAIL NOTATER Sjekk KRO, i katalogen: ``` /root/scripts/helge/RAIL ``` # PHP filer i images katalogene på Wikihost? En måte å loope gjennom X antall images kataloger for diverse wiki'er for å se om det kan ha sneket seg inn noen PHP filer kan gjøres med følgende bash kode: ```bash for i in $(find . -maxdepth 3 -type d -name "images"); do ``` ``` echo "find $i -type f -name '*.php'"; done > runme.sh ``` ``` chmod 750 runme.sh ./runme.sh ``` og etter å kjørt denne, fant jeg bare 1 fil, min egen hacker.php fil :-) ``` ./itwiki/code/images/hacker-helge-test.php ``` # open_basedir virker ikke i Apache Når en bruker php-fpm så blir linjer som dette i apache vhost ignorert: ``` php_admin_value open_basedir /var/www/sites/turspor ``` det gjør at om en hacker greier å laste opp en PHP fil, så vil hackderen kunne eksekvere denne og deretter lese innhold i filer som er aksessbar for Apache brukeren. En nødløsning er å legge til linjer i .htaccess filen i kataloger som applikasjonen laster opp filer til. Da nektes PHP filen å bli eksekvert: ## Eksempel 1 ``` # In upload directory's .htaccess <FilesMatch "\.(php|phtml|php3|php4|php5|pl|py|jsp|asp|sh)$"> ``` ``` ``` ``` Require all denied ``` ``` ``` ``` </FilesMatch> ``` ## Eksempel 2, fra en Drupal site ``` # Set the catch-all handler to prevent scripts from being executed. SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006 <Files *> ``` ``` # Override the handler again if we're run later in the evaluation list. SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003 ``` ``` </Files> ``` Ulempen er at en må identifisere upload katalogene til PHP applikasjonen. For wordpress/drupal er det enkelt, for andre himasnekra PHP applikasjoner, så må en lete etter nålen i høystakken. # streame en mp4 fra S3 Selve videoen (full screen, mobile, autostart): * https://folk.uib.no/mihho/s3helloworld/stream3.html HTML koden: * https://folk.uib.no/mihho/s3helloworld/stream3.txt # Full feature ubuntu docker container lokalt Her er en Dockerfile som kan brukes for å kjøre opp et ubuntu miljø lokalt: ``` # Dockerfile FROM ubuntu:24.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y \ ``` ``` ``` ``` bash-completion \ curl \ wget \ git \ vim \ nano \ htop \ net-tools \ iputils-ping \ dnsutils \ lsof \ tcpdump \ strace \ gdb \ build-essential \ python3 \ python3-pip \ php \ php-cli \ php-mbstring \ openssh-client \ sudo \ unzip \ gnupg \ software-properties-common \ rsync \ screen \ tmux \ ca-certificates \ && apt-get clean ``` ``` ``` ``` CMD ["/bin/bash"](```)("pwsh"]) ``` For å fyre den opp: ``` docker run -it --rm --name my-lab --hostname labbox --cap-add=SYS_PTRACE --security-opt seccomp=unconfined linux-lab:latest ``` # Sette en cronjob på pause i Kubernetes Denne skal visstnok sette en cronjob på pause ``` kubectl patch cronjob turspor-db-backup -n adm-it-pub-turspor -p '{"spec" : {"suspend" : true }}' ``` For aktivere den igjen: ``` kubectl patch cronjob turspor-db-backup -n adm-it-pub-turspor -p '{"spec" : {"suspend" : false }}' ``` For å liste ut status: ``` kubectl get cronjob turspor-db-backup -n adm-it-pub-turspor -o jsonpath='{.spec.suspend}'; echo ``` # Forsøk på filopplasting til s3 bucket helloworld i nrec * https://folk.uib.no/mihho/s3helloworld/upload.php For å få en status: * https://folk.uib.no/mihho/s3helloworld/index-diagnostic.php # Blir fontene og ikonene for små når du kopler til skrivebord.uib.no? Med xfree så kan en bruke scale for å øke størrelsen: ``` xfreerdp /u:mihho /v:skrivebord.uib.no /w:2200 /h:1400 /scale:180 /scale-desktop:180 ``` # Gjøre tilgangen til et Skjemaker skjema litt mer vrient ``` https://skjemaker.app.uib.no/view.php?id=5050770&secretkey=ThisIsTheSecretPassw0rd ``` vil gi tilgang til skjemaet, mens: ``` https://skjemaker.app.uib.no/view.php?id=5050770 ``` ikke gjør det. Det er et javascript som obscurer det. Så om en hacker sjekker koden, så finner de ut av det. Men en bot som travaserer seg gjennom 17 000 skjemaer ved å la id være et løpenummer, vil antakelig kanskje ikke få det med seg. Javascript koden er: * https://folk.uib.no/mihho/uibhjelp/custom-code.js # mounte uibfelles på Linux ``` sudo mkdir /mnt/uibfelles sudo mount -t cifs //felles.uib.no/UiBFelles /mnt/uibfelles -o username=mihho,domain=uib ``` # Kopiere ut en tidligere versjon av Dockerfila ``` git show 75b910a6caf11880d01b4ed29fed25b52775f5fd:Dockerfile > Docker.copy ``` # Lag en lang streng f.eks for an katalog eller passord kjapt og gale ``` mkdir "$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)" ``` # Sende epost til ledere i sammenheng med avvikling av UiBFelles Foreløpig roter jeg med div script her: ``` /root/scripts/Avvikling_UiB_Felles/runde2/temp/tmp ``` ``` Create-Send-Email-Script.sh ``` finner alle filer som heter temp_fil_EMAIL. Tar ut EMAIL. Deretter fikser innholdet i filen slik at listen blir pyntelig. Deretter lage en body_text, og så spytter ut en mutt commando. Må testes grunding # Endringer i deploy i kubernetes? ``` kubectl rollout restart deployment turspor -n adm-it-pub-turspor ``` ser ut til å funke # Onedrive i skyen * https://universityofbergen-my.sharepoint.com/ # Kjøre backup av en katalog i RAIL Dersom du har et script i RAIL som pakker en katalog og sender til S3 og du ønsker å kjøre den i crontab, så ser ikke det ut til å fungere på selve cluster boksen. Men en kan trigge scriptet ved å kjøre følgende fra en annen maskin: ``` ssh helgeo@login-01.bgo1.test.rail.uhdc.no '/home/helgeo/scripts/TursporBackup.sh' ``` Her er TursporBackup.sh: ```bash #!/bin/bash cd /home/helgeo/scripts/ PODNAME=$(kubectl get pods -n adm-it-pub-turspor -l app=turspor -o jsonpath='{.items[cp -n adm-it-pub-turspor "$PODNAME:/var/www/html/wp-content/uploads" ./uploads tar czf turspor_uploads_backup_$(date +%Y%m%d_%H%M%S).tar.gz uploads source keystone_rc.sh swift upload turspor turspor_uploads_backup_*.tar.gz find . -type f -mtime +5 -name 'turspor_uploads_backup_*.tar.gz' -exec rm -f {} \; ``` # caching i docker build Jeg prøvde å legge til filer i en wordpress docker image, men de kom ikke med. Det viste seg da at docker build kommandoen ignorerte de nye filene grunnet caching. Det en kunne se under byggeprosessen var følgende linjer: ``` #12 [6/9](kubectl)(0].metadata.name}')) COPY html/ /var/www/html/ #12 CACHED ``` Løsningen var å legge til --no-cache i .gitlab-ci.yml fila: ``` docker build --no-cache -t git.app.uib.no:4567/it/site/turspor.h.uib.no/turspor:prod . ``` # Fjerne ikke eksisterende eposter i en liste Dersom en har to filer: ``` epostlisten ``` og ``` ikke-eksisterende_eposter ``` hvor den første innholder både eksisterende og ikke eksisterende eposter, så er det ønskelig å oppdatere "epostlisten" slik at ikke-eksisterende eposter blir fjernet. Dette for å unngå at scriptet prøver å sende til epost adresser som ikke eksisterer i ldap typisk. Da kan en kjøre følgende kommando: ``` grep -v -F -f ikke-eksisterende_eposter epostlisten > epostlisten.vasket ``` # Søke etter filer og kataloger som Apache brukeren har skrivetilgang til En bør unngå så langt det er mulig at Apache brukeren er eier og/eller kan skrive til kataloger og filer. For å søke etter disse kan en gjøre noe ala dette: ``` find . -maxdepth 3 -user apache -ls | egrep -v proc | egrep -v log | egrep -v 'sess|tmp|images|cache' ``` # Slette gamle filer i en S3 bucket Dette ser ut til å kun fungere med .tar.gz filer. Om filen er en .jpg eller .png, så fungerer det ikke, da ved nedlasting så settes current timestamp. Først laste ned en kopi av hele bucketen: ``` swift download turspor ``` Deretter bruke find for å finne gamle filer sammen med delete: ``` find tmp/ -mtime +6 -exec swift delete turspor {} \; ``` Om en roter det til, så har en fortsatt en lokal kopi. Om en ønsker å rydde lokalt så gjør en det tilsvarende: ``` find tmp/ -mtime +6 -exec rm -f {} \; ``` For å kunne slette alle filer som er eldre enn en viss dato så må en til med et bash script. Denne ser ut til å gjøre jobben: ```bash #!/bin/bash BUCKET="helloworld" DAYS=1 # Today's date minus 2 days, in YYYY-MM-DD format cutoff_date=$(date -d "-${DAYS} days" +%F) # Debug print echo "Deleting files from container '$BUCKET' older than: $cutoff_date" # List objects with dates and filenames, and loop through them swift list "$BUCKET" -l | awk '{print $2 "," $5}' | while IFS=',' read -r file_date file_name; do ``` ``` ``` ``` if [ "$file_date" < "$cutoff_date" ]( "$file_date" < "$cutoff_date" ); then echo "Deleting: $file_name (Date: $file_date)" swift delete "$BUCKET" "$file_name" fi ``` ``` ``` ``` done ``` # Fjerne gamle mariadb-dump jobber i kubernetes ``` kubectl get jobs -n adm-it-pub-mariadb -o name | grep mariadb-dump | xargs kubectl delete -n adm-it-pub-mariadb ``` # turspor s3 Lokalt på laptop: ``` sudo -i source keystone_rc.sh swift list turspor ``` ## debugging lokalt på laptop ``` docker build -t git.app.uib.no:4567/helge.opedal/mariadb-s3cmd/mariadb-s3cmd:prod . docker run -it git.app.uib.no:4567/helge.opedal/mariadb-s3cmd/mariadb-s3cmd:prod bash source /opt/venv/bin/activate pip list ``` ## I bgo-test ``` kubectl get jobs -n adm-it-pub-turspor kubectl delete job turspor-db-backup-manual-1746707762 -n adm-it-pub-turspor kubectl apply -f turspor-mariadb-backup-cronjob.yaml kubectl create job --from=cronjob/turspor-db-backup turspor-db-backup-manual-$(date +%s) -n adm-it-pub-turspor k9s -n adm-it-pub-turspor ``` og så dukket det jammen opp en .sql fil i NREC: * https://dashboard.nrec.no/dashboard/project/containers/container/turspor/tmp ``` db_backup_20250508_131950.sql ``` # s3 nrec * https://uh-iaas.readthedocs.io/object.html#id4 * https://docs.nrec.no/api.html#using-the-cli-tools ## keystone_rc.sh ``` export OS_USERNAME=Helge.Opedal@uib.no export OS_PROJECT_NAME=uib-adm-it-pub-prod export OS_PASSWORD=habahabatsuttsut export OS_AUTH_URL=https://api.nrec.no:5000/v3 export OS_IDENTITY_API_VERSION=3 export OS_USER_DOMAIN_NAME=dataporten export OS_PROJECT_DOMAIN_NAME=dataporten export OS_REGION_NAME=bgo export OS_INTERFACE=public export OS_NO_CACHE=1 ``` OS_USERNAME og OS_PASSWORD finner en på: * https://access.nrec.no/ og deretter: ``` source keystone_rc.sh ``` Og så: ``` openstack ec2 credentials list ``` ## .s3cfg ``` [= asdfljhasdøfghøasdgløsdjkg host_base = object.api.bgo.nrec.no host_bucket = object.api.bgo.nrec.no secret_key = asdføljhadløfghsdkløghløsdkfhg ``` ## .aws/credentials ``` [default](access_key)(default]) aws_access_key_id = asdføoljkadfsølghsdølfgølsdkfjg aws_secret_access_key = asdfglhsdfølkgjhsdøfkghlsdkfjhg ``` ## .aws/config ``` [= <region> s3 = ``` ``` ``` ``` signature_version = s3v4 endpoint_url = https://object.api.bgo.nrec.no:8080/swift/v1/turspor ``` ``` ``` ``` ``` ## swift ``` pip3 install python-swiftclient pip3 install python-keystoneclient ``` ``` source keystone_rc.sh swift list turspor ``` ``` swift upload turspor Article_Title.pdf ``` ``` swift download turspor Article_Title.pdf ``` * https://dashboard.nrec.no/dashboard/project/containers/container/turspor ## Eksempel på db dump i cronjob * https://git.app.uib.no/platform_public/rail/gitops/ub-ufs-du/-/blob/main/base/clarino-test/cronjobs/postgres-db-backup-cronjob.yaml?ref_type=heads#L1 ### Og tilhørende Dockerfil * https://itgit.app.uib.no/ub/CLARINO/dspace-import/-/blob/clarino/docker/dockerfile.s3sync?ref_type=heads # dumpe en mariadb database i RAIL kubernetes ``` kubectl exec -n adm-it-pub-turspor turspor-mariadb-statefulset-0 -- mysqldump -u root -p`cat /home/helgeo/.mysql` turspor_db > turspor$(date +%m%d).sql ``` En kan kanskje lagre dumpen inne i poden også på et PVC volume område: ``` kubectl exec -n adm-it-pub-turspor turspor-mariadb-statefulset-0 -- \ ``` sh -c 'mysqldump -u root -p"$(cat /home/helgeo/.mysql)" turspor_db > /var/lib/mysql/backups/turspor$(date +%Y%m%d).sql' ``` ``` # ssh-agent bruk en annen nøkkel (hint for Rail) ``` ssh-agent bash ssh-add ~/.ssh/id_rsa_rail git pull origin main ``` Og får å fjerne nøkkelen igjen: ``` ssh-add -d ~/.ssh/id_rsa_rail ``` # Mulige yaml kode sjekkere? * KubeLinter * Datree # watch er en kul Linux kommando! Se live top IP er fra access_log for å feilsøke etter "synderen" ``` watch -n 1 'tail -n 100000 /var/log/httpd/access_log | awk "{print \$1}" | sort | uniq -c | sort -nr | head -10' ``` Som da gir ut "live" data på besøkende på din web nettside on-the-fly i access_log filen de siste 100000 linjene. Dette kan være nyttig for å vite hvilke IP'er er med på å dra ned nettstedet ditt..jepp ``` ``` ``` 77529 129.177.9.100 ``` ``` 589 20.185.79.47 564 158.39.77.26 540 52.142.24.149 462 129.177.6.169 462 129.177.6.125 425 66.249.66.23 194 20.171.207.138 168 193.26.115.62 165 52.169.5.58 ``` ``` ``` ``` ``` # [Brukar:Mihho/RAIL-KLADD](region)(default])(Brukar:Mihho/RAIL-KLADD) # Rsynce MariaDB (og senere Postgresql dump) sql dump filer fra NREC til On-Prem Linux host ``` rsync -av -e "ssh -i ~/.ssh/id_rsa_nrec_mariadb" rocky@mariadb.app.uib.no:/localvolume/backup/helge/* /backup/helge/NREC-MariaDB/ ``` Og via crontab ``` 11 3 * * * root rsync -av -e "ssh -i ~/.ssh/id_rsa_nrec_mariadb" rocky@mariadb.app.uib.no:/localvolume/backup/helge/* /backup/helge/NREC-MariaDB/ ``` Forklaring: Dersom en har RAIL Kubernetes applikasjoner så kan de ikke "snakke" med databaser bak 129.177 brannmuren. Derfor kan vi sette opp en MariaDB/Postgresql boks i NREC (som i dag heter: mariadb.app.uib.no) som har databasene til RAIL applikasjoner. Når databaser dumpes der, må de rsynces ned til Linux on-prem for backup mot TSM og Billy. # Dumpe RAIL Kubernetes mariadb database til lokal fil Først portforwarding: ``` ssh -L 3307:localhost:3306 helgeo@login-01.bgo1.test.rail.uhdc.no kubectl port-forward -n adm-it-pub-mariadb mariadb-statefulset-0 3306:3306 ``` Deretter: ``` mariadb-dump -h 127.0.0.1 -P 3307 -u root -p corviz > /tmp/corviz-dump.sql ``` simsalabim Et annnet alternativ kan også være å gjøre noe ala: ``` kubectl exec -it mariadb-pod -- bash -c "mariadb-dump -u root -pYOURPASSWORD database > /backup/db.sql" kubectl cp mariadb-pod:/backup/db.sql /path/on/linux/server/ ``` ``` kubectl exec mariadb-pod -- tar -czf /backup/db.sql.tar.gz -C /backup db.sql kubectl cp mariadb-pod:/backup/db.sql.tar.gz /path/on/linux/server/ ``` Men siden / root disken er full på bgo1-test, så funker det jo ikke. Og ``` kubectl scp ``` eksisterer ikke? # Logg inn RAIL ```bash #!/bin/bash RAIL_PORT=$(ssh helgeo@login-01.bgo1.test.rail.uhdc.no grep -- --listen-address=127.0.0.1: .kube/config | cut -d: -f2) ssh -L$RAIL_PORT:localhost:$RAIL_PORT helgeo@login-01.bgo1.test.rail.uhdc.no kubectl get pods firefox http://localhost:22008 ssh helgeo@login-01.bgo1.test.rail.uhdc.no ``` # Sist innlogget brukerliste i ITwikien * https://itwiki.uib.no/index.php?title=Spesial:Siste_brukerinnlogging&order_by=user_touched&order_type=DESC # Min personlige git side * https://git.app.uib.no/Helge.Opedal/etc ``` git clone git@git.app.uib.no:Helge.Opedal/etc.git ``` # Flytte en katalog til eksisterende tar fil ``` tar --append --file=/backup/my-backup.tar /var/www/app/skjemaker/htdocs/data/form_NNNNNN/ ``` # Kubernetes_workshop_dag_8 * [Kubernetes_workshop_dag_7 * [Brukar:Mihho/kubernetes_workshop_dag_7](#)(Brukar:Mihho/kubernetes_workshop_dag_8](Brukar:Mihho/kubernetes_workshop_dag_8))(Brukar:Mihho/kubernetes_workshop_dag_7) # Kubernetes_workshop_dag_6 * [Kubernetes_workshop_dag_5 * [Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_5](#)(Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_6](Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_6))(Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_5) # Corviz_i_Kubernetes_workshop_dag_4 * [Corviz_i_Kubernetes_workshop_dag_3 * [Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_3](#)(Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_4](Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_4))(Brukar:Mihho/Corviz_i_Kubernetes_workshop_dag_3) # Corviz i Kubernetes workshop dag 2 * [Kubernetes workshop dag 2](i)(Brukar:Mihho/Corviz)(Brukar:Mihho/Corviz i Kubernetes workshop dag 2) # mariadb.app.uib.no MariaDB Test i Nrec Helge Rocky 8 i Nrec: ``` 158.37.65.236 ``` * https://mariadb.app.uib.no/phpMyAdmin/ Logg inn: ``` ssh helgeo@p1kro01 ssh mihho@p1publogin ssh helgeo@d1helge01 sudo -i ssh -i .ssh/id_rsa rocky@158.37.65.236 ``` Eller: ``` ssh -i ~/.ssh/id_rsa_mariadb rocky@mariadb.app.uib.no ``` For å logge inn med mysql fra p1kro01: ``` mysql -u skeivtarkiv_test -h mariadb.app.uib.no -pHeMmElIGPaSsOrD skeivtarkiv_test ``` Dersom andre klienter skal kople til, så må det legges til spesifikt IP adresse i ingress i Nrec openstack. ## 2FA i phpMyAdmin Jeg har aktivert 2FA i phpMyAdmin på mariadb.app.uib.no. For å få dette til måtte jeg gjøre: ``` mysql -u root -p < /usr/share/phpMyAdmin/sql/create_tables.sql ``` Lage bruker: ``` CREATE USER 'pma_user'@'localhost' IDENTIFIED BY 'pma_password'; GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'pma_user'@'localhost'; FLUSH PRIVILEGES; ``` og disse må legges til config.inc.php ``` /* phpMyAdmin configuration storage settings */ $cfg['localhost'; // Change if phpMyAdmin is on a different host $cfg['Servers'](=)('Servers'][$i]['controlhost'])['pma_user'; $cfg['Servers'](=)($i]['controluser'])['pma_password'; $cfg['Servers'](=)($i]['controlpass'])['phpmyadmin'; $cfg['Servers'](=)($i]['pmadb'])['pma__bookmark'; $cfg['Servers'](=)($i]['bookmarktable'])['pma__relation'; $cfg['Servers'](=)($i]['relation'])['pma__table_info'; $cfg['Servers'](=)($i]['table_info'])['pma__table_coords'; $cfg['Servers'](=)($i]['table_coords'])['pma__pdf_pages'; $cfg['Servers'](=)($i]['pdf_pages'])['pma__column_info'; $cfg['Servers'](=)($i]['column_info'])['pma__history'; $cfg['Servers'](=)($i]['history'])['pma__recent'; $cfg['Servers'](=)($i]['recent'])['pma__table_uiprefs'; $cfg['Servers'](=)($i]['table_uiprefs'])['pma__tracking'; $cfg['Servers'](=)($i]['tracking'])['pma__userconfig'; $cfg['Servers'](=)($i]['userconfig'])['pma__users'; $cfg['Servers'](=)($i]['users'])['pma__usergroups'; $cfg['Servers'](=)($i]['usergroups'])['pma__navigationhiding'; $cfg['Servers'](=)($i]['navigationhiding'])['pma__savedsearches'; $cfg['Servers'](=)($i]['savedsearches'])['pma__central_columns'; $cfg['Servers'](=)($i]['central_columns'])['pma__designer_settings'; $cfg['Servers'](=)($i]['designer_settings'])['pma__export_templates'; ``` Deretter gå til Settings - Two factor authentication og så scanne QR koden # Oppdatere cache i it.uib.no Script kjører via: ``` /home/helgeo/CreateCache-it.uib.no ``` Den kjører i 30 minutter, max 5 sekunder per GET request. Det trigger Mediawiki koden i IThjelp til å generere en tilfeldig side. Når det gjøres, så lagres html koden i en lokal cache som da fungerer som html cache for neste besøkende. Cache'en bygges opp her på p1kro01: ``` /var/www/app/wiki/sites/ithjelp/code/cache ``` Scriptet er nokså enkelt: ```bash #!/bin/bash # Define the URL and the duration for the loop url="https://it.uib.no/Spesial:Tilfeldig" duration=$((30 * 60)) # 30 minutes in seconds interval=5 # Interval in seconds # Get the current time and set an end time for the loop end_time=$(( $(date +%s) + duration )) # Loop and send requests while [ $(date +%s) -lt $end_time ](=)($i]['export_templates']); do ``` ``` ``` ``` wget -q -O /dev/null "$url" # Send the request without saving the output sleep $interval # Wait for the next interval ``` ``` ``` ``` done ``` Målet? Å få kjappe nettsider på it.uib.no # Sikkerhets gjennomgang Mediawiki - stikkord * stramme inn spesialsider * sjekk suid * root squash * cyclone * rydde i ldap gruppene * defender * shodan.io * brannmur iptebles ut * vmware disconnect nettverkskort * https://www.mediawiki.org/wiki/Extension:MaintenanceShell * https://www.mediawiki.org/wiki/Manual:Shell.php * https://github.com/fribyte-code/wiki ``` Official wiki for friByte 🌱. Contribute to fribyte-code/wiki development by creating an account on GitHub. ``` Extensions aktivert for Wiki'ene ved UiB (Wikhost): ``` wfLoadExtension( 'ParserFunctions' ); wfLoadExtension( 'VisualEditor' ); wfLoadExtension( 'SimpleMathJax' ); wfLoadExtension( 'InputBox' ); wfLoadExtension( 'Cite' ); wfLoadExtension( 'Widgets' ); wfLoadExtension( 'PageForms' ); ``` * https://dehashed.com/ * https://portswigger.net/web-security/file-upload * portswigger.net * https://www.cvedetails.com/vulnerability-list/vendor_id-2360/product_id-4125/Mediawiki-Mediawiki.html?page=1&cvssscoremin=7&order=1 # Mediawiki Mediawiki : Security vulnerabilities, CVEs Security vulnerabilities of Mediawiki Mediawiki : List of vulnerabilities affecting any version of this product: * https://www.cvedetails.com * https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php # TSM restore av en katalog til en ny katalog ``` dsmc restore "/var/www/sites/skeivtarkiv/*" "/var/www/sites/TMP4/" -pick -ina -sub=yes ``` Etter restoren kan en flytte Prod katalog til navn-feil, og så bruke mv for å flytte inn katalogen som er restoret fra TSM # PHP ytelse Hint: * opcache (yum install for hver php8X-php-fpm) ## Klient caching av diverse filer css, js, bilder osv ``` <IfModule mod_expires.c> ``` ``` ExpiresActive On ``` ``` ``` ``` # Set default expiration time ExpiresDefault "access plus 1 hour" ``` ``` ``` ``` # Set expiration times for specific file types ExpiresByType text/css "access plus 1 week" ExpiresByType application/javascript "access plus 1 week" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/webp "access plus 1 month" ExpiresByType application/font-woff2 "access plus 1 year" ExpiresByType application/font-woff "access plus 1 year" ExpiresByType font/woff2 "access plus 1 year" ExpiresByType font/woff "access plus 1 year" ExpiresByType application/x-font-ttf "access plus 1 year" ExpiresByType font/ttf "access plus 1 year" ExpiresByType font/otf "access plus 1 year" ``` ``` </IfModule> <IfModule mod_headers.c> ``` ``` # Set Cache-Control headers for caching static assets <FilesMatch "\.(css|js|woff|woff2|ttf|otf|png|jpg|jpeg|gif|svg|webp)$"> ``` ``` Header set Cache-Control "public, max-age=31536000, immutable" ``` ``` </FilesMatch> ``` ``` ``` ``` <FilesMatch "\.(html|htm)$"> ``` ``` Header set Cache-Control "private, max-age=86400" ``` ``` </FilesMatch> ``` ``` </IfModule> <IfModule mod_deflate.c> ``` ``` # Enable GZIP compression for text-based files AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json text/xml application/xml application/xhtml+xml application/rss+xml font/woff2 font/woff ``` ``` </IfModule> ``` # IRT - Incident Response Team Samhandlingskanalen: * https://app.rayvn.global/#/ # Forsøk på å estimere ant. timer per oppgave per uke i 2025 (Under arbeid, og foreløpig estimert) | Oppgave i 2025 | Timer per uke | | --- | --- | | Kubernetes | 5 | | Møter | 2 | | Wikihost | 3 (drift, forvaltning, oppgradering) | | Skjemaker | 4 (drift, forvaltning, oppgradering) | | WordPress | 4 (drift, forvaltning, oppgradering) | | Webhotell (Egendriftet Løsning, under avvikling) (Skeivtarkiv, vis.uib.no, turspor, folk, org, m.m.) | 2 | | Red Hat 8 avvikling | 0 | | Grind (Kringom) | 0.5 | | Umjubileum ustillings server/app | 0.5 | | Egenutvikling (docker, kubernetes, kurs m.m) | 3 | | Bash og PHP-utvikling (drift og forvaltning) | 1 | | Støtte til W3-kurs og w3-staging servere | 0 | | Turing-server i Dikult kurser | 0.5 | | Apache Apex Reverse-proxy | 0 | | Generell brukerstøtte (svare på saker, tilganger, feilsøking, oppretting osv: Skjemaker, Regelsamlingen, WordPress, MediaWiki, filer.uib.no osv) | 8 | | Heldagssamlinger | 1 | | Prating og diskusjoner | 2 | | Støtte for Regelsamlingen | 0.5 | | Sprint/workshops | 1 | | Sprint/workshops | 1 | Estimert ca 38 timer per uke # Forsøk på å estimere ant. timer per oppgave per uke i 2024 Jeg har forsøkt å beregne hvor mye tid jeg bruker på ulike oppgaver per uke. Jeg jobber selvfølgelig ikke med alt dette i løpet av en uke, f.eks Wikihost oppgaver er gjerne oppgraderingsarbeid, og det gjør jeg i mine egne "sprinter" vanligvis 2-3 ganger i året, og det tar estimert rundt 4-6 uker totalt. Ut fra et slik estimat, så har jeg beregnet dette ned til antall timer per uke basert på at vi har 226 arbeidsdager i året. Listen hadde kanskje vært mer forståelig om fordelingen hadde blitt gjort med antall dager og uker per oppgave. | Oppgave i 2024 | Timer per uke | | --- | --- | | Møter | 3.5 | | Wikihost | 3 (drift, forvaltning, oppgradering) | | Skjemaker | 4 (drift, forvaltning, oppgradering) | | WordPress | 4 (drift, forvaltning, oppgradering) | | Webhotell (Egendriftet Løsning, under avvikling) (Skeivtarkiv, vis.uib.no, turspor, folk, org, m.m.) | 3 | | Red Hat 7 avvikling | 3 | | Grind (Kringom) | 1 time per uke (vil estimere rundt 3 uker i året på denne oppgaven, alt fra epost, feilsøking, tilganger osv) | | Egenutvikling (docker, kubernetes, kurs m.m) | 2-3 | | Bash og PHP-utvikling (drift og forvaltning) | 2-3 | | Støtte til W3-kurs og w3-staging servere | 1 (det arbeidet jeg gjorde for KA) | | Turing-server i Dikult kurser | 0.5 (inkludert overgang fra Redhat 7 til 8) | | Apache Apex Reverse-proxy | 0.5 (inkludert overgang fra Redhat 7 til 8) | | Generell brukerstøtte (svare på saker, tilganger, feilsøking, oppretting osv: Skjemaker, WordPress, MediaWiki, filer.uib.no osv) | 6 | | Heldagssamlinger | 1 | | Prating og diskusjoner | 2 | | Støtte for Regelsamlingen | 0.5 | | Sprint/workshops | 0.5 | | Sprint/workshops | 0.5 | Og her er dataene med dager og uker per år: | Oppgave | Dager/år (lav-høy) | Uker/år (lav-høy) | | --- | --- | --- | | Møter | 21 | 3 | | Wikihost (drift, forvaltning, oppgradering) | 20 | 4 | | Skjemaker (drift, forvaltning, oppgradering) | 20 | 4 | | WordPress (drift, forvaltning, oppgradering) | 25 | 5 | | Webhotell (Egendriftet løsning, under avvikling) | 18 | 3 | | Red Hat 7 avvikling | 18 | 3 | | Grind (Kringom) | 4-5 | 1 | | Egenutvikling (docker, kubernetes, kurs m.m) | 15 | 3 | | Bash og PHP-utvikling (drift og forvaltning) | 15 | 3 | | Støtte til W3-kurs og w3-staging servere | 6 | 1 | | Turing-server i Dikult kurser | 3 | 1/2 | | Apache Apex Reverse-proxy | 3 | 1/2 | | Generell brukerstøtte (svare på saker, tilganger, feilsøking, osv.) | 35 | 7 | | Heldagssamlinger | 4 | 1 | | Prating og diskusjoner | 6 | 1 | | Støtte for Regelsamlingen | 3 | 1/2 | | Sprint/workshops | 5 | 1 | | Sprint/workshops | 5 | 1 | Uformell addering: ``` (237 dager, 45 uker) på et arbeidsår 226 dager, 45 uker ``` # Tips for Linux videoer * Sende epost med en annen avsender * Lage første index.html fil * while loop * for loop (for i in $(cat fil); do echo $i; done) * # [[Brukar:Mihho/RAIL-INTRO-DAG-1](*)(Brukar:Mihho/RAIL-INTRO-DAG-1](Brukar:Mihho/RAIL-INTRO-DAG-1))(Brukar:Mihho/RAIL-INTRO-DAG-1) # [[Brukar:Mihho/RAIL_INTRO_DAG_2_-_TEMA_HEMMELIGHET_PULL_SECRET](*)(Brukar:Mihho/RAIL_INTRO_DAG_2_-_TEMA_HEMMELIGHET_PULL_SECRET](Brukar:Mihho/RAIL_INTRO_DAG_2_-_TEMA_HEMMELIGHET_PULL_SECRET))(Brukar:Mihho/RAIL_INTRO_DAG_2_-_TEMA_HEMMELIGHET_PULL_SECRET) # [[Brukar:Mihho/Kubernetes_RAIL_intro_dag_3_Prodsetting_av_Shared_App](*)(Brukar:Mihho/Kubernetes_RAIL_intro_dag_3_Prodsetting_av_Shared_App](Brukar:Mihho/Kubernetes_RAIL_intro_dag_3_Prodsetting_av_Shared_App))(Brukar:Mihho/Kubernetes_RAIL_intro_dag_3_Prodsetting_av_Shared_App) # [[Brukar:Mihho/Kubernetes-kurs-dag1-intro](*)(Brukar:Mihho/Kubernetes-kurs-dag1-intro](Brukar:Mihho/Kubernetes-kurs-dag1-intro))(Brukar:Mihho/Kubernetes-kurs-dag1-intro) # [[Brukar:Mihho/Kubernetes-kurs-dag1-etter-lunsj](*)(Brukar:Mihho/Kubernetes-kurs-dag1-etter-lunsj](Brukar:Mihho/Kubernetes-kurs-dag1-etter-lunsj))(Brukar:Mihho/Kubernetes-kurs-dag1-etter-lunsj) # [[Brukar:Mihho/Kubernetes-kurs-dag2](*)(Brukar:Mihho/Kubernetes-kurs-dag2](Brukar:Mihho/Kubernetes-kurs-dag2))(Brukar:Mihho/Kubernetes-kurs-dag2) # [[Brukar:Mihho/Kubernetes-kurs-dag3](*)(Brukar:Mihho/Kubernetes-kurs-dag3](Brukar:Mihho/Kubernetes-kurs-dag3))(Brukar:Mihho/Kubernetes-kurs-dag3) # minikube ``` Minikube is ideal for experimentation, small-scale testing, and learning Kubernetes without the need for complex setups, making it a great tool for developers. ``` # Overvåke størrelsen til en fil ``` watch -n 1 du -h /path/to/fila ``` # Sette opp PHP remi 8.3 ``` sudo dnf module reset php sudo dnf module enable php:remi-8.3 ``` og så: ``` sudo dnf install php ``` # Logge inn på Kubernetes RAIL boks Opprett .ssh/config: ``` Host rail-osl1-test ``` ``` ``` ``` #HostName login-01.osl1.test.rail.uhdc.no HostName login-03.osl1.test.rail.uhdc.no User helgeo LocalForward 23008 localhost:23008 ``` ``` ``` ``` Host rail-bgo1-test ``` ``` ``` ``` #HostName login-01.bgo1.test.rail.uhdc.no HostName login-03.bgo1.test.rail.uhdc.no User helgeo LocalForward 22008 localhost:22008 ``` ``` ``` ``` Host * ``` ``` ``` ``` ServerAliveInterval 30 ServerAliveCountMax 100 ``` ``` ``` ``` ``` Deretter: ``` ssh rail-bgo1-test ``` og så: ``` kubectl get pods ``` Ninja triks: ``` kubectl hns tree adm-it-pub ``` som da gir ut: ``` adm-it-pub ├── [└── [s](adm-it-pub-profile)(s]) adm-it-pub-shared ``` Og videre: ``` ssh rail-bgo1-test minikube tunnel ``` ``` ssh rail-bgo1-test minikube dashboard ssh -L 8001:127.0.0.1:46397 helgeo@rail-bgo1-test ``` og så ``` http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/daemonset?namespace=default ``` # Finn månedsbackup filer av Skjemaker Hver måned så blir det lagret en kopi av Skjemaker databasen. For å finne disse backupene blant alle de andre .sql.gz filene, så kan en kjøre følgende find kommando: ``` find . -regextype posix-extended -iregex '.*/skjemaker[som da vil gi ut: ``` ./skjemaker19.February.sql.gz ./skjemaker19.March.sql.gz ./skjemaker19.December.sql.gz ./skjemaker19.April.sql.gz ./skjemaker19.May.sql.gz ./skjemaker19.January.sql.gz ./skjemaker21.September.sql.gz ./skjemaker21.July.sql.gz ./skjemaker21.August.sql.gz ./skjemaker21.October.sql.gz ``` Dersom en er interessert i få filer som har en årsdato i seg, og hvor mye GB dette kan totalt være, så kan en kjøre: ``` find /backup -type f -regextype posix-extended -regex '.*/.*(2019|202[0-9](```)(0-9].*\.(January|February|March|April|May|June|July|August|September|October|November|December)\.sql\.gz')).*\.sql\.gz' -exec du -ch {} + | grep total ``` # Hurtignotater fra gitlablab kurset * [Bruk curl til å finne return koden fra et nettsted ``` curl -o /dev/null -s -w "%{http_code}\n" -k https://helge.w.uib.no ``` gir da typisk ut: ``` 200 ``` # Gamle deny/allow from Apache 2.2 regler i nyere Apache 2.4 Om en har eldre Apache 2.2 kode som skal flyttes til Apache 2.4, så vil aksess regler som deny/allow slutte å virke. En kan få de til å virke også i Apache 2.4 ved å aktivere følgende apache module: ``` mod_access_compat.so ``` # En kan bruke VLC til å gjøre store .avi filer mindre Media -> gjør om /lagre -> Legg til fil (legg til avi filen) -> Konvert/lagre -> Velg profil (Video for Youtube HD) -> Mål-Bla gjennom -> start # Om du har store .avi filer, så kan du bruke ffmpeg for å gjøre de mindre og samtidig konvertere de til et annet format Her er 3 eksempler: ``` for file in *.avi; do ``` ``` ``` ffmpeg -i "$file" -vcodec libx264 -crf 23 -preset fast -acodec aac -b:a 192k -ar 44100 -shortest "${file%.avi}_final.mp4" ``` ``` ``` done ``` ``` for file in *.avi; do ``` ``` ``` ffmpeg -i "$file" -vcodec libx264 -crf 23 -preset fast -acodec aac -b:a 192k -shortest "${file%.avi}_compressed.mp4" ``` ``` ``` done ``` ``` for file in *.avi; do ``` ``` ``` ffmpeg -i "$file" -vcodec libx264 -crf 25 -preset fast -acodec aac -b:a 128k "${file%.avi}_compressed.mp4" ``` ``` ``` done ``` # Søk gjennom filer etter spesifikke ord ``` grep --color=always -Hn "password" *.txt ``` Ordet "password" blir highlightet og filnavnet samt linjenummer blir skrevet ut. # Blir du ofte logget ut av phpMyAdmin? Dette kan være løsningen. Legg til: ``` $cfg['LoginCookieValidity'](#)(Brukar:Mihho/kladd-gitlablab-kurs](Brukar:Mihho/kladd-gitlablab-kurs)) = 86400; ``` i config.inc.php fila. Les her: * https://stackoverflow.com/questions/26242624/phpmyadmin-no-activity-within-1800-seconds-please-log-in-again-error Det er mulig at disse også må endres i php.ini fila: ``` session.gc_maxlifetime = 1800 ; // Default is 1440 seconds (24 minutes) session.cookie_lifetime = 1800 ; // Also 30 minutes ``` Og husk at også disse innstillingene i apache confen kan ha betydning: ``` Timeout 300 ProxyTimeout 300 ``` # Wordpress w.uib.no i en docker container? For å importere databasen: ``` docker exec -i hello-world-mysql-wordpress mysql -u root -pHabaHaba wordpress < wordpressblog04.20240917.sql ``` # Teste boks for Fastapi python applikasjonen? Har satt opp denne: ``` ssh -i .ssh/id_rsa rocky@158.39.77.73 ``` i adm-it-pub Prod NREC, så den er klar for Prodsetting av: Web: * https://britabot.app.uib.no/ # sshuttle mot jumphost ``` sshuttle -l 0.0.0.0 -x 172.0.0.0/8 -v -r mihho@p1publogin 129.177.0.0/16 ``` # Docker cron jobber? Mulig løsning som må testes ut: ```bash FROM php:8.0-apache # Install cron and any other dependencies RUN apt-get update && apt-get install -y cron # Add your crontab file to the container COPY crontab /etc/cron.d/your-crontab-file # Apply cron job permissions RUN chmod 0644 /etc/cron.d/your-crontab-file # Start cron service and Apache CMD ["-f"]("cron",) && apache2-foreground ``` # Mysql dump bash script ```bash #!/bin/bash mysqlcheck -u root --auto-repair --check --all-databases &> /backup/helge/autorepairloggen.$(date -I) DATOTID=$(date +%Y-%m-%d:%T) MAANED=$(date +%B) DAG=$(date +%d) AAR=$(date +'%Y') LISTA=`find /var/lib/mysql/ -maxdepth 1 -type d | awk -F '/' '{print $5}' | sort | uniq | sed '/^$/d'` for i in $LISTA; do echo "cd /backup/helge; mysqldump --lock-tables=false $i > /backup/helge/$i.$DATOTID.sql"; done > /backup/helge/runme.sh echo "cd /backup/helge/; gzip *.sql" >> /backup/helge/runme.sh # Månedsbackup. Dersom gitt dagsnummer, kopier dump fil til månedens fil if [ $DAG = "09" ]; then ``` ``` for i in $LISTA; do echo "mv /backup/helge/$i.$DATOTID.sql.gz /backup/helge/$i.$AAR.$MAANED.sql.gz"; done >> /backup/helge/runme.sh ``` ``` fi # kjoerbart script chmod 755 /backup/helge/runme.sh # Kjør backup /backup/helge/runme.sh # til slutt ta vare på kommandoene i en git log cd /backup/helge/ git commit -m "runme.sh: db-backup kommandoene" runme.sh exit; ``` # Fjerne alt og begynne på nytt i docker ``` docker stop $(docker ps -aq) docker rm $(docker ps -aq) docker rmi $(docker images -q) docker volume rm $(docker volume ls -q) docker network rm $(docker network ls -q) docker system prune -a --volumes ``` # docker build error? Mulig løsning: ``` docker builder prune --all ``` # Glemt passord i en wiki? og en får følgende melding: ``` Error: You are using an unsupported PHP version (PHP 7.4.33). MediaWiki 1.42 needs PHP 8.1.0 or higher. ``` Løsning: ``` /opt/remi/php81/root/bin/php changePassword.php ``` # Skeivtarkiv Test i en docker container? Foreløpig test: ``` ssh d1helge01 cd /local/helge/skeivtarkiv/ docker-compose up ``` og så gå til: * https://skeivtarkiv.test.uib.no GD mangler, feiler med: ``` failed to solve: process "/bin/sh -c docker-php-ext-install gd" did not complete successfully: exit code: 1 ``` ## Få en engangsinnlogging til Skeivtarkiv i docker Test ``` ssh helgeo@d1helge01 cd /local/helge/skeivtarkiv docker exec -it skeivtarkiv /bin/bash vendor/bin/drush uli ``` Da får en typisk ut: * https://skeivtarkiv.test.uib.no/user/reset/1/1724772361/4j4e8fBJWkj7eDrBTappo2-9HPY-25pl7mu2y9RvmU0/login denne limer en inn i nettleseren og så er en innlogget som admin :-) # Skeivtarkiv Drupal bak reverse proxy En opplever mixed content problem, og da vises ingen bilder f.eks. En løsning kan da være å legge til i settings.php fila (her er p1kro01 reverse-proxy): ``` $conf[TRUE; $base_url = 'https://skeivtarkiv.test.uib.no'; $conf['reverse_proxy_addresses'](=)('reverse_proxy']) = array('129.177.6.149'); $conf['HTTP_X_FORWARDED_FOR'; ``` Fra: * https://stackoverflow.com/questions/36222254/drupal-mixed-content-error-when-using-ssl-certificate # Fjerne error reporting til nettleseren i en docker container I forsøket med å få Skjemaker opp i en docker, så kom det hver gang en deprecated melding ut på nettleseren. For å unngå denne feilmeldingen så la jeg til følgende i Dockerfile'en, og da forsvant meldingen: ``` # Rename php.ini-production to php.ini RUN mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini # Concatenate custom configurations to php.ini and php.ini-production RUN echo "memory_limit = 256M" >> /usr/local/etc/php/php.ini && \ ``` ``` ``` ``` echo "max_execution_time = 300" >> /usr/local/etc/php/php.ini && \ echo "max_input_time = 600" >> /usr/local/etc/php/php.ini && \ echo "upload_max_filesize = 20M" >> /usr/local/etc/php/php.ini && \ echo "post_max_size = 40M" >> /usr/local/etc/php/php.ini && \ echo "error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED" >> /usr/local/etc/php/ ``` ``` ``` ``` php.ini ``` # Skjemaker som docker i Test * https://skjemaker.test.uib.no er en reverse proxy mot en testinstallasjon av Machform som en docker container. Selve test applikasjonen kjører på Helge sin grisleboks (grisle: https://ordbokene.no/nno/bm/%C3%A5%20grisle): * d1helge01 Planen er å ikke realisere Test installasjoner på Redhat/Rocky bokser lenger, men kun som docker kontainere. Målet er å få driftserfaring med docker. Får å kople til phpmyadmin: * http://d1helge01.uib.no:8080 phpMyAdmin i Skjemaker docker Test'en: https://skjemaker.test.uib.no/phpmyadmin/ NB: det er ip basert begrensning. Dersom en skal hvitliste en ip så må dette legges inn i skjemaker.test.uib.no.conf vhost filen. For at en skal kjøre en upgrade.php så må data katalogen være eid av apache prosessen. Det gjøres enklest ved å: ``` docker exec -it skjemaker-docker-instans /bin/bash chown -R www-data data ``` En må også huske å gå til: * https://skjemaker-docker-instans.testapp.uib.no/main_settings.php og endre Machform URL til: * skjemaker.test.uib.no ## Importere skjemaker.sql inn i en mysql docker container ``` docker exec -i skjemaker22-docker-container mysql -u root -ptest1234 skjemaker22-database < skjemaker.sql ``` ## Dumpe mysql data fra en mysql docker container Kladd: ``` docker exec <mysql_container_name> mysqldump --single-transaction --quick --max_allowed_packet=1M -u root -p database_name > backup.sql ``` # Validering mot ldaps virker ikke fra en docker container Dersom en ikke greier å validere mot ldap.uib.no:636 fra en docker container (typisk en PHP application), så kan følgende løsning være å putte denne setningen inn i Dockerfile'n: ``` # ldaps RUN mkdir /etc/ldap/ && \ echo 'TLS_REQCERT allow' >> /etc/ldap/ldap.conf ``` Fra: * https://serverfault.com/questions/628777/cant-contact-ldap-server-with-ldaps-in-docker # Installere htmldoc på Redhat ``` yum install snapd systemctl enable --now snapd.socket ln -s /var/lib/snapd/snap /snap systemctl start snapd snap install htmldoc ``` # For liten /tmp katalog? Om en kjører en kommando som bruker /tmp til mellomlagring og /tmp går full, så kan du løse dette ved å bruke en annen disk som har mer plass. Dette gjøres ved å sette: ``` export TMPDIR=/var/www/nytmpdisk/ ``` hvor nytmpdisk er en katalog i disken /var/www som da er større enn /tmp disken. Her er et eksempel: ``` df -kh ``` gir ut: ``` Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_local-lv_tmp 1014M 40M 975M 4% /tmp /dev/mapper/vg_sata-lv_www 359G 291G 69G 81% /var/www ``` Her kan en se at på /var/www har en 69GB ledig, mens i /tmp er det kun 975M ledig. # Logg fylles opp veldig fort i din PHP applikasjon? Har hatt en Drupal hvor watchdog tabellen økte noe voldsomt, som igjen gjorde at dump filen ble til slutt 126GB og så ble disken full. En mulig løsning kan være å legge inn følgende i settings.php fila: ``` error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); ``` som da sier til PHP at alt unntatt 'notice' og 'warning' meldinger skal logges. Da det var notice og warning meldinger som flooded tabellen, så løste det problemet. # Hvilken PHP versjon kjører nettstedet? ``` wget --server-response --spider --tries=1 --timeout=3 https://skjemaker.app.uib.no 2>&1 | grep X-Powered-By ``` gir: ``` ``` X-Powered-By: PHP/8.3.9 ``` ``` Men, husk at webserveren bestemmer selv om slik informasjon skal gis ut. Om en setter: ``` expose_php = Off ``` så forhindrer en at PHP versjonsnummeret blir gitt ut. Noe som er anbefalt. # mysqlcheck for MariaDB I noen tilfeller bør en unngå kjøre mysqlcheck mot hele MariaDB. Har opplevd at det stopper hele greia. Kanskje bedre å ta database for database, og da gjerne spredt utover uken. Her er i alle fall syntaksen: ``` mysqlcheck -u [username](=)('reverse_proxy_header']) -p --optimize --auto-repair [# Oppdatere regler.app.uib.no ``` ssh helgeo@p1kro01 cd regler.app.uib.no git pull git log ``` Gjør evt. endringer ``` git push ``` Sjekk: * https://regler.test.uib.no # phpMyadmin for skjemaker.app.uib.no Skjemaker tjenesten som egentlig heter Machform har en MariaDB database. Dersom en trenger tilgang til Skjemaker databasen så må en gjøre følgende: ``` ssh navnekonto@p1skjemaker04 sudo -i cd /etc/httpd/conf.d git mv phpmyadmin.conf.OFF phpmyadmin.conf service httpd reload ``` og når en er ferdig: ``` git mv phpmyadmin.conf phpmyadmin.conf.OFF service httpd reload ``` # Hvilken tabell er den største? Om du har en stor MariaDB database og du lurer på hvilken tabell som er den største, så kan du kjøre følgende sql statement: ``` SELECT table_schema AS "Database", ``` ``` ``` ``` table_name AS "Table", ROUND((data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" ``` ``` ``` ``` FROM information_schema.TABLES WHERE table_schema = 'your_database_name' ORDER BY (data_length + index_length) DESC; ``` # Nettsider og php versjoner De fleste nettsidene under er prøvd med nyere versjon av PHP. I en del tilfeller så krasjer enten webapplikasjonen eller en eller annen plugin/innstikk/extension. Dermed befinner applikasjonen seg fortsatt på 7.4 da nyere versjon ikke fungerer. I de tilfellene det har fungert å oppgradere PHP versjonen, så er de flyttet til den høyeste 8.x versjonen som har vist seg å fungere med applikasjonen. | Nettside/domene | PHP versjon | Kommentar | Status | Dato | | --- | --- | --- | --- | --- | | https://registrering.uib.no/proforma/ | 8.2 | https://ntk.app.uib.no/TJ0736 | Ok | | | https://www.universitetsmuseet.no/nb | 8.1 | I følge https://whatcms.org/ så er Drupal versjonen på 9.2. Kan noen verifisere dette? | Mike jobber med saken | | | https://grind.no | 7.2 | [Egendriftet løsning? Avtale?](```)(database_name])(https://ntk.app.uib.no/TJ0139) | Den skal avvikles 2. desember | AVVIKLET! | | https://kursserver.k.uib.no/ | 8.2 | [for Dikult kurser Daniel Jung](kursserver)(UiB)(https://ntk.app.uib.no/TJ0689) | OK | | | [(470 nettsteder)](Wordpress)(Multisite)(https://ntk.app.uib.no/TJ0014) [8.3 | Flere plugins som ikke var kompatible med PHP 8.3 er avviklet | Ok! Done :-) | 17. oktober 2024. Ferdigstilt! | | Wikihost (ca 60 stk) bl.a it.uib.no/itwiki.uib.no | 7.4 og 8.0 | PHP >= 8.1 versjon gjør at ldap modulen ikke fungerer. ER NÅ LØST! | Planlegger innføring SimpleSaml og oppgradering. Avvikling av de som ikke har gitt tilbakemelding etter epost utsendelse. | ALLE WIKIENE ER OPPGRADERT TIL PHP 8.3! | | Diverse nettsteder på Egendriftet Løsning (se under) | | Planen er å avvikle de som ikke kan oppgraderes eller sikre de med å flytte til Docker eller å legge en Web Application Firewall (WAF) foran | FERDIGSTILT! | DONE! | | https://vis.uib.no | 8.2 | | Ok | DONE! | | https://birkeland.uib.no | 8.3 | | Ok | DONE! | | https://bio.uib.no/te/ | 8.3 | | Ok | DONE! | | https://booking2.h.uib.no | 8.1 | Sikret med ip kontroll og htpasswd | PHP versjon ok enn så lenge. Selve applikasjonen er utdatert | AVVIKLET! | | https://btrc.h.uib.no | 7.4 | Sikret med ip kontroll og htpasswd. Men PHP kode er gammel og ikke vedlikeholdt | Stenges ned desember 2024. Eier er varslet | AVVIKLET! | | https://corviz.h.uib.no | 8.3 | | Ok | DONE! | | https://discretion.uib.no | 8.3 | 2 plugins er avviklet | OK! | DONE! | | https://dna.h.uib.no | 8.3 | Done! Virker i følge eier | Ok :) | DONE! | | https://emid.h.uib.no | 8.2 | | Ok | DONE! | | https://expearth.uib.no | 8.3 | Quiz'en knekker | Avventer. Kan den avvikles? | OPPGRADERT PHP 8.3! | | https://skjemaker.app.uib.no | 8.3.8 | Appnitro Machform støtter PHP 8.3 versjonen | Ny versjon 22 Prodsatt. Ok! :-) | DONE! | | https://katalog.skeivtarkiv.no | 7.4 | Bruker en funksjon som forsvinner når php > 7.4. Usikker på når dette blir fikset. | Venter på nettsteds-eier UB | REMI PHP 7.4 ER AKTIVERT! | | https://mso.uib.no/ | 8.3 | Tester med nettstedeier. Drupal core versjon ukjent | De har fått utsettelse. Planlagt flytting til Fribyte | OPPGRADERT PHP 8.3! | | https://nmr.uib.no/ | 7.4 | Vurderes avviklet/flyttet til www.uib.no. Gammel Joomla versjon, upatchet og ikke oppgradert. | Avviklet! Mulig flytting til www.uib.no | AVVIKLET! | | https://skeivtarkiv.no/ | 7.4 | Ser ut til å virke med PHP 8.2 i Test-teste Docker versjon | Klar til oppgradering av PHP til 8.3, evt. 8.2, venter på klarsignal | REMI PHP 7.4 ER AKTIVERT! | | https://solli.h.uib.no/ | 8.2 | Done! Virker i følge eier | Ok | OPPGRADERT PHP 8.3! | | https://solli.h.uib.no/ | 8.2 | Done! Virker i følge eier | Ok | OPPGRADERT PHP 8.3! | # SimpleSaml Azure AD og Mediawiki * [Brukar:Mihho/SimpleSaml_Mediawiki](|)(.w.uib.no](https://www.google.com/search?q=site%3Aw.uib.no))(Brukar:Mihho/SimpleSaml_Mediawiki) # Bash script for å lage eposter til typisk nettstedseiere Kan være nyttig når en skal aktivt varsle nettstedseiere og andre via epost. * [Folk og Org drifts-scripts Nå som Radisson7 blir slått av, så er gamle root scripts lagt her: * p1kro01.uib.no:/root/scripts/radisson7-scripts Disse scriptene er i hovedsak brukt til å hente ut brukerinfo, sende epost til Folk og Org brukerne osv. Altså type forvaltning og avvikling. # PHP støtte for Oracle backend database: oci8 Vi fikk en problemstilling under ``` yum update ``` på p1record02.uib.no ``` Error: Problem 1: cannot install the best update candidate for package php82-php-oci8-8.2.21-1.el8.remi.x86_64 ``` ``` - nothing provides libclntsh.so.23.1()(64bit) needed by php82-php-oci8-8.2.28-1.el8.remi.x86_64 from remi-safe ``` ``` ``` Løsningen: ``` rpm -e oracle-instantclient-basic ``` ``` wget https://download.oracle.com/otn_software/linux/instantclient/2380000/oracle-instantclient-basic-23.8.0.25.04-1.el9.x86_64.rpm ``` ``` sudo rpm -Uvh oracle-instantclient-basic-23.8.0.25.04-1.el9.x86_64.rpm ``` verifiser at pakken er kommet inn: ``` find /usr/lib/oracle/ -name libclntsh.so.23.1 ``` ``` sudo dnf update php82-php-oci8 ``` Da kommer de andre oppdaterte pakkene inn også. Deretter: ``` service php82-php-fpm restart service httpd restart ``` Bruk opsjonen status for å sjekke at de faktisk kjører. done. Se sak: * https://itgit.app.uib.no/it/dpv/daf/pub/backlog/-/issues/83 som da beskriver problemstilling med å få Oracle støtte i PHP på en Linux Rhel8/Rocky8. Og se også gjerne eldre artikkel: [Php oci install rhel5](#)(Brukar:Mihho/AlertAdmin.sh](Brukar:Mihho/AlertAdmin.sh))(Php oci install rhel5) Om en prøver: ``` dnf install php82-php-oci8 ``` og får: ``` Last metadata expiration check: 3:30:38 ago on Tue 04 Jun 2024 07:42:38 AM CEST. Error: ``` Problem: cannot install the best candidate for the job ``` - nothing provides libclntsh.so.21.1()(64bit) needed by php82-php-oci8-8.2.19-1.el8.remi.x86_64 from remi-safe ``` ``` (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages) ``` så kan dette være løsningen: Først: ``` wget https://download.oracle.com/otn_software/linux/instantclient/2114000/oracle-instantclient-basic-21.14.0.0.0-1.el8.x86_64.rpm ``` Deretter: ``` rpm -i oracle-instantclient-basic-21.14.0.0.0-1.el8.x86_64.rpm ``` og så skal denne fungere: ``` yum install php82-php-oci8 ``` Deretter sjekk med f.eks: ``` <?php phpinfo(); ?> ``` som bør da gi ut: ``` OCI8 Support enabled ``` # Skrive ut postgresql resultat til fil Logg inn: ``` psql ``` Deretter: ``` \o out.txt ``` Og så f.eks: ``` \dt ``` Logg ut: ``` \q ``` Og vips: ``` cat out.txt ``` :-) # Redmine i docker ## Dockerfil og docker-compose for Redmine Kommer... ## Endre Redmine admin passord Logg inn på docker container: ``` docker exec -it redmine bash ``` deretter: ``` RAILS_ENV=production bundle exec rails c ``` Deretter i konsollet: ``` user = User.where(login: 'admin').first user.password = 'NytTPasSorD' exit! ``` Nå skal en kunne logge inn via: ``` https://localhost:3000 ``` # Binær dump og restore i Postgresql Dersom en dumper og restorer med binær data så går alt mye mye fortere. Anbefales. For å dumpe, eksempelvis: ``` pg_dump -C -Fc database > database-dag-tid.dump ``` Og så restore: ``` pg_restore -d juradm database-dag-tid.dump ``` # WordPress/custom-notification.php * [Text felt vises ikke når en skal lage ny artikkel i Drupal w3-kurs.test.uib.no <htmlet>panopto-helge-1</htmlet> # Cytomine instans i NREC * https://doc.cytomine.com/admin-guide/legacy/legacy-install * https://forum.image.sc/t/how-to-configure-ssl-for-cytomine/66869 NB: Katalogen /var/lib/docker blir fort veldig stor. Derfor må en passe på å enten lage en symlenke eller eget volum for denne, ellers blir / disken full på null komma niks. ``` ssh -i .ssh/cytomine ubuntu@158.39.200.169 ``` # Er domenenavnet en webserver? * [Brukar:Mihho/ErWebServer.sh](#)(WordPress/custom-notification.php](WordPress/custom-notification.php))(Brukar:Mihho/ErWebServer.sh) # SSL sertifikat i Nginx Om en legger inn nye referanser til cert og key i ssl.inc fila, husk semikolon! ``` ssl_certificate /etc/letsencrypt/live/w3-prestaging.test.uib.no-0001/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/w3-prestaging.test.uib.no-0001/privkey.pem; ``` Det er fort gjort å glemme semikolonnet på slutten, særlig om en klipper og limer fra letsencrypt teksten. # W3 kurs / staging # Lage ny midlertidig bruker for w3-staging.test.uib.no ``` ssh t1w3app02 sudo -i su - w3-drupal cd /var/www/w3.uib.no bin/site-drush uli ``` Da får en en url som er på formen: ``` http://w3.uib.no/en/user/reset/1/1712304497/8lmC7KE9H6a_ZFYvM4o8DwxjanNNC57b7v5t9iyFUg8/login ``` Erstatt domenenavnet med: ``` w3-staging.test.uib.no ``` og lim inn lenken i nettleseren. Vipps så er en innlogget. En kan også lage en innloggingslenke på vegne av en annen bruker: ``` ssh markus@t1w3app02 sudo -i su - w3-drupal cd /var/www/w3-kurs.test.uib.no bin/site-drush uli mpi067 ``` ## Dumpe postgres database på t1w3app02 ``` pg_dump -C -Fc -h t_w3_stageing.pg.uib.no -U t_w3_stageing_admin -d t_w3_stageing > t_w3_stageing.dump ``` ## Resette staging ``` ./cron-stage-w3-staging --yes ``` ## Kladd: ``` ssh helgeo@t1w3app02 sudo -i su - w3-drupal ``` Interessante bash scripts som vi ser på nå ligger i: ``` /home/w3-drupal ``` deriblant: ``` kurs.db.restore.sh ``` og deretter: ``` /home/w3-drupal/bin/synced/site-reset-staging-from-prod-branch ``` ... ``` ../vendor/bin/drush -l w3-prestaging.test.uib.no core:status https://w3-prestaging.test.uib.no/en tig --all sudo su w3-drupal pwd /var/www/w3-prestaging.test.uib.no git fetch --all --prune #prune sletter lokale brancher gti status git reset --hard origin/master git submodule update ``` # AWS Lightsail ## Møte AWS * Endre Syrdalen, esyrdale@amazon.es * Maria Rantalaiho (Finland) ## Postgresql i Lightsail Gå til: * https://aws.com Trykk på databases - create database Deretter får en detaljer som brukernavn, passord osv Her er eksempel deretter på oppkopling: ``` psql -U dbmasteruser -h ls-37dd6e42c404a78e82a4bffbebe4139395b9a9ce.cjaio6uoqytv.eu-north-1.rds.amazonaws.com -d postgres -W ``` Lag bruker: ``` createuser -U dbmasteruser -h ls-37dd6e42c404a78e82a4bffbebe4139395b9a9ce.cjaio6uoqytv.eu-north-1.rds.amazonaws.com -r -P -d test -W ``` Legg test brukeren til dbmasteruser, og sett eierskap: ``` GRANT test TO dbmasteruser; CREATE DATABASE test OWNER = test; ``` Eller om en vil bruke createdb: ``` createdb -U dbmasteruser -h ls-37dd6e42c404a78e82a4bffbebe4139395b9a9ce.cjaio6uoqytv.eu-north-1.rds.amazonaws.com -O test test -W ``` Slette database: ``` dropdb -U dbmasteruser -h ls-37dd6e42c404a78e82a4bffbebe4139395b9a9ce.cjaio6uoqytv.eu-north-1.rds.amazonaws.com test -W ``` Importere en sql dump: ``` psql -U dbmasteruser -h ls-37dd6e42c404a78e82a4bffbebe4139395b9a9ce.cjaio6uoqytv.eu-north-1.rds.amazonaws.com test -W < dumpfila.sql ``` Ny kladd: Åpne en incognito fane, gå til: ``` aws.com ``` Så logg inn. Mer nyttig informasjon: * https://aws.amazon.com/getting-started/guides/deploy-lamp-lightsail/ * https://harrybailey.com/2020/06/updating-php-on-an-aws-lightsail-wordpress-stacks/ * https://docs.bitnami.com/aws/how-to/migrate-drupal/ Fortløpende kladd: ``` Rackspace: mellomleverandør, gir også teknisk support Forhandlet via SIKT. Publisering - Test: aws id: 835611770218 https://signing.aws.amazon.com Søke etter Lightsail: lightsail.aws.amazone.com Riktig veg å gå inn; myapplications.microsoft.com LightsailPilot-WordPress-01 13.53.122.138 (public ip) ``` Som gikk så fint sist gang, men nå får jeg: ``` User: arn:aws:sts::448410102050:assumed-role/ita-app-developer/mihho@uib.no Service: lightsail Action: GetRegions On resource(s): arn:aws:lightsail:eu-west-1:448410102050:* Context: no identity-based policy allows the lightsail:GetRegions action ``` Løsningen var å åpne nettleseren i incognito modus :-) Søke etter hjelp: * https://repost.aws/questions ## AWS KONTO ``` HelgeAWS wordpress: user ``` ## aws lightsail wordpress * https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-quick-start-guide-wordpress ## SSL på wordpress i AWS Lightsail bitnami Kjør denne: ``` /opt/bitnami/bncert-tool ``` ### Nyttig tips? * https://www.himandthyme.com/bitnami-error-the-domain-does-not-resolve-please-fix-its-dns-entries-or-remove-it/ ## endre php.ini verdier i aws lightsail wordpress instans ``` sudo -i nano -w /opt/bitnami/php/etc/php.ini /opt/bitnami/ctlscript.sh restart apache ``` Ref: * https://repost.aws/questions/QU7pchfyaTQD6Ik1NIINM9cQ/i-need-to-increase-max-execution-time-and-max-input-vars-for-wp-in-lightsail ## Kople til aws server boks med SSH ``` ssh -i .ssh/aws.pem bitnami@13.53.122.138 ``` Det kan se ut til at en må laste ned .pem fil for hvert Lightsail prosjekt en fyrer opp. Wordpress user passordet ligger i filen: ``` bitnami_application_password ``` Om en har glemt privat nøkkelen så skal en finne den under Account Lightsail: ``` * https://lightsail.aws.amazon.com/ls/webapp/account/profile ``` ## Kople til mysql på aws server boks ``` mariadb -u bn_wordpress bitnami_wordpress -p ``` Passordet ligger i wp-config.php fila ## Kople til phpmyadmin aws server Start først en SSH tunnel: ``` ssh -i .ssh/aws.pem -L 8888:127.0.0.1:80 bitnami@AWS_SERVER_IP_ADDRESS ``` deretter: ``` https://localhost:8888/phpmyadmin ``` # Tegnsett i vim Om en opplever at æ,ø og å krøller seg til i editoren vim, så kan det hjelpe å legge inn følgende i .vimrc filen: ``` set fileencoding=utf-8 set encoding=utf-8 set termencoding=utf-8 ``` Og i tillegg kan dette også være til hjelp: ``` export LANG=nn_NO.utf8 ``` # Installere siste Postgresql server på Linux Redhat 8 ``` yum module info postgresql yum module reset postgresql yum module install postgresql:15/server yum info postgresql-server ``` som da skal gi: ``` Version : 15.5 ``` Fra: * https://www.redhat.com/en/blog/introduction-appstreams-and-modules-red-hat-enterprise-linux Deretter: ``` postgresql-setup initdb systemctl enable postgresql systemctl start postgresql ``` ## Åpne i iptables brannmur for psql client Eksempel: ``` iptables -A INPUT -s 129.177.13.56/32 -p tcp -m multiport --dports 5432 -m comment --comment "010 allow postgres from t1w3app02" -j ACCEPT ``` ## Aksessere via nettleser mot postgresql server (PHP 8 relatert...) ``` yum install phpPgAdmin ``` Legg til ip adressen din: ``` nano -w phpPgAdmin.conf ``` i linje: ``` Require ip 129.177.xxx.yyy ``` Til slutt ``` service httpd restart ``` Men, koden trenger patcher. Hent først fork: * https://github.com/EdvaldoAFilho/pgAdmin erstatt alle filene under: ``` /usr/share/phpPgAdmin ``` Deretter legg til patch: * https://groups.google.com/g/linux.debian.bugs.dist/c/CC0r5OoIHEo?pli=1 * https://github.com/Steveorevo/phppgadmin/commit/6ae0b7b99b34adb85d253a0c545a220c54180f8e Og sett følgende i phpPgAdmin sin config.inc.php fil /usr/share/phpPgAdmin/conf/config.inc.php: ``` $conf['localhost'; ``` I tillegg må en også antakelig ha følgende linje i pg_hba.conf filen: ``` host all all 129.177.xxx.yyy/32 md5 ``` Hvor 129.177.xxx.yyy er din datamaskins IP adresse. og deretter: * https://dinserver.uib.no/phpPgAdmin ## Lag postgresql bruker og database Lag en read only bruker: ``` createuser -s -D -R -S wikireadonly ``` Deretter i psql: ``` alter role wikireadonly with password 'HgF54sdsfHlfjh'; ``` Dersom brukeren skal ha lese tilgang: ``` \c itwiki GRANT USAGE ON SCHEMA mediawiki to wikireadonly; GRANT SELECT ON ALL TABLES IN SCHEMA mediawiki to wikireadonly; ``` Lag super bruker: ``` createuser -S -D -R -E itwiki createdb -O itwiki itwiki ``` Deretter: ``` psql ``` og kjør: ``` alter role itwiki with password '************' ``` ## Endre eier av alle tabellene i en Postgresql database Først må du finne alle tabellene. Det kan en gjøre med følgende sql: ``` select 'ALTER TABLE mediawiki.' || t.tablename || ' OWNER TO arkiwiki;' from pg_tables t where t.tableowner != 'arkiwiki'; ``` Databasen er altså "arkiwiki", og vi ønsker at postgresql bruker "arkiwiki" skal eie alle tabellene. Dette vil da gi ut alle sql statementene som du da kjører. Altså en lang liste med noe ala: ``` ``` ALTER TABLE mediawiki.iwlinks OWNER TO arkiwiki; ALTER TABLE mediawiki.job OWNER TO arkiwiki; ALTER TABLE mediawiki.l10n_cache OWNER TO arkiwiki; ALTER TABLE mediawiki.ldap_domains OWNER TO arkiwiki; ALTER TABLE mediawiki.log_search OWNER TO arkiwiki; ALTER TABLE mediawiki.logging OWNER TO arkiwiki; ALTER TABLE mediawiki.math OWNER TO arkiwiki; ALTER TABLE mediawiki.mediawiki_version OWNER TO arkiwiki; ALTER TABLE mediawiki.module_deps OWNER TO arkiwiki; ALTER TABLE mediawiki.ipblocks OWNER TO arkiwiki; ``` ``` ## Tømme en cachetabell i postgresql (mediawiki relatert) Når en kjører update.php så kan en ende opp i at oppgraderingsscriptet bailer ut pga feil i følgende tabell: ``` l10n_cache ``` Løsningen er å tømme denne tabellen, det gjør på følgende måte: ``` su - postgres psql ``` og deretter: ``` truncate l10n_cache ``` og så kjøre update.php på nytt: ``` php maintanence/update.php ``` ## Dumpe all sider i en wiki til xml En kan bruke innebygd mediawiki verktøy for å dumpe innhold til xml som igjen kan importeres i en annen wiki: ``` cd /var/www/sites/navnwiki/ php maintenance/dumpBackup.php --full --include-files --uploads > navnwiki.xml ``` og tilsvarende kan en importere xml filen: ``` php maintenance/importDump.php navnwiki.xml ``` ## Migrere data fra Postgresql til Mysql/Mariadb Nyttig lesestoff: * https://wiki.alpinelinux.org/wiki/Converting_mediawiki_database_from_postgresql_to_mysql/mariadb En kan også eksportere sidene til xml filer, for deretter å importere de med: ``` php maintanance/importDump.php xmlfila.xml ``` Tilsvarende kan en også gjøre med bildene: ``` php maintanance/importImages.php bildekatalog/ ``` # Benytte Linux jumphost for å kople til interne porter (TOTP) # Intern server: d1helge01.uib.no # Jumphost: p1publogin.uib.no Først må en legge til en personlig public key på itgit.app.uib.no. Hint: ``` ssh-keygen ``` Kopier id_rsa.pub til itgit.app.uib.no (preferences -> SSH keys -> add new key) Deretter: ``` ssh mihho@p1publogin.uib.no ``` Om du har passord på nøkkelen så må du oppgi dette her. For deg så er huskeregelen: ToksyMoksyDoksy Omorganiseringen Da får en opp et slikt vindu: [400px](=)('servers'][0]['host'])(File:totp-jumphost-qr-code.png) *NB: alle koder er endret fra de originale* Og under stod det: ``` Your new secret key is: CI4KJJKLHKH435H3L5HKLDU Enter code from app (-1 to skip): ``` Når jeg prøvde å scanne qr coden, så skjedde det ingenting i hverken ms authenticator appen eller google authenticator appen på telefonen min. Derfor valgte jeg: ``` -1 ``` og fikk videre: ``` Your new secret key is: CI4KJJKLHKH435H3L5HKLDU Enter code from app (-1 to skip): 373438 Code incorrect (correct code 234345). Try again. Enter code from app (-1 to skip): -1 Code confirmation skipped Your emergency scratch codes are: ``` ``` 58134343 72456456 25345345 56675675 56356456 ``` ``` ``` Jeg var da logget inn. Nå startet jeg sshuttle på min lokale maskin: ``` sshuttle -r mihho@p1publogin.uib.no 0/0 ``` Første gang bruke jeg en av scratch kodene. Og vips så kunne jeg aksessere intern port 8081 på d1helge01 fra lokal maskin via jumphosten p1publogin. Deretter logget jeg ut av alt, stengte alle app'er på telefonen og gjentok sshuttle kommandoen. Denne gang dukket p1publogin.uib.no på Google Authenticator appen og jeg kunne bruke koden fra denne til å logge inn på jumphosten p1publogin.uib.no Deretter kunne jeg aksessere mine docker containere på d1helge01 i nettleseren min: Eksempelvis: * http://d1helge01.uib.no:8081 * http://d1helge01.uib.no:8082 * http://d1helge01.uib.no:8083 # Docker tips ## ERR_CONNECTION_REFUSED Jeg får ERR_CONNECTION_REFUSED når jeg prøver å nå http://localhost mot min nye flotte docker container. Om en er på VPN så kan det ha noe med lokal ruting å gjøre. En mulig løsninger er å starte containeren med --network host: ``` docker run -d --network host -p 8080:80 webapp1 ``` ser ut til å fungere sammen med Cisco VPN ## Hvor ligger php.ini filen i docker-containeren? Logg inn på kontaineren: ``` docker exec -it skjemaker_php-apache_1 /bin/bash ``` deretter: ``` php -i | grep php.ini ``` ## Mulig template for en docker php:apache ``` RUN apt-get update -y && apt-get install -y \ ``` ``` ``` ``` libpng12-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ curl \ libcurl4-openssl-dev \ libxpm-dev \ libvpx-dev \ && docker-php-ext-configure gd \ --with-freetype-dir=/usr/lib/x86_64-linux-gnu/ \ --with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \ --with-xpm-dir=/usr/lib/x86_64-linux-gnu/ \ --with-vpx-dir=/usr/lib/x86_64-linux-gnu/ \ && docker-php-ext-install \ pdo \ pdo_mysql \ gd \ curl \ && a2enmod rewrite \ && service apache2 restart ``` ``` ``` ``` ``` # Eget utviklingsmiljø for docker Fra egen maskin, start med: ``` sshuttle -r helgeo@d1helge01.uib.no 0/0 ``` En kan også gå via jumphosten: ``` sshuttle -r mihho@p1publogin.uib.no 0/0 ``` Deretter logg inn på d1helge01 og bli sudo: ``` ssh helgeo@d1helge01; sudo -i ``` Gå så til katalog: ``` cd /local/helge/prosjektnavn ``` hvor "prosjektnavn" er en av flere, f.eks skjemaker Sjekk om det allerede kjører docker containere: ``` docker stats ``` stopp evt. containere: ``` docker container stop container_id ``` For å starte prosjekt: ``` cd prosjektnavn; docker-compose build; docker-compose up -d ``` Deretter kan en åpne nettleseren og gå f.eks til: ``` http://d1helge01:80 ``` eller for phpmyadmin typisk: ``` http://d1helge01:8081 ``` Dersom i phpmyadmin blir spurt om servernavn, så er det navnet på containeren, altså: ``` mysql ``` # Docker Helloworld itgit.app.uib.no For å teste imaget lokalt, så kan en hente ned ferdig laget image fra itgit.app.uib.no med følgende: ``` docker login -u Helge.Opedal -p "$(cat token)" itgit.app.uib.no:4567 ``` hvor "token" er en fil som inneholder en Personal Access Token. Deretter kan en hente ned docker imaget: ``` docker pull itgit.app.uib.no:4567/helge.opedal/helloworld:test ``` En skal da få den opp i listen: ``` docker image ls ``` som gir ut: ``` itgit.app.uib.no:4567/helge.opedal/helloworld test 0e3949b654d8 16 minutes ago 455MB ``` Deretter bygge: ``` docker build -t helloworld . ``` og kjøre: ``` docker run -d -p 8083:80 helloworld:latest ``` Sjekk at containeren kjører: ``` docker container ls ``` som gir noe ala: ``` e69e8f59dc8f helloworld:latest "docker-php-entrypoi…" 41 seconds ago Up 40 seconds 0.0.0.0:8083->80/tcp, :::8083->80/tcp hungry_hamilton ``` Og til slutt selve lakmus-testen: * http://localhost:8083/ som da skal gi ut innholdet i index.html|php filen gitt i prosjektet. # Ansible 101 kurs AM * [101](Brukar:Mihho/Ansible)(Brukar:Mihho/Ansible 101) # GITLAB Huskeliste: * https://docs.gitlab.com/ee/ci/variables/predefined_variables.html # [også: * https://itgit.app.uib.no/it/dpv/daf/pub/pubkita # Sette opp p1blog04, Wordpress multisite, apache, php, mariadb m.m. ``` ssh mihho@sokrates cd /home/mihho/ANSIBLE-PROSJEKTER/p1blog04/ansible ansible-playbook bootstrap-test.yaml -i prod.ini -u helgeo -bK --ask-pass ``` ## Installere php-fpm Har lest denne, ikke sikkert det er rett måte å gjøre det på, men ser ut til å virke: * https://computingforgeeks.com/how-to-install-php-rocky-almalinux-centos/ Annen info: * https://php.watch/articles/php-8.3-install-upgrade-on-fedora-rhel-el * https://blog.remirepo.net/post/2019/12/03/Install-PHP-7.4-on-CentOS-RHEL-or-Fedora * https://www.linuxtechi.com/install-php-7-centos-7-rhel-7-server/?utm_content=cmp-true Repo lagt til med: ``` yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm ``` Og så: ``` yum install php74-php-fpm ``` Deretter endre i fil: * /etc/opt/remi/php74/php-fpm.d/www.conf med: ``` listen = 127.0.0.1:9074 ``` hvor 74 er samme siffer som php versjonen. Deretter kan en legge til følgende i vhost configen: ``` ``` <FilesMatch \.php$> ``` ``` SetHandler proxy:fcgi://127.0.0.1:9074 ``` ``` </FilesMatch> ``` ``` og: ``` service httpd restart ``` En kan sjekke hvilke som er installert med: ``` php74 -modules ``` Dersom en heller vil bruke unix sock, så kan en legge til følgende i vhost configen: ``` <FilesMatch \.php$> ``` ``` SetHandler "proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost/" ``` ``` </FilesMatch> ``` # WCAG Web Content Accessibility Guidelines 1999-> ``` Web, Innhold, Tilgjengelighet, Retningslinjer ``` ## WCAG prinsipper ``` Mulig å oppfatte, mulig å betjene, forståelig, robust ``` * Gi tekstalternativer til alt Ikke-tekstlig innhold (eks: tekst til bilde) * Gi alternativer til tidsbaserte medier (lyd og video) (eks: teksting på video, tegnspråk) * Tilpasse, skille fra hverandre: (kontraster, farger) * Tilgjengelig med tastatur * Nok tid (eks: to-faktor autentisering) * Anfall (epilepsis, blinkende nettsider) * Navigebar * Leselig (språk, målgruppe) * Forutsigbar * Inndatahjelp * Kompatibel (eks: om en utvikler egne sjekk-bokser i skjemaer) ## WCAG-EM "Metode for vurdering av hele nettsider" * 5 steg. Plukke ut nøkkelsider, sjekke hvilke teknologier som er i bruk, eks: react, osv * tilslutt lag en rapport ## Test verktøy * Wave: https://wave.webaim.org/ * Colour Contrast Analyzer * axe DevTools * Siteimprove (brukes i NAV, nav.no) ## Andre verktøy * headings map: plugin til wordpress som sjekker headinger ## Andre tips * merk i html kode med språk dersom det er ulikt språk i samme html kode Eks: ``` <blockquote lang="en">This is an english text</blockquote> ``` # WAI-ARIA Accessible Rich Internet Applications Attributter som en kan legge på andre tag'er. Mange ARIA-attributter -> flere tilgjengelighetsfeil. Men: kan hjelpe med: sidenavigering, tastatur, live-oppdateringer, widgets Live oppdateringer: Eksempel, en fyller inn epost felt, men fyller feil syntaks (mangler @), feilmeldinger kommer etter tab-ut, men det får ikke en blind person med seg i leselisten. Dette kan wai-aria løse. Widgets: kan merkes for at tastatur skal fungerere /skjermlesere skal kjenne igjen kontroller. # Installere PHP81-PHP-FPM på Centos 7 (remi repo) ``` yum install php81-php-fpm yum install php81-php-mysqlnd yum install php81-php-json yum install php81-php-ldap yum install php81-php-mbstring yum install php81-php-bcmath yum install php81-php-cli yum install php81-php-common yum install php81-php-gd yum install php81-php-json yum install php81-php-pdo yum install php81-php-pear yum install php81-php-process yum install php81-php-xml ``` osv Deretter endre i www.conf fila: ``` nano -w /etc/opt/remi/php81/php-fpm.d/www.conf ``` endre port number: ``` 9000 -> 9081 ``` Da blir det enklere om en skal ha flere PHP versjoner på samme boks. F.eks php74-php-fpm vil da portnummer: ``` 9074 ``` Start tjenesten: ``` service php81-php-fpm start ``` Sørg for at tjenesten starter ved reboot ``` systemctl enable php81-php-fpm ``` Deretter kan en kople vhost'en mot php81-php-fpm tjenesten. Legg inn følgende i 443 vhost config oppsettet: ``` <FilesMatch \.php$> ``` ``` SetHandler proxy:fcgi://127.0.0.1:9081 ``` ``` </FilesMatch> ``` Reload/restart tjenesten(e): ``` service php81-php-fpm; service httpd reload ``` For å verifisere at en faktisk får riktig php versjon, så legg inn en info.php i vhost'ens documentroot med: ``` <?php ``` ``` phpinfo(); ``` ``` ?> ``` og sjekk: * https://vhostdomene.app.uib.no/info.php ## Slå av error_reporting En kan i www.conf filen legge til: ``` php_admin_value[error_reporting](Se)(Brukar:Mihho/pubkita-glass-app](Brukar:Mihho/pubkita-glass-app)) = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED ``` for å slå av error_reporting. # Reset php module For at det skal være default ny php versjon når en kjører cli oppdatering, f.eks: ``` wp plugin update-all ``` så må en endre dette med: ``` dnf module list php dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf -y makecache dnf -y repolist dfn module list php dnf -y module reset php dnf module install php:remi-8.1 locate php-fpm php -v ``` Da skal en få at lokal php er 8.1 og dermed skal de pluginene som tester på hvilken lokal PHP versjon en har fungere. # Mediawiki and Azure AD Single Sign on? Vi har fått til itwiki.test.uib.no. Nå prøver vi å omgjøre denne til itwiki.app.uib.no Azure Portal: ``` portal.azure.com -> all services -> app registrations -> itwiki-saml... og så: ACCESS DENIED! ``` itwiki.test.uib.no ``` kjører på d1helge01, itwiki-oyvind, docker-compose, mw 1.42, sqlite db ``` ------ Den dagen vi får tid til å utforske dette... lever i håpet.. * https://medium.com/vivritiengineering/mediawiki-and-azure-single-sign-on-e3fbc13d1f46 * https://azureossd.github.io/2016/08/15/setup-single-sign-on-with-aad-using-simplesamlphp/ * https://stackoverflow.com/questions/66031201/simplesamlphp-sso-azure-works-in-firefox-and-safari-but-not-in-chrome-and-edg # certbot ## Slette et sertifikat Sjekk først om sertifikatet er i bruk. Det innebærer å søke i .inc filer og se om det refereres til. Først finne hvilke sertifikater en har: ``` certbot certificates ``` deretter når en vet hvilke som ikke er i bruk: ``` certbot delete --cert-name navn-på-cert.uib.no ``` ## certbot på grind.no ``` certbot certonly --nginx --non-interactive --agree-tos --email plattform@uib.no --server https://acme.sectigo.com/v2/OV --eab-kid nananananannanakid --eab-hmac-key nanannananananannajkey --domain grind.no --domain grind.app.uib.no --domain grind.testapp.uib.no --domain grind.test.uib.no --domain skigard.test.uib.no --domain skigard.uib.no ``` Som da gav ut: ``` IMPORTANT NOTES: ``` - Congratulations! Your certificate and chain have been saved at: ``` ``` /etc/letsencrypt/live/grind.no/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/grind.no/privkey.pem Your certificate will expire on 2024-02-02. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" ``` ``` ``` ``` ## certbot for apex app apache reverse proxy ``` certbot certonly ---apache -d adgang.app.uib.no -d apex.app.uib.no -d apex-shared.app.uib.no -d avvik.app.uib.no -d bm.app.uib.no -d brutus.app.uib.no -d christie.app.uib.no -d fond.app.uib.no -d form.app.uib.no -d fragments.app.uib.no -d geosamples2.app.uib.no -d geosamples.app.uib.no -d lap.app.uib.no -d litteraturkiosken.app.uib.no -d oka.app.uib.no -d reg.app.uib.no -d sebapxp.app.uib.no -d skjema-2016.app.uib.no -d skjema.app.uib.no -d sys.app.uib.no -d testa.app.uib.no -d test.app.uib.no -d veiledning.app.uib.no ``` ## certbot en kort how-to beskrivelse Les først denne: [Bestilling](-)(TLS/SSL-sertifikater)(TLS/SSL-sertifikater - Bestilling) Jeg er litt paranoid, så pleier å ta vare på all config under /etc/httpd og /etc/nginx: ``` tar -cf httpd-YYYY-MM-DD.tar /etc/httpd/ tar -cf nginx-YYYY-MM-DD.tar /etc/nginx/ ``` En kan også sjekke inn filer i et lokalt git om nødvendig: ``` cd /etc/httpd/ git add -f * git commit -m "tar alt inn i git" * ``` En kan også sjekke om det er tsm backup: ``` dsmc restore "/etc/httpd/*" -pick -ina ``` Ok, så kan en begynne: Først må certbot installeres: ``` yum install certbot ``` Om det er apache, så må også denne inn: ``` yum install python3-certbot-apache ``` For nginx: ``` yum install python3-certbot-nginx ``` Om maskinen er åpent tilgjengelig på nett på port 80/443, så bruk letsencrypt: ``` certbot certonly --apache -d domenenavn1 -d domenenavn2 certbot certonly --nginx -d domenenavn1 -d domenenavn2 ``` Om ikke port 80/443 er åpent tilgjengelig for alle vhostene så bruk Sectigo: ``` certbot certonly --nginx --non-interactive --agree-tos --email plattform@uib.no --server https://acme.sectigo.com/v2/OV --eab-kid Notaeabkid --eab-hmac-key Notaeabhmackey --domain domenenavn1 --domain domenenavn2 ``` Og for Apache: ``` certbot certonly --standalone --agree-tos --email plattform@uib.no --server https://acme.sectigo.com/v2/OV --eab-kid Notarealeab-kid --eab-hmac-key Notarealeabhmackey --domain certnavn.uib.no ``` NB: eab-kid og eab-hmac-key må en få generert hos Plattform. Som regel blir informasjonen lagt under /root Opsjonene: --nginx, --apache og/eller --standalone ser ut til å virke litt om en annen. Her kan en prøve seg fram. Sertifikatet blir liggende under: ``` /etc/letsencrypt/live/certnavn.uib.no/ ``` I apache så kan en referere til cert, key, cahain med følgende: ``` SSLCertificateFile /etc/letsencrypt/live/certnavn.uib.no/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/certnavn.uib.no/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/certnavn.uib.no/chain.pem ``` For Ngxin gjelder disse linjene: ``` ssl_certificate /etc/letsencrypt/live/certnavn.uib.no/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/certnavn.uib.no/privkey.pem; ``` For at sertifikatet skal fornyes automatisk, må det legges inn i /etc/crontab: ``` # Let's Encrypt certbot renew MAILTO=osys@uib.no 0 6 * * 1 root /usr/local/bin/certbotrenew ``` innholdet i certbotrenew avhengiger om det er Letsencrypt eller Sectigo. Om en lurer på hvilke sertifikater en har så kjør: ``` certbot certificates ``` Da vil en få cert navnet som en må referere til. Letsencrypt (cat /usr/local/bin/certbotrenew): ``` #!/bin/bash #set -e /bin/certbot renew > /tmp/certbot.log mail -s "Certbot renew on $(hostname)" webhotell@it.uib.no < /tmp/certbot.log ``` Sectigo (cat /usr/local/bin/certbotrenew): ``` #!/bin/bash #set -e /bin/certbot renew --server https://acme.sectigo.com/v2/OV --cert-name "certnavn.uib.no" > /tmp/certbot.log /bin/certbot renew >> /tmp/certbot.log mail -s "Certbot renew on $(hostname)" webhotell@it.uib.no < /tmp/certbot.log ``` ## cerbot på p1skjemaker04 ``` certbot certonly --cert-name skjemaker1 --standalone --non-interactive --agree-tos --email plattform@uib.no --server https://acme.sectigo.com/v2/OV --eab-kid habahabasutsut --eab-hmac-key habahabasutsut --domain skjemakerbackend2.app.uib.no --domain skjemakerbackend.app.uib.no ``` ## certbot på p1blog01 - work in progress ### Installasjon ``` yum install certbot yum install python2-certbot-apache ``` For Rocky8: ``` yum install python3-certbot-apache ``` ``` yum list installed | grep certbot certbot certonly --standalone --non-interactive --agree-tos --email plattform@uib.no --server https://acme.sectigo.com/v2/OV --eab-kid LKG-not-a-real-kid-sdfsdfsdhgo95kFw --eab-hmac-key kldfg-not-a-real-key-yfiourtoIg --domain w.uib.no --domain "*.w.uib.no" certbot certonly --dry-run --server https://acme.sectigo.com/v2/OV --domain w.uib.no cat /usr/local/bin/certbotrenew /bin/certbot renew --dry-run --server https://acme.sectigo.com/v2/OV --cert-name "w.uib.no" nano -w ssl.inc ``` ## certbot på Kro work-in-progress ``` The requested apache plugin does not appear to be installed ``` Om pluginen apache mangler til certbot, så kan en: ``` yum install python2-certbot-apache ``` certbot certonly --apache ``` arkiv.uib.no (7) ``` ``` IMPORTANT NOTES: ``` - Congratulations! Your certificate and chain have been saved at: ``` ``` /etc/letsencrypt/live/arkiv.uib.no/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/arkiv.uib.no/privkey.pem Your certificate will expire on 2022-12-14. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" ``` ``` ``` ``` ``` [vhosts.d](root@kro)# ls -al /etc/letsencrypt/live/arkiv.uib.no/ total 8 drwxr-xr-x 2 root root 88 Sep 15 09:38 . drwx------ 10 root root 4096 Sep 15 09:38 .. lrwxrwxrwx 1 root root 36 Sep 15 09:38 cert.pem -> ../../archive/arkiv.uib.no/cert1.pem lrwxrwxrwx 1 root root 37 Sep 15 09:38 chain.pem -> ../../archive/arkiv.uib.no/chain1.pem lrwxrwxrwx 1 root root 41 Sep 15 09:38 fullchain.pem -> ../../archive/arkiv.uib.no/fullchain1.pem lrwxrwxrwx 1 root root 39 Sep 15 09:38 privkey.pem -> ../../archive/arkiv.uib.no/privkey1.pem -rw-r--r-- 1 root root 692 Sep 15 09:38 README ``` Deretter referere til disse i en ny ssl-arkiv.uib.no.inc fil, of deretter oppdatere arkiv.uib.no.conf filen med referanse til ny ssl-inc fil. Flere domener: ``` certbot certonly --apache -d andar.h.uib.no -d arkiv.uib.no -d atlascolors.h.uib.no -d bio.h.uib.no -d birkeland.uib.no -d booking.h.uib.no -d boolean.h.uib.no -d corviz.h.uib.no -d darwin.uib.no -d discretion.uib.no -d dna.h.uib.no -d eecrg.h.uib.no -d elo2015.h.uib.no -d emid.h.uib.no -d expearth.uib.no -d ferdighetssenteret.h.uib.no -d fmri.uib.no -d h2.h.uib.no -d humle.h.uib.no -d itschemistry.h.uib.no -d jensen.h.uib.no -d ka.uib.no -d kro.h.uib.no -d kurs.h.uib.no -d mso.uib.no -d nmr.h.uib.no -d radioweb.uib.no -d rc-resources.h.uib.no -d solli.h.uib.no -d theunissen.h.uib.no -d turspor.h.uib.no -d um.uib.no -d vis.uib.no -d watson.h.uib.no -d www.birkeland.uib.no -d phpmyadmin.h.uib.no ``` ## Benytt ansible for certbot Se også Cato som har laget en ansible som kan løse dette: * https://itgit.app.uib.no/Cato.Kolas/uib-certbot-ansible # ldap søk Finn detaljer om gruppen **vev_filer_ka**: ``` curl ldap.uib.no/ou=vev_filer_ka,ou=organization,dc=uib,dc=no ``` Finn detaljer om gruppen **SV-AORG**: ``` curl ldap.uib.no/ou=SV-AORG,ou=organization,dc=uib,dc=no ``` Finn medlemmer av gruppen **vev_filer_kmd**: ``` ldapsearch -x -H ldap://ldap.uib.no cn=vev_filer_kmd ``` # Multifaktor engelsk beskrivelse * https://uib.topdesk.net/solutions/open-knowledge-items/item/KI%200780/en_gb/ # Sertifikater på veg ut? * https://oppetid.app.uib.no/ssl.php # sms på sokrates (huskelapp) ``` Lagt under /root ``` Startes med: ``` perl sms.pl -D ``` Hint: ``` yum install perl-XML-Simple ``` Muligens fungerer cpn også, men ikke sikker: ``` yum install perl-CPAN ``` Deretter: ``` cpan ``` og så: ``` install XML::Simple ``` eksempel på script med sms utsendelse: * /home/mihho/gatewayapi.com/test.sh # Boka [[Brukar:Mihho/SiFra](#)(Bruker:Mihho/Bøker/Applikasjonsdrift](Bruker:Mihho/Bøker/Applikasjonsdrift))(Brukar:Mihho/SiFra) # Openstack ubuntu server Cytomine ``` ssh sokrates ssh -i helgeubuntu_id_rsa ubuntu@158.39.77.44 ``` evt: ``` ssh -i .ssh/helgeubuntu_id_rsa ubuntu@cytomine.app.uib.no ``` ## Pakker, docker m.m.: https://www.ctl.io/developers/blog/post/what-is-docker-and-when-to-use-it/ ``` sudo apt-get update apt install unzip sudo apt-get install apt-transport-https ca-certificates curl software-properties-common mkdir /data/www mount /dev/disk/by-uuid/d47fe46e-5572-4fed-958c-1cb8b3e403b6 /data/www nano -w /etc/fstab df -kh apt-get update apt install unzip apt-get install apt-transport-https ca-certificates curl software-properties-common mkdir Cytomine_src/ cd Cytomine_src/ wget https://github.com/cytomine/Cytomine-bootstrap/archive/master.zip -O bootstrap.zip unzip bootstrap.zip mv Cytomine-bootstrap-master Cytomine-bootstrap apt-get update apt-get install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - apt-key fingerprint 0EBFCD88 cat /etc/apt/sources.list nano -w /etc/apt/sources.list sudo add-apt-repository "deb [$(lsb_release -cs) stable" nano -w /etc/apt/sources.list apt-get update apt-get install docker-ce ``` # Stoppe alle docker containerne på en gang ``` docker stop $(docker ps -a -q) ``` ## Hmm ``` E: Failed to fetch https://storebits.docker.com/ee/ubuntu/sub-0c1aa770-729b-4fa8-be64-609811fb3cf5/ubuntu/dists/zesty/stable-17.06/binary-amd64/Packages 404 Not Found ``` # Mine saker i RTS <rss>https://rts.uib.no/issues.atom?assigned_to_id=me&key=b3d159828740aea0d08d48718b40a3d42009c485&set_filter=1&sort=priority%3Adesc%2Cupdated_on%3Adesc</rss> # App (android/iphone?) utviklere * Kjetil Farsund Fossheim, se også: # MariaDB Master - Slave replikering Lesestoff: * https://mariadb.com/kb/en/mariadb/setting-up-replication/ ## Master På Master, bruker phpMyAdmin. Gå til: Replication -> master replication -> configure it Velg: Replicate all databases; Ignore Da skal en få opp linjene som skal legges til /etc/my.cnf filen. I mitt tilfelle ble det: ``` server-id=6653021 log_bin=mysql-bin log_error=mysql-bin.err binlog_ignore_db=mysql binlog_ignore_db=a3 binlog_ignore_db=studkatold binlog_ignore_db=testtobeignored ``` Antar at det kan være lurt å ignore databasen 'mysql' i og med at den innholder privilegier som kanskje kun bør gjelde for Master. Men, om en planlegger å bruke Slaven som stand-by, så må vel denne også replikeres. En kan også snu på konfigurasjonen og velge spesifikt hvilke databaser som skal replikeres. Det er ikke å anbefale, for da blir ikke nye databaser tatt med om en glemmer å legge til disse i my.cnf filen. Eksempel på dette: ``` server-id=6653021 log_bin=mysql-bin log_error=mysql-bin.err binlog_do_db=ekt ``` Så må en lage en ny bruker som skal benyttes til replikeringen. Kjør følgende på Master: ``` GRANT REPLICATION SLAVE ON *.* TO replication_user; ``` Så starte MariaDB på nytt: ``` service mariadb restart ``` Da skal en kunne se under Master replication følgende verdier (eksempelvis selvfølgelig): ``` File: mysql-bin.000001 Position: 245 Binlog_doDB: ekt Binlog_ignore_DB: ``` For at Slaven skal kunne hente dataene, så må Master tillate koplinger fra Slave på port 3306. En må da oppdatere i brannmuren med: ``` -A INPUT -s 158.39.74.35/32 -p tcp --dports 3306 -j ACCEPT ``` Så gjør en tilsvarende på Slaven, men denne gang går en til Slave configuration. Da får en forslag til server-id: ``` server-id=1496741332 ``` Så må databasene som skal replikeres speiles mellom Master og Slave. Dette medfører nedetid på Master (databaser og tabeller på låses under kopieringen!). Kan gjøres med på Master: ``` FLUSH TABLES WITH READ LOCK ``` Finn så posisjonen til binær loggen med: ``` SHOW MASTER STATUS ``` For å speile dataene så tipper jeg en vanlig dump og restore vil funke: På Master: ``` mysqldump database ``` På Slave: ``` mysql -u root -p < dumpfil.sql ``` Så må Slaven startes. Logg inn på Slaven, kjør mysql og følgende sql: ``` CHANGE MASTER TO ``` MASTER_HOST='chartest7.uib.no', MASTER_USER='replication_user', MASTER_PASSWORD='clksdjfg345dløsfkgj', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=245, MASTER_CONNECT_RETRY=10; ``` ``` Så kan en starte slaven: ``` START SLAVE; ``` En bør teste at en oppdatering i en record på Master faktisk vises på Slaven. Videre bør en teste at dersom synkroniseringen stoppes over tid (f.eks med lock-tables på Slaven), så kommer databasene i synk igjen. Kan testes ved at en blokkerer Slaven i brannmuren. Videre som en bør se på er om det er utfordringer med MyIsam kontra Innodb. Så langt som jeg har testet, så virker det som at både MyIsam og innodb funker fint... ## bash script for å teste backup på Slave med lock-tables Dersom en lager et script som tar fortløpende 10 databasedumper av en database, så kan en teste om Slaven greier å hente seg inn igjen når det skjer endringer på Master. Teorien er vel at så lenge en backup går (som kan ta mange minutter), så skal ikke slaven bli oppdatert. Men, når dumpen på slaven er gjort, så må Slaven innhente seg igjen med data fra Master. Har begynt med denne: ```bash #!/bin/bash dato=`date` A=0 # Kjør 10 sammenhengende mysql dumper (noe som vil ta ca 30 min) # Gjør endringer i Master-databasen underveis. Hva skjer da på Slaven? while [ $A -lt 11 ](https://download.docker.com/linux/ubuntu)(arch=amd64]); do ``` ``` echo "Nå kjører vi loop nummer $A. Databasen er Skjemaker" mysql -u root -p`cat /root/mariadb` skjemaker -e "FLUSH TABLES WITH READ LOCK;" & sleep 3 mysqldump -u root -p`cat /root/mariadb` --lock-tables skjemaker > /backup/skjemaker-"$dato".sql let A=A+1 mysql -u root -p`cat /root/mariadb` -e "UNLOCK TABLES;" ``` ``` done ``` # Bot i itwiki'en [en bruker her i ITwiki'en som kan brukes til litt av hvert... # Min aller første sak i Issue Tracker! Fra meg selv, til meg selv, nr 267 i rekken: * https://bs.uib.no/?module=issues&action=view&tid=267 # [Bruker:Mihho/Oppgaver_2017](er)(Bruker:Botit](Bruker:Botit))(Bruker:Mihho/Oppgaver_2017) # Diverse ## Masonry javascript kode Denne er i sving her i ITwiki'en og får boksene på hovedsiden til å fly fram og tilbake avhengig av størrelsen på vinduet.. * http://masonry.desandro.com/ ## Div <div id="button-wrap-inner"> <a class="btn" href>test</a> </div> * [[User:Mihho/Books/ITwiki_-_driftsdokumentasjon_og_annan_interninfo](*)(User:Mihho/riskassessment](User:Mihho/riskassessment))(User:Mihho/Books/ITwiki_-_driftsdokumentasjon_og_annan_interninfo) * [[User:Mihho/spinthewheel](*)(User:Mihho/db-update-skjemaker](User:Mihho/db-update-skjemaker))(User:Mihho/spinthewheel) * [[User:Mihho/Samba](*)(User:Mihho/Møterom_og_agenda](User:Mihho/Møterom_og_agenda))(User:Mihho/Samba) * [Linux servere](av)(User:Mihho/Bestilling)(User:Mihho/Bestilling av Linux servere) * [[User:Mihho/Ukesrapporten](*)(User:Mihho/Varnish](User:Mihho/Varnish))(User:Mihho/Ukesrapporten) * [[User:Mihho/Forsiden](*)(User:Mihho/diverse](User:Mihho/diverse))(User:Mihho/Forsiden) // Test av wowslider * [Følgende: ``` <math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds= \int_a^x f(y)(x-2y)\,dy</math> ``` blir til: <math>\int_a^x \!\!\!\int_a^s f(y)\,dy\,ds= \int_a^x f(y)(x-2y)\,dy</math> </nowiki> # Kople til Windows fellesområde fra Centos/Redhat Først må du ha installert cifs-utils: ``` yum install cifs-utils ``` Editer så fstab fila: ``` vim /etc/fstab ``` Legg inn følgende på én linje (eksempelvis): ``` <nowiki>//felles.uib.no\ADM\IT\Felles\Referat /var/doc/it/referat cifs credentials=/root/secret.txt,uid=brukernavn,suid,gid=ansatt,sec=ntlmsspi,ro 0 0</nowiki> ``` Hvor filen secret.txt må holdes skjult for alle (hint: chmod 400 filnavn, og legges under /root katalogen), og innholdet i denne er typisk: ``` username=ditt-uib-brukernavn password= domain=UIB ``` NB: Når du skal mounte opp, så åpner du secret.txt filen (med vim eller annet egnet) og skriver inn ditt UiB passord bak password= Så kan du mounte: ``` mount -a ``` Når du har verifisert at du kan se innholdet f.eks med: ``` ls -al /var/doc/it/referat ``` Så åpner du secret.txt filen igjen og sletter passordet igjen. Ellers gjelder: * felles.uib.no serveren en kopler opp mot * ADM er delt share * IT\Felles\Referat er stien * /var/doc/it/referat er lokalt mount point (lokal katalog som peker til området på Windows serveren) * cifs er protokollen * sec=ntlmsspi er sikkerhetsprotokoll * ro (read only), smart å ha dersom en kun skal lese filene. * De to siste numrene har noe med dump og pass å gjøre (http://askubuntu.com/questions/9939/what-does-the-last-two-fields-in-fstab-mean) Området koples opp med: ``` mount -v /var/doc/it/referat ``` # Extension SimpleTable Følgende: ``` <tab class="wikitable sortable" sep=comma head=top> Overskrift 1,Overskrift 42,Overskrift 3,Overskrift 4 Field 4,Field 5,Field 6,tjoh Field 7,Field 8,Field 9,s </tab> ``` blir: <tab class="wikitable sortable" sep=comma head=top> Overskrift 1,Overskrift 42,Overskrift 3,Overskrift 4 Field 4,Field 5,Field 6,tjoh Field 7,Field 8,Field 9,s </tab> # Syntax highlighting ``` ```bash #!/bin/bash echo "Hello World" ``` ``` ``` ``` ```bash #!/bin/bash echo "Hello World" ``` # Oppgaver Høsten 2014 * [user:Mihho/Høsten 2014](<nowiki>==Math==)(User:Mihho/Videoer](User:Mihho/Videoer))(user:Mihho/Høsten 2014) # Oppgaver Våren 2014 * [2014](user:Mihho/Våren)(user:Mihho/Våren 2014) # Diverse * UiB Google Custom Search: http://folk.uib.no/mihho/search * Min egen ajax javascript php ldap (personer og steder) søke teste greie: http://apendix2.uib.no/sok (kun fra UiB nett) * Min blogg: http://helge.b.uib.no * IT avdelingen-Universitetet i Bergen * http://www.uib.no/personer/Helge.Opedal # Presentasjoner og kurs (en veeldig ikke-oppdatert liste) # 2014 * www.uib.no og Webber mars 2014: [Reverse Proxy mars 2014: [File:reverse-proxy.pdf](*)(File:w1.pdf](File:w1.pdf))(File:reverse-proxy.pdf) ## 2013 * [sites Helge Thursday 7th June 2013.pdf](Web)(File:UiB)(File:UiB Web sites Helge Thursday 7th June 2013.pdf) ## 2012 * [ub januar 2012.pdf](kurs)(wiki)(https://it.uib.no/ithjelp/images/5/55/Wiki_kurs_ub_januar_2012.pdf) * [PAM gruppen 29 november.pdf](presentasjon)(Wikihost)(https://it.uib.no/ithjelp/images/c/c1/Wikihost_presentasjon_PAM_gruppen_29_november.pdf) (2012) ## 2007 * [TrackeR.pdf](File:Issue)(File:Issue TrackeR.pdf) <rss>http://helge.b.uib.no/feed/</rss> # Diverse lenker * http://lifeofageekadmin.com/enable-virtualization-on-dell-optiplex-755-to-run-oracle-virtualbox-4/ # Kan en laste opp zip filer i itwiki'en? [:File:Temp.zip](:File:Temp.zip) Ja, ser det ut til :)
Save
Cancel
test
2026-01-12 14:08:48
``` dette er en test ```
Save
Cancel
Gitlab-markup
2026-01-12 13:19:26
Eksempler: # Heading 1 ## Heading 2 ### Heading 3 ``` **bold text** *italic text* ~~strikethrough~~ `inline code` ``` ``` Lists ``` - Bullet point 1 - Bullet point 2 - Nested bullet 1. Numbered item 1 2. Numbered item 2 ```python def hello(): print("Hello World") ```markdown [Link text](https://example.com)  | Header 1 | Header 2 | |----------|----------| | Cell 1 | Cell 2 | > This is a quote ---
Save
Cancel
Fail2ban
2026-01-12 12:52:38
Kan brukes til å blokkere IP adresser. Baseres på regel-sett, som matcher entries in an logg. F.eks IP GET requests i en apache access_log fil. Kommando: ``` fail2ban-client status ``` test2
Save
Cancel
Wordpress
2026-01-12 12:29:55
## Se også * [Wordpress_brukerstøtte](Wordpress_brukerstøtte) * [Wordpress_drift](Wordpress_drift) ## Nytt juni 2024 Tjenesten .w.uib.no kjører nå på P1BLOG04. Den kjører kun Apache med PHP-FPM og MariaDB backend. Det betyr at det ikke lenger kjører Nginx eller Varnish. Teksten under gjelder for den forrige serveren P1BLOG01 som nå er avviklet i sammenheng med Redhat 7 avviklingen. ## Beskrivelse UiB sin Wordpress Multisite tjeneste. Kjører på [p1blog01](https://bs.uib.no/?module=cmdb&action=view&boks=1644). Tjenesten oppdateres automatisk en gang i døgnet ved hjelp av [Ansible](https://en.wikipedia.org/wiki/Ansible_(software)). ## Varnish Varnish er installert på det nye wordpress-hotellet som erstatning for w3-total cache. Varnish er konfigurert til å cache til disk og bruker til enhver tid 15GB til dette formålet. Cache-tiden er satt til 1 måned, og etter hver endringslørdag bygges cachen automatisk opp igjen på nytt. `/etc/varnish/varnish.params` definerer hvor stor cachen skal være. Om cachen blir full slettes elementer etter least recent used prinsippet. ``` VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,15G" ``` All varnish-oppførsel er beskrevet i `/etc/varnish/default.vcl`. Som definerer hvor lenge det caches, hva som caches og hvordan ulike forespørsler blir håndtert. I nginx-loggene blir det logget dersom en får cache HIT og cache MISS. Loggen `/var/log/nginx/timing-upstream-wordpress.log` sier hvor lang tid hver forespørsel bruker for å hente ressursen fra backend-serveren. ### Manuelt purge URL'er fra cache ``` [~](root@p1blog01)# /root/purge-url.sh ``` ### Undersøke varnishlog etter cache MISS ``` [~](root@p1blog01)# varnishlog -q 'VLC_call ~MISS' ``` For mer detaljer om varnish-oppsettet vennligst les her: [Wordpress-varnish](Wordpress-varnish) ## Nginx Det er installert nginx som webserver på det nye wordpress-hotellet. Dette er et enklere oppsett enn før og varnish er satt opp bak nginx og foran backenden (se tegning nedenfor). All konfigurasjon fra nginx i conf.d-mappen er styrt på selve serveren, bare default nginx.conf i /etc/nginx og filen ssl.inc er styrt fra puppet. Puppet vil sikre at nginx kjører og at filen nginx.conf er lik templaten fra puppet. Ellers er oppsettet hovedsaklig styrt manuelt, pga mye custom regulære uttrykk i nginx-konfigurasjonen.  Nytt navnerom w.uib.no er også etablert, men alle gamle URL'er som begynner på b.uib.no vil fungere pga regexp i frontend-wordpress.conf ```nginx server { ``` listen 80; listen [::]:80; server_name ~^(?<blogg>.+).b\.uib\.no$; rewrite ^/(.*)$ https://$blogg.w.uib.no$request_uri; ``` } server { ``` listen 443; listen [::]:443; include ssl-old.inc; server_name ~^(?<blogg>.+).b\.uib\.no$; rewrite ^/(.*)$ https://$blogg.w.uib.no$request_uri; ``` } ``` ### nginx-helper Tidligere ble bildet i wordpress-løsningen mappet til riktig nettsted (blogs.dir i wp-content) ved hjelp .htaccess i apache. I nginx finnes det derimot ikke noe .htaccess og vi har da satt opp og installert en nginx-plugin som ordner denne koblingen for oss. Innstikket heter nginx-helper og er site-aktivert. Den er automatisk enablet når den er aktivert og har som hovedfunskjon å koble alle nettstedene til riktig id, slik at bilder og filer i multisite-instansen kobles og vises til rett nettsted. ``` ... musicandresistance.w.uib.no 1011; raederlab.w.uib.no 1012; christiekonferansen.w.uib.no 1014; grs.w.uib.no 1015; ifpodkast.w.uib.no 1016; soga.w.uib.no 1018; ... ``` Alle filer bruker location /files i frontend-wordpress.conf i nginx. Ved å kikke på ulike bilder på tvers av wordpress-nettsteder vil man kunne se at bildene lastes med "like" urler /files/årstall/.. som for eksempel bildet rdlnsj_6.jpg fra raudt.w.uib.no: https://raudt.w.uib.no/files/2010/10/rdlnsj_6.jpg Dette er i realiteten mappet opp til en individuell fil for dette spesifikke nettstedet. F12 i nettleseren vil vise hvilken id nettstedet har i wordpress og som matches på filsystemet. Nginx setter også headeren x-blogid for debuggingsformål. Så i praksis betyr det at dette bildet har sti /var/www/wordpress/wp-content/blogs.dir/121/files/2010/10/rdlnsj_6.jpg ``` ls /var/www/wordpress/wp-content/blogs.dir/121/files/2010/10/rdlnsj_6.jpg /var/www/wordpress/wp-content/blogs.dir/121/files/2010/10/rdlnsj_6.jpg ``` Dette bildet kan også aksesseres direkte i nettleseren. https://raudt.w.uib.no/wp-content/blogs.dir/121/files/2010/10/rdlnsj_6.jpg Nginx-helper settings i site-admin i wordpress lager filen map.conf. Map.conf ligger i stien /var/www/wordpress/wp-content/uploads/nginx-helper, og lastes inn i nginx-conf på denne måten. ```nginx map $http_host $blogid { ``` default -999; include /var/www/wordpress/wp-content/uploads/nginx-helper/map.conf; ``` } ``` og ved hjelp av: ```nginx location /files { ``` root /var/www/wordpress/wp-content/blogs.dir/$blogid; add_header 'X-blogid' $blogid; ``` } ``` Kobler den da sammen riktig bilde/fil til riktig nettsted som beskrevet ovenfor. ## Ansible I `/root/upgrade/wordpress` ligger ansible-jobbene som oppdaterer Wordpress. Ansible-jobben fungere som en wrapper rundt `wp-cli` og kjører de samme kommandoene som man ville gjort manuelt. Hver oppgradering logges til en egen logg, for å feilsøke legges denne jobben i `/var/log/wordpress`. For å oppdatere ansible-jobbene må endringene gjøres i gitrepoet nedenfor. Før hver kjøring gjøres det en `git pull` for å sikre at de nyeste endringene blir tatt med før oppgradering. ``` git clone git@git.uib.no:utils/ansible/wordpress ``` ## Selvbetjening Alle brukere ved UiB kan selv opprette nye nettsteder via https://wordpress.app.uib.no Se: [Wordpress.app.uib.no](Wordpress.app.uib.no) ## Installasjon av tema og plugins En må kun bruke wp cli når en installerer nye tema og plugins. Dersom temaet befinner seg på annet sted enn wordpress.org, så kan en laste ned zip filen til /tmp, og så installere den med: ``` wp theme install /tmp/tema.zip ``` Dersom det er feil i temaet, så vil wp cli rapportere om dette. Plugins utenfor wordpress.org eller andre annerkjente firmaer som lager plugins, bør en unngå. F.eks egenutviklete plugins tillates ikke. ## status * http://oppetid.app.uib.no/?tjeneste=b.uib.no * https://metiri.uib.no/Linux/p1blog01.uib.no/ * http://overvakning.app.uib.no/blog_hist.php ## CMDB ## Tjenestekatalog https://tk.app.uib.no/node/14 ## Annet https://it.uib.no/Wordpress https://w.uib.no/ https://webhotell.w.uib.no/
Save
Cancel
Skjemaker
2026-01-12 12:08:33
"Skjemaker" er navnet på en definert tjeneste ved IT-avdelingen, Universitetet i Bergen som gjør det mulig for både ansatte og studenter ved Uib å logge inn og lage sine egne webskjema. Webskjemaene kan benyttes til spørreundersøkelser, påmeldinger osv. Det er Appnitro Machform som har laget PHP koden, og det er en lisensert kode som UiB har kjøpt. Kostnaden er rundt 1500 kroner i året for lisensen. ## Søk i brukere og skjemaer i Skjemaker * https://skjemaker.app.uib.no/docs/user_forms_sok.php Passord får en av Helge ## Nginx reverse-proxy på Masterlb * https://itgit.app.uib.no/it/ft/pf/linux/masterlb-new/-/blob/main/nginx/conf.d/prod.d/skjemaker.app.uib.no.conf?ref_type=heads ## Skjemaker Users and Forms uttrekk Noen ganger så savner brukeren et eller flere skjema. Det som er problemet er at de ikke husker hva skjemaet het eller at de har ikke url'en til skjemaet. Da blir det som å lete etter nålen i høystakken. Men, nå har jeg laget ett uttrekk som en kan kikke i dersom en bruker savner et skjema eller flere. Dette uttrekket ligger her: ``` p1skjemaker04:/root/scripts/helge/CleanUp/users_forms.txt ``` SQL for å få dette til er følgende: ```sql SELECT ``` u.user_id, ``` ``` u.user_email, ``` ``` f.form_id, ``` ``` f.form_name, ``` ``` creator.user_email AS form_created_by ``` FROM ap_permissions p JOIN ap_users u ``` ON p.user_id = u.user_id ``` JOIN ap_forms f ``` ON p.form_id = f.form_id ``` LEFT JOIN ap_users creator ``` ON f.form_created_by = creator.user_id ``` ORDER BY u.user_id, f.form_id; ``` For å sjekke hvilke skjemaer en bruker har laget eller har tilgang til, så kan en typisk søke med: ``` cat users_forms.txt | grep helge.opedal ``` som da gir ut en liste: | user_id | user_email | form_id | form_name | form_created_by | | --- | --- | --- | --- | --- | | 773 | helge.opedal@uib.no | 15913250 | Bergen Summer Research School 2024 | howaida.abdelrahman@uib.no | | 773 | helge.opedal@uib.no | 19856268 | Plastic Network Fall Meeting | rannveig.myklebust@uib.no | | 893 | kristian.skurtveit@uib.no | 1679249 | Bestilling av ny Linux server IT-avdelingen (intern) TEST | helge.opedal@uib.no | | 898 | vala.hjorth-jenssen@uib.no | 222 | Kurs i svømming | helge.opedal@uib.no | | 954 | andrea.grimnes@uib.no | 14069460 | HMS-vernerunde kontor GEO 2021 Copy FRA BACKUP 03.01 | helge.opedal@uib.no | | 954 | andrea.grimnes@uib.no | 14069460 | HMS-vernerunde kontor GEO 2021 Copy FRA BACKUP 03.01 | helge.opedal@uib.no | ## Skjemaker CleanUp! Begynner nå med en rydde-rutine i Skjemaker hvor gamle skjemaer som ikke har fått registreringer etter 1. januar 2024 blir slettet. Script ligger her enn så lenge på p1kro01: ``` /root/scripts/skjemaker/CleanUp ``` ## Ny versjon av Machform 27 med SSO og sikrere fil-opplasting NB: husk å kopiere inn robots.txt fil nå ny Machform kode Prodsettes! Sette opp SSO: * https://docs.machform.com/help/how-to-set-up-machform-with-single-sign-on-sso ## Ny versjon av Machform 25 på veg inn (GJENNOMFØRT) Denne versjonen inneholder en fix for en sql injection, så den er viktig å få inn. Jobben: * Hente filene * Gjøre UiB endringer i filene * Test oppgradere på Test først * Teste, Teste og Teste Om alt ser ok, så gjøres det samme i Prod. Det blir nedetid, så må ta det ved anledning. Vi bør også ta en vmware snapshot rett før vi trykker på knappen. ## Sikkerhetstiltak * Innlogging kun fra 129.177. eller VPN * Superadmins (Helge og Lennart) har etablert 2FA ved innlogging * Hver fredag kjøres en sql som fjerner Superadmin rettighetene. Superadmin rettighetene må aktiveres via bash script under /root/scripts/helge/makehelgeadmin.sh * Aktiv sletting av gamle skjemaer som ikke er i bruk lenger ** https://itgit.app.uib.no/it/dpv/daf/pub/backlog/-/issues/124 * Vurdering av potensielle sårbarheter (sql injection m.m.) er gjennomført sammen med Appnitro * PHP 8.3 er aktivert * Aktiv sletting av gamle skjemaer med innhold * Aktiv sletting av registreringer i BetalMeg skjemaet (30 dager beholdes) ### Vurdering av andre sikkerhetstiltak * Skjemaer som er "eierløse" bør slettes. Det gjelder da typisk gamle skjemaer som er eid av brukere som ikke lenger har konto på UiB * Aktiv søking etter skjemaer med felter som henter inn sensitiv personopplysinger. Kan en f.eks søke etter ord som "personnummer" osv? * Sette opp en helt ny Skjemaker, og så gå for en kontrollert avvikling av dagens løsning? I praksis blir det da å tømme databasen * Skjemaer som ikke lenger mottar data, fra før 2021, bør slettes (eier er mest sannsynlig sluttet og/eller skjemaet er ikke lenger i bruk) ## Backup av Skjemaker I tillegg til database dump, så kjøres det også TSM backup på p1skjemaker04. I tillegg kan en pakke hele skjemaker katalogen og legge den inn på Billy. Det gjøres med følgende: ``` tar -czvf /home/mihho/billy/skjemaker/skjemaker24.tar -C /var/www/app skjemaker24 ``` ## Oppdatere avsender epost adresser i Skjemaker Noen ganger har en lyst til å endre på avsender adresser på diverse skjemaer. Da kan en kjøre noe tilsvarende som dette: ```sql UPDATE ap_forms SET form_email = 'studie.bio@uib.no' WHERE form_email = 'studie@bio.uib.no'; UPDATE ap_forms SET form_email = 'utveksling@jurfa.uib.no' WHERE form_email = 'utveksling.jurfa@uib.no'; UPDATE ap_forms SET form_email = 'utveksling@jurfa.uib.no' WHERE form_email = 'utveksling.jurfa@uib.no'; UPDATE ap_forms SET form_email = 'studieveileder@kmd.uib.no' WHERE form_email = 'studieveileder.kmd@uib.no'; UPDATE ap_forms SET form_email = 'exchange@psyfa.uib.no' WHERE form_email = 'exchange.psyfa@uib.no'; UPDATE ap_forms SET esl_from_email_address = 'studie.bio@uib.no' WHERE form_email = 'studie@bio.uib.no'; UPDATE ap_forms SET esl_from_email_address = 'utveksling@jurfa.uib.no' WHERE form_email = 'utveksling.jurfa@uib.no'; UPDATE ap_forms SET esl_from_email_address = 'utveksling@jurfa.uib.no' WHERE form_email = 'utveksling.jurfa@uib.no'; UPDATE ap_forms SET esl_from_email_address = 'studieveileder@kmd.uib.no' WHERE form_email = 'studieveileder.kmd@uib.no'; UPDATE ap_forms SET esl_from_email_address = 'exchange@psyfa.uib.no' WHERE form_email = 'exchange.psyfa@uib.no'; UPDATE ap_forms SET esr_from_email_address = 'studie.bio@uib.no' WHERE form_email = 'studie@bio.uib.no'; UPDATE ap_forms SET esr_from_email_address = 'utveksling@jurfa.uib.no' WHERE form_email = 'utveksling.jurfa@uib.no'; UPDATE ap_forms SET esr_from_email_address = 'utveksling@jurfa.uib.no' WHERE form_email = 'utveksling.jurfa@uib.no'; UPDATE ap_forms SET esr_from_email_address = 'studieveileder@kmd.uib.no' WHERE form_email = 'studieveileder.kmd@uib.no'; UPDATE ap_forms SET esr_from_email_address = 'exchange@psyfa.uib.no' WHERE form_email = 'exchange.psyfa@uib.no'; ``` ## Machform versjon 22 Prodsatt torsdag 12. september 2024 kl 15:30 ## Finne antall filer som er lastet opp i Skjemaker ``` find /var/www/app/skjemaker/htdocs/data -type d -name 'files' -exec find {} -type f \; | wc -l ``` som gav en rundt 134 000 filer. ## Gå til Forms tabellen direkte i phpMyAdmin ``` NB! Husk å sette riktig databasenavn! ``` Når en åpner phpMyAdmin mot Skjemaker databasen, så går det vinter og vår. Derfor er det kjappere å kalle på en tabell direkte, f.eks: ``` https://skjemakerbackend2.app.uib.no/phpmyadmin/index.php?route=/sql&db=skjemaker25&table=ap_forms&pos=0 ``` ``` https://skjemakerbackend2.app.uib.no/phpmyadmin/index.php?route=/sql&db=skjemaker25&table=ap_users&pos=0 ``` eller mot et spesifikt skjema: ``` https://skjemakerbackend2.app.uib.no/phpmyadmin/index.php?route=/sql&pos=0&db=skjemaker21&table=ap_form_1000386 ``` ## Sletting av skjemaer i Skjemaker Skjemaker databasen vokser og vokser. Det er mange tusen skjemaer som ikke lenger er i bruk, og som potensielt har informasjon som vi kanskje ikke ønsker skal ligge der. Men, når en prøver å slette skjemaer i Skjemaker, så er det bare et flagg i databasen som settes til 0. Jeg sendte en epost til Appnitro hvor jeg spør om hvordan en kan slette skjemaer for godt i Skjemaker. Her er svaret dere: ``` Hi Helge, ``` ``` By default, MachForm won't actually remove your data when you delete them indeed. If you need to immediately remove the data upon deletion, you can edit the config.php file under your machform folder. ``` ``` Search for this line: define('MF_CONF_TRUE_DELETE',false); ``` ``` change it to become: define('MF_CONF_TRUE_DELETE',true); ``` ``` This way, every time you delete any form or entry, it will be deleted permanently. ``` ``` If you need to remove the old tables, I suggest not to do this directly, since many related tables/entries need to be deleted as well. Instead, go to your "ap_forms" table and restore the old deleted forms by changing the "form_active" value to 1. ``` ``` Then delete the form using MachForm interface. This way, your data will be correctly deleted. ``` ``` Let me know if you have more questions. ``` ``` Kind regards, -- Yuniar Setiawan Founder, Appnitro Software Web: https://www.machform.com ``` Men, utfordringen er at det er rundt 6000 skjemaer som er "slettet". Å slå de på er lett, det er bare å sette inn et 1 tall der det i dag er et 9 tall. Men, selve slettingen via nettsiden, ser ut til å være enten en javascript funksjon eller POST. Jeg slo på sql loggingen med å legge inn følgende i my.cnf.d/mariadb-server.cnt: ``` general_log_file = /var/log/mysql/mysql.log ``` ``` general_log = 1 ``` I tillegg må også følgende settes til TRUE i Skjemaker config.php fila: ``` define('MF_CONF_TRUE_DELETE',true); ``` og da fant jeg de aktuelle sql'ene som kjøres når et skjema blir faktisk slettet: ``` delete from ap_forms where form_id='5074704' delete from ap_form_elements where form_id='5074704' delete from ap_element_options where form_id='5074704' delete from ap_column_preferences where form_id='5074704' delete from ap_entries_preferences where form_id='5074704' delete from ap_form_locks where form_id='5074704' delete from ap_form_filters where form_id='5074704' delete from ap_form_stats where form_id='5074704' delete from ap_element_prices where form_id='5074704' delete from ap_field_logic_elements where form_id='5074704' delete from ap_field_logic_conditions where form_id='5074704' delete from ap_page_logic where form_id='5074704' delete from ap_page_logic_conditions where form_id='5074704' delete from ap_email_logic where form_id='5074704' delete from ap_email_logic_conditions where form_id='5074704' delete from ap_webhook_options where form_id='5074704' delete from ap_webhook_parameters where form_id='5074704' delete from ap_webhook_logic_conditions where form_id='5074704' delete from ap_success_logic_options where form_id='5074704' delete from ap_success_logic_conditions where form_id='5074704' delete from ap_reports where form_id='5074704' delete from ap_report_elements where form_id='5074704' delete from ap_report_filters where form_id='5074704' delete from ap_grid_columns where form_id='5074704' delete from ap_approval_settings where form_id='5074704' delete from ap_approvers where form_id='5074704' delete from ap_approvers_conditions where form_id='5074704' delete from ap_form_payments where form_id='5074704' delete from ap_form_images_files where form_id='5074704' delete from ap_form_pdf_files where form_id='5074704' delete from ap_integrations where form_id='5074704' drop table if exists `ap_form_5074704_approvals` drop table if exists `ap_form_5074704_review` drop table if exists `ap_form_5074704_files` drop table if exists `ap_form_5074704_listfiles` drop table if exists `ap_form_5074704_log` drop table if exists `ap_form_5074704` drop table if exists ap_form_5074704_files delete from ap_permissions where form_id='5074704' ``` ## Etablering av ny versjon av Machform fordrer noen endringer i diverse filer Følgende filer må endres når ny versjon av Skjemaker (Machform) skal prod-settes: * index.php * config.php * css/main.css * export_entries.php * includes/entry-functions.php * grid_datasource.php * includes/footer.php * includes/report-functions.php * index.php En kan prøve seg med 3-veis git magi, men det enkleste er nok å sammenligne med forrige versjon, eller sjekke i git historien og så legge inn endringene manuelt. ## Versjon 21 Machform * p1skjemaker04 (https://bs.uib.no/?module=cmdb&action=view&boks=3144) med PHP 8.3 og MariaDB 15.1 Ble prod-satt torsdag 23. mai 2024 kl 16:00 Ny versjon Skjemaker 22 er på veg (per 27. august 2024). ## Tilganger i Skjemaker Det er laga nokro himasnekra bash og php script som håndterer dette. Aksess via: * https://skjemaker.app.uib.no/tilgang Koden er: 1814 Innmelder får da en lenke med 1 time gyldig nøkkel og som gir tilgang til et skjema hvor en kan spesifisere skjema id og epostadressen til den som skal ha tilgang. når dette er meldt inn så er det et bash script som sjekker at du faktisk er den som eier skjemaet, og at nøkkelen er gyldig. Det er også en del andre tester. Om alt er ok, så kjøres det et cronscript som da faktisk skriver til Mysql databasen, og en får da tilgang. For at "tilgang" app'en skal fungere, så må en ha installert følgende programvare: * php * mutt * dos2unix ## Javascript pop-up på hovedsiden før innlogging En kan få en pop-up på innloggingssiden til Skjemaker ved å legge følgende inn i index.php etter body tag'en: ```javascript <script> ``` // JavaScript function to display the popup box ``` ``` function displayPopup() { ``` ``` alert("Viktig melding! Her kommer en detaljert beskrivelse av no.\n\nLes mer om tjenesten/produktet på:\n\nhttps://it.uib.no/Skjemaker\n\nIT avdelingen - Universitetet i Bergen.\n\n13. mai 2024"); ``` ``` } ``` ``` // Call the displayPopup function when the window is fully loaded ``` ``` window.onload = function() { ``` ``` displayPopup(); ``` ``` }; ``` </script> ``` ## Webplakat under oppgradering av Skjemaker En måte å gjøre det på er som følger. Flytt htdocs katalogen til htdocs-old ``` mv htdocs htdocs-old ``` Deretter lag ny htdocs ``` mkdir htdocs ``` og så flytt inn to filer: ``` index.html ``` som inneholder html teksten "Skjemaker under oppgradering". Og index.php: ```php <?php // Redirect to index.html header("Location: https://skjemaker.app.uib.no"); exit; ?> ``` hvor Location er der hvor gjeldende Prod av Skjemaker er. i tillegg må en lage en symlenke: ``` ln -s index.php view.php ``` dette fordi en kan nå skjemaene direkte via view.php filen, og en ønsker at brukerne også skal få samme webplakat. Alle andre kall vil gi 404 not found som er helt greit. F.eks dersom en Skjemaker administrator er innlogget og prøver å gjøre endringer på et av sine skjema. ## Ny søkefunksjon i versjon > 19 Den nye søkefunksjonen er raskere, men treffer dårligere. Dette henger sammen med endringer i koden for søke i Machform. Jeg spurte de om dette og de har kommet med følgende forslag som jeg skal nå prøve ut: ``` you can customize manage_forms.php file. Edit the file and search for these code : $total_forms > 500 $total_forms <= 500 ``` ``` Then change 500 to 20000 Or another way, you can change new search box search method. To do this, go to line 637 for these code : ``` ``` searchEngine: "strict", and change it to searchEngine: "loose", ``` ## Versjon 21 Machform * Skjemaker kjører i dag gjennom [er satt opp som en Nginx reverseproxy. Selve PHP applikasjonen kjører i en Apache webserver sammen med MariaDB databasen på boks: * p1skjemaker04 Forrige maskin * p1skjemaker16 er fortsatt i sving som en teste-maskin. Den kjører enn så lenge forrige versjon av Skjemaker, og kan være nyttig til feilsøking, og evt. finne tilbake til tidligere skjemaker og entries. Den er sperret på IP så det er kun Helge som kan logge inn. En åpner opp i vhost configen om en skal ha tilgang. I sammenheng med at applikasjonen ble lagt bak Masterlb så fikk "skjemaker.app.uib.no" en ny IP adresse. Vi ser nå at mange klienter utenfor UiB fortsatt henviser til gammel ip adresse. Det er derfor satt opp en midlertidig tilgjengelig reverse-proxy her: * https://skjemaker.h.uib.no Den vil være tilgjengelig i noen dager inntil DNS har oppdatert seg rundt omkring. Internt på UiB og VPN til UiB er ikke dette et problem. Skjemaker er skrevet i PHP. Produktet heter Machform, og vi får programvare fra Appnitro (http://www.appnitro.com/). Lisenskostnaden er rundt 130 USD = 1360 NOK per år. ## Skjemaker 18.1 På ny Prod boks (prodsettes i oktober 2022) så benyttes php-fpm. Denne har innstillinger som en må se på her: ``` /etc/php-fpm.d/www.conf ``` særlig gjelder det at når en opplever følgende 503 feil: ``` [Fri Sep 30 11:48:14.693502 2022](som)(Masterlb](Masterlb)) [43572]([pid)(proxy_fcgi:error]) (70007)The timeout specified has expired: [129.177.9.169:57204](client) AH01075: Error dispatching request to : ``` som ser ut til å skje under oppgraderingen. Da kan løsningen være å legge inn følgende i vhost configen /etc/httpd/vhosts.d/vhost.conf ``` TimeOut 1200 ``` ``` ProxyTimeout 1200 ``` ## Internal error 500 Noen ganger så feiler Skjemaker. Det kan ende med en 500 internal error, og i errorloggen på skjemakerbackend.app.uib.no så kan en f.eks se noe ala: ``` [03 12:49:51.148788 2023](Jan)(Tue) [53703]([pid)(proxy_fcgi:error]) [129.177.6.20:52298](client) AH01071: Got error 'PHP message: PHP Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, string given in /var/www/app/skjemaker/htdocs/includes/view-functions.php:5199\nStack trace:\n#0 /var/www/app/skjemaker/htdocs/includes/view-functions.php(7895): mf_display_matrix(Object(stdClass))\n#1 /var/www/app/skjemaker/htdocs/edit_form.php(243): mf_display_raw_form(Object(PDO), 11838429)\n#2 {main}\n thrown in /var/www/app/skjemaker/htdocs/includes/view-functions.php on line 5199', referer: https://skjemaker.app.uib.no/form_locked.php?id=11838429 ``` Det kan da tyde på at det er PHP kode som ikke kjører tilfredstillende. Dette bør en rapportere til Appnitro slik at de kan fikse det i neste versjon. Jeg pleier å sende en epost til Andar Redityo: ``` support@appnitro.com ``` I dette tilfellet var det et viktig Skjemaker skjema, som de hadde brukt mye tid på. De hadde heller ingen kopi av skjemaet. Løsningen for å komme tilbake til forrige versjon av skjemaet ble det da gjort som følger: # finn siste nattlige backup av skjemaker basen # kopier denne over til en annen server, f.eks kro.uib.no # import databasen inn i ny database der, gjerne med navn som referer til skjemaet det gjelder: "skjemaker11838429" # etabler samme PHP kode som på skjemakerbackend.app.uib.no på Kro serveren # lag Mysql bruker, og legg inn riktige verdier i config.php # en kan så logge inn, og finne skjemaet: ## https://skjemaker11838429.h.uib.no/manage_forms.php # deretter lager en en kopi av skjemaet # denne kopien eksporterer en ut som en json fil # Denne json filen kan en så importere tilbake inn i skjemaker.app.uib.no Og vips så har en fått tilbake en versjon av skjemaet fra sist nattlige backup. Skjemaet kan så deles med innmelder. Feilen ser ut til å være relatert til PHP 8 versjonen: * https://stackoverflow.com/questions/66671269/fatal-error-uncaught-typeerror-count-argument-1-var-must-be-of-type-cou Husk også at dersom en får 503/500 timeout feil i phpMyAdmin, så må en øke verdier i php.ini: * https://stackoverflow.com/questions/46594731/apache-proxy-fcgi-the-timeout-specified-has-expired-error-dispatching-reques ## Mariadb navneregler Næh.. kankskje det var en dårlig idé. Databasenavnet er hardkodet inn i "Tilgang" bash scriptene... hmm så da må en lage en rutine som henter ut gjeldende database navn fra config.php filen til gjeldende kjørende Machform kode. <s> Forslag til ny navneregler på Skjemaker sin Mariadb database navn: ``` skjemakerNN-YYYY-MM-NN ``` hvor NN er Machform versjonssnummer, og YYYY-MM-NN er dagens dato. Fordelen med dette er at en da kan tilrettelegge ny database med et løpenummer, og skifte av database gjøres enkelt i config.php Machform koden. </s> ## Fjerne rettigheter til en bruker på gitt skjema I dag kan brukerne selv gi andre tilgang til sine skjema via: * https://skjemaker.app.uib.no/tilgang Men, noen ganger er det ønskelig at brukeren skal fjernes fra et gitt skjema. Dette finnes en skjult funksjon i Skjemaker for dette. Dersom ID til et skjema er: 123456 så kan en legge til, endre og fjerne tilganger til skjemaet via denne url'en: * https://skjemaker.app.uib.no/form_info.php?id=123456 Lenkene: ``` form_info.php ``` og ``` form_access.php ``` ser ikke ut til å være tilgjengelig for vanlige brukere. Altså er det kun superadmin som kan aksessere disse. Derfor må det enn så lenge gjøres av system admin dersom noen skal fjernes fra et gitt skjema. En annen måte å gjøre dette på er å skrive inn følgende sql i en fil: ``` ``` UPDATE `ap_permissions` SET `edit_form` = '0', `edit_entries` = '0', `view_entries` = '0', `edit_report` = '0' WHERE `ap_permissions`.`form_id` = NNNNNNNN AND `ap_permissions`.`user_id` = UUUUU; ``` ``` hvor NNNNNNN er skjemaets id, og UUUUU er brukerens user_id. Om en prøver å kjøre denne sql via phpMyAdmin så ender det opp med en 500 internal error. Ukjent hvorfor. Derfor er det bedre å skrive disse sql'ene inn i en fil, med f.eks navn: oppdater.sql og så kjøre inn oppdateringene via bash shellet som root bruker: ``` ``` # mysql skjemaker < oppdater.sql ``` ``` Det kan være at UPDATE statementet over ikke helt løser det. En kan også slette slike entries med (men hold tunga beint i munnen): ``` DELETE FROM ap_permissions WHERE `ap_permissions`.`form_id` = NNNNNNNNN AND `ap_permissions`.`user_id` = UUUU" ``` ## Oppgradering Det er lurt å ta oppgraderingen på en ny server i stedenfor å gjøre det direkte i Prod. Om noe skulle gå galt så kan en alltid rygge tilbake på gammel server. ### Fargekoder Navn på bokser i dag er på formen: p1skjemakerNN hvor p1 forteller om den fysiske plasseringen, og NN er et løpenummer eller en referanse til versjonsnummeret til Machform. For å gjøre det enklere å holde styr på om en er på Prod, Test eller Staging, så er det lagt inn fargekoder på bash terminal prompten på følgende måte: ``` /root/.bashrc ``` oppdateres typisk med: ``` PS1='\[\W](\e[0;31m\][``` Les mer her: https://www.cyberciti.biz/faq/bash-shell-change-the-color-of-my-shell-prompt-under-linux-or-unix/ <div style="color:red"><li>Rød prompt: PRODUKSJON. En må være forsiktig med hva en gjør</li></div> <div style="color:green"><li>Grønn prompt: alt ok, en er enten på Test eller Staging. Ingen fare om en slår av apache eller dropper lokale databaser osv.</li></div> <div style="color:yellow"><li>Gul prompt: Er ikke en Prod boks, men en skal likevel være forsiktig. Kan en være en boks som potensielt blir satt i Produksjon</li></div> <div style="color:purple"><li>Lille prompt: Har vært en Prod boks, men er på veg til utfasing. Beholdes i en periode i tilfelle en skulle trenge å hente arkivert data. F.eks om en skulle trenge å hente trafikk data tilbake i tid.</li></div> ## Etablere Machform koden på ny server # Bestill og last ned ny machform kode. Pakk ut koden på /var/www/app/skjemaker/htdocs på ny Prod boks # kopier inn sertifikater og nøkkel for *.app fra gjeldende Prod til ny server Staging # Legge inn ssh-keygen nøkler slik at rsync og scp kan gå auto f.eks i cron # Hent inn siste dump fil fra Prod:Mariadb: ``` mysql skjemakerNN < skjemaker_fra_prod.sql ``` # Kopiere inn diverse bash script: ``` [root@SkjemakerProd scripts](\u@\h)\$\[')(\e[0m\])# tar -cf helge.tar helge/ ``` ``` [scripts](root@SkjemakerProd)# scp helge.tar helgeo@p1skjemaker16:/var/www/tmp/ ``` # Ta med git repo ``` scp /var/www/app/skjemaker/htdocs/.git helgeo@p1skjemaker16:/var/www/app/skjemaker/htdocs ``` # Oppdatert /root/.gitconfig med: ``` name = Root at P1SKJEMAKERNN ``` ``` email = osys@it.uib.no ``` ``` [= auto ``` # Med hjelp av git kan en se hvilke endringer som er gjort i Machform css/php koden: ``` git status ``` ``` git diff ``` # Oppdatert crontab med: ``` */2 * * * * root $(cd /root/scripts/helge; ./rungivepermission.sh) ``` ``` */13 * * * * root $(cd /root/scripts/helge; ./flushsessions.sh) ``` ``` # Nattlige mysql dumper ``` ``` 9 1 * * * root /root/scripts/mysqlbackup.sh ``` # "tilgang" (https://skjemaker.app.uib.no/tilgang) app'en må synkes fra Prod (eller at den ligger i git, altså noe git clone, deretter en deploy.sh som pakker ut filene til riktige kataloger). Innebærer bash script til /root/scripts, samt html filer under /var/www/app/tilgang ``` cd /var/www/app/skjemaker; tar -cf tilgang.tar tilgang/ ``` ``` scp tilgang.tar helgeo@p1skjemaker16:/var/www/tmp/ ``` # Registrere midlertidig DNS, eks p1skjemakerNN hvor NN er siste versjonsnummer av Machform * https://tjinfo.uib.no/dyndns # Lage lokal mariadb admin bruker: ``` CREATE USER 'helgeo'@'localhost' IDENTIFIED BY '***********************'; ``` ``` GRANT ALL PRIVILEGES ON *.* TO 'helgeo'@'localhost' WITH GRANT OPTION; ``` ``` FLUSH PRIVILEGES; ``` # rsynce data fra Prod til Staging: rsync -avr /var/www/app/skjemaker/htdocs/data ``` helgeo@nyprodskjemaker.uib.no:/var/www/app/skjemaker/htdocs/ ``` # Oppdatert config.php med mariadb bruker og passord # Sett riktige rettigheter på data/ katalogen ``` chown -R apache data ``` # Oppgrader databasen: ``` https://skjemakerNN.app.uib.no/upgrade.php ``` # UiB branding, hente inn UiB logo ``` scp machform_logo.png helgeo@p1skjemaker16:/var/www/tmp/ ``` ``` mv /var/www/app/skjemaker/htdocs/images/machform_logo.png machform_logo.png.bak ``` ``` scp machform_logo_vibrant.png helgeo@p1skjemaker16:/var/www/tmp/ ``` ``` mv machform_logo_vibrant.png machform_logo_vibrant.png.bak ``` ``` mv /var/www/tmp/machform_logo.png /var/www/app/skjemaker/htdocs/images ``` ``` mv /var/www/tmp/machform_logo_vibrant.png /var/www/app/skjemaker/htdocs/images ``` ``` scp machform_logo_light.png helgeo@p1skjemaker16:/var/www/tmp/ ``` # Legg inn 2 url'er i index.php rett over <div id="logo"> ``` <a id="footer" target=_blank href="https://skjemaker.app.uib.no/tilgang">Registrer tilgang til andre på skjemaet ditt</a> ``` ``` <a id="footer" target=_blank href="https://tk.app.uib.no/node/29">Betingelser/Term of use</a> ``` ### Synking av data _Kladd, skal finskrive det senere. Dette er ingen eksakt kakeoppskrift. Det kan variere fra gang til gang. Men i hovedtrekk altså_ Antar at ny kode etableres på ny server. Måten å etablere ny kode på er: ``` cd /var/www/tmp/ ``` ``` unzip nyversionmachform.zip ``` ``` mv /var/www/app/skjemaker/htdocs /var/www/app/skjemaker/htdocs_old ``` ``` mv /var/www/tmp/machform /var/www/skjemaker/htdocs/ ``` ``` mv /var/www/app/skjemaker/htdocs_old/data/ /var/www/skjemaker/htdocs/ ``` Deretter må databasen importeres. Gjøres ved å dumpe databasen på dagens Prod, og så flytte den over til ny server. Deretter slettes evt. eksisterende skjemaker database på ny server. Så importeres databasen. Dump: ``` mysqldump skjemakerProd -x > /backup/skjemaker.$(date '+%Y-%m-%d_%H:%M:%S').sql ``` Import: ``` mysql skjemakerdatabase < skjemaker.dato.sql ``` Deretter må data synkes. Dette gjøres ved å kjøre rsync på ny server. Følgende rsync kommando kan benyttes: ``` rsync -avrn helgeo@oldserver:/var/www/app/skjemaker/htdocs/data /var/www/app/skjemaker/htdocs/ --delete ``` I tillegg må en også få meg koden under: * /var/www/app/skjemaker/tilgang * /root/scripts Fjern n'en (dryrun) etter at en evt. har testet. ### upgrade.php ``` https://nyserver.app.uib.no/upgrade.php ``` ### Etablere ldap igjen Det kan være at ldap ikke fungerer. Dette må da slås på etter at en har logget seg inn. En må altså logge inn med en lokal konto. Denne kontoen er en lokal konto: ``` helge.opedal@uib.no ``` som kan benyttes. Passordet er: (snakk med Helge) Etter at en har logget inn kan en slå på Ldap. Om en ikke har noen lokal konto så må en inn i MariaDB databasen og finne user tabellen til Skjemaker. En kan da endre på hvilken som helst konto fra Ldap bruker til lokal bruker, samt epost adressen. I tillegg må en slå på to felter fra 0 til 1 slik at brukeren blir en administrator. Så kan en velge "forgot password" i innloggingsformen og så får en tilsendt et nytt passord på epost. Så kan en logge inn. ### DNS Dersom det er en ny server, så må en nå få endret domenenavnet til å peke mot den nye serveren. Dette kan en enten få hjelp av Hostmaster med, eller få tilgang til https://tjinfo.uib.no/dyndns og gjøre endringen selv. ``` skjemaker.app.uib.no -> ny_server ``` Endring i DNS gjøres på selve Prod dagen. Det kan være lurt å få satt ned TTL et par dager før. ### Endringsdag Dersom en skal gjøre oppgraderingen på en lørdag eller torsdag så må en avtale med Unix, slik at en unngår at f.eks nettet går ned eller at maskinen blir rebootet under oppgraderingen. ### Epost informasjon En bør sende ut informasjon på epost i god tid til brukerne, slik at de unngår å planlegge større datainnsamlinger samme dag. Se /root/scripts/helge/epostutsendelse/ på boksen. En kan hente ut f.eks alle brukerne som har logget inn på skjemaker.app.uib.no de 3 siste månedene. Denne epost listen må en samkjøre mot ldap for å luke ut kontoer som ikke eksisterer lenger. Dersom en har en "liste": ``` fornavn1.etternavn2@uib.no ``` ``` fornavn2.etternavn2@uib.no ``` ``` ... ``` ``` fornavn3.etternavn3@uib.no ``` Så kan en legge til følgende med: ``` cat liste | sed 's/^/ldapsearch -x -H ldap:\/\/ldap.ha.uib.no mail=/g' | sed 's/$/ | egrep ^mail/g' > kjormeg.sh ``` kjormeg.sh kan en da kjøre, og en vil få tilbake fra ldap hvilke epost adresser som er reelle. Deretter kan en lage en "body" fil med teksten en ønsker å sende ut, og så til slutt sende ut med: ``` su -c "cat body | mutt -s 'Skjemaker oppgraderes dato og tid' fornavn.etternavn@uib.no" dittuibbrukernavn ``` En slik liste kan en lage ut fra epostlisten: ``` cat liste | sed "s/^/su -c \"cat body | mutt -s 'infoteksten' /g" | sed 's/$/\" dittuibbrukernavn/g' ``` ### Estimert nedetid Det er noe manuelt arbeid, så en bør beregne 1 time, og bør helst varsle at det forventes 2 timer nedetid. ### Webplakat Siden dump og import av databasen kan ta lang tid, så bør brukerne møte en webplakat med informasjon om arbeidet. Dette kan gjøres ved å rette DocumentRoot i skjemaker.conf i Apache til å peke mot en index.html fil. NB: Dersom .conf filen er styrt av puppet, så må en i oppgraderingsperioden disable puppet: ``` puppet agent --disable "Puppet midlertidig disablet grunnet oppgradering. Ditt navn" ``` Et eksempel på en slik fil kan være: ```html <html> ``` <head> ``` ``` <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /> ``` ``` <meta name='viewport' content='width=device-width, initial-scale=1'> ``` ``` </head> ``` <body> <div class='container-fluid'> <div class="header__wrapper"> ``` <header class="header"> ``` ``` <h1 class="site-name">Nødvendig sikkerhetsarbeid på Skjemaker<br>Necessary security work on Skjemaker</h1> ``` </div> <div>Nødvendig sikkerhetsarbeid på Skjemaker er under arbeid. Arbeidet startet kl 12. Det estimeres ca 3 timers nedetid, og tjenesten forventes å være oppe igjen ca kl 15:00</div> <p><div><em>We are doing necessary security work on Skjemaker. The work started at 12:00 pm and we expect the service to be up and running as normal again at around 15:00 pm</em></div><p><p> <div id="footer"> ``` <p>IT avdelingen - Universitetet i Bergen</p> ``` ``` <p>Bergen 11. september 2021</p> ``` ``` <p><a href="https://hjelp.uib.no">hjelp.uib.no</a> - <a href="https://it.uib.no">it.uib.no</a></p> ``` </div> <div> ``` <p>IT department - University of Bergen</p> ``` ``` <p>Bergen 11th of September 2021</p> ``` ``` <p><a href="https://hjelp.uib.no/en">help.uib.no</a> - <a href="https://it.uib.no/en">it.uib.no</a></p> ``` </div> </div> </body> </html> ``` For å aktivere webplakaten, kan en oppdatere vhost configen skjemaker.conf med: ``` DocumentRoot /var/www/html ``` ``` RewriteEngine On ``` ``` RewriteRule (.*) /var/www/html/webplakat.html ``` som de vil omskrive alle GET requests til webplakat.html fila. ## Endringer i php/css koden etter ny Machform kode er etablert Det er noen mindre endringer en må gjøre i den ny-etablerte Machformkoden. I og med at vi ikke lenger har et 3-veis git merge regime, så må disse endringene gjøres manuelt. ### Endringer i index.php * Referer til mainuib.css i stedenfor main.css UTGÅTT? * Legg inn a href linjer til "tilgang": https://it.uib.no/Skjemaker/Betingelser * Legg til referanse til https://it.uib.no/Skjemaker/Betingelser ### Endringer i css Legg inn i følgende css inn i main.css slik at google integrasjon og betalingsløsningene blir skjult: ``` ul#mf_form_list div.form_option:nth-child(9) { ``` display: none; ``` } ul#mf_form_list div.form_option:nth-child(7) { ``` display: none; ``` } ``` NB: Disse kan variere fra versjon til versjon, dersom det blir flere faner i mf_form listen ### Endringer i includes/entry-functions.php og export_entries.php Når en trykker på typisk: * https://skjemaker16.app.uib.no/manage_entries.php?id=7381589 Så får en følgende feilmelding: ``` Cardinality violation: 1242 Subquery returns more than 1 row ``` Dette løses ved at linje: ``` C.option_id=A.option_id ``` erstattes med ``` C.option_id=A.option_id LIMIT 1 ``` Dette er rapportert til Appnitro, men ser ikke ut som koden deres blir oppdatert. En kan teste på nylig oppgradert Skjemaker med url'en over mot id 7381589, og kommer 1242 feilmeldingen, så må koden oppdateres med LIMIT 1 linjene det gjelder. Det er flere steder dette må gjøres, sjekk git log i htdocs/ katalogen. En kan også søke etter hvilke filer det gjelder med: ``` find /var/www/app/skjemaker/htdocs -maxdepth 3 -type f -name '*.php' | xargs grep 'C.option_id=A.option_id' ``` Og deretter oppdatere filene med: ``` sed -i 's/C.option_id=A.option_id/C.option_id=A.option_id LIMIT 1/g' grid_datasource.php ``` ``` sed -i 's/C.option_id=A.option_id/C.option_id=A.option_id LIMIT 1/g' includes/entry-functions.php ``` ``` sed -i 's/C.option_id=A.option_id/C.option_id=A.option_id LIMIT 1/g' export_entries.php ``` Se også: * * https://itgit.app.uib.no/it/dpv/daf/pub/skjemaker/-/commits/main ## Tidligere egenutviklet kode ved UiB I tillegg til PHP koden fra Appnitro (som kalles Machform), så hadde vi også tidligere lagt til en del egenutviklet kode her ved UiB. Se under. I all hovedsak er denne koden nå utgått unntatt mindre endringer i css. Se detaljer over. * Branding/uib-styling (Are, Cato) * Hardkodet at bare admin kan velge/lage themes (Cato) * Modifisert login-siden, inklusiv javascript-kode (Dishanker) * Bruk av UibFetcher (sikring av passord m.m.) (Cato) * Deltakerliste (for å vise hvem som er påmeldt på web) (Cato) * Gi andre admin-tilgang til dine skjema (Sharil, Cato) * Bugfix: edit_report insert i permission-table (Cato) * Modifisert php mail-funksjonen (-fno-reply@skjemaker.app.uib.no) (Helge, Cato) * Fjernet visning av Payment-opsjonen (Cato) * Satt X-UA-Compatible til content="IE=edge" for å få det til å virker i IE (Cato) * Alternativ pålogging: Dataporten (Jørgen) * Fjernet "Remember me" funksjonalitet ved pålogging (Cato) Koden trackes i vår Git: <s>* https://git.uib.no/cgit/site/skjemaker.app.uib.no.git/</s> Denne er nedlagt. Videreført her: * https://git.app.uib.no/it/site/skjemaker.app.uib.no/-/commits/master/?ref_type=HEADS Vi pleier å ha 2 releaser i året, en på våren og en på høsten. Avhengig av når Appnitro gir ut nye releaser. ## Bash script for å gi tilganger Det ligger et bash script på p1skjemaker03 som skriver direkte til MariaDB databasen skjemaker:ap_permissions. Brukerne kan bestille tilganger via dette skjemaet: * http://skjemaker.app.uib.no/tilgang Her er slik scriptet er per dags dato nå (noe utdatert): ```bash #!/bin/bash # Se http://link.uib.no/skjemakertilgang # En må verifisere at innmelder faktisk er eier av skjemaet # Hent ut navnene til de andre som også har tilgang til skjemaet og legge dette ved epostkvitteringen. export EMAIL="AutoEmail Do-not-reply<no-reply@it.uib.no>" echo "export EMAIL=\"AutoEmail Do-not-reply<no-reply@it.uib.no>\"" if [| -z $2 || -z $3 ](ui)(color])( -z $1 ); then ``` echo "Usage: ./givepersmissions.sh formid useremail owneremail" ``` ``` echo "Eksample: ./givepermissions.sh 9195409 helge.opedal@uib.no chernet.dotche@uib.no" ``` ``` STATUS=0 ``` ``` exit 1; ``` fi FORMID=$1 USEREMAIL=$2 OWNEREMAIL=$3 OWNERID=$(mysql skjemaker <<<"SELECT user_id FROM ap_users WHERE user_email LIKE '$OWNEREMAIL'") OWNERID=$(echo $OWNERID | awk {'print $2'}) # Eiers navn OWNERNAME=$(mysql skjemaker -e "SELECT ap_users.user_fullname FROM ap_users WHERE ap_users.user_id = '$OWNERID'") OWNERNAME=$(echo $OWNERNAME | sed 's/^user_fullname //g') # Er owneremail eier til skjemaet? EREIER=$(mysql skjemaker <<<"SELECT COUNT(*) FROM ap_permissions WHERE form_id like '$FORMID' and user_id like '$OWNERID' and edit_form like '1'") EREIER=$(echo $EREIER | awk {'print $2'}) # Hva heter skjemaet? NAVNSKJEMA=$(mysql skjemaker -e "SELECT form_name FROM ap_forms WHERE ap_forms.form_id = '$FORMID'") NAVNSKJEMA=$(echo $NAVNSKJEMA | sed 's/^form_name //g') if [ $EREIER -eq 1 ]; then ``` USERID=$(mysql skjemaker <<<"SELECT user_id FROM ap_users WHERE user_email LIKE '$USEREMAIL'") ``` ``` USERID=$(echo $USERID | awk {'print $2'}) ``` ``` echo "Innmelder $OWNEREMAIL ($OWNERID) eier skjemaet. Ok, tilgang gis til $USEREMAIL ($USERID) til skjema $FORMID" ``` ``` # Hvem andre har tilgang til skjemaet? ``` ``` ANDRE=$(mysql skjemaker -e "SELECT ap_users.user_email FROM ap_users,ap_permissions WHERE ap_permissions.form_id = '$FORMID' and ap_permissions.user_id = ap_users.user_id") ``` ``` ANDRE=$(echo $ANDRE | sed 's/^user_email //g') ``` ``` export EMAIL="AutoEmail Do-not-reply<no-reply@it.uib.no>" ``` ``` su -c "echo -e ' ``` Hei $OWNERNAME, Tilgang til skjema https://skjemaker.app.uib.no/view.php?id=$FORMID er nå gitt til $USEREMAIL. Skjemaets navn er: $NAVNSKJEMA De som har tilgang til dette skjemaet er nå: $ANDRE. Les mer informasjon om tjenesten her: https://it.uib.no/Skjemaker Hilsen IT avdelingen' | mutt -s 'Tilgang gitt' $OWNEREMAIL" mihho ``` mysql skjemaker <<<"INSERT INTO ap_permissions VALUES ('$FORMID', '$USERID', '1', '1', '1', '1' )" ``` fi ``` ## Hva var på gang i 2020? Per dags dato (2020-01-08) så jobber en med å få oppgradert Skjemaker til versjon 12. Det er krav til ny PHP versjon, så ny boks [installert, og machform12 Vanilla er etablert på denne: * https://skjemaker.testapp.uib.no <s>Parallelt så forsøker en å merge UiB koden fra dagens Prod (machform7 med UiB utviklet kode) sammen med Machform12 kode. Dette vil også bli etablert på p1skjemaker01.</s> Vi går bort fra UiB kode og etablerer Skjemaker på Vanilla Machform kode. ### Stier på p1skjemaker01 Machform12 vanilla versjon: * /var/www/app/machform12 Skjemaker12 git cherry-pick versjon (under arbeid, ikke klar): * /var/www/app/skjemaker12-cherry-pick-version Hvilken versjon til enhver tid er tilgjengelig på nett under https://skjemaker.testapp.uib.no gjøres ved å symlinke: * /var/www/app/skjemaker til en av katalogene over. ## Status per dags dato november 2020 I dag er det over 17000 skjemaer i løsningen 3900 registrerte brukere (administratorer (eiere av skjemaer) som kan oppdatere selve skjemaet, legge til felter osv). Skjemaker har vært i drift siden 2013 (2012?). ## Statistikk * http://sokrates.uib.no/skjemakerstat/ * Se også https://stats.uib.no (innlogging påkrevd) ## Hva er Machform Machform er en skjema-generator for web. Denne er skrevet i PHP og bruker enten Mysql eller MariaDB database. IT avdelingen har kjøpt programmet og tilpasset denne til flerbruk. (Ldap innlogging) Lisensdetaljer: ``` Customer ID APP121004-6579-47152 Name Magne Bergland License Type MachForm Unlimited ``` <s>U9DF-7375-1D9F-BF07-6633 (I versjon 4.6 så skal en også finne lisensnøkkelen i tabellen: ap_settings, i kolonnen: licence_key) </s> Navnet på tjenesten ble "Skjemaker" etter en intern spørreundersøkelse. Det var enighet om at ordet "Machform" burde unngås i selve tjeneste-navnet og i url'en som skulle benyttes. Alle ansatte og studenter ved UiB har tilgang til tjenesten. (Burde vi vurdere å etablere tjenesten for UH-sektoren via Feide-pålogging? Det ble gjort, og Feide ble etablert, likevel ble dette lite prioritert, og det var ingen fra UH som brukte tjenesten. Derfor er dette nå avviklet og en er tilbake til standard ldap innloggingsfunksjon som kommer med Machform.) * De som har utviklet Machform er: http://www.appnitro.com/ * Detaljer: http://www.appnitro.com/machform/purchase * ConfigDB: https://bs.uib.no/?module=cmdb&action=viewl&cert_id=49 ## Om tjenesten Skjemaker * Tjenesten er tilgjengelig via URL: https://skjemaker.app.uib.no/ * Se også: [Skjemaker](er)(p1skjemaker01](p1skjemaker01))(Skjemaker) ## Beskyttelse mot spam Skjemaker har aktivert reCAPTCHA som gjør at brukeren må skrive inn en tekst basert på tolkning av et bilde. Nøkler legges i filen config.php. I og med at nøkkelen skal holdes utenfor git, så ligger selve verdien i filen auth.txt. ## API mot Issue Tracker (er utgått) Skjemaker sender ikke lenger data til IssueTracker. Derimot kan det settes opp imap-kontoer som Skjemaker kan sende epost til, hvor de igjen blir lastet inn i TopDesk (hjelp.uib.no). Ved å sette riktig Reply-to og From i epost headerne i eposten fra Skjemaker, så blir dette tolket av TopDesk, og riktig avsender blir satt i TopDesk saken. <s>I sammenheng med at skjemaer i Skjemaker (Machform skjema) blir benyttet til blant annet bestillinger av wiki'er, så er det laget en api for Skjemaker hvor data som skrives inn i et skjemaker-skjema blir postet via POST til BS. * Verdier som defineres er: * opened_by * default_opened_by * summary * problem * gid * product 'opened_by' må knyttes til det feltet som en definerer i skjemaet hvor brukeren skriver inn sitt brukernavn. I og med at brukerne kan finne på å skrive feil brukernavn, bør en sette en 'default_opened_by' til f.eks ditt eget brukernavn, slik at en kan fange opp feilregistreringer. 'Summary' kan være hva som helst, f.eks en hjelpetekst og hva som bestilles (som også kan være et felt i skjemaker-skjemaet). 'Problem' er selve hovedteksten, den vil normalt sett være satt til: <nowiki>{entry_data}</nowiki> som er alle feltene i skjemaet. 'gid' er gruppe id for den gruppen i issue tracker POST data skal sendes til. Eksempelvis er nummer 110: "App, alle saker" gruppen (om en ønsker å teste, så er det greit, men gi oss beskjed) Se følgende sak for detaljer: 'product' er hvilken problemtype vi snakker om, hvor 41 er eksempelvis 41. Liste over hvilke product-verdier en kan velge mellom er: ``` ``` 25 | Access ``` ``` 42 | Directory Services ``` ``` 26 | E-mail ``` ``` 27 | General ``` ``` 28 | Hardware ``` ``` 29 | Hardware installation ``` ``` 30 | Hardware new order ``` ``` 31 | Network ``` ``` 32 | PDA/Cellphone ``` ``` 33 | Phone ``` ``` 43 | Portal ``` ``` 34 | Printer ``` ``` 44 | Rejected/Forwarded ``` ``` 35 | Restore/Storage ``` ``` 36 | Software ``` ``` 37 | Software installation ``` ``` 39 | Software manual distro ``` ``` 38 | Software new order ``` ``` 46 | Tech error ``` ``` 40 | User error ``` ``` 41 | Web ``` ``` 68 | Windows7 ``` ``` I tillegg må en legge til en X-API-WIKI-BS nøkkel med gitt verdi i http headeren, som fungerer som en valideringsnøkkel. Url'en som en skal bruke er: * https://bs.uib.no/skjemaker.php De som er interessert kan ta kontakt med Helge. Bildet viser hvordan innstillingene kan settes i et Skjemaker skjema for å sende data til BS via api: [Eksempel på et skjema som sender data til Issue Trackerens API * https://it.uib.no/Wikihost_bestilling Skjemaet er aktivt og bestillinger sendes direkte til App-alle-saker.</s> ## Installasjon * hent kode fra Machform. Koden får en ved å bestille lisens fra: https://sites.fastspring.com/appnitro/instant/machform_unlimited (versjon 16: [Fil:Machform16.zip](###)(300px](File:skjemaker_post_til_bs_api.jpg))(Fil:Machform16.zip)) * Kan også lastes ned herfra: https://sites.fastspring.com/appnitro/order/dl/APP211013-6068-63118F * pakk ut * lag mysql database med bruker * kjør installasjons script * etabler dns navn <s>* legg til phplib, UiB himaspøta php script, blant annet ldap brukervalidering og db-passord fetcher kode, for økt sikkerhet: ** https://git.uib.no/cgit/lib/php.uib.git/</s> ### Lisensnøkler ``` Machform version 16: UF6E-63BD-F507-3AFF-278B ``` ``` Bestillingsnummer for Machform 16: APP211013-6068-88108 ``` #### Eldre versjoner ``` MachForm version 7: U5EA-B4E4-CBA7-C1D1-E133 ``` ## Dataporten (er utgått) Vanilla Machform kode fra Appnitro støtter ikke OAuth. Validering skjer via vanlig LDAP. <s>Aktiveres ved å logge inn med en admin bruker, velge Settings og Enable OAuth 2 Authentication for Users Se: https://rts.uib.no/issues/6810 Ved ny installasjon/redeploy må man: # Kjøre 'composer update' i '/var/www/app/skjemaker/htdocs/lib/PHPoAuthLib' for å generere 'vender'-katalogen. # Utføre nødvendige database-endringer. Se: https://git.uib.no/cgit/site/skjemaker.app.uib.no.git/tree/migrations/add_oauth_enable_column_to_ap_settings.sql</s> ## Skjemaker server-oppsett, konfigurasjon, oppdateringsrutiner og annet drifts-relatert ## Skjemaker-utvikling (er utgått) _Hvilke rutiner som gjelder ved utvikling, integrasjon og tilpasning av Machform._ Vi utvikler ikke lenger i Skjemaker. Vi forholder oss til koden slik den er fra Appnitro. <s>En kan bruke LONG7 til å utvikle. Her ligger skjemaker koden under /var/www/app/skjemaker. Koden trackes vha git. Det er vel heller ingenting i veien for at en kan sjekke ut koden selv på sin egen maskin direkte fra: * https://git.uib.no/cgit/site/skjemaker.app.uib.no.git/ og videreutvikle på sin egen maskin. For tilganger til LONG7, Git osv, ta kontakt med enten [Jørgen, Mike, Jan eller Kristian.</s> ## Brukerdokumentasjon Det er oppretta et dokument for veiledning i bruk av Skjemaker på IT-hjelp. * https://it.uib.no/Skjemaker ## Skjemaker og Wikihost ### Embedde Skjemaker skjemaer i en wiki artikkel Dette er mulig. Det forutsetter at en aktiverer extensionen HTMLet. Deretter må en opprette en html fil (f.eks foobar.html) under katalogen: * wiki(.app|.)uib.no:/var/www/mediawiki-latest/htmlets/ koden i filen foobar.html blir da hentet inn i artikkelen. En kaller på filen ved å bruke taggene: <nowiki><htmlet>foobar</htmlet></nowiki> Eksempel: * https://it.uib.no/Wikihost_bestilling hvor selve skjemaet egentlig befinner seg på: * https://skjemaker.app.uib.no/view.php?id=226 ## Annen informasjon Appnitro svarer på spørsmål: [Filpeikar:Machform_xss_sql-injection.pdf](Lennart,)(Helge](Helge),)(Filpeikar:Machform_xss_sql-injection.pdf) ## Feil og problemer ### Bruker har slått på to-faktor og greier nå ikke å logge inn Løsningen er da å slå av to-faktor igjen. Men pga en bug i Skjemaker, så får en det ikke til via webgrensesnittet. En må altså gjøre det direkte i databasen. Gjøres på følgende måte: ``` ssh brukernavn@char7 ``` ``` mysql -e "use skjemaker; select user_id from ap_users where user_email like 'fornavn.etternavn@uib.no';" ``` ``` mysql -e "use skjemaker; update ap_users set tsv_enable='0' where user_id like 'NNNN'; flush privileges;" ``` hvor NNNN er brukerens user_id i Skjemaker ap_users tabellen. ### Det tar flere minutter å hente ut data entries fra et skjema En løsning kan være å legge til indekser til ap_element_options tabellen. Disse har blitt lagt til og ser ut til å ha løst problemet. ``` option_id BTREE No No option_id 1005 A No ``` ``` form_id BTREE No No form_id 8724 A No ``` ``` element_id BTREE No No element_id 252 A No ``` ### Bruker har slettet skjema ved feil Alle skjemaker skjema kan hentes fram igjen. Det gjøres ved å sette 1 i feltet: form_active. I tillegg må en legge brukerens brukernavn til skjemaet igjen under permissions. Se også sakene: * * ### Bruker har slettet entries ved feil Det skal være mulig å hente fram igjen. En må finne tabellen det gjelder i MariaDB (https://skjemaker.app.uib.no/phpMyAdmin) og så finne feltet som definerer hvorvidt recorden er slettet eller ikke. Et annet alternativ er å hente tilbake en db-dump og restore dette til en temporær "Skjemaker" slik at brukeren selv kan hente dataene. ### Epost utsendelse feiler ved sletting av epostfelt En kan få følgende feilmelding dersom en sletter et epost felt i Skjemaker: ``` "Fatal error: Uncaught exception 'Swift_RfcComplianceException' with message 'Address in mailbox given [not comply with RFC 2822, 3.6.2.' in /var/www/app/skjemaker/htdocs/lib/swift-mailer/classes/Swift/Mime/Headers/MailboxHeader.php:352 Stack trace: 0 /var/www/app/skjemaker/htdocs/lib/swift-mailer/classes/Swift/Mime/Headers/MailboxHeader.php(264): ``` Swift_Mime_Headers_MailboxHeader->_assertValidAddress('{element_5}') 1 /var/www/app/skjemaker/htdocs/lib/swift-mailer/classes/Swift/Mime/Headers/MailboxHeader.php(108): ``` ``` Swift_Mime_Headers_MailboxHeader->normalizeMailboxes(Array) 2 /var/www/app/skjemaker/htdocs/lib/swift-mailer/classes/Swift/Mime/Headers/MailboxHeader.php(65): ``` Swift_Mime_Headers_MailboxHeader->setNameAddresses(Array) 3 /var/www/app/skjemaker/htdocs/lib/swift-mailer/classes/Swift/Mime/SimpleHeaderFactory.php(60): Swift_Mime_Headers_MailboxHeader->setFieldBodyModel(Array) 4 /var/www/app/skjemaker/htdocs/lib/swift-mailer/classes/Swift/Mime/SimpleHeaderSet.php(70): Swift_Mime_SimpleHeaderFactory in /var/www/app/skjemaker/htdocs/lib/swift-mailer/classes/Swift/Mime/Headers/MailboxHeader.php on line 352 " ``` Dette er forklart i detaljer her: * Detaljene er også beskrevet til Appnitro: * http://www.appnitro.com/forums/topic/fatal-error-uncaught-exception-swift_rfccomplianceexception-2?replies=1#post-25151 * http://www.appnitro.com/forums/topic/fatal-error-uncaught-exception-swift_rfccomplianceexception?replies=10#post-25150 ## RSS feed til topic'en hos Appnitro * <rss>http://www.appnitro.com/forums/rss/topic/3921</rss> ### Utdatert informasjon Skjemaker oppgraderes til versjon 4, planlagt 14. juli 2014. Se detaljer i endringslogg: * https://bs.uib.no/?module=change&action=view&tid=6459 ### Før 14. juli 2014 * Prod Server: REAL * Utviklings Server: LONG * Databaseserver: CHAR ### Etter 14. juli 2014 * Prod Server: REAL6 * Utviklingsserver: LONG6 * Databaseserver: CHAR Vi må få etablert et nytt regime for Mysql databasedrift. Char er en gammel RHEL5 boks, og vi ønsker å komme oss over på CHAR6 som har nyere Mysql versjon. I denne løypen må vi også vurdere: * Mysql server/slave replikering (for enklere database dump backup, i dag låses hele databasen når dump foretas, noe som kan ta 20 minutter og mer.) * MariaDB kontra Mysql? * Overvåkning av Mysql databaser: backup, oppetid osv. ### Plan for oppgraderingen Skjemaker versjon 4 mandag 14. juli 2014 Foreløpig plan for oppgraderingen: FORBEREDELSE: * lese denne først: http://www.appnitro.com/upgrading-machform-v3 * tilrettelegge Machform (migrert med UiB php kode) versjon 4.2 på REAL6 under /var/www/app/skjemaker vha git * branche koden til en branch med navn "prod" på REAL6 PRODUKSJON (mandag 14. april) * stenge/stoppe Skjemaker tjenesten (apache vhost deny/allow, på REAL::/var/www/applications/skjemaker/conf/http(s).conf) * kjøre mysql-dump script på CHAR, samt verifisere at dumpen er ok. * åpne opp kun for 9'er nett for Skjemaker vhost på REAL6 * endre på tjinfo.uib.no/dyndns slik at skjemaker.app.uib.no -> REAL6 * verifisere DNS endringen (ping skjemaker.app.uib.no) * kopiere (synce) katalogene 'data' og 'hooks' fra REAL til REAL6 under skjemaker katalogen. * kjøre upgrade.php på REAL6 (https://skjemaker.app.uib.no/upgrade.php) * teste, teste * lage evt. redirect/rewrite rule i apache på Real slik at klienter som fortsatt ikke har fått DNS oppdatert, blir redirigert til REAL6 (om mulig). * vurdere om vi skal også etablere https://skjemaker.uib.no ?? (som redirigerer til skjemaker.app.uib.no) (diskuteres, kan gjøres senere) * oppdatere ConfigDB med informasjon om bokser osv. ### Gamle nyheter Versjon 4.8 er oppgradert 23. juni2016. Nytt er altså [MariaDB](does)({element_5}])(MariaDB) og nyere versjon av PHP (5.4). Release: * https://rts.uib.no/versions/1490 [Category:Skjemaker](Category:Skjemaker)
Save
Cancel
Wiki
2026-01-12 12:08:33
Wikihost Wikihost er en tjenste hvor ansatte og studenter kan få en Mediawiki instans. Mediawiki er skrevet i PHP og har Postgresql databaser.
Save
Cancel