Kapitel 4. Autentisering och åtkomstkontroll

Innehållsförteckning

4.1. Normal Unix-autentisering
4.2. Hantering av konto- och lösenordsinformation
4.3. Bra lösenord
4.4. Skapa krypterat lösenord
4.5. PAM och NSS
4.5.1. Konfigurationsfiler som nås av PAM och NSS
4.5.2. Den moderna centraliserade systemhanteringen
4.5.3. "Varför GNU su inte stöder hjulgruppen"
4.5.4. Strängare regler för lösenord
4.6. Säkerhet vid autentisering
4.6.1. Säkert lösenord på Internet
4.6.2. Secure Shell
4.6.3. Extra säkerhetsåtgärder för Internet
4.6.4. Säkra lösenordet för root
4.7. Andra åtkomstkontroller
4.7.1. Listor för åtkomstkontroll (ACL)
4.7.2. sudo
4.7.3. PolicyKit
4.7.4. Begränsning av åtkomst till vissa servertjänster
4.7.5. Säkerhetsfunktioner i Linux

När en person (eller ett program) begär åtkomst till systemet bekräftas identiteten genom autentisering som en betrodd identitet.

[Varning] Varning

Konfigurationsfel i PAM kan leda till att du blir utestängd från ditt eget system. Du måste ha en räddnings-CD till hands eller konfigurera en alternativ startpartition. För att återhämta dig, starta systemet med dem och korrigera saker därifrån.

Normal Unix-autentisering tillhandahålls av modulen pam_unix(8) under PAM (Pluggable Authentication Modules). Dess 3 viktiga konfigurationsfiler, med ":"-separerade poster, är följande.


"/etc/passwd" innehåller följande.

 ...
user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
 ...

Som förklaras i passwd(5) betyder varje ":"-separerad post i den här filen följande.

  • Inloggningsnamn

  • Inmatning av lösenordsspecifikation

  • Numeriskt användar-ID

  • Numeriskt grupp-ID

  • Användarnamn eller kommentarsfält

  • Användarens hemkatalog

  • Valfri tolk för användarkommandon

Den andra posten i "/etc/passwd" användes för den krypterade lösenordsposten. Efter införandet av "/etc/shadow" används den här posten för lösenordsspecifikationen.


"/etc/shadow" innehåller följande.

 ...
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
 ...

Som förklaras i shadow(5) betyder varje ":"-separerad post i denna fil följande.

  • Inloggningsnamn

  • Krypterat lösenord (Det inledande "$1$" anger att MD5-kryptering används. "*" indikerar ingen inloggning)

  • Datum för senaste lösenordsbytet, uttryckt som antal dagar sedan 1 januari 1970

  • Antal dagar som användaren måste vänta innan hon kan ändra sitt lösenord igen

  • Antal dagar efter vilka användaren måste ändra sitt lösenord

  • Antal dagar innan ett lösenord upphör att gälla under vilka användaren ska varnas

  • Antal dagar efter att ett lösenord har löpt ut under vilka lösenordet fortfarande ska accepteras

  • Datum då kontot upphör att gälla, uttryckt i antal dagar sedan den 1 januari 1970

"/etc/group" innehåller följande.

group1:x:20:user1,user2

Som förklaras i group(5) betyder varje ":"-separerad post i denna fil följande.

  • Gruppnamn

  • Krypterat lösenord (används egentligen inte)

  • Numeriskt grupp-ID

  • "," Separerad lista med användarnamn

[Notera] Notera

"/etc/gshadow" har samma funktion som "/etc/shadow" för "/etc/group", men används egentligen inte.

[Notera] Notera

Det faktiska gruppmedlemskapet för en användare kan läggas till dynamiskt om raden "auth optional pam_group.so" läggs till i "/etc/pam.d/common-auth" och anges i "/etc/security/group.conf". Se pam_group(8).

[Notera] Notera

Paketet base-passwd innehåller en auktoritativ lista över användare och grupper: "/usr/share/doc/base-passwd/users-and-groups.html".

Här är några viktiga kommandon för att hantera kontoinformation.


Du kan behöva ha root-behörighet för att vissa funktioner ska fungera. Se crypt(3) för kryptering av lösenord och data.

[Notera] Notera

På systemet som konfigurerats med PAM och NSS som Debians salsamaskin, kanske innehållet i de lokala "/etc/passwd", "/etc/group" och "/etc/shadow" inte används aktivt av systemet. Ovanstående kommandon är giltiga även i en sådan miljö.

