Usługa biff

Usługa biff służy do powiadamiania użytkowników o przychodzącej poczcie. Kiedy użytkownik jest zalogowany na konsoli systemowej zostanie dostarczona mu informacja. że dostał pocztę. Usługa jest uruchamiana poprzez inetd działa używając protokołu UDP na porcie 512. W OpenBSD serwerem usługi biff jest comsat. Żeby do użytkownika były dostarczane wiadomości musi się on na to zgodzić wykonując polecenie:

$ biff y

Przykład powiadomienia o przychodzącej poczcie.

New mail for root@foo.bar.com has arrived:
----
From: rtfm 
Subject: alkdfjaldkfj
sdlifaslfdajd

----

Porównanie dwóch katalogów

Pewnie kiedyś zastanawialiście się nad tym jak porównać zawartość dwóch katalogów, z pomocą przychodzi polecenie diff. Pokażę w kilku przykładach co możemy uzyskać za pomocą tego polecenia.

Przygotowanie
Na początek stworzymy dwa katalogi temp1 oraz temp2, katalog temp1 będzie zawierał, takie pliki: 1, 2, 3, 4, natomiast temp2 będzie zawierał pliki: 2, 4, 5, 6. Plik temp1/1 będzie zawierał znak '1', natomiast plik temp2/1 będzie zawierał znak '2'. W obydwu katalogach będą znajdowały się podkatalogi subdir w podkatalogu subdir katalogu temp2 utworzymy plik 9.

$ mkdir -p {temp1/subdir,temp2/subdir}
$ touch temp1/{1,2,3,4}
$ touch temp2/{2,4,5,6,subdir/9}
$ echo '1' > temp1/1
$ echo '2' > temp2/2

Porównanie dwóch katalogów i wyświetlenie różnic pomiędzy plikami

$ diff temp1 temp2
Only in temp1: 1
diff temp1/2 temp2/2
0a1
> 2
Only in temp1: 3
Only in temp2: 5
Only in temp2: 6
Common subdirectories: temp1/subdir and temp2/subdir

Inny format diff można uzyskać za pomocą parametru -u

$ diff -u temp1 temp2
Only in temp1: 1
diff -u temp1/2 temp2/2
--- temp1/2     Mon Dec 19 07:53:45 2011
+++ temp2/2     Mon Dec 19 07:54:13 2011
@@ -0,0 +1 @@
+2
Only in temp1: 3
Only in temp2: 5
Only in temp2: 6
Common subdirectories: temp1/subdir and temp2/subdir

Urzywając parametru -q uzyskamy tylko informacje o tym które pliki różnią się od siebie.

$ diff -q temp1 temp2
Only in temp1: 1
diff -q temp1/2 temp2/2
Files temp1/2 and temp2/2 differ
Only in temp1: 3
Only in temp2: 5
Only in temp2: 6
Common subdirectories: temp1/subdir and temp2/subdir

Porównanie rekursywne katalogów
Jak widać, w powyższych przykładach, żaden z wyników nie zawiera wzmianki na temat pliku temp2/subdir/9, dzieje się tak dlatego, że polecenie diff nie przetwarza podkatalogów. Żeby zmusić diff do przetwarzania podkatalogów należy użyć parametru -r.

$ diff -qr temp1 temp2
Only in temp1: 1
diff -qr temp1/2 temp2/2
Files temp1/2 and temp2/2 differ
Only in temp1: 3
Only in temp2: 5
Only in temp2: 6
Only in temp2/subdir: 9

Porównanie rekursywne katalogów oraz wyświetlenie różnic pomiędzy plikami
Polecenie diff pokaże różnice pomiędzy plikami oraz katalogami uwzględniając podkatalogi.

$ diff -qur temp1 temp2
Only in temp1: 1
diff -qur temp1/2 temp2/2
--- temp1/2     Mon Dec 19 07:53:45 2011
+++ temp2/2     Mon Dec 19 07:54:13 2011
@@ -0,0 +1 @@
+2
Only in temp1: 3
Only in temp2: 5
Only in temp2: 6
Only in temp2/subdir: 9

Linki

ThinClient Fujitsu Siemens FUTRO S400 i OpenBSD

