Nakładanie łatek bezpieczeństwa w OpenBSD

Łatka (patch) to zazwyczaj małe coś, co poprawia działanie naszego systemu, nakłada się ją na kod źródłowy, a następnie kompiluje się tą część systemu, za którą ona odpowiada. Łatka to plik zawierający różnice pomiędzy starą wersją a nową wersją plików. Może ona usuwać lub dodawać kod.

Pobranie źródeł systemu

Standardowa instalacja OpenBSD nie zawiera źródeł systemu, należy je samodzielnie pobrać. Źródła systemu należy rozpakować w katalogu /usr/src.

# cd /usr/src
# ftp ftp://ftp.openbsd.org/pub/OpenBSD/$(uname -r)/{src.tar.gz,sys.tar.gz}

Rozpakowanie źródeł

# tar zxvf src.tar.gz -C /usr/src
# tar zxvf sys.tar.gz -C /usr/src

Nakładanie łatek bezpieczeństwa

Łatki bezpieczeństwa można pobrać ze strony errata.html. Każda z łatek posiada zaszytą w sobie instrukcję instalacji.

Przykład łatki 010: RELIABILITY FIX dla OpenBSD 4.8. Po nałożeniu tej łatki wymagana jest kompilacja jądra, oczywiście nie każda łatka wymaga kompilacji jądra systemu.

Apply by doing:
	/usr/src
	patch -p0 < 010_sis.patch

Then build and install a new kernel

Index: sys/dev/pci/if_sis.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_sis.c,v
retrieving revision 1.99
retrieving revision 1.99.2.2
diff -p -u -r1.99 -r1.99.2.2
--- sys/dev/pci/if_sis.c	6 Aug 2010 05:24:16 -0000	1.99
+++ sys/dev/pci/if_sis.c	17 Feb 2011 00:53:48 -0000	1.99.2.2
@@ -1,4 +1,4 @@
-/*	$OpenBSD: if_sis.c,v 1.99 2010/08/06 05:24:16 deraadt Exp $ */
+/*	$OpenBSD: if_sis.c,v 1.99.2.2 2011/02/17 00:53:48 sthen Exp $ */
 /*
  * Copyright (c) 1997, 1998, 1999
  *	Bill Paul .  All rights reserved.
@@ -1268,6 +1268,11 @@ sis_newbuf(struct sis_softc *sc, struct 

 	c->sis_mbuf = m_new;
 	c->sis_ptr = htole32(c->map->dm_segs[0].ds_addr);
+
+	bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap,
+	    ((caddr_t)c - sc->sc_listkva), sizeof(struct sis_desc),
+	    BUS_DMASYNC_PREWRITE);
+
 	c->sis_ctl = htole32(ETHER_MAX_DIX_LEN);

 	bus_dmamap_sync(sc->sc_dmat, sc->sc_listmap,

Zgodnie z instrukcją zawartą w łatce wykonujemy następujące polecenia.

# cd /usr/src
# patch -p0 < 010_sis.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Apply by doing:
|       /usr/src
|       patch -p0 < 010_sis.patch
|
|Then build and install a new kernel
|
|Index: sys/dev/pci/if_sis.c
|===================================================================
|RCS file: /cvs/src/sys/dev/pci/if_sis.c,v
|retrieving revision 1.99
|retrieving revision 1.99.2.2
|diff -p -u -r1.99 -r1.99.2.2
|--- sys/dev/pci/if_sis.c       6 Aug 2010 05:24:16 -0000       1.99
|+++ sys/dev/pci/if_sis.c       17 Feb 2011 00:53:48 -0000      1.99.2.2
--------------------------
Patching file sys/dev/pci/if_sis.c using Plan A...
Hunk #1 succeeded at 1.
Hunk #2 succeeded at 1268.
done

Teraz przechodzimy do kompilacja jądra systemu, więcej na ten temat można znaleźć FAQ.

# cd /usr/src/sys/arch/i386/conf
# config GENERIC
# cd ../compile/GENERIC
# make depend
# make
# make install

Po restarcie, system zostanie uruchomiony z nałożoną łatką.

Linki

OpenSMTPD i GMail w OpenBSD

Opiszę jak wykorzystać serwer OpenSMTPD oraz konto GMail do wysyłania lokalnej poczty.

Cały czas trwają prace nad zastąpieniem serwera pocztowego Sendmail przez OpenSMTPD w OpenBSD, jednak można go już uruchomić. Został on dodany w OpenBSD 4.6, wydanie 4.9 nadal używa Sendmaila jako podstawowego serwera poczty.

Kolejne wydania systemu przynoszą zmiany w działaniu i konfiguracji OpenSMTPD, więc powinno się śledzić na bieżąco podręcznik man OpenSMTPD.

Zamiana serwera poczty na OpenSMTPD

W pliku /etc/mailer.conf należy podmienić pewne wpisy:

sendmail /usr/sbin/smtpctl
send-mail /usr/sbin/smtpctl
mailq /usr/sbin/smtpctl
makemap /usr/libexec/smtpd/makemap
newaliases /usr/libexec/smtpd/makemap

Wyłączenie sendmaila i uruchomienie OpenSMTPD

# pkill sendmail
# newaliases
# echo "sendmail_flags=NO" >> /etc/rc.conf.local
# echo "smtpd_flags=\"\"" >> /etc/rc.conf.local
# smtpd -n
# smtpd

Procesy serwera OpenSMTPD

# ps ax | grep -i smtpd
22163 ??  I       0:00.02 smtpd: smtp server (smtpd)
29964 ??  S       0:00.02 smtpd: runner (smtpd)
14287 ??  I       0:00.01 smtpd: queue (smtpd)
16238 ??  I       0:00.01 smtpd: lookup agent (smtpd)
12778 ??  I       0:00.00 smtpd: mail filter agent (smtpd)
22112 ??  I       0:00.01 smtpd: control (smtpd)
18754 ??  I       0:00.00 smtpd: mail delivery agent (smtpd)
22594 ??  I       0:00.01 smtpd: mail transfer agent (smtpd)
23207 ??  Is      0:00.00 smtpd

Konfiguracja dla konta GMail

# echo "smtp.gmail.com NAZWA_UŻYTKOWNIKA@gmail.com:HASŁO" > /etc/mail/secrets
# chmod 600 /etc/mail/secrets
# makemap -o /etc/mail/secrets.db /etc/mail/secrets
# chmod 640 /etc/mail/secrets.db
# chgrp _smtpd /etc/mail/secrets /etc/mail/secrets.db

W ten sposób stworzyliśmy plik bazy zawierający ustawienia dla konta GMail

Teraz przejdziemy do konfiguracji OpenSMTPD, w pliku /etc/mail/smtpd.conf dodajemy:

listen on lo0

hostname "obsd.localdomain"

map "aliases" { source db "/etc/mail/aliases.db" }
map "secrets" { source db "/etc/mail/secrets.db" }

accept for local alias aliases deliver to mbox
accept for all relay via "smtp.gmail.com" port 587 tls auth "secrets"

Wpis hostname uzupełniamy nazwą swojego serwera, którą musi zawierać plik /etc/hosts. Jeśli nasz serwer działa w sieci lokalnej i nie służy jako serwer Internetowy to jego nazwa nie powinna występować w sieci Internet np. kostucha.lan lub kostucha.lokalna.

Restart serwera OpenSMTPD

# pkill smtpd
# smtpd

Test wysłania poczty

Najprościej użyć programu mail

mail twoj@email.pl
Subject: Test OpenSMTPD
Wiadomosc testowa
.
EOT

Sprawdzanie stanu OpenSMTPD

# smtpctl show stats
control.sessions=2
control.sessions_active=1
control.sessions_maxactive=1
mda.sessions=0
mda.sessions.active=0
mda.sessions.maxactive=0
mta.sessions=0
mta.sessions.active=0
mta.sessions.maxactive=0
parent.uptime=13
queue.inserts.local=0
queue.inserts.remote=0
runner.active=0
runner.maxactive=0
runner.bounces=0
runner.bounces.active=0
runner.bounces.maxactive=0
smtp.errors.delays=0
smtp.errors.linetoolong=0
smtp.errors.read_eof=0
smtp.errors.read_system=0
smtp.errors.read_timeout=0
smtp.errors.tempfail=0
smtp.errors.toofast=0
smtp.errors.write_eof=0
smtp.errors.write_system=0
smtp.errors.write_timeout=0
smtp.sessions=0
smtp.sessions.aborted=0
smtp.sessions.active=0
smtp.sessions.maxactive=0
smtp.sessions.timeout=0
smtp.sessions.smtps=0
smtp.sessions.smtps.active=0
smtp.sessions.smtps.maxactive=0
smtp.sessions.starttls=0
smtp.sessions.starttls.active=0
smtp.sessions.starttls.maxactive=0

Linki

Wyłączenie protokołu ARP

Wyłączenie protokołu ARP wiąże się z brakiem połączenia z innymi hostami w sieci LAN, których nasz system nie zna, czyli nie posiada odpowiednich wpisów w tablicy ARP. Tablica ARP składa się rekordów zawierających informacje na temat adresu IP oraz adresu MAC hosta. Jeśli protokół ARP jest wyłączony i tablica ARP nie zawiera informacji na temat danego hosta, nie ma możliwości żeby nasz system uzyskał połączenie z tym hostem. Do nawiązania połączenia pomiędzy dwoma systemami w sieci LAN wymagany jest odpowiedni wpis w tablicy ARP na obu hostach.

Protokół ARP

Wyłączenie protokołu ARP na interfejsie sieciowym

# ifconfig nazwa_interfejsu -arp

Po wyłączeniu protokołu ARP, interfejs uzyskuje dodatkową flagę NOARP

# ifconfig xl0 -arp
# ifconfig xl0 | grep flags
xl0: flags=88c3<UP,BROADCAST,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500

Wyświetlenie tablicy ARP

arp -a
host1 (192.168.6.1) at 00:25:9c:bb:83:d8 on xl0
...

Wyczyszczenie tablicy ARP

# arp -da
192.168.6.1 (192.168.6.1) deleted

Dodanie hosta do tablicy ARP

# arp -as 192.168.6.1 00:01:02:03:04:05

Wszystkie hosty w tablicy ARP, które samemu dodamy są dodatkowo opisane jako static

Instalacja sshguard

Program sshguard służy do obrony przed atakami na serwer SSH, w tym celu należy go zintegrować z filtrem pakietów (PF).

Instalacja pakietu sshguard

Używając polecenia pkg_add instalujemy pakiet sshguard.

# pkg_add sshguard
sshguard-1.5rc4p0: ok
--- +sshguard-1.5rc4p0 -------------------
To use sshguard you must add the following to /etc/pf.conf:

table <sshguard> persist

block in quick on egress proto tcp from <sshguard> \
        to any port ssh label "ssh bruteforce"

To start sshguard automatically at boot time, add these lines to /etc/rc.local:

if [ -x /usr/local/sbin/sshguard ]; then
        echo -n ' sshguard'
        /usr/local/sbin/sshguard -l /var/log/authlog >/dev/null 2>&1 &
fi

Należy postępować z powyższymi instrukcjami, a więc dodać odpowiednie wpisy w /etc/pf.conf oraz w /etc/rc.local, tak żeby sshguard uruchamiał się przy starcie systemu.

Pomoc dla polecenia sshguard

# sshguard -h
Usage:
sshguard [-b <thr:file>] [-w <whlst>]{0,n} [-a num] [-p sec] [-s sec]
        [-l <source>] [-f <srv:pidfile>]{0,n} [-i <pidfile>] [-v]
        -b      Blacklist: thr = number of abuses before blacklisting, file = blacklist filename.
        -a      Number of hits after which blocking an address (40)
        -p      Seconds after which unblocking a blocked address (420)
        -w      Whitelisting of addr/host/block, or take from file if starts with "/" or "." (repeatable)
        -s      Seconds after which forgetting about a cracker candidate (1200)
        -l      Add the given log source to Log Sucker's monitored sources (off)
        -f      "authenticate" service's logs through its process pid, as in pidfile
        -i      When started, save PID in the given file; useful for startup scripts (off)
        -v      Dump version message to stderr, supply this when reporting bugs

        The SSHGUARD_DEBUG environment variable enables debugging mode (verbosity + interactivity).

Konfiguracja filtra pakietów PF

W pliku /etc/pf.conf dodajemy tablice sshguard.

table <sshguard> persist

Następnie dodajemy regułę filtrująca

block in quick on egress proto tcp from <sshguard> \
        to any port ssh label "ssh bruteforce"

Regułę możemy tak zmodyfikować, żeby PF odrzucał wszystkie połączenia z podejrzanych hostów, a nie tylko na port usługi SSH.

block in quick on egress proto tcp from <sshguard> \
        to any label "ssh bruteforce"

Teraz należy przeładować konfigurację PF

# pfctl -f /etc/pf.conf

Uruchomienie sshguard

Do uruchomienia sshguard przy starcie systemu będzie nam potrzebny wpis w pliku /etc/rc.local:

if [ -x ${PREFIX}/sbin/sshguard ]; then
        echo -n ' sshguard'
        ${PREFIX}/sbin/sshguard -l /var/log/authlog >/dev/null 2>&1 &
fi

Logi systemowe

Próba nieautoryzowanego logowania do systemu

$ ssh root@192.168.6.132
root@192.168.6.132's password:
Permission denied, please try again.
root@192.168.6.132's password:
Permission denied, please try again.
root@192.168.6.132's password:
Permission denied (publickey,password,keyboard-interactive).

W logach wygląda to następująco /var/log/authlog

May 23 21:31:59 bsd sshd[3784]: Failed password for root from 192.168.6.123 port 60997 ssh2
May 23 21:32:04 bsd last message repeated 4 times
May 23 21:32:04 bsd sshd[28697]: Disconnecting: Too many authentication failures for root
May 23 21:32:04 bsd sshguard[14879]: Blocking 192.168.6.123:4 for >630secs: 50 danger in 2 attacks over 5 seconds (all: 50d in 1 abuses over 5s)..

Za pomocą polecenia pfctl możemy sprawdzić listę blokowanych hostów

# pfctl -Tshow -tsshguard
   192.168.6.123

Linki

Autoryzacja za pomocą haseł jednorazowych S/Key

System haseł jednorazowych (OTP – one time password) to dobry sposób autoryzacji do serwerów, które nie posiadają szyfrowanej transmisji danych. Takich jak telnet czy ftp. Można również używać haseł jednorazowych do połączenia z serwerem SSH.

Włączenie obsługi haseł jednorazowych

System haseł jednorazowych jest standardowo wyłączony, trzeba go samodzielnie uruchomić.

# skeyinit -E

Wyłączenie obsługi haseł jednorazowych

# skeyinit -D

Obsługa haseł jednorazowych przez serwer SSH

W konfiguracji serwera SSH istnieje parametr, który standardowo zezwala na autoryzację za pomocą haseł jednorazowych. Jest to parametr ChallengeResponseAuthentication, jeśli ustawimy go na no, to serwer SSH nie pozwoli na autoryzację za pomocą kluczy jednorazowych.

Uruchomienie autoryzacji S/Key dla konta użytkownika

Uruchomienie haseł jednorazowych dla własnego konta. Po wydaniu polecenia skeyinit zostaniemy poproszeni o podanie hasła – przepustki, która musi mieć przynajmniej 10 znaków. Polecenie należy wykonać za pomocą szyfrowanego kanału lub z lokalnej konsoli.

$ skeyinit
Reminder - Only use this method if you are directly connected
           or have an encrypted channel.  If you are using telnet,
           hit return now and use skeyinit -s.
Password:                        <- tutaj podajemy swoje normalne hasło
[Adding user1 with md5]
Enter new secret passphrase:     <- dwukrotnie podajemy przepustkę minim 10 znaków
Again secret passphrase:

ID user1 skey is otp-md5 100 obsd46062
Next login password: MOAT HAIR TOP AVER FIVE LEE

Generowanie listy haseł

Istnieją programy do generowania haseł jednorazowych, możemy posłużyć się poleceniem skey, lub skorzystać z programów dostępne na różne systemy i telefony komórkowe. W tej chwili mój telefon jest wyposażony w system Android jedną z lepszych aplikacji tego typu jest OTPdroid. Kilka programów można znaleźć na stronie http://www.eda.org/pub/tools/.

Wygenerowanie 10 haseł zaczynając od numeru 100

$ skey -md5 -n 10 100 obsd46062
Reminder - Do not use this program while logged in via telnet.
Enter secret passphrase:
91: MEN BONE LAIR HEN GIRL LIND
92: ELK HALE LIME GOSH ATE HAW
93: ACME YAW FOE TIC RAW FLO
94: TO SLIM NOW JAIL TWIG GAM
95: YAW TWIN FORT BELA ARTY RUSS
96: RYE FRET BIEN SORT SAY SEAM
97: AJAR TWO GULF GERM LIP IRON
98: HAM TUBE BANE TOE LIEN GARB
99: LUSH HARM SUNG VET CHAD LYRA
100: MOAT HAIR TOP AVER FIVE LEE

Logowanie do systemu

Chcąc zalogować się do systemu używając hasła jednorazowego, za swoją nazwą użytkownika należy dodać :skey.

$ ssh user1:skey@localhost
otp-md5 99 obsd46062
S/Key Password:
Last login: Tue May  3 22:36:18 2011 from 192.168.6.99
OpenBSD 4.9 (GENERIC) #671: Wed Mar  2 07:09:00 MST 2011

Welcome to OpenBSD: The proactively secure Unix-like operating system.

Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code.  With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.

$

Włączenie obsługi haseł jednorazowych dla serwera FTP

Żeby włączyć autoryzację hasłami S/Key dla serwera FTP należy zmodyfikować plik /etc/login.conf

W linii zaczynającej się od auth-ftp-defaults na końcu po przecinku dodajemy słowo skey, całość wygląda tak:

auth-ftp-defaults:auth-ftp=passwd,skey:

W ten sposób będziemy mogli zalogować się do serwera FTP za pomocą normalnego hasła oraz hasła jednorazowego. Oczywiście możemy uruchomić autoryzację wyłącznie za pomocą haseł jednorazowych, co wyeliminuje możliwość podsłuchania normalnego hasła.

Logowania do serwera FTP

Także tutaj jako nazwy użytkownika używamy kombinacji login:skey.

$ ftp localhost
Trying 127.0.0.1...
Connected to localhost.
220 obsd.pl FTP server ready.
Name (localhost:user1): user1:skey
331- otp-md5 98 obsd46062
331 S/Key Password:
Password:
230- OpenBSD 4.9 (GENERIC) #671: Wed Mar  2 07:09:00 MST 2011
230-
230- Welcome to OpenBSD: The proactively secure Unix-like operating system.
230-
230- Please use the sendbug(1) utility to report bugs in the system.
230- Before reporting a bug, please try to reproduce it with the latest
230- version of the code.  With bug reports, please try to ensure that
230- enough information to reproduce the problem is enclosed, and if a
230- known fix for it exists, include that as well.
230-
230 User user1 logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Linki

Wyszukiwanie adresu MAC interfejsu sieciowego

Adres MAC interfejsu sieciowego możemy odnaleźć za pomocą polecenia ifconfig.

# ifconfig sis0 | grep lladdr | sed -ne 's/.*\(..:..:..:..:..:..\).*/\1/p'
00:00:00:85:2d:15

OpenBSD 4.9 wydane

Zmiany można przejrzeć na stronie http://www.openbsd.org/plus49.html, nowe wydanie można pobrać z głównego serwera FTP ftp://ftp.openbsd.org/pub/OpenBSD/4.9 lub serwera lustrzanego ftp://ftp.eu.openbsd.org/pub/OpenBSD/4.9/i386.

Wymuszenie zmiany hasła użytkownika

Chcąc wymusić zmianę hasła użytkownika, trzeba określić okres ważności hasła oraz w ciągu ilu dni od wygaśnięcia hasła, użytkownik może je zmienić. W pliku /etc/login.conf w odpowiedniej klasie np. default należy dodać następujące linie:

:password-dead=3d:\ # użytkownik ma 3 dni do zmiany hasła po jego wygaśnięciu
:passwordtime=29d:\ # hasło zostanie przedłużone na kolejne 29 dni

Data wygaśnięcia hasła dla konta jest przechowywana w pliku /etc/master.passwd.

test:*************:1001:10::1304145515:0::/home/test:/bin/ksh

Jeśli w systemie mamy skonfigurowany inny sposób autoryzacji jak S/Key lub połączenie za pomocą kluczy SSH, zmiana hasła nie zostanie wymuszona i użytkownik będzie mógł zalogować się do systemu.

Zmiana daty wygaśnięcia hasła

Teraz pora zająć się kontem użytkownika, za pomocą polecenia usermod ustawimy datę wygaśnięcia hasła. Jeśli chcemy, żeby hasło zostało zmienione przy pierwszym logowaniu należy ustawić datę na dzisiejszą.

Ustawienie zmiany hasła przy pierwszym logowaniu.

# usermod -f $(date +%s) nazwa_użytkownika

Polecenie $(date +%s) wyświetla aktualną datę w formacie Unix EPOCH.

Wyświetlenie czasu w postaci EPOCH i konwersja na bardziej czytelną formę.

# date +%s
1304145302
# date -r 1304145302
Sat Apr 30 08:35:02 CEST 2011

Konwersja daty na czas EPOCH

Format daty to RRRRMMDDGGMM

# date -j +%s 201104300835
1304145300

Przykład logowania do systemu

Przy pierwszym logowaniu do systemu użytkownik zostanie poproszony o zmianę hasła.

WARNING: Your password has expired.
You must change your password now and login again!
Changing local password for test.
Old password:
New password:
Retype new password:
Connection to wrap closed.

Dodanie użytkownika i określenie ważności hasła

Dodanie użytkownika z określeniem daty wygaśnięcia hasła

# useradd -f 1304145515 test
# grep test /etc/master.passwd
test:*************:1001:10::1304145515:0::/home/test:/bin/ksh

Skrypt automatyzujący zmiany

Skrypt uwzględnia konta z numerem UID >= 1000 oraz pomija konto nobody o numerze UID = 32767.

#!/bin/ksh

users=$(awk '($3>=1000) && ($3!=32767) { print $1 }'  FS=: /etc/master.passwd)
for i in $users
do
   usermod -f $(date +%s) $i
done

Zmiana adresu MAC interfejsu sieciowego

Adres MAC możemy zmienić samodzielnie przy pomocy polecenia ifconfig oraz parametru lladdr.

# ifconfig ex0 lladdr 00:12:12:43:43:22

Jeśli chcemy żeby zmiany były wprowadzane przy starcie systemu należy zmienić zawartość pliku /etc/hostname.nazwa_interfejsu.

Przykład zmiany adresu MAC interfejsu ex0. W pliku /etc/hostname.ex0 umieszczamy

inet 192.168.6.66 255.255.255.0
lladdr 00:00:00:85:2d:15

Skrypt sprawdzający nowe poprawki dla OpenBSD

Od jakiegoś czasu na stronie OpenBSD Journal, nie jest aktualizowany kanał RSS, dotyczący poprawek dla OpenBSD pojawiających się na stronie www.OpenBSD.org/errata.html. Poniższy skrypt zastąpił u mnie tą lukę. Skrypt najlepiej uruchamiać codziennie jako zadanie cron. Do poprawnego działania skryptu należy skonfigurować dwie zmienne katalog oraz email. Za każdym razem gdy pojawia się nowa poprawka, zostaje wysłany e-mail na podany adres w postaci różnicy pomiędzy kolejnymi sprawdzeniami.

Skrypt errata.sh

#!/bin/ksh

katalog=/skrypty
email=adres@email.pl

if [ $# -eq 0 ]; then
    echo Podaj jako parametr numer wersji OpenBSD.
    echo $0 4.8
    exit
fi

wersja=$1
wersjabk=$(echo $1 | tr -d "[.]")

if [ -e $katalog/errata-$wersja.new ]; then
    mv $katalog/errata-$wersja.new $katalog/errata-$wersja.old
fi

if [ ! -e $katalog/errata-$wersja.old ]; then
    touch $katalog/errata-$wersja.old
fi

lynx -dump http://www.openbsd.org/errata$wersjabk.html \
    | grep ftp.openbsd.org | grep -v $wersja.tar.gz \
    | awk '{ print $2 }' > $katalog/errata-$wersja.new

diff -U2 $katalog/errata-$wersja.old $katalog/errata-$wersja.new > $katalog/errata-$wersja.diff

if [ -s $katalog/errata-$wersja.diff ]; then
    # wysyla jako zalacznik
    # uuencode errata.diff errata.diff |
    /usr/bin/mail -s "OpenBSD $wersja errata" $email < $katalog/errata-$wersja.diff
fi

Wywołanie skryptu

Jako parametr skryptu należy podać numer wersji systemu, który chcemy obserwować.

$ ./errata.sh 4.8

Przykład otrzymanego maila

Subject: OpenBSD 4.8 errata

--- /skrypty/errata-4.8.old	Thu Apr 21 17:59:17 2011
+++ /skrypty/errata-4.8.new	Thu Apr 21 17:59:34 2011
@@ -1,2 +1,3 @@
+http://ftp.openbsd.org/pub/OpenBSD/patches/4.8/common/010_sis.patch
 http://ftp.openbsd.org/pub/OpenBSD/patches/4.8/common/009_pf.patch
 http://ftp.openbsd.org/pub/OpenBSD/patches/4.8/common/008_openssl.patch

Skrypt sprawdzający czy są nowsze wydania poprawek OpenBSD

Poprzedni skrypt sprawdzał czy są nowe poprawki dla konkretnego wydania OpenBSD, natomiast poniższy skrypt sprawdza czy na stronie www.OpenBSD.org/errata.html pojawiły się poprawki do nowszej wersji systemu niż zawartej w zmiennej version.

#!/bin/ksh

version=48
errata=$(lynx --dump --source http://www.openbsd.org/errata.html \
    | grep "<a href=\"errata" \
    | sed -n '$p' | sed -e 's/<[^>]*>//g' | tr -d [.,])

if [ $errata -gt $version ]; then
    v1=$(echo $errata | cut -c 1)
    v2=$(echo $errata | cut -c 2)
    echo "Znalazlem nowa wersje errraty jest to wersja $v1.$v2."
fi

Jeśli chcemy dostać powiadomienie na maila możemy skorzystać z rozwiązania znajdującego się w pierwszym skrypcie lub uruchomić go w następujący sposób.

$ ./errata-version.sh | mail -s "Jest już nowe wydanie OpenBSD Errata" adres@email.pl

Linki

Blokowanie logowania do systemu w OpenBSD

Czasami zachodzi potrzeba zablokowania logowania do systemu normalnym użytkownikom. Opisany sposób blokowania obejmuje użytkowników klasy default. Użytkownik root oraz konto użytkownika utworzone w trakcie procesu instalacji nie są w klasie default, dzięki czemu mimo blokady, będą mogli się zalogować do systemu. Za pomocą polecenia $ userinfo nazwa_użytkownika możemy sprawdzić klasę użytkownika.

$ userinfo user1 | grep class
class   staff

Włączenie blokady

# touch /etc/nologin

Wyłączenie blokady

Po usunięciu pliku /etc/nologin użytkownicy będą mogli ponownie się zalogować.

# rm /etc/nologin

Podpis i weryfikacja archiwów gzip za pomocą klucza RSA

Do podpisu archiwum gz służy narzędzie gzsig umożliwiające podpis jak i weryfikacje pliku. Podpis jest składany, przy użyciu klucza RSA, DSA lub certyfikatu X509.

Przygotowanie pary kluczy (RSA)

Klucze generujemy za pomocą ssh-keygen, po wykonaniu poniższego polecenia otrzymamy parę kluczy RSA-GZSig.pub oraz RSA-GZSig – klucz publiczny oraz klucz prywatny.

Klucz publiczny służy do weryfikacji podpisu i możemy go udostępniać innym osobom. Klucz prywatny powinien być przechowywany w bezpiecznym miejscu – służy on do składania podpisów.

W trakcie generowania kluczy zostaniemy poproszeni o podanie hasła / przepustki, należy je podać dwukrotnie.

ssh-keygen -b 2048 -C gzsig -f RSA-GZSig -t rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in RSA-GZSig.
Your public key has been saved in RSA-GZSig.pub.
The key fingerprint is:
fb:c4:0e:3c:97:5a:42:b2:e1:b8:49:b5:e0:84:ec:27 gzsig
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
| . .             |
|  o o + S        |
| . o = B o .     |
|  E = + * *      |
|   + o   @       |
|    o   . o      |
+-----------------+

Podstawowa składnia gzsig

$ gzsig
Usage: gzsig sign [-q] [-f secret_file] privkey [file ...]
Usage: gzsig verify [-q] [-f secret_file] pubkey [file ...]

Podpisanie pliku gz

Do podpisania archiwum użyjemy narzędzia gzsig oraz klucza prywatnego RSA-GZsig. Należy podać to samo hasło, które było użyte podczas generowania klucza.

$ gzsig sign RSA-GZSig plik.gz
Enter passphrase:
Signed plik.gz

Weryfikacja pliku gz

Prawidłowa weryfikacja

Do weryfikacji archiwum również użyjemy narzędzia gzsig oraz klucza publicznego RSA-GZsig.pub

$ gzsig verify RSA-GZSig.pub plik.gz
Verified plik.gz

Brak podpisu w archiwum

W przypadku kiedy archiwum nie zostało podpisane otrzymamy komunikat o treści:

$ gzsig verify RSA-GZSig.pub acx-firmware-1.4.tgz
No gzip signature found

Błędna weryfikacja

Natomiast jeśli archiwum zostało zmienione otrzymamy komunikat o treści:

$ gzsig verify RSA-GZSig.pub acx-firmware-1.4.tgz
RSA verification failed
Error verifying signature
Couldn't verify acx-firmware-1.4.tgz

Linki

gzsig man
ssh-keygen man

Prosty serwer ‘WWW’

Ciężko to nazwać serwerem, ale jeśli potrzebujemy szybko udostępnić jakiś plik możemy użyć tego sposobu.

# while true; do cat .profile | nc -l 9999; done

Do chwili przerwania polecenia (Ctrl-C), na porcie nr 9999 będzie udostępniany plik .profile.

Lista dysków w OpenBSD

Jeśli chcesz sprawdzić jakie dyski zostały wykryte przez system można użyć komendy sysctl.

Od wydania OpenBSD 4.9, oprócz nazwy dysku (wd0) jest podawany DUID (disklabel UID)

# sysctl hw.disknames
hw.disknames=wd0:0a0e3090f31542fb

Wcześniejsze wersje OpenBSD

# sysctl hw.disknames
hw.disknames=wd0,wd1