20TD02U_ForAlle_Blooms_Side_65_Database_MySQL - itnett/FTD02H-N GitHub Wiki

Grunnleggende sikkerhet relatert til MySQL er essensielt for å sikre databasen mot uautorisert tilgang, datainnbrudd, og andre sikkerhetstrusler. Vi vil dekke emnet "Grunnleggende sikkerhet i MySQL" ved hjelp av Blooms taksonomi, som vil ta deg fra grunnleggende forståelse til praktisk anvendelse. Denne tilnærmingen inkluderer logiske, programmatiske og praktiske eksempler på hvordan du kan sikre en MySQL-database.

Videregående Skole Nivå

1. Kunnskap (Remembering)

Emne: Grunnleggende Sikkerhetskonsepter i MySQL

  • Logisk tilnærming: Start med å lære om de grunnleggende sikkerhetskonseptene i MySQL, som brukere og tillatelser, sterke passord, og sikre tilkoblinger.
  • Programmatisk tilnærming: Utfør grunnleggende sikkerhetsoperasjoner som å opprette en ny bruker med begrensede tillatelser.
  • Praktisk tilnærming: Opprett en MySQL-bruker med bare nødvendige tillatelser og bruk et sterkt passord.
-- Opprett en ny bruker med begrensede rettigheter
CREATE USER 'begrenset_bruker'@'localhost' IDENTIFIED BY 'SterktPassord!123';
GRANT SELECT, INSERT ON bedrift.* TO 'begrenset_bruker'@'localhost';

2. Forståelse (Understanding)

Emne: Brukeradministrasjon og Tilgangskontroll

  • Logisk tilnærming: Forstå hvordan MySQL brukeradministrasjon fungerer, inkludert hvordan du gir og tilbakekaller tillatelser, og hvordan du bruker roller for å administrere tilgang.
  • Programmatisk tilnærming: Implementer og test forskjellige roller og tillatelser for brukere i MySQL.
  • Praktisk tilnærming: Opprett flere brukere med forskjellige tillatelser og test deres tilgangsnivåer.
-- Opprett en ny rolle og tilordne den til en bruker
CREATE ROLE 'data_analytiker';
GRANT SELECT ON bedrift.* TO 'data_analytiker';

-- Tilordne rollen til en bruker
GRANT 'data_analytiker' TO 'begrenset_bruker'@'localhost';

Høyskole Nivå

3. Anvendelse (Applying)

Emne: Sikring av Data i MySQL

  • Logisk tilnærming: Lær hvordan du bruker kryptering for å beskytte sensitive data i MySQL, inkludert både transportkryptering og kryptering av lagrede data.
  • Programmatisk tilnærming: Implementer kryptering på kolonnenivå og konfigurer SSL/TLS for sikre tilkoblinger til MySQL-serveren.
  • Praktisk tilnærming: Krypter sensitive data i en MySQL-tabell og konfigurer serveren til å kreve SSL/TLS for tilkoblinger.
-- Krypter en kolonne med sensitive data
CREATE TABLE kunder (
    kunde_id INT PRIMARY KEY,
    navn VARCHAR(50),
    personnummer VARBINARY(255)
);

-- Sett inn krypterte data
INSERT INTO kunder (kunde_id, navn, personnummer)
VALUES (1, 'Ola Nordmann', AES_ENCRYPT('12345678901', 'hemmelig_nøkkel'));

-- Hent og dekrypter data
SELECT navn, AES_DECRYPT(personnummer, 'hemmelig_nøkkel') AS personnummer FROM kunder;

4. Analyse (Analyzing)

Emne: Sikkerhetsovervåking og Logging

  • Logisk tilnærming: Forstå hvordan logging og overvåking fungerer i MySQL for å holde oversikt over sikkerhetshendelser og uautoriserte forsøk på tilgang.
  • Programmatisk tilnærming: Konfigurer MySQL for å logge sikkerhetshendelser som påloggingsforsøk og bruk av privilegier.
  • Praktisk tilnærming: Overvåk loggene for uvanlig aktivitet, som feil påloggingsforsøk eller endringer i brukerprivilegier.