När du skapar ett konto under systeminstallationen eller med kommandot passwd(1) bör du välja ett bra lösenord som består av minst 6 till 8 tecken, inklusive ett eller flera tecken från var och en av följande uppsättningar enligt passwd(1).

  • Små bokstäver i alfabetet

  • Siffror 0 till 9

  • Skiljetecken

[Varning] Varning

Välj inte ord som går att gissa sig till som lösenord. Kontonamn, personnummer, telefonnummer, adress, födelsedag, namn på familjemedlemmar eller husdjur, ordboksord, enkla sekvenser av tecken som "12345" eller "qwerty", ... är alla dåliga val för lösenordet.

Det finns oberoende verktyg för att generera krypterade lösenord med salt.


Moderna Unix-liknande system som Debian-systemet tillhandahåller PAM (Pluggable Authentication Modules) och NSS (Name Service Switch) för att den lokala systemadministratören ska kunna konfigurera sitt system. Dessa mekanismers roll kan sammanfattas på följande sätt.

  • PAM erbjuder en flexibel autentiseringsmekanism som används av applikationsprogramvaran, vilket innebär utbyte av lösenordsdata.

  • NSS erbjuder en flexibel namntjänstmekanism som ofta används av standardbiblioteket C för att få fram användar- och gruppnamn för program som ls(1) och id(1).

Dessa PAM- och NSS-system måste konfigureras på ett konsekvent sätt.

De viktigaste paketen i PAM- och NSS-systemen är följande.


  • "The Linux-PAM System Administrators' Guide" i libpam-doc är nödvändig för att lära sig PAM-konfigurationen.

  • avsnittet "System Databases and Name Service Switch" i glibc-doc-reference är viktigt för att lära sig NSS-konfigurationen.

[Notera] Notera

Du kan se en mer omfattande och aktuell lista med kommandot "aptitude search 'libpam-|libnss-'". Akronymen NSS kan också betyda "Network Security Service", vilket inte är samma sak som "Name Service Switch".

[Notera] Notera

PAM är det mest grundläggande sättet att initiera miljövariabler för varje program med det systemomfattande standardvärdet.

Under systemd installeras paketet libpam-systemd för att hantera användarinloggningar genom att registrera användarsessioner i systemd-kontrollgruppshierarkin för logind. Se systemd-logind(8), logind.conf(5) och pam_systemd(8).

Här är några viktiga konfigurationsfiler som PAM och NSS har åtkomst till.


Begränsningen av lösenordsvalet implementeras av PAM-modulerna, pam_unix(8) och pam_cracklib(8). De kan konfigureras med hjälp av sina argument.

[Tips] Tips

PAM-moduler använder suffixet ".so" för sina filnamn.

Den moderna centraliserade systemhanteringen kan distribueras med hjälp av den centraliserade LDAP-servern (Lightweight Directory Access Protocol) för att administrera många Unix-liknande och icke-Unix-liknande system i nätverket. Open source-implementeringen av Lightweight Directory Access Protocol är OpenLDAP Software.

LDAP-servern tillhandahåller kontoinformationen genom användning av PAM och NSS med paketen libpam-ldapd och libnss-ldapd för Debian-systemet. Flera åtgärder krävs för att aktivera detta (jag har inte använt den här installationen och följande är enbart sekundär information. Vänligen läs detta i detta sammanhang).

  • Du konfigurerar en centraliserad LDAP-server genom att köra ett program, t.ex. den fristående LDAP-daemon, slapd(8).

  • Du ändrar PAM-konfigurationsfilerna i katalogen "/etc/pam.d/" så att de använder "pam_ldap.so" i stället för standardinställningen "pam_unix.so".

  • Du ändrar NSS-konfigurationen i filen "/etc/nsswitch.conf" så att "ldap" används i stället för standard ("compat" eller "file").

  • Du måste se till att libpam-ldapd använder SSL-anslutning (eller TLS) för att skydda lösenordet.

  • Du kan få libnss-ldapd att använda SSL-anslutning (eller TLS) för att säkerställa dataintegritet på bekostnad av LDAP-nätverkets overhead.

  • Du bör köra nscd(8) lokalt för att cachelagra alla LDAP-sökresultat för att minska LDAP-nätverkstrafiken.

Se dokumentationen i nsswitch.conf(5), pam.conf(5), ldap.conf(5) och ”/usr/share/doc/libpam-doc/html/” som tillhandahålls av paketet libpam-doc och ”info libc ’Name Service Switch’” som tillhandahålls av paketet glibc-doc.

På samma sätt kan du sätta upp alternativa centraliserade system med andra metoder.

[Notera] Notera

Informationen här kanske inte är tillräcklig för dina säkerhetsbehov, men den bör vara en bra början.

Programmet Secure Shell (SSH) tillhandahåller säker krypterad kommunikation mellan två icke betrodda värdar över ett osäkert nätverk med säker autentisering. Det består av OpenSSH-klienten, ssh(1), och OpenSSH-daemon, sshd(8). Denna SSH kan användas för att tunnla en osäker protokollkommunikation som POP och X säkert över Internet med funktionen port forwarding.

Klienten försöker autentisera sig med hjälp av värdbaserad autentisering, autentisering med offentlig nyckel, autentisering med utmaningssvar eller lösenordsautentisering. Användningen av autentisering med publik nyckel möjliggör fjärrinloggning utan lösenord. Se Avsnitt 6.3, ”Server och verktyg för fjärråtkomst (SSH)”.

Om du vill förhindra att personer får åtkomst till din maskin med root-behörighet måste du vidta följande åtgärder.

  • Förhindra fysisk åtkomst till hårddisken

  • Lås UEFI/BIOS och förhindra uppstart från flyttbara media

  • Ange lösenord för GRUB:s interaktiva session

  • Lås GRUB-menyn från redigering

Med fysisk tillgång till hårddisken är det relativt enkelt att återställa lösenordet med följande steg.

  1. Flytta hårddisken till en PC med CD-bootbar UEFI/BIOS.

  2. Starta upp systemet med ett räddningsmedium (Debian-startdiskett, Knoppix-CD, GRUB-CD, ...).

  3. Montera rotpartitionen med läs- och skrivåtkomst.

  4. Redigera "/etc/passwd" i rotpartitionen och gör den andra posten för rotkontot tom.

Om du har redigeringsåtkomst till GRUB-menyalternativet (se Avsnitt 3.1.2, ”Steg 2: startladdaren”) för grub-rescue-pc vid start, är det ännu enklare med följande steg.

  1. Starta systemet med kärnparametern ändrad till något i stil med "root=/dev/hda6 rw init=/bin/sh".

  2. Redigera "/etc/passwd" och töm den andra posten för root-kontot.

  3. Starta om systemet.

Systemets root-skal är nu åtkomligt utan lösenord.

[Notera] Notera

När man har root shell-åtkomst kan man komma åt allt på systemet och återställa alla lösenord på systemet. Dessutom kan han kompromissa med lösenordet för alla användarkonton med hjälp av verktyg för att knäcka lösenord med brutal kraft, t.ex. john och crack-paket (se Avsnitt 9.5.11, ”Kontroll av systemsäkerhet och -integritet”). Detta knäckta lösenord kan leda till att andra system äventyras.

Den enda rimliga mjukvarulösningen för att undvika alla dessa problem är att använda en mjukvarukrypterad rotpartition (eller "/etc"-partition) med hjälp av dm-crypt och initramfs (se Avsnitt 9.9, ”Tips om datakryptering”). Du behöver dock alltid ett lösenord för att starta systemet.

Det finns andra åtkomstkontroller till systemet än den lösenordsbaserade autentiseringen och filbehörigheterna.

ACL:er är en överuppsättning av de vanliga behörigheterna som förklaras i Avsnitt 1.2.3, ”Behörigheter i filsystemet”.

Du stöter på ACL:er i aktion i moderna skrivbordsmiljöer. När en formaterad USB-lagringsenhet är automatiskt monterad som t.ex. "/media/penguin/USBSTICK" kan en normal användare, pingvinen, köra:

 $ cd /media/penguin
 $ ls -la
total 16
drwxr-x---+ 1 root    root    16 Jan 17 22:55 .
drwxr-xr-x  1 root    root    28 Sep 17 19:03 ..
drwxr-xr-x  1 penguin penguin 18 Jan  6 07:05 USBSTICK

"+" i den 11:e kolumnen indikerar att ACL:er används. Utan ACL:er skulle en vanlig användare, pingvin, inte kunna lista sig på det här sättet eftersom pingvin inte är med i rotgruppen. Du kan se ACL:er som:

 $ getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:penguin:r-x
group::---
mask::r-x
other::---

Här:

  • "user::rwx", "group::---" och "other::---" motsvarar de vanliga ägar-, grupp- och andra behörigheterna.

  • ACL:n "user:penguin:r-x" ger den vanliga användaren penguin behörigheten "r-x". Detta gjorde det möjligt för "ls -la" att lista kataloginnehåll.

  • ACL:n "mask::r-x" anger den övre gränsen för behörigheter.

Se"POSIX Access Control Lists on Linux", acl(5), getfacl(1) och setfacl(1) för mer information.

sudo(8) är ett program som är utformat så att en sysadmin kan ge begränsade root-privilegier till användare och logga root-aktiviteter. sudo kräver endast ett vanligt användarlösenord. Installera sudo-paketet och aktivera det genom att ställa in alternativ i "/etc/sudoers". Se konfigurationsexempel i "/usr/share/doc/sudo/examples/sudoers" och Avsnitt 1.1.12, ”sudo konfiguration”.

Min användning av sudo för single user-systemet (se Avsnitt 1.1.12, ”sudo konfiguration”) syftar till att skydda mig mot min egen dumhet. Personligen anser jag att sudo är ett bättre alternativ än att använda systemet från root-kontot hela tiden. Följande ändrar till exempel ägaren till "någon_fil" till "mitt_namn".

$ sudo chown my_name some_file

Om du känner till root-lösenordet (vilket självinstallerade Debian-användare gör) kan du naturligtvis köra alla kommandon under root från vilket användarkonto som helst med "su -c".

PolicyKit är en operativsystemskomponent för kontroll av systemövergripande behörigheter i Unix-liknande operativsystem.

Nyare GUI-program är inte utformade för att köras som privilegierade processer. De kommunicerar med privilegierade processer via PolicyKit för att utföra administrativa åtgärder.

PolicyKit begränsar sådana åtgärder till användarkonton som tillhör sudo-gruppen på Debian-systemet.

Se polkit(8).

För systemets säkerhet är det en god idé att inaktivera så många serverprogram som möjligt. Detta är särskilt viktigt för nätverksservrar. Att ha oanvända servrar, aktiverade antingen direkt som daemon eller via super-serverprogram, anses vara en säkerhetsrisk.

Många program, t.ex. sshd(8), använder PAM-baserad åtkomstkontroll. Det finns många sätt att begränsa åtkomsten till vissa servertjänster.

Se Avsnitt 3.5, ”Systemhantering”, Avsnitt 4.5.1, ”Konfigurationsfiler som nås av PAM och NSS”, och Avsnitt 5.7, ”Netfilters infrastruktur”.

[Tips] Tips

Sun RPC-tjänster måste vara aktiva för NFS och andra RPC-baserade program.

[Tips] Tips

Om du har problem med fjärråtkomst i ett nyare Debian-system, kommentera bort felaktiga konfigurationer som ”ALL: PARANOID” i ”/etc/hosts.deny” om de finns. (Men du måste vara försiktig med säkerhetsriskerna som är förknippade med denna typ av åtgärd.)

Linuxkärnan har utvecklats och stöder säkerhetsfunktioner som inte finns i traditionella UNIX-implementationer.

Linux stöder utökade attribut som utökar de traditionella UNIX-attributen (se xattr(7)).

Linux delar upp de privilegier som traditionellt förknippas med superuser i olika enheter, så kallade capabilities(7), som kan aktiveras och inaktiveras oberoende av varandra. Capabilities är ett attribut per tråd sedan kärnversion 2.2.

Ramverket Linux Security Module (LSM) tillhandahåller en mekanism för olika säkerhetskontroller som kan kopplas till nya kärntillägg. Till exempel:

Eftersom dessa tillägg kan strama åt privilegiemodellen hårdare än den vanliga Unix-liknande säkerhetsmodellen, kan till och med root-behörigheten begränsas. Vi rekommenderar att du läser ramverksdokumentet för Linux Security Module (LSM) på kernel.org.

Linux namnrymder omsluter en global systemresurs med en abstraktion som gör att processerna inom namnrymden ser ut som om de har en egen isolerad instans av den globala resursen. Ändringar i den globala resursen är synliga för andra processer som är medlemmar i namnrymden, men osynliga för andra processer. Sedan kärnversion 5.6 finns det 8 typer av namnrymder (se namnrymder(7), unshare(1), nsenter(1)).

Från och med Debian 11 Bullseye (2021) använder Debian en enhetlig cgroup-hierarki (a.k.a. cgroups-v2).

Exempel på användning av namnrymder med cgrupper för att isolera sina processer och tillåta resurskontroll är:

Dessa funktioner kan inte realiseras av Avsnitt 4.1, ”Normal Unix-autentisering”. Dessa avancerade ämnen är oftast utanför ramen för detta introduktionsdokument.