Z okazji wydania OpenBSD 5.0, nabyłem drogą kupna terminal Fujitsu Siemens Futro S400 z przeznaczeniem na domowy serwer. Obecnie znajdują się na nim takie usługi jak: DHCP, lokalny DNS, SSH, WWW, SAMBA, FTP, w chwili obecnej urządzenie jest wyposażone w jeden interfejs sieciowy, więc na razie nie będzie ono działało jako ruter, ani Access Point, czego nie wykluczam w przyszłości. System jest zainstalowany na karcie CF, a dodatkowo jest podłączony dysk USB 2.5″ 250GB, na którym znajdują się katalogi /usr, /var/ oraz /home.

Wewnątrz urządzenia znajduje się standardowe złącze IDE 40pin. Używając odpowiedniego adaptera, możemy zainstalować dysk PATA 2.5″, niestety nie posiadam takiego dysku, dlatego też dysk podłączony do portu USB.

OpenBSD zainstalowałem używając Pendrive USB, niestety nie udało mi się uruchomić systemu z zewnętrznego dysku USB 2.5″. Instalację możemy również przeprowadzić używając sieci LAN.

Jednym z ciekawszych rozwiązań jakie możemy znaleźć, to chłodzenie procesora. Ciepło wytwarzane przez procesor jest rozprowadzane po obudowie urządzenia. Innym udogodnieniem jest włączenie i wyłączenie urządzenia za pomocą kombinacji klawiszy Ctrl+Alt+Backspace.

Teraz kilka słów na temat samego urządzenia.

Specyfikacja: ThinClient Fujitsu Siemens FUTRO S400
Procesor: AMD Geode™ NX 1500@6W - 1000MHz
BIOS: Phoenix-Award
Pamięć RAM: 256MB DDR SO-DIMM
Grafika/Chipset: SiS 963L / SiS 741CX
Interfjes LAN: Realtek 8169 10/100/1000 Mbit/s Fast Ethernet PXE
Złącze IDE 40pin
Slot kart CompactFlash
Złącze PCI (maksymalna długość karty to 155mm)
Port LPT
Port RS232
4 złącza USB
Audio In/Out
Wyjście VGA D-SUB
Mysz PS/2
Klawiatura PS/2
Wymiary: 246 x 68 x 177
Waga: około 1,5kg
Zewnętrzny zasilacz 12V, 5.0A (60W)

Zużycie energii
Maksymalne27W
Średnie18W
Minimalne3.8W

Wydruk dmesg

# dmesg
OpenBSD 5.0 (GENERIC) #43: Wed Aug 17 10:10:52 MDT 2011
    deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: AMD Athlon(tm) Processor ("AuthenticAMD" 686-class, 256KB L2 cache) 1.01 GHz
cpu0: FPU,V86,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE
real mem  = 234352640 (223MB)
avail mem = 220483584 (210MB)
mainbus0 at root
bios0 at mainbus0: AT/286+ BIOS, date 05/14/08, BIOS32 rev. 0 @ 0xfaa30, SMBIOS rev. 2.2 @ 0xf0000 (31 entries)
bios0: vendor Phoenix Technologies, LTD version "6.00PG Rev. 4.00.0Q" date 05/14/2008
bios0: FUJITSU SIEMENS FUTRO S400
apm0 at bios0: Power Management spec V1.2 (slowidle)
acpi at bios0 function 0x0 not configured
pcibios0 at bios0: rev 2.1 @ 0xf0000/0xc794
pcibios0: PCI IRQ Routing Table rev 1.0 @ 0xfc6f0/144 (7 entries)
pcibios0: PCI Exclusive IRQs: 3 5 9 10 11 15
pcibios0: PCI Interrupt Router at 000:02:0 ("SiS 85C503 System" rev 0x00)
pcibios0: PCI bus #1 is the last bus
bios0: ROM list: 0xc0000/0xc000 0xcc000/0x4000! 0xd0000/0x1000 0xef000/0x1000!
cpu0 at mainbus0: (uniprocessor)
pci0 at mainbus0 bus 0: configuration mode 1 (bios)
pchb0 at pci0 dev 0 function 0 "SiS 741 PCI" rev 0x03
sisagp0 at pchb0
agp0 at sisagp0: aperture at 0xe8000000, size 0x4000000
ppb0 at pci0 dev 1 function 0 "SiS 86C202 AGP" rev 0x00
pci1 at ppb0 bus 1
vga1 at pci1 dev 0 function 0 "SiS 6330 VGA" rev 0x00
wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
pcib0 at pci0 dev 2 function 0 "SiS 85C503 System" rev 0x25
pciide0 at pci0 dev 2 function 5 "SiS 5513 EIDE" rev 0x00: 741: DMA, channel 0 configured to compatibility, channel 1 configured to compatibility
wd0 at pciide0 channel 0 drive 0:
wd0: 16-sector PIO, LBA48, 57231MB, 117210240 sectors
wd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2
pciide0: channel 1 ignored (disabled)
auich0 at pci0 dev 2 function 7 "SiS 7012 AC97" rev 0xa0: irq 10, SiS7012 AC97
ac97: codec id 0x414c4770 (Avance Logic ALC203 rev 0)
ac97: codec features headphone, 20 bit DAC, 18 bit ADC, No 3D Stereo
audio0 at auich0
ohci0 at pci0 dev 3 function 0 "SiS 5597/5598 USB" rev 0x0f: irq 9, version 1.0, legacy support
ohci1 at pci0 dev 3 function 1 "SiS 5597/5598 USB" rev 0x0f: irq 3, version 1.0, legacy support
ehci0 at pci0 dev 3 function 3 "SiS 7002 USB" rev 0x00: irq 5
ehci0: timed out waiting for BIOS
usb0 at ehci0: USB revision 2.0
uhub0 at usb0 "SiS EHCI root hub" rev 2.00/1.00 addr 1
re0 at pci0 dev 9 function 0 "Realtek 8169" rev 0x10: RTL8169/8110SB (0x1000), irq 15, address 00:90:dc:07:3d:c1
rgephy0 at re0 phy 7: RTL8169S/8110S PHY, rev. 3
isa0 at pcib0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
pckbc0 at isa0 port 0x60/5
pckbd0 at pckbc0 (kbd slot)
pckbc0: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard, using wsdisplay0
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
lpt0 at isa0 port 0x378/4 irq 7
wbsio0 at isa0 port 0x2e/2: W83697HF rev 0x12
lm1 at wbsio0 port 0x290/8: W83697HF
npx0 at isa0 port 0xf0/16: reported by CPUID; using exception 16
usb1 at ohci0: USB revision 1.0
uhub1 at usb1 "SiS OHCI root hub" rev 1.00/1.00 addr 1
usb2 at ohci1: USB revision 1.0
uhub2 at usb2 "SiS OHCI root hub" rev 1.00/1.00 addr 1
mtrr: Pentium Pro MTRR support
vscsi0 at root
scsibus0 at vscsi0: 256 targets
softraid0 at root
scsibus1 at softraid0: 256 targets
root on wd0a (6033a1aca10172d8.a) swap on wd0b dump on wd0b

sysctl hw

# sysctl hw
hw.machine=i386
hw.model=AMD Athlon(tm) Processor ("AuthenticAMD" 686-class, 256KB L2 cache)
hw.ncpu=1
hw.byteorder=1234
hw.pagesize=4096
hw.disknames=wd0:8b2f62e6f9ae5c18,sd0:673638487314ab73,sd1:
hw.diskcount=3
hw.sensors.lm1.volt0=0.00 VDC (VCore)
hw.sensors.lm1.volt1=0.00 VDC (+3.3V)
hw.sensors.lm1.volt2=4.97 VDC (+5V)
hw.sensors.lm1.volt3=0.00 VDC (+12V)
hw.sensors.lm1.volt4=-14.91 VDC (-12V)
hw.sensors.lm1.volt5=-7.71 VDC (-5V)
hw.sensors.lm1.volt6=4.92 VDC (5VSB)
hw.sensors.lm1.volt7=3.25 VDC (VBAT)
hw.cpuspeed=1001
hw.vendor=FUJITSU SIEMENS
hw.product=FUTRO S400
hw.serialno=LSD04345
hw.uuid=22428976-3515-2242-3333-00121288ee8g
hw.physmem=251129856
hw.usermem=251117568
hw.ncpufound=1
hw.allowpowerdown=1

Lista interfejsów sieciowych

Przy pomocy polecenia ifconfig możemy otrzymać informację na temat dostępnych interfejsów sieciowych, oraz ich konfiguracji, żeby uzyskać ich listę trzeba posłużyć się kilkoma dodatkowymi poleceniami. W OpenBSD po instalacji jest skonfigurowanych kilka specjalnych interfejsów sieciowych są to: lo0, enc0 oraz pflog0, listę interfejsów specjalnych możemy znaleźć na stronie http://www.openbsd.org/faq/faq6.html#Setup.if są to: lo, pflog, enc, sl, ppp, tun, bridge, vlan, svlan, gre, gif, carp, mpe, vether. Możemy je wszystkie wykluczyć lub tylko te, które obecnie są skonfigurowane.

$ ifconfig | egrep -v '^[[:space:]]|(enc|lo|pflog)[[:digit:]]+:' | sed -ne 's/^\(.*\):.*/\1/p'
re0
xl0

OpenBSD 5.0 wydane

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

Wyłączenie urządzenia w binarnym jądrze systemu

Parametry jądra OpenBSD możemy zmieniać bez ponownej kompilacji. Właśnie dziś okazało się, że po instalacji OpenBSD-current, gładzik w moim Netbooku powoduje wysyp mnóstwa komunikatów (pms0: not in sync yet, discard input), a na domiar złego działa jak pijana mysz. Zupełnie nie zależy mi na używaniu gładzika, ponieważ moim głównym urządzeniem wskazującym jest mysz komputerowa, postanowiłem wyłączyć to ustrojstwo.

Przy pomocy polecenia config przeszedłem do trybu UKC – User Kernel Config. Następnie wyłączyłem niepotrzebne urządzenie, w tym przypadku pms i opuściłem UKC. Zmiany w jądrze były widoczne po restarcie systemu. Jeśli eksperymentujemy i nie do końca wiemy jak zachowa się system po restarcie, lepiej przetestować jądro zanim ustawimy je na stałe.

# config -e -o bsd.new /bsd

Nowo skonfigurowane jądro zostanie zapisane w pliku bsd.new, tak więc należy je uruchomić wywołując nazwę jądra przy starcie.

boot> boot bsd.new

Wyłączenie urządzenia pms

Wyłączenie urządzenia pms nie stanowi dużego zagrożenia dla systemu, wprowadziłem zmiany na działającym jądrze bez wykonania kopii.

# config -ef /bsd
OpenBSD 5.0-current (GENERIC.MP) #108: Mon Oct 24 18:10:16 MDT 2011
    deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC.MP
Enter 'help' for information
ukc> disable pms
324 pms* disabled
ukc> quit
Saving modified kernel.

Teraz wystarczy uruchomić system ponownie, a urządzenie pms nie powinno już działać.

Problemy?

Jeśli jednak coś pójdzie nie tak, czyli przekombinowaliśmy, to przy starcie systemu należy wejść do UKC i cofnąć zmiany. Jednak podczas startu systemu naniesione zmiany nie zostaną zapisane, tak więc po poprawnym uruchomieniu systemu, używając UKC, należy je ponownie wprowadzić i zapiać.
Przejście do UKC podczas startu systemu:

boot> boot bsd -c

Linki

Monitorowanie zajętości partycji

Skrypt capacity.sh sprawdza wszystkie podłączone partycje i jeśli zajętość którejś z nich przekroczy wartość parametru max wyświetla komunikat.

#!/bin/ksh

max=85

for disc in $(df | awk '{ print $6 }' | sed '1d'); do
   capacity=$(df $disc | sed '1d' | awk '{ print $5 }' | tr -cd [[:digit:]])
   if [ $capacity -gt $max ]; then
      echo UWAGA! Partycja \"$disc\" jest zajęta w $capacity procentach.
   fi
done

Przykład użycia skryptu z ustawionym parametrem max=3

./capacity.sh
UWAGA! Partycja "/" jest zajęta w 7 procentach.
UWAGA! Partycja "/usr" jest zajęta w 25 procentach.

Bezpieczne testowanie reguł firewalla

Testowanie firewalla niesie ze sobą pewne zagrożenia. Przy przeładowaniu reguł może okazać się, że coś przeoczyliśmy i zostaniemy odcięci od maszyny. W przypadku maszyn produkcyjnych taka sytuacja jest niedopuszczalna. Jeśli jednak jesteśmy zmuszeni pracować w środowisku produkcyjnym, to z pomocą przychodzą nam takie polecenia jak at, atq, atrm.

Zanim wypróbujemy testowy zestaw reguł, stworzymy zadanie przywrócenia wersji stabilnej po 5 minutach. W ten sposób zostaną załadowane reguły z pliku /etc/pf.conf po 5 minutach od uruchomienia polecenia.

# echo "/sbin/pfctl -f /etc/pf.conf" -r now | at + 5 minutes
commands will be executed using /bin/ksh
job 1318160880.c at Sun Oct  9 13:48:00 2011

Po uruchomieniu polecenia program zwróci nam numer zadania w tym przypadku to 1318160880.c, jest on potrzebny żeby usunąć zadanie. Listę zadań możemy uzyskać za pomocą polecenia atq

# atq
 Rank     Execution Date     Owner          Job       Queue
  1st   Oct  9, 2011 13:48   root       1318160880.c   c

Teraz możemy załadować nowy zestaw reguł zapisany w pliku /etc/pf.conf.new.

# pfctl -f /etc/pf.conf.new

Jeśli stwierdzimy że wszystko działa poprawnie, możemy usunąć zadanie przywrócenia oryginalnych reguł. Użyjemy do tego polecenia atrm.

# atrm 1318160880.c
1318160880.c removed

Linki

Serwer czasu w OpenBSD

Serwer NTPD umożliwia dystrybucję czasu w sieci. System OpenBSD posiada własną implementację tego protokołu o nazwie OpenNTPD.

Ustawienie strefy czasowej

Konfigurację serwera NTP zaczniemy od ustawienia poprawnej strefy czasowej.
Strefa czasowa jest zapisana w pliku /etc/localtime

# ls -l /etc/localtime
lrwxr-xr-x  1 root  wheel  35 Jul  4 11:09 /etc/localtime -> /usr/share/zoneinfo/Canada/Mountain

Jak widać jest to link do pliku Canada/Mountain, jeśli chcemy ustawić Polską strefę czasową, należy stworzyć odpowiedni link do pliku /usr/share/zoneinfo/Poland.

# ln -sf /usr/share/zoneinfo/Poland /etc/localtime
# ls -l /etc/localtime
lrwxr-xr-x  1 root  wheel  26 Jul 23 08:04 /etc/localtime -> /usr/share/zoneinfo/Poland

Konfiguracja

Plikiem konfiguracyjnym dla NTPD jest /etc/ntpd.conf. Serwer NTPD standardowo nie nasłuchuje na żadnym interfejsie, można to zmienić ustawiając zmienną listen, ustawienie wartości zmiennej na znak * spowoduje, że serwer będzie nasłuchiwał na wszystkich interfejsach sieciowych, możemy też określić adres IP na którym ma nasłuchiwać usługa:

listen on 192.168.0.1

Do synchronizacji możemy użyć pojedynczego serwera czasu lub puli serwerów. (server, servers), w przypadku kiedy chcemy użyć pojedynczego serwera do synchronizacji należy go określić po parametrze servers bez s ;)

Użycie puli serwerów

servers pl.pool.ntp.org

Użycie pojedynczego serwera

server tempus1.gum.gov.pl

Przykładowa konfiguracja zapisana w pliku /etc/ntpd.conf

listen on *
servers pl.pool.ntp.org

Uruchomienie NTPd przy starcie systemu

Uruchamiamy usługę ntpd z parametrem -s, zsynchronizuje czas z serwerem przy starcie usługi ntpd, dzięki czemu możemy pominąć synchronizację za pomocą rdate.

Start usługi NTPD wraz z systemem będzie możliwy po dodaniu do pliku /etc/rc.conf.local wpisu:

ntpd_flags="-s"

Linki

Konfiguracja Wi-Fi w trybie access point

Do uruchomienia Wi-Fi w trybie AP wykorzystałem starą kartę USB Linksys WUS854G ver.4 (WUS854GV4). Jest ona wykrywana jako ural. Jedna uwaga, zanim kupisz kartę upewnij się, że jest ona oparta o układ który umożliwia ustawienie jej w trybie Host AP. Jest to o tyle trudne, że producenci sprzętu rzadko chwalą się co jest w środku, a developerzy OpenBSD nie są w stanie przetestować każdej nowej wersji karty, który pojawia się na rynku. Dobrym przykładem jest karta TP-Link WN321G, która według man rum powinna posiadać układ RT2601USB, ale np. wersja 3 lub 3.1 posiada całkowicie inny układ i jest wykrywana jako run.

Przejdźmy do konfiguracji naszego interfejsu sieciowego. Konfigurację zapisujemy w pliku /etc/hostname.ural0, poniższe ustawienia nadają karcie adres IP 192.168.6.231/24, klucz WPA to testowo999, nazwa sieciowa OpenBSD i pracuje na kanale nr 12.

inet 192.168.6.231 255.255.255.0 NONE media autoselect \
wpakey testowo999 mediaopt hostap nwid OpenBSD chan 12

Teraz należy uruchomić interfejs ural0, co powinno stworzyć nam nową sieć widoczną jako OpenBSD.

# sh /etc/netstart ural0

Linki

Archiwizacja podkatalogów

Skrypt przetwarza podkatalogi w bieżącej lokalizacji, tworząc archiwa tar.gz a następnie usuwa przetworzony podkatalog.

#!/bin/ksh

for i in $(ls -A)
do
   if [ -d "$i" ]; then
      echo "Przetwarzam: $i"
      tar -czf "$i.tgz" "$i"
      echo " Usuwam: $i"
      rm -rf "$i"
   fi
done

 

CVS i SSH

Pobranie plików z repozytorium używając protokołu SSH wymaga ustawienia dwóch zmiennych CVS_RSH oraz CVSROOT.

$ export CVS_RSH=ssh
$ export CVSROOT=użytkownik@serwer.org:/ścieżka/do/repozytorium
$ cvs co moduł
użytkownik@serwer.org's password:

Możemy pominąć ustawienie tych dwóch zmiennych i samodzielnie wpisać całość polecenia CVS:

$ cvs -d :ext:użytkownik@serwer.org:/ścieżka/do/repozytorium co moduł

Jeśli używamy innego portu SSH, niż standardowy 22, należy dodać w pliku .ssh/config numer portu na który ma się łączyć klient SSH.

Host serwer.org
   Port 1234
   User cvs

Dystrybucja kluczy SSH

Generowanie klucza SSH

Zacznę od wygenerowania pary kluczy, za pomocą polecenia ssh-keygen. Polecenie możemy uruchomić bez podawania parametrów, jego wynikiem będą dwa pliki: .ssh/id_rsa oraz .ssh/id_rsa.pub, są to klucz prywatny i klucz publiczny. To właśnie klucz publiczny musimy wysłać na zdalną maszynę, żeby zalogować się do systemu używając wygenerowanej pary kluczy.

Do zabezpieczenia klucza prywatnego możemy użyć przepustki, jest to rodzaj hasła, które będzie wymagane przy próbie użycia klucza. O przepustkę zostaniemy zapytani podczas generowania kluczy Enter passphrase (empty for no passphrase):.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/red/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/red/.ssh/id_rsa.
Your public key has been saved in /home/red/.ssh/id_rsa.pub.
The key fingerprint is:
05:ca:86:35:41:0b:00:dd:d9:38:70:b7:b3:85:3f:b1 red@wrap
The key's randomart image is:
+--[ RSA 2048]----+
|.oo+o=*..        |
|  ..=*.* .       |
|    ..O o .      |
|     . = +       |
|      . E        |
|         .       |
|                 |
|                 |
|                 |
+-----------------+

Skrypt ssh-klucze.sh

Plik .ssh/id_rsa.pub należy wysłać na serwery gdzie będziemy się logować, do tego stworzyłem prosty skrypt.

W skrypcie należy zwrócić uwagę, na dwie linie zawierające polecenie cat - > .ssh/authorized_keys, gdzie użyty jest znak > przekierowujący potok, jego użycie spowoduje zastąpienie pliku .ssh/authorized_keys. Jeśli nie chcemy, aby ten plik został nadpisany, należy użyć dwóch znaków >>, wtedy do pliku authorized_keys zostanie dodany nowy klucz.

Skrypt sprawdza czy został podany parametr, jeśli parametr istnieje to wysyła klucz na podany adres, w innym przypadku zostanie użyta lista hostów znajdująca się w pliku ssh-klucze.txt.

Plik ssh-klucze.txt, może wyglądać tak:

użytkownik@sdf.org
serwer-ssh.org -p 1234

Wysłanie klucza do pojedynczego hosta

$ ./ssh-klucze.sh user@192.168.6.66 -p 443

Skrypt ssh-klucze.sh

#!/bin/ksh

if [ ! -f ~/.ssh/id_rsa.pub ]; then
   echo "Brak klucza publicznego (~/.ssh/id_rsa.pub)."
   echo "Użyj polecenia ssh-keygen"
   exit
fi

if [ "$1" ]; then
   cat .ssh/id_rsa.pub | ssh $@ "if [ ! -d ~/.ssh ]; then mkdir ~/.ssh; \
   chmod 700 ~/.ssh; fi; cat - > .ssh/authorized_keys; \
   chmod 600 ~/.ssh/authorized_keys"
else
   cat ssh-klucze.txt | while read hostname; do
      echo "Wysylam klucz na: $hostname"
      cat .ssh/id_rsa.pub | ssh $hostname "if [ ! -d ~/.ssh/ ]; \
      then mkdir ~/.ssh; chmod 700 ~/.ssh; fi; cat - > .ssh/authorized_keys; \
      chmod 600 ~/.ssh/authorized_keys"
   done
fi

Agent SSH

Program ssh-agent przechowuje klucz prywatny i nie trzeba każdorazowo podawać przepustki.

$ eval $(ssh-agent); ssh-add
Agent pid 268
Enter passphrase for /home/red/.ssh/id_rsa:
Identity added: /home/red/.ssh/id_rsa (/home/red/.ssh/id_rsa)

Linki

Zabezpieczenie trybu single user hasłem

Startując system w trybie Single user (boot -s), mamy pełny dostęp do systemu bez podawania hasła użytkownika root. Możemy się przed tym zabezpieczyć poprzez edycję pliku /etc/ttys. W linii zaczynającej od console usuwamy słowo secure.

console "/usr/libexec/getty std.9600"   vt220   off secure

Linki

Synchronizacja czasu w OpenBSD

Poprawna data systemowa jest bardzo ważna zarówno w przypadku serwerów jak i stacji roboczych. Dzięki Network Time Protocol (NTP) możemy synchronizować datę swojego systemu z serwerem czasu. Do synchronizacji czasu służy polecenie rdate.

Manualna synchronizacja czasu

# rdate -nv 0.pl.pool.ntp.org
Sun Jun 12 08:24:10 CEST 2011
rdate: adjust local clock by 0.027733 seconds

Automatyczna synchronizacja czasu

W celu zautomatyzowania zadania synchronizacji czasu użyjemy usługi cron. W poniższych przykładach system synchronizuje datę codziennie o godzinie 8:14.

Edytujemy zadania crona i dodajemy następującą linię

# crontab -e
8 14 * * * /usr/sbin/rdate -nv 0.pl.pool.ntp.org > /dev/null 2>&1 | logger -t NTP "Synchronizacja czasu `date`"

Do loggera zostanie przekazany następujący komunikat

# tail /var/log/messages
Jun 12 08:24:53 wrap NTP: Synchronizacja czasu Sun Jun 12 08:24:53 CEST 2011

Jeśli chcemy, aby do loggera został przekazany oryginalny komunikat rdate wystarczy nieco zmodyfikować zadanie crona

# crontabl -e
8 14 * * * /usr/sbin/rdate -nv 0.pl.pool.ntp.org | logger -t NTP

Efektem jest taki wpis:

# tail /var/log/messages
Jun 12 08:25:39 wrap NTP: Sun Jun 12 08:25:38 CEST 2011
Jun 12 08:25:39 wrap NTP: rdate: adjust local clock by 0.001178 seconds

Linki