-- Aktiver generell logging og slow query logging for sikkerhetsovervåking
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'TABLE';

-- Sjekk general_log for mistenkelig aktivitet
SELECT * FROM mysql.general_log WHERE user_host LIKE 'begrenset_bruker%';

Universitets Nivå

5. Syntese (Synthesizing)

Emne: Design av En Helhetlig Sikkerhetsstrategi

  • Logisk tilnærming: Kombiner kunnskapen om tilgangskontroll, kryptering og overvåking for å designe en helhetlig sikkerhetsstrategi for en MySQL-database.
  • Programmatisk tilnærming: Implementer en komplett sikkerhetsløsning som inkluderer sikre tilkoblinger, rollebasert tilgangskontroll, kryptering, og overvåking.
  • Praktisk tilnærming: Rull ut en full sikkerhetsstrategi for en MySQL-database som sikrer både datalagring og dataoverføring.
-- Kombiner flere sikkerhetstiltak
-- 1. Bruk SSL for å sikre tilkoblinger
ALTER USER 'begrenset_bruker'@'localhost' REQUIRE SSL;

-- 2. Krypter sensitive kolonner
ALTER TABLE kunder ADD COLUMN telefon VARBINARY(255);
UPDATE kunder SET telefon = AES_ENCRYPT('98765432', 'hemmelig_nøkkel') WHERE kunde_id = 1;

-- 3. Aktiver og overvåk logging
SET GLOBAL general_log = 'ON';

6. Evaluering (Evaluating)

Emne: Evaluering av MySQL-Sikkerhetspraksis

  • Logisk tilnærming: Lær hvordan du evaluerer sikkerhetspraksis i MySQL for å sikre at de oppfyller organisasjonens sikkerhetsstandarder.
  • Programmatisk tilnærming: Utfør en sikkerhetsrevisjon ved å bruke skript og verktøy som evaluerer konfigurasjonen og sikkerhetsinnstillingene i MySQL.
  • Praktisk tilnærming: Gjennomfør en sikkerhetsrevisjon på en MySQL-database for å identifisere sårbarheter og anbefale forbedringer.
-- Bruk MySQL-sikkerhetsrevisjonsskript for å sjekke konfigurasjonen
SHOW VARIABLES LIKE 'have_ssl';

-- Evaluer styrken på passordpolitikken
SHOW VARIABLES LIKE 'validate_password%';

7. Skapelse (Creating)

Emne: Utvikling av Sikkerhetsverktøy for MySQL

  • Logisk tilnærming: Design og utvikle et sikkerhetsverktøy eller skript som kan brukes til å automatisere sikkerhetskontroller og forbedre MySQL-sikkerheten.
  • Programmatisk tilnærming: Implementer et verktøy eller et skript som utfører sikkerhetssjekker, administrerer brukertillatelser, eller automatisk håndterer sikkerhetsoppdateringer.
  • Praktisk tilnærming: Implementer et skript som kjører regelmessige sikkerhetskontroller på MySQL-serveren, som å sjekke etter mistenkelig aktivitet eller passordstyrke.
# Bash script for å sjekke SSL og logging status
#!/bin/bash
# Sjekk SSL-status
ssl_status=$(mysql -u root -e "SHOW VARIABLES LIKE 'have_ssl';" | grep 'have_ssl' | awk '{print $2}')
echo "SSL Status: $ssl_status"

# Sjekk logging status
log_status=$(mysql -u root -e "SHOW VARIABLES LIKE 'general_log';" | grep 'general_log' | awk '{print $2}')
echo "General Log Status: $log_status"

# Planlegg dette scriptet til å kjøre regelmessig ved hjelp av cron
# Eksempel: 0 0 * * * /path/to/security_check.sh

Konklusjon

Denne fullstendige tilnærmingen til grunnleggende sikkerhet relatert til MySQL dekker alle nivåer fra videregående skole til universitetsnivå, basert på Blooms taksonomi. Ved å bruke praktiske, logiske og programmatiske eksempler, vil du utvikle en dyp forståelse av hvordan du sikrer en MySQL-database mot ulike trusler, hvordan du implementerer sikre praksiser, og hvordan du evaluerer og forbedrer disse praksisene.


Denne veiledningen er designet for studenter, utviklere, og databaseadministratorer som ønsker å bygge og styrke sin kompetanse innen sikkerhet relatert til MySQL, og hvordan de kan anvende denne kunnskapen i praktiske scenarier.

Nedenfor er et skript som sjekker en MySQL-database for 20 sikkerhetsfaktorer og tilbyr å utføre automatiske tilnærminger for å rette opp eventuelle sårbarheter. Dette skriptet er skrevet i Bash og bruker MySQL-kommandolinjeverktøyet for å utføre sikkerhetskontroller og rette opp sårbarheter etter brukerens samtykke.

Bash-skript for Sikkerhetssjekk i MySQL

#!/bin/bash

# MySQL-tilkoblingsdetaljer
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"

# Funksjon for å utføre sikkerhetssjekk
function check_security {
  echo "Sikkerhetssjekk nr. $1: $2"
  mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "$3"
}

# Funksjon for å rette sikkerhetssårbarhet
function fix_security {
  read -p "Ønsker du å rette dette problemet? (y/n): " choice
  if [ "$choice" == "y" ]; then
    mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "$1"
    echo "Rettet."
  else
    echo "Valgte å ikke rette."
  fi
}

echo "Kjører sikkerhetssjekk på MySQL-serveren..."

# 1. Sjekk for anonyme brukere
check_security 1 "Sjekk for anonyme brukere" "SELECT user, host FROM mysql.user WHERE user='';"
fix_security "DELETE FROM mysql.user WHERE user='';"

# 2. Sjekk for brukere uten passord
check_security 2 "Sjekk for brukere uten passord" "SELECT user, host FROM mysql.user WHERE authentication_string='';"
fix_security "UPDATE mysql.user SET authentication_string=PASSWORD('NewStrongPassword') WHERE authentication_string='';"

# 3. Sjekk om root har tilgang fra alle verter
check_security 3 "Sjekk om root har tilgang fra alle verter" "SELECT user, host FROM mysql.user WHERE user='root' AND host='%';"
fix_security "UPDATE mysql.user SET host='localhost' WHERE user='root' AND host='%';"

# 4. Sjekk om SSL er aktivert
check_security 4 "Sjekk om SSL er aktivert" "SHOW VARIABLES LIKE 'have_ssl';"
fix_security "SET GLOBAL require_secure_transport = ON;"

# 5. Sjekk om serveren har generell logging aktivert
check_security 5 "Sjekk om generell logging er aktivert" "SHOW VARIABLES LIKE 'general_log';"
fix_security "SET GLOBAL general_log = 'ON';"

# 6. Sjekk om serveren har slow query logging aktivert
check_security 6 "Sjekk om slow query logging er aktivert" "SHOW VARIABLES LIKE 'slow_query_log';"
fix_security "SET GLOBAL slow_query_log = 'ON';"

# 7. Sjekk for gamle eller sårbare MySQL-versjoner
check_security 7 "Sjekk for gamle eller sårbare MySQL-versjoner" "SELECT VERSION();"
echo "Oppgrader MySQL hvis det er en gammel versjon."

# 8. Sjekk om innebygde kontoer som 'test' finnes
check_security 8 "Sjekk om 'test'-databasen eller kontoer finnes" "SHOW DATABASES LIKE 'test';"
fix_security "DROP DATABASE IF EXISTS test;"

# 9. Sjekk for tillatelse til å utføre innlasting av filer
check_security 9 "Sjekk for FILE-tillatelse" "SELECT user, host FROM mysql.user WHERE File_priv='Y';"
fix_security "REVOKE FILE ON *.* FROM 'user'@'host';"

# 10. Sjekk for usikre autentiseringsprotokoller
check_security 10 "Sjekk for gammeldags autentiseringsprotokoller" "SHOW VARIABLES LIKE 'old_passwords';"
fix_security "SET GLOBAL old_passwords=0;"

# 11. Sjekk for brukere med SUPER-tillatelse
check_security 11 "Sjekk for brukere med SUPER-tillatelse" "SELECT user, host FROM mysql.user WHERE Super_priv='Y';"
fix_security "REVOKE SUPER ON *.* FROM 'user'@'host';"

# 12. Sjekk for brukere med GRANT OPTION
check_security 12 "Sjekk for brukere med GRANT OPTION" "SELECT user, host FROM mysql.user WHERE Grant_priv='Y';"
fix_security "REVOKE GRANT OPTION ON *.* FROM 'user'@'host';"

# 13. Sjekk om event scheduler er aktivert
check_security 13 "Sjekk om event scheduler er aktivert" "SHOW VARIABLES LIKE 'event_scheduler';"
fix_security "SET GLOBAL event_scheduler=OFF;"

# 14. Sjekk for brukere med USAGE-tillatelse
check_security 14 "Sjekk for brukere med kun USAGE-tillatelse" "SELECT user, host FROM mysql.user WHERE Insert_priv='N' AND Select_priv='N' AND Update_priv='N' AND Delete_priv='N';"
fix_security "DELETE FROM mysql.user WHERE Insert_priv='N' AND Select_priv='N' AND Update_priv='N' AND Delete_priv='N';"

# 15. Sjekk om MySQL kjører med root-rettigheter (system)
check_security 15 "Sjekk om MySQL kjører som root" "SELECT @@hostname, @@user;"
echo "Kjør MySQL som en begrenset bruker hvis den kjører som root."

# 16. Sjekk for databaseversjonslekkasjer
check_security 16 "Sjekk om versjonsinformasjon blir eksponert" "SHOW VARIABLES LIKE 'version_comment';"
fix_security "SET GLOBAL version_comment='';"

# 17. Sjekk for farlige globale variabler
check_security 17 "Sjekk for farlige globale variabler" "SHOW VARIABLES WHERE Value LIKE '%';"
echo "Gjennomgå og endre eventuelle usikre variabler."

# 18. Sjekk for inaktive brukere
check_security 18 "Sjekk for inaktive brukere" "SELECT user, host, last_login FROM mysql.user WHERE last_login IS NULL OR last_login < NOW() - INTERVAL 1 YEAR;"
fix_security "DELETE FROM mysql.user WHERE user = 'inaktiv_bruker';"

# 19. Sjekk om binære loggfiler er beskyttet
check_security 19 "Sjekk om binære loggfiler er beskyttet" "SHOW VARIABLES LIKE 'log_bin_trust_function_creators';"
fix_security "SET GLOBAL log_bin_trust_function_creators=0;"

# 20. Sjekk for gamle eller ubrukte indekser
check_security 20 "Sjekk for gamle eller ubrukte indekser" "SELECT DISTINCT TABLE_NAME, INDEX_NAME FROM information_schema.STATISTICS WHERE CARDINALITY=0;"
echo "Gjennomgå og slett eventuelle ubrukte indekser."

echo "Sikkerhetssjekk fullført."

Hvordan Bruke Skriptet

  1. Lag en ny fil: Opprett en ny fil på serveren din og lim inn skriptet. Gi filen et navn som mysql_security_check.sh.

  2. Gjør skriptet kjørbart: Kjør følgende kommando for å gjøre skriptet kjørbart:

    chmod +x mysql_security_check.sh
    
  3. Kjør skriptet: Start skriptet ved å kjøre det med bash:

    ./mysql_security_check.sh
    
  4. Følg instruksjonene: Skriptet vil sjekke 20 sikkerhetsfaktorer og vil tilby å rette opp eventuelle sårbarheter. Du blir spurt om du vil rette dem, og du kan velge y for ja eller n for nei.

Forbehold

  • Oppgraderinger: Skriptet sjekker MySQL-versjonen, men oppgraderinger må håndteres manuelt.
  • Tilpasning: Du kan tilpasse skriptet til dine spesifikke behov ved å legge til eller fjerne sjekker, eller ved å tilpasse kommandoene som utføres.
  • Backup: Sørg for å ha en backup av databasen før du utfører rettelser, da visse endringer kan ha betydelige konsekvenser.

Dette skriptet gir deg en effektiv måte å kontrollere og forbedre sikkerheten til MySQL-serveren din, og lar deg automatisere mange vanlige sikkerhetstiltak.