Archiwum z Sierpień 2008

Zmiana profilu na LinkedIn

poniedziałek, 11 Sierpień 2008

Na razie drobna, wkrótce więcej…

Bezpieczne połączenia z MySQL (C API)

niedziela, 10 Sierpień 2008

Ostatnio coraz więcej kodu w C piszę z użyciem MySQL API, a że dane przy jednym z projektów są poufne i serwer nie jest lokalny, przyjrzałem się połączeniom SSL. W zasadzie po stronie kodu to nic wielkiego – wystarczy wywołać mysql_ssl_set() przed mysql_real_connect() (mysql_connect() jest deprecated). Oczywiście pod warunkiem, że klient jest skompilowany ze wsparciem OpenSSL (lub yaSSL, ale nigdy nie testowałem).

Uruchomienie samego serwera (również przy założeniu, że skompilowany ze wsparciem SSL) sprowadza się do podania dodatkowych parametrów w linii komend. Przykładowo może to wyglądać tak:

mysqld --defaults-file=/etc/mysql/my.cnf --ssl --ssl-ca=</path/to/CA.crt> --ssl-cert=</path/to/file.crt> --ssl-key=</path/to/file.key>

Ewentualnie odpowiednie parametry podać w pliku konfiguracyjnym (my.cnf):

ssl-ca = </path/to/CA.crt>
ssl-cert =</path/to/file.crt>
ssl-key =</path/to/file.key>

Pamiętać należy, że w przypadku, gdy certyfikat jest zabezpieczony hasłem, MySQL może być jedynie uruchomiony ręcznie. Korzystając ze skryptów startowych (na pewno w Gentoo Linux) czy nawet wrzucając proces w tło (&) serwer nie skorzysta z certyfikatu i nie nawiążemy szyfrowanej transmisji. Próba takiego uruchomienia zakończy się podobnym wpisem w logach:

[Warning] Failed to setup SSL

Testowe połączenie do serwera z konsoli mysql możemy wykonać podając jedynie ścieżkę do certyfikatu CA (format PEM), np.

mysql -h <host> -u <user> -p --ssl-ca=</path/to/CA.crt> <database>

Wywołując STATUS możemy sprawdzić czy bieżące połączenie ma wsparcie SSL:

SSL:            Cipher in use is DHE-RSA-AES256-SHA

czy też nie:

SSL:            Not in use

Wymuszanie szyfrowanych połączeń możliwe tylko poprzez REQUIRE SSL przy nadawaniu praw użytkownikowi (GRANT). W takim przypadku połączenie bez SSL zakończy się komunikatem podobnym jak w przypadku np. podania błędnego hasła:

ERROR 1045 (28000): Access denied for user 'exg'@'192.168.1.101' (using p assword: YES)

Więcej o używaniu SSL w MySQL można poczytać tutaj:

Wracając do samej funkcji mysql_ssl_set(), to jako parametry przyjmuje: uchwyt połączenia zwrócony przez mysql_init(), ścieżkę do pliku klucza, certyfikatu i certyfikatu CA oraz ścieżkę do katalogu z certyfikatami CA w formacie PEM, a także listę wspieranych algorytmów.
Nieużywane parametry powinny przyjmować wartość NULL.
Funkcja zawsze zwraca 0, o błędach SSL informuje mysql_real_connect().

ERROR 2026 (HY000): SSL connection error

Na koniec łyżka dziegciu – libmysql (i klient mysql) dla Windows (ten z binarnej paczki) nie jest skompilowany z obsługą SSL. Aby korzystać z bezpiecznych połączeń należy pobrać źródła i samodzielnie dokonać kompilacji. Mi się nie udało… Może przez zbyt stare Visual C++.

Zamieszanie z DNS

piątek, 8 Sierpień 2008
bsk.com.pl

bsk.com.pl

Zrobiło się ostatnio trochę szumu wokół DNS za sprawą Dana Kaminskiego. Więcej, prócz wpisów w jego blogu, można poczytać tutaj:

IANA udostępniła narzędzie, dzięki któremu możemy sprawdzić czy jesteśmy bezpieczni czy nie. Technicznie ten test wygląda mniej więcej tak (linie nieparzyste pytania, linie parzyste – odpowiedzi):

1: [udp sum ok] 59142 [1au] NS? DOMAIN.TLD. ar: . OPT UDPsize=4096 (40) (DF) (ttl
    52, id 0, len 68)
2: 59142*- q: NS? DOMAIN.TLD. 2/0/3 DOMAIN.TLD. NS[|domain] (ttl 63, id 45373, len
    154)
3: [udp sum ok] 29369+ SOA? iana.org. (26) (DF) (ttl 52, id 0, len 54)
4: [udp sum ok] 29369 ServFail- q: SOA? iana.org. 0/0/0 (26) (ttl 63, id 0, len 54)
5: [udp sum ok] 62488+ SOA? iana.org. (26) (DF) (ttl 52, id 0, len 54)
6: 62488- q: SOA? iana.org. 0/5/3 ns: iana.org. NS[|domain] (ttl 63, id 45375, len
    218)

Konwersacja z moim pierwszym serwerem (linie 3 i 4) kończy się odpowiedzią SERVFAIL, z drugim (linie 5 i 6) – iana.org has no SOA record. Pierwszy to bind 9.3.5, drugi – PowerDNS 2.9.21. Oba mają wyłączone rekursywne zapytania. W przypadku bind:

allow-recursion { 127.0.0.1; };

PowerDNS to:

allow-recursion=127.0.0.1/8

Wobec czego możemy się pocieszyć komunikatem:

Safe.

The servers tested for DOMAIN.TLD are not vulnerable to cache poisoning.

djbdns (w wersji 1.05) nie odpowiada w ogóle na takie ‘zaczepki’ i IANA uznaje, że Appears to not respond to recursive lookups.

Supermicro Extended Power Connector

wtorek, 5 Sierpień 2008

Próbowałem rozbudować dwa serwery – pierwszy z płytą Supermicro X6DHE-G2+, drugi z Intel Entry Server Board SE7230NH1-E. Oba w obudowach Chenbro RM21400 rev. B.

Do pierwszej płyty zamówiłem (w HDD-Komputer) riser card Supermicro CSE-RR2UE-AX. Liczyłem, że do drugiej również uda mi się ją wsadzić. Niestety. Karta posiada złącze oznaczone jako SEPC (Supermicro Extended Power Connector). Nie ma żadnej konkretnej ogólnodostępnej dokumentacji na stronach Supermicro do tego złącza, ale jak nazwa mówi, jest to dodatkowe zasilanie. I pewnie z racji tego, że karta jest aktywna (PCI Express x8 -> 3 x PCI-X), bez podłączenia do odpowiedniego gniazda nie zadziała. Ot taki wymysł Supermicro…

Supermicro CSE-RR2UE-AX

Supermicro CSE-RR2UE-AX

Popsuty ifconfig w OpenBSD -current

piątek, 1 Sierpień 2008

Coś nie działa jak ma działać:

[root@bastard-bis ~]# ifconfig em0 inet
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr 00:15:17:0b:c9:ba
groups: egress
media: Ethernet autoselect (1000baseT full-duplex)
status: active
inet 172.17.3.2 netmask 0xfffffffc broadcast 172.17.3.3
inet A.B.C.9 netmask 0xfffffc00 broadcast A.B.E.255

Czyli widzimy tylko dwa adresy. No to dodajmy kolejny alias:

[root@bastard-bis ~]# ifconfig em0 alias A.B.C.108/32
ifconfig: SIOCAIFADDR: File exists

Usługi mogą nasłuchiwać na adresie, którego `nie ma’.
Po restarcie wszystko poszło jak powinno. Prawdopodobnie w ten sposób doprowadziłem do tego:

  • uruchomienie maszyny (konfiguracja interfejsów przy starcie, włączenie usług sieciowych),
  • ifconfig em0 -alias A.B.C.108,
  • ręczna konfiguracja sieci (sh /etc/netstart lub ifconfig em0 alias A.B.C.108) – zakończone błędem.

Wygląda na to, że nie chce to działać przez usługi, które zbindowane były do tego adresu. Nie mam chęci / czasu, by drążyć temat, niemniej udało mi się zasymulować taką sytuację i po zabiciu wszystkich demonów, które mogły słuchać na tym adresie, alias został dodany.

# relayctl stop

piątek, 1 Sierpień 2008

[root@bastard-bis ~]# relayctl stop
command failed

Podobnie było z reload. Zanim zaczęło w ogóle działać, relayctl wyświetlał, że opcja jest możliwa. Byłbym szczęśliwy, gdyby stop było reakcją na moje request for feature. Podręcznik systemowy na razie milczy na ten temat.
Dla jasności:

[root@bastard-bis ~]# uname -sr
OpenBSD 4.4

Testy „na szybko” pokazały, że nawet przy wszystkich hostach niedostępnych relayd nie przestaje działać! Daję mu tydzień i wyrzucam LVS + Keepalived :-)

Aug  1 01:31:10 bastard-bis relayd[14496]: host 10.0.25.249, check send expect (0ms), state up -> down, availability 98.33%
Aug  1 01:31:10 bastard-bis relayd[14496]: host 10.0.25.249, check tcp use ssl (1ms), state up -> down, availability 98.33%
Aug  1 01:31:15 bastard-bis relayd[14496]: host 10.0.25.247, check send expect (210ms), state up -> down, availability 91.80%
Aug  1 01:31:15 bastard-bis relayd[14496]: host 10.0.25.247, check tcp use ssl (211ms), state up -> down, availability 88.52%
Aug  1 01:31:30 bastard-bis relayd[14496]: host 10.0.25.249, check send expect (54ms), state down -> up, availability 93.75%
Aug  1 01:31:30 bastard-bis relayd[14496]: host 10.0.25.249, check tcp use ssl (61ms), state down -> up, availability 93.75%
Aug  1 01:31:45 bastard-bis relayd[14496]: host 10.0.25.247, check send expect (1ms), state down -> up, availability 85.07%
Aug  1 01:31:45 bastard-bis relayd[14496]: host 10.0.25.247, check tcp use ssl (52ms), state down -> up, availability 82.09%