Härdning av konfiguration
Observera
Gå igenom din labbapplikations svarshuvuden och felsidor. Mycket information läcker ofta utan att någon avsett det: versionsnummer på server och ramverk, fullständiga sökvägar, databasfel, stackspårningar, interna IP-adresser och testkonton som glömts kvar.
curl -I http://localhost:8080
Vad koden gör — förklaring rad för rad
Hämtar svarshuvudena från en tjänst som körs lokalt, för att se vad den berättar om sig själv.
- localhost
- Namnet för "den här maskinen". Anropet lämnar aldrig datorn.
- :8080
- Portnumret efter kolon. Här körs tjänsten på port 8080 i stället för den vanliga 80.
Analysera
Grundorsaken är nästan alltid att utvecklingsinställningar följt med till drift. Felsökningsläge som visar detaljerade fel är en fördel under utveckling och ett problem i produktion. Standardlösenord och exempelkonton följer med från installationen. Tjänster som ingen använder står kvar och lyssnar.
Bygg försvaret
1. Säkerhetshuvuden — en fullständig uppsättning för nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Content-Security-Policy "default-src 'self'; object-src 'none'; frame-ancestors 'none'" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
# Dölj versionsinformation
server_tokens off;
Vad koden gör — förklaring rad för rad
Den fullständiga uppsättningen säkerhetshuvuden för nginx. Varje rad stänger en egen liten lucka; tillsammans utgör de en baslinje.
- Strict-Transport-Security
- Tvingar HTTPS i fortsättningen (se Lab 1).
- Content-Security-Policy
- Begränsar vad webbläsaren får köra (se Lab 4).
- X-Content-Type-Options "nosniff"
- Hindrar webbläsaren från att gissa filtyp. Utan den kan en uppladdad bild tolkas som ett skript.
- Referrer-Policy
- Styr hur mycket av din adress som skickas vidare när en besökare klickar sig till en annan sajt.
- Permissions-Policy
- Stänger av webbläsarfunktioner sidan inte behöver — här plats, kamera och mikrofon.
- server_tokens off;
- Döljer serverns versionsnummer, som annars står i varje svar.
2. Stäng av felsökningsläge i produktion. I Django: DEBUG = False och en korrekt ifylld ALLOWED_HOSTS. I de flesta ramverk styrs detta av en miljövariabel — se till att produktionsmiljön faktiskt har rätt värde satt, och att det inte går att råka starta i fel läge.
3. Generiska felsidor utåt, detaljerade loggar inåt. Användaren ska se "Ett fel uppstod, referens ABC-123". Loggen ska innehålla hela stackspårningen kopplad till samma referens.
4. Inventera och minimera. Lista vilka tjänster som lyssnar och stäng av det som inte behövs:
ss -tulpn # vilka portar lyssnar, och vilken process
systemctl list-units --type=service --state=running
Vad koden gör — förklaring rad för rad
Två kommandon för att se vad som faktiskt körs på maskinen. Du kan inte stänga av det du inte vet finns.
- ss -tulpn
- Listar vilka portar som lyssnar och vilken process som äger dem. Bokstäverna är flaggor: t och u för de två vanliga protokollen, l för lyssnande, p för process, n för att visa nummer i stället för namn.
- systemctl list-units --type=service --state=running
- Listar alla tjänster som är igång just nu. Allt som inte behövs bör stängas av.
5. Byt alla standarduppgifter och ta bort exempel- och testkonton. Detta gäller även databaser, administrationsgränssnitt, utskriftsservrar och nätverksutrustning.
6. Patchhantering som rutin. Ha en bestämd kadens för uppdateringar och automatiserad beroendekontroll i byggkedjan (npm audit, pip-audit, Dependabot eller motsvarande).
Verifiera
# Kontrollera att huvudena levereras
curl -I https://exempel.se
# Kontrollera att felsidor inte läcker detaljer
curl https://exempel.se/finns-inte-12345
Vad koden gör — förklaring rad för rad
Två kontroller efter härdningen: att huvudena verkligen levereras, och att felsidor inte avslöjar för mycket.
- curl -I https://exempel.se
- Visa svarshuvudena och leta efter de rader du lagt till.
- curl https://exempel.se/finns-inte-12345
- Begär medvetet en sida som inte finns. Svaret ska vara kortfattat, inte en stackspårning med sökvägar och versionsnummer.
Dokumentera
Skapa en härdningschecklista som kan återanvändas vid varje driftsättning. En checklista som faktiskt används är mer värd än en omfattande policy som ingen läser.
Kunskapskontroll
Välj ett svar per fråga. Du får återkoppling direkt, och avsnittet markeras som klart när alla frågor är besvarade.
1Vad är risken med att lämna felsökningsläge (DEBUG) påslaget i produktion?
2Vad gör inställningen `server_tokens off;` i nginx?
3Hur bör ett serverfel presenteras?
Configuration hardening
Observe
Review your lab application's response headers and error pages. A great deal of information often leaks unintentionally: server and framework version numbers, full file paths, database errors, stack traces, internal IP addresses, and forgotten test accounts.
curl -I http://localhost:8080
What this code does — line by line
Fetches the response headers from a service running locally, to see what it says about itself.
- localhost
- The name for "this machine". The request never leaves the computer.
- :8080
- The port number after the colon. Here the service runs on port 8080 instead of the usual 80.
Analyze
The root cause is almost always development settings carried into production. Debug mode showing detailed errors is an asset during development and a liability in production. Default passwords and sample accounts arrive with the installation. Services nobody uses stay running and listening.
Build the defense
1. Security headers — a complete set for nginx:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Content-Security-Policy "default-src 'self'; object-src 'none'; frame-ancestors 'none'" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
# Hide version information
server_tokens off;
What this code does — line by line
The complete set of security headers for nginx. Each line closes its own small gap; together they form a baseline.
- Strict-Transport-Security
- Enforces HTTPS going forward (see Lab 1).
- Content-Security-Policy
- Restricts what the browser may run (see Lab 4).
- X-Content-Type-Options "nosniff"
- Stops the browser guessing file types. Without it, an uploaded image can be interpreted as a script.
- Referrer-Policy
- Governs how much of your address is passed along when a visitor clicks through to another site.
- Permissions-Policy
- Switches off browser features the page does not need — here location, camera and microphone.
- server_tokens off;
- Hides the server's version number, which otherwise appears in every response.
2. Disable debug mode in production. In Django: DEBUG = False and a properly populated ALLOWED_HOSTS. In most frameworks this is driven by an environment variable — make sure the production environment actually has the right value set, and that it is not possible to start in the wrong mode by accident.
3. Generic error pages outward, detailed logs inward. The user should see "An error occurred, reference ABC-123." The log should contain the full stack trace tied to that same reference.
4. Inventory and minimize. List what is listening and switch off what is not needed:
ss -tulpn # which ports are listening, and which process
systemctl list-units --type=service --state=running
What this code does — line by line
Two commands for seeing what is actually running on the machine. You cannot switch off what you do not know is there.
- ss -tulpn
- Lists which ports are listening and which process owns them. The letters are flags: t and u for the two common protocols, l for listening, p for process, n to show numbers rather than names.
- systemctl list-units --type=service --state=running
- Lists every service currently running. Anything not needed should be switched off.
5. Change all default credentials and remove sample and test accounts. This applies to databases, admin interfaces, print servers and network equipment too.
6. Patch management as routine. Set a defined cadence for updates and automate dependency checks in the build pipeline (npm audit, pip-audit, Dependabot or equivalent).
Verify
# Confirm the headers are delivered
curl -I https://example.com
# Confirm error pages do not leak detail
curl https://example.com/does-not-exist-12345
What this code does — line by line
Two checks after hardening: that the headers really are delivered, and that error pages do not reveal too much.
- curl -I https://example.com
- Show the response headers and look for the lines you added.
- curl https://example.com/does-not-exist-12345
- Deliberately request a page that does not exist. The answer should be brief, not a stack trace with paths and version numbers.
Document
Create a hardening checklist that can be reused at every deployment. A checklist that actually gets used is worth more than a comprehensive policy nobody reads.
Knowledge check
Pick one answer per question. You get feedback immediately, and the unit is marked complete once every question is answered.
1What is the risk of leaving debug mode (DEBUG) enabled in production?
2What does the `server_tokens off;` setting do in nginx?
3How should a server error be presented?