Jump to content

mgutt

Moderators
  • Posts

    11,367
  • Joined

  • Last visited

  • Days Won

    124

Everything posted by mgutt

  1. This script automatically grants write permissions for selected shares and users, after the root user logged into the WebGUI and removes it after 10800 seconds (3 hours) to protect the shares most of the time against ransomware attacks. Simply logout from the WebGUI and login again, to re-grant write permissions. Installation: Install the "User Scripts" plugin from "Apps" Add a new script and paste the following script Set the schedule to "Custom" and the value to * * * * * (this means the script is executed every minute) Note: As the cronjob runs "only" every minute, it takes up to one minute to get write permissions. #!/bin/bash # ##################################### # Script: SMB Share Auto Write Protection # Description: Selected SMB Shares get write access for a specific time after the root user logged in # and are reset to read-only afterwards to protect them against ransomware. # Author: Marc Gutt # Version: 0.3 # # Changelog: # 0.3 # - fixed wrong last login timestamp # 0.2 # - clean up smb config backups # - get most recent syslog file # ##################################### # ##################################### # Settings # ##################################### # Enable writing on this shares after root user logged in protect_shares="Movie,Music,Photo,TV,Video" # Set shares to read-only X seconds after root user logged in protect_shares_after_seconds="10800" # Which users are allowed to write users="marc" # Location of smb shares config file config_file="/etc/samba/smb-shares.conf" # ##################################### # Script # ##################################### # make script race condition safe if [[ -d "/tmp/${0//\//_}" ]] || ! mkdir "/tmp/${0//\//_}"; then echo "Script is already running!"; exit 1; fi; trap 'rmdir "/tmp/${0//\//_}"' EXIT; # check if smb config file exists if [[ ! -f "$config_file" ]]; then echo "$config_file not found!" exit 1 fi # check if nothing writes to the config file (avoids race conditions) if ! find "$config_file" -mmin +1 -exec true {} +; then echo "$config_file is not old enough" exit 0 fi # get last login timestamp syslog_file=$(ls /var/log/syslog /var/log/syslog.[0-9] 2>/dev/null | tail -n1) last_login=$(grep "webGUI: Successful login user root" "$syslog_file" | tail -n1) last_login_date=$(echo "$last_login" | grep -oP "^.*?:[0-9]+:[0-9]+") timestamp_last_login=$(date -d "$last_login_date" +%s) echo "Last login was: $last_login_date" # get current and expire timestamps timestamp_now=$(date +%s) timestamp_protect=$((timestamp_last_login + protect_shares_after_seconds)) # prepare input protect_shares=${protect_shares//,/|} users=(${users//,/ }) # read share configs into array shares_config=$(cat $config_file) shares_config=${shares_config//[/$'\f'[} # add feed-form as a delimiter IFS=$'\f' # set delimiter to feed-form shares_config=($shares_config) # fill array IFS=' ' # set delimiter to whitespace # loop through configs update_config="" for i in "${!shares_config[@]}"; do config="${shares_config[$i]}" if [[ $config =~ ^\[($protect_shares)\] ]]; then sharename=$(echo "$config" | head -n1) if [[ ! $config =~ "read list =" ]]; then echo "$sharename Does not contain \"read list\"!" continue fi if [[ ! $config =~ "write list =" ]]; then echo "$sharename Does not contain \"write list\"!" continue fi read_list=$(echo -e "$config" | grep -Po "(?<=read list = ).*") write_list=$(echo -e "$config" | grep -Po "(?<=write list = ).*") if [[ ! $read_list ]] && [[ ! $write_list ]]; then echo "$sharename Has no users in read AND write list!" continue fi config_before="$config" # set share to read-only if [[ timestamp_protect -lt timestamp_now ]]; then for user in "${users[@]}"; do # add user to read list if [[ ! $read_list =~ $user ]]; then echo "$sharename $user added to read list" read_list="$read_list,$user" fi # remove user from write list write_list_array=(${write_list//,/ }) for j in "${!write_list_array[@]}"; do if [[ ${write_list_array[$j]} == "$user" ]]; then echo "$sharename $user deleted from write list" unset "write_list_array[$j]" fi done write_list="$(IFS=, ; echo "${write_list_array[*]-}")" done echo "$sharename Grant $write_list write permissions and set $read_list to read-only" # make share writeable else for user in "${users[@]}"; do # add user to write list if [[ ! $write_list =~ $user ]]; then echo "$sharename $user added to write list" write_list="$write_list,$user" fi # remove user from read list read_list_array=(${read_list//,/ }) for j in "${!read_list_array[@]}"; do if [[ ${read_list_array[$j]} == "$user" ]]; then echo "$sharename $user deleted from read list" unset "read_list_array[$j]" fi done read_list="$(IFS=, ; echo "${read_list_array[*]-}")" done fi # remove comma(s) from beginning and end read_list=$( echo "$read_list" | sed 's/^,*//' | sed 's/,*$//' ) write_list=$( echo "$write_list" | sed 's/^,*//' | sed 's/,*$//' ) # set configs shopt -s extglob # needed for the following regex: config=${config/read list =*([ a-zA-Z0-9.-_,])/read list = $read_list} config=${config/write list =*([ a-zA-Z0-9.-_,])/write list = $write_list} if [[ "$config_before" != "$config" ]]; then update_config=1 shares_config[$i]="$config" fi fi done # write array to config file if [[ $update_config ]]; then # backup smb config file echo "Backup SMB config file" cp -v "$config_file" "/tmp/$(date +%FT%H-%M-%S)_$(basename "$config_file")" # overwrite smb config file echo "Update SMB config file" printf "%s" "${shares_config[@]}" > "$config_file" # add final new line echo "" >> "$config_file" # reload smb config smbcontrol all reload-config else echo "SMB config has not changed" fi # remove all smb config backups older than 2 days find /tmp -name "*_$(basename "$config_file")" -not -name "$(date +%F)*" -not -name "$(date +%F --date="yesterday")*" -delete
  2. Einfach mit "touch /boot/config/smb-extra.conf" erstellen. Die wird erst durch manche Plugins erstellt zb Recycle Bin.
  3. Nein geht nicht. Nur Xeon Chipsätze können das. Also C236, C246, W480, C256, etc
  4. Ok, für 10G nicht optimal, aber man spart dafür ja einiges. Muss man abwägen.
  5. @ich777 sagte mal, dass die was taugt: https://www.mydealz.de/deals/western-digital-blue-sn550-m2-2tb-nvme-m2-wds200t2b0c-mit-saturn-oder-mediamarkt-newslettergutschein-1902944 Hat zwar keinen DRAM, nutzt aber den RAM vom Server mit und ist daher trotzdem schnell genug. Keine Ahnung auf was die fällt, wenn der SLC Cache voll ist. Also ob die auch bei 10G passen würde.
  6. Ja beim Booten kannst du den Memorytest auswählen. Welche Intel CPU und welche NVMe sind verbaut? Lass dir doch nicht alles aus der Nase ziehen. 🧐
  7. Korrekt. Eventuell kann man es nachträglich aktivieren. Dann müsste man mit ethtool probieren. Ich meine das geht so: ethtool -K eth1 rxhash on Kann aber sein, dass falls das nicht klappt der Server offline geht und neu gestartet werden muss. Daher stoppe am besten erstmal das Array. Hier gibt es auch noch andere Varianten um das zu aktivieren: https://suricata.readthedocs.io/en/suricata-6.0.1/performance/high-performance-config.html
  8. Ich sehe keine Fehler. Hast du Container im br0 Netzwerk? Auch VMs? Bei br0 kann es zu Konflikten kommen, die zu einem Absturz führen können. Oder nutzt du ein AMD Board, das unter dem USB Bug leidet? Da was mit tsc in den Logs auftaucht wäre auch die Frage ob du eine Intel CPU verwendest, die unter dem hpet Bug leidet. Noch ein Grund können ASPM Fehler bezogen auf NVMes sein. Ansonsten Klassiker wie defekter RAM, etc. Letzteres würde ich zuerst mal prüfen. Also nur mit einem RAM Modul Booten und den Memory Test machen. Dann beim nächsten usw.
  9. Das Board ist mal wieder ausverkauft. Den Pentium Gold holst du lieber gebraucht. Meinen letzten habe ich glaube ich für 30 € gekauft. Neu liegen die ja normalerweise bei deutlich unter 100 €.
  10. mgutt

    Read-Cache

    Dann ist es "simpel". Pack die Daten der Website auf die HDDs und vor dem zb Apache Webserver Container lässt du einen Nginx Container alle Anfragen in den Cache schreiben. Du musst dann vermutlich /var/nginx/cache vom Container auf den Cache des Hosts verweisen lassen und dann brauchst du nur noch ein Skript, dass jeden Tag / alle paar Stunden aufräumt. Also wenn größer als X GB, dann lösche Y GB an alten Dateien. Für SSHFS wird es komplizierter: https://serverfault.com/questions/293811/is-it-possible-to-set-the-cache-size-for-fuse-and-or-sshfs Scheinbar kann man nur die Zeit, aber nicht die Größe festlegen?! Falls doch, könnte man einen Mount von /mnt/cache/sharename/sshfs_mount nach /mnt/disk1/sharename/daten erstellen. Wobei die Frage ist, wohin der cached. Wenn das nach /tmp geht (RAM), müsste man noch den passenden Unterordner auf die SSD mounten.
  11. Führe bitte das auf beiden Servern aus: egrep 'CPU|eth*' /proc/interrupts Erhältst du als Antwort bei den 10G Karten mehrere CPUs? Muss ungefähr so aussehen: CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 128: 29913308 0 0 0 0 0 0 0 0 0 0 0 IR-PCI-MSI 524288-edge eth0 129: 0 11210660 0 0 0 0 0 0 0 0 0 0 IR-PCI-MSI 524289-edge eth0 130: 0 0 13256826 0 0 0 0 0 0 0 0 0 IR-PCI-MSI 524290-edge eth0 131: 0 0 0 7000893 0 0 0 0 0 0 0 0 IR-PCI-MSI 524291-edge eth0 132: 0 0 0 0 19946721 0 0 0 0 0 0 0 IR-PCI-MSI 524292-edge eth0 133: 0 0 0 0 0 15990550 0 0 0 0 0 0 IR-PCI-MSI 524293-edge eth0 134: 0 0 0 0 0 0 19140087 0 0 0 0 0 IR-PCI-MSI 524294-edge eth0 135: 0 0 0 0 0 0 0 11455140 0 0 0 0 IR-PCI-MSI 524295-edge eth0 136: 0 0 0 0 0 0 0 0 6 0 0 0 IR-PCI-MSI 524296-edge eth0 In meinem Fall sind das 12 CPU Threads, daher 12 Interrupts. Wenn das auf beiden Seiten gegeben ist, dann können die 10G Karten RSS (Receive Side Scaling). Dann kannst du dir den Config Editor installieren und über Tools die /boot/config/smb-extra.conf auf dem Stick bearbeiten. Hier fügst du nun folgende Zeilen ein um Multichannel und RSS bei der Karte zu aktivieren: server multi channel support = yes interfaces = "<IPvon10GKarte>;capability=RSS,speed=10000000000" aio read size = 1 aio write size = 1 Das natürlich bei beiden Servern. Beispiel: Nun erstmal den SMB Mount trennen, danach auf beiden Seiten das Array stoppen und starten und den Mount wieder verbinden. Nun sollte RSS aktiv sein. Du kannst auch einen vorher/nachher Vergleich machen. Öffne dazu das WebTerminal und führe "htop" aus und starte einen großen Dateitransfer. Ohne RSS siehst du einen smbd Prozess, danach mehrere. Die Last wird nun auf mehrere CPUs verteilt.
  12. Nein, WD hat ganz offiziell die Red gestrichen. Früher standen die in der Produktbeschreibung im WD Store. Jetzt nicht mehr. Also da sind wirklich keine mehr drin. WD verkauft im eigenen Store auch B Ware. Also Retouren anderer Kunden dürften das sein.
  13. Die WD Duo haben meine ich keine Red mehr drin.
  14. WD Red Plus liegen im Bestpreis bei 20 € pro TB. Ist mit 22 € nah dran. In jedem Fall nicht überteuert.
  15. Die 2TB hat starke Werte von 1.4 GB/s, wenn der 40GB Cache voll ist: https://www.techpowerup.com/review/kioxia-exceria-plus-g2-2-tb/6.html Die 2TB Samsung kommt auf 1.5GB/s https://www.guru3d.com/articles-pages/samsung-970-evo-plus-2tb-nvme-m-2-ssd-review,8.html Zur 1TB Kioxia finde ich leider nichts.
  16. mgutt

    Read-Cache

    Nicht ganz perfekt, aber man könnte das Mover Tuning Plugin verwenden und dort nach Dateialter verschieben lassen: Sagen wir mal, man stellt 14 Tage ein. Und nun lässt man täglich ein Skript alle Dateien auf dem Cache per "touch" vom Datum her gleich setzen, wie das Access Datum. Wobei ich nicht weiß, ob Mover Tuning das Access Datum bei jedem Durchlauf aktualisiert?! Alternativ müsste man was über SMB Logs lösen. Also alle Zugriffe mitloggen und an Hand der Logs die Zeitstempel aktualisieren. Komplett live alle Dateizugriffe auf dem Cache überwachen, würde zu viel CPU Leistung kosten.
  17. Da gibt es noch keine Erfahrungswerte für in unRAID. Die Frage ist ob die Ärger unter Linux macht zb wegen ASPM. Ist in jedem Fall mit DRAM und SLC Cache, also ein gutes Modell. Hat im Vergleich zur 970 EVO statt 600TBW aber "nur" 400TBW. Gibt es schon Tests zur Kioxia, wie schnell die ist, wenn der Cache aufgebraucht wurde bzw wie groß der ist?
  18. Dass die Preise so schnell wieder normal geworden sind, ist es der beste Beweis für den Flopp dieser Währung. Gut so 😁
  19. Normal ja. Es gibt manchmal nur Ausnahmen, dass zb ein PCIe Slot deaktiviert wird, wenn eine GPU installiert wird oder bestimmte SATA Buchsen genutzt werden. Musst du mal in der Anleitung schauen.
  20. Bei Amazon bekommst du wie überall eine Gewährleistung mit Beweislastumkehr nach 6 Monaten. Sonderregelungen im ersten Jahr sind mir meine bekannt. Früher war Amazon mal richtig kulant, abee die Zeiten sind mittlerweile auch vorbei.
  21. Äpfel und Birnen? Gewährleistung heißt ja nicht, dass man sein Geld zurückbekommt?! Davon abgesehen ging es um die Garantie.
  22. Normal ^^ 15 € pro TB ist so der Standardkurs für White Label im Angebot. Alle Platten sind 24/7 geeignet. Siehe Backblaze, die viele Jahre Consumer Platten genutzt haben. Ja, aber manche Netzteile sind nicht richtig verkabelt und brauchen daher einen Adapter von Molex auf PowerSATA, sonst läuft die Platte nicht an, weil 3.3V anliegen. Garantie ist Glückssache. Ich würde die Gehäuse aufheben und im Falle des Defektes wieder einbauen. Man muss aber auch die Ersparnis berücksichtigen. Mir ist die Garantie jedenfalls egal. Von der Ersparnis kann ich mir zig neue Platten kaufen (habe 8 Stück). Ja.
×
×
  • Create New...