Generowanie losowych haseł w Ubuntu

Hasła, każdy ma ich przynajmniej kilka w pamięci, ale życie uczy, że nie warto stosować takich samych do autoryzacji bankowych, kont na naszej-klasie, gadu czy na roota ;)

Chciałbym Wam przedstawić bardzo proste narzędzie z którego korzystam z powodzeniem od kilku lat – nazywa się apg (Automated Password Generator) i służy do wygodnego generowania haseł.

Narzędzie oferuje dwa rodzaje haseł – mniej zaawansowane, ale znacznie łatwiejsze do zapamiętania dla osób znających język angielski oraz bardziej zaawansowane (zawierające poza literami dodatkowe krzaczki). Za pomocą dodatkowych parametrów możemy wpłynąć na zawartość dużych, małych liter lub liczb.

Instalacja jest standardowa:

aptitude install apg

Help

Wygląda tak:

apg -h

apg   Automated Password Generator
Copyright (c) Adel I. Mirzazhanov

apg   [-a algorithm] [-r file]
[-M mode] [-E char_string] [-n num_of_pass] [-m min_pass_len]
[-x max_pass_len] [-c cl_seed] [-d] [-s] [-h] [-y] [-q]

-M mode         new style password modes
-E char_string  exclude characters from password generation process
-r file         apply dictionary check against file
-b filter_file  apply bloom filter check against filter_file
(filter_file should be created with apgbfm(1) utility)
-p substr_len   paranoid modifier for bloom filter check
-a algorithm    choose algorithm
1 - random password generation according to
password modes
0 - pronounceable password generation
-n num_of_pass  generate num_of_pass passwords
-m min_pass_len minimum password length
-x max_pass_len maximum password length
-s              ask user for a random seed for password
generation
-c cl_seed      use cl_seed as a random seed for password
-d              do NOT use any delimiters between generated passwords
-l              spell generated password
-t              print pronunciation for generated pronounceable password
-y              print crypted passwords
-q              quiet mode (do not print warnings)
-h              print this help screen
-v              print version information

A teraz praktyka

Wystarczy znajomość kilku parametrów:

Generowanie 5-ciu haseł: -n

apg -n 5

ookyopIack
berpAxEr
DusEphac
yomlipvog~
weehacir

Generowanie haseł o minimalnej długości: -m

apg -n 5 -m 10

BlysBicWeo
fefimvesBa
CuAtecHeoc
crejvibred
CynfiShnoi

Generowanie haseł z wymową (aby łatwiej było je zapamiętać): -t

apg -n 5 -m 10 -t

WaigJocWig (Waig-Joc-Wig)
Geagsyinau (Geags-yin-au)
Cunefkalt9 (Cun-ef-kalt-NINE)
Pemyidyish (Pem-yid-yish)
agsirasuk7 (ags-ir-as-uk-SEVEN)

Generowanie bardziej zaawansowanych haseł: -a 1

apg -a 1 -n 5 -m 10

N;%5RWNM|B
$48+HGvlac
{@M!yPMa-y
jyI<{\3;{i
t)nThAUw?~

Skrypt ten jest bardzo przydatny, kiedy musimy wygenerować komuś hasło ponieważ nie jest w stanie sobie czegoś wymyślić (i pewnie wymyślił by ostatecznie nazwę swojego psa lub imię małżonki) lub stawiamy następny z kolei serwer mysql, a nie chcemy zostawiać takiej dziury jak nie tak dawno ktoś z ekipy Wykopu, kiedy to wykradziono im hasła użytkowników.

Wirtualni userzy ftp w Ubuntu

Poniżej znajduje się instrukcja opisująca jak skonfigurować krok po kroku bardzo prosty i bezpieczny serwer ftp obsługujący wirtualne konta – użytkowników, których fizycznie nie ma zdefinowanych w systemie. Jako serwer ftp wykorzystany zostanie vsftpd (very secure ftp daemon).

Założenia: potrzebujemy prostego serwera ftp do którego możemy zdefiniować kilku użytkowników, gdzie każdy ma dostęp do tego samego katalogu (opis jak należy to skonfigurować, aby każdy użytkownik miał swój własny katalog znajduje się we wpisie źródłowym, którego adres zamieściłem na końcu wpisu).

Najpierw instalujemy serwer ftp oraz narzędzie do obsługi bazy użytkowników:

aptitude install vsftpd db4.2-util

Tworzymy katalog ftp:

mkdir /home/ftp
chown ftp:ftp /home/ftp

(aplikacja domyślnie podczas instalacji zakłada katalog /srv/ftp)

Podmieniamy plik /etc/vsftpd.conf na następujący:

# /etc/vsftpd.conf
listen=YES
listen_ipv6=NO
#listen_port=2121

anonymous_enable=NO
local_enable=YES
guest_enable=YES

virtual_use_local_privs=YES
pam_service_name=vsftpd-virtual

guest_username=ftp

local_root=/home/ftp

local_umask=022
write_enable=YES
hide_ids=YES
dirmessage_enable=YES

use_localtime=YES
xferlog_enable=YES
log_ftp_protocol=YES
setproctitle_enable=YES

connect_from_port_20=YES

chroot_local_user=YES
chroot_list_enable=NO
secure_chroot_dir=/var/run/vsftpd/empty

W razie potrzeb – zmieniamy ustawienia – np. jeśli chcemy zmienić port na którym aplikacja ma nasłuchiwać – usuwamy znak komentarza z linii listen_port i zmieniamy numer portu.

Przygotowujemy plik /etc/pam.d/vsftpd-virtual:

auth required pam_userdb.so db=/etc/vsftpd-virtual
account required pam_userdb.so db=/etc/vsftpd-virtual

Przygotowujemy plik z użytkownikami i hasłami /etc/vsftpd-konta:

uzytkownik1
haslo1
uzytkownik2
haslo2

umieszczamy hasła w bazie:

db4.2_load -T -t hash -f /etc/vsftpd-konta /etc/vsftpd-virtual.db

a następnie restartujemy usługę:

service vsftpd restart

Możemy już zalogować się do serwera, przykładowo:

lftp -p 2121 -u uzytkownik1,haslo1 localhost
lftp test1@localhost:~> ls
lftp test1@localhost:/>

Źródło: http://linuxforfun.net/2008/04/05/vsftpd-virtual-users/

Jabber od Google w Pidginie

Coraz więcej osób wyraża w różnych serwisach niezadowolenie z najnowszych usprawnień oferowanych przez GG Network S.A. w swoim sztandardowym produkcie – komunikatorze Gadu-Gadu. Niemniej jednak, większość z nas chcąc czy nie chcąc korzysta z Gadu. Powodem, dla którego nie odchodzimy od niego są dwa główne czynniki – jego popularność oraz wciąż niewielka popularność Jabbera.

Czym jest Jabber?

Jabber, pracujący w oparciu o protokół będący otwartym standardem XMPP działa na zasadzie sieci rozproszonej. Każdy kto dysponuje domeną Internetową może postawić sobie swój własny serwer Jabbera i rozmawiać z innymi użytkownikami Jabbera na całym świecie.

Identyfikator w Jabberze, tzw. JID, ma postać konto@domena – czyli analogicznie do adresów email. Użytkownik łączy się do swojego serwera Jabber. Nie ma serwera globalnego. Nie zdarzy się zatem sytuacja, jaka ma miejsce w sieci Gadu Gadu, kiedy padają ich serwery i w całej Polsce nikt nie może rozmawiać na Gadu.

Serwerów Jabberowych oferujących darmowe konta jest dużo w Internecie. Wielu operatorów hostingowych którzy nie chcą zostawać w tyle, oferuje dla hostowanych u nich naszych domen, jednoczesną obsługę już nie tylko poczty, ale również Jabbera – przykładem jest ovh.pl.

Trzeba jeszcze nadmienić, że Jabber, pomimo braku intensywnego wzrostu użytkowników – nie jest w odwrocie. Protokół XMPP jest powszechnie uważany za bardzo dobry i niedoceniany. Ogólny trend Instant Message’ingu jest taki, że powstające komunikatory nie wymyślają już nowych, zamkniętych protokołów, tylko opierają się o XMPP. Oznacza to, że każdy nowo powstały komunikator będzie w stanie “rozmawiać” z naszym. Jeśli nie będzie – ma niewielkie szanse, żeby wogóle zostać zauważony.

Każdy z nas ma już konto Jabber w Google

Od jakiegoś czasu Google udostępnia nam coraz to więcej nowych usług, które w świetny sposób integrują się ze sobą. Ktoś kto zakłada sobie konto pocztowe w Googlach, automatycznie dostaje do dyspozycji konto w Google Talk, który jest w pełni zgodny z protokołem XMPP. Komunikatora tego można używać z poziomu Gmaila (Chat). Nie jest to jednak zbyt praktyczne. Nic nie stoi jednak na przeszkodzie, aby podłączyć się do tego konta z komunikatora w postaci programu zainstalowanego na naszym komputerze.

Konfiguracja Google Talk w Pidginie

Pidgin może jednocześnie obsługiwać wiele protokołów, a nawet wiele instancji takich samych protokołów. Możemy dzięki temu w jednym pracującym Pidginie mieć jednoczesny dostęp przykładowo do naszego konta Gadu-Gadu, konta na jakimś serwisie Jabberowym oraz Google Talk. Jak to zrobić?

W oknie Pidgina wybieramy z menu pozycję Konta / Zarządzaj:

Naciskamy Dodaj:

I przeprowadzamy właściwą konfigurację:

[nazwa konta] – to sprzed małpki z adresu email :)

[zasób] – warto podać tu inną wartość na każdym komputerze na którym pracujemy – dzięki temu jeśli np. zapomnimy zamknąć komunikator w pracy,  w domu “nie będzie nas rozłączać” i będziemy mogli prowadzić normalne rozmowy.

Jeśli używacie zdjęcia profilu w Google Profileważna uwaga: łącząc się z komunikatora – ikona użytkownika zastąpi tą w Google Profile. Dlatego warto na każdym komunikatorze pamiętać aby to zdjęcie ustawić – inaczej nasze zdjęcie w profilu Google będzie nam znikać.

Google Talk dla konta Google Apps

Jeśli pracujecie na koncie Gmailowym które jest skonfigurowane na Twojej własnej domenie (opis usługi popełniłem w tym wpisie), dobra wiadomość – również możemy skonfigurować sobie Google Talka, ustawienia są następujące:

[nazwa konta] – jak wyżej, czyli to co mamy przed małpką w adresie email

[domena] – nasza domena

Następnie w zakładce Zaawansowane (Advanced), w polu serwer wpisujemy talk.google.com – i to wszystko :)

Bardzo przyjemnym dodatkiem jest możliwość informowania nas przez Pidgina, że mamy nowe maile w Gmailu. Uważam, że to bardzo wygodne. Nowe maile Pidgin pokazuje w następujący sposób:

Integracja aplikacji w obrębie Google

Wspomniałem wcześniej, że Google bardzo fajnie integruje swoje usługi – świetnym przykładem jest pokazywanie statusu Google Talk w jednej z najlepszych aplikacji które oferuje nam Google jak zwykle nieodpłatnie – w Google Readerze (które przybliżyłem we wpisie Internet na bieżąco). Wygląda to tak:

Życzę wszystkim miłego uniezależniania się od Gadu-Gadu! :)

Pozytywne strony Microsoftu

Usłyszałem, że mój blog jest stronniczy. Wszędzie tylko Linux to Linux tamto, Ubuntu jest fajne, a co Microsoft lub Windows to dziadostwo.

Faktycznie można odnieść wrażenie, że jestem jakimś przeciwnikiem Microsoftu. Au contraire! :) Może nie specjalnie jestem fanem tej firmy – po prostu niezbyt często jest ich za co pochwalić. Sposób w jaki próbują zdobywać rynek, w jaki podchodzą do klienta, licencjonowanie produktów i wiele innych aspektów ich działalności sprawia, że włos mi się jeży na głowie. Chwalę zamiast tego za zwyczaj inną firmę – Google, ale dlatego, że ich metodologia zdobywania rynku bardzo mi się podoba i trzymam za nich jak najbardziej kciuki.

Żeby jednak blog nie był taki całkiem stronniczy, napiszę teraz klika pozytywnych słów o Microsofcie :)

Swojego czasu w jednej z aplikacji Microftu – USB/DVD download tool – znaleziono kod, który został wcześniej opublikowany na licencji GPL. Informacje te zostały potwierdzone przez Microsoft. Mieli w tej sytuacji trzy możliwości – przepisać fragment kodu, wycofać aplikację z rynku lub udostępnić ją na licencji Open Source. Pierwszą reakcją firmy była decyzja o wycofaniu programu z rynku, jednak ktoś ostatecznie podjął decyzję, aby… wypuścić program na licencji GPL.

Uważam, że taka decyzja ze strony Microsoftu jest świetna. W końcu – nic nie stoi na przeszkodzie, żeby nadal brali pieniądze za ich system, pakiet Office oraz specjalistyczne oprogramowanie, a mniejsze narzędzia – udostępniali na takiej licencji. Uważam, że gdyby poszli dalej tą drogą – takich mniejszych narzędzi mogłoby pojawiać się znacznie więcej, pojawiałyby się znacznie częściej (bo w końcu mogli by wykorzystać wszędobylski kod GPL), a społeczność oddanych programistów napewno pomagałaby im łatać dziury w kodzie, których w ich aplikacjach jest bardzo dużo.

Mając darmowe wsparcie ze strony developerów, przychylność związaną z przyklaskiwaniem tej bardzo dobrej metodzie publikacji programów zyskali by dużo więcej, niż tylko korzyści materialne, które to moim zdaniem byłyby całkiem wymierne.

Drugim tematem, za który chciałbym ich pochwalić jest produkt Bing – czyli wyszukiwarka Internetowa. Jest szybka i znacznie bardziej dopracowana niż ich poprzednia wyszukiwarka – MSN Search. Wyszukiwanie nie jest tak inteligentne jak to które oferuje konkurencja, ale produkt jest już całkiem używalny. Usługę tą Microsoft integruje już z produktami innych firm – np. z Twitterem. W mojej opinii jest to krok milowy.

Smutne jest jednak to, że wypuszczenie ów wyszukiwarki było podyktowane jedynie względami walki z konkurencją – Google. CEO Microsoftu, Steve Ballmer, w swoich wypowiedziach pokazał już nie raz, jak wielką pogardą obdarza firmę Google i ich podejście do zarabiania i oferowania usług oraz jak bardzo nie znosi pojęcia licencji GPL. Obawiam się więc, że opisane przeze mnie dwa pozytywne aspekty działania tej firmy nie mają szansy na zakorzenienie się w polityce Microsoftu jak długo obecny CEO będzie pełnił swoją funkcję.

CEO Microsoft, Steve Ballmer

Wszystkie znaki towarowe i nazwy firm wymienione w tym wpisie zostały użyte tylko w celach informacyjnych i należą do ich właścicieli

DIY: Akcent świąteczny w miejscu pracy

Zrób to sam: Choinka u Informatyków :)

Kliknij, aby powiększyć

ACL dla plików i katalogów w Ubuntu

Unixowy system uprawnień dla plików i katalogów został naprawdę dobrze przemyślany i świetnie się sprawdza. Każdy jednak prędzej czy później może trafić na sytuację, w której możliwość stosowania rozszerzonych uprawnień dałaby znacznie większą swobodę i wygodę.

Kogo temat może zainteresować?

Wydaje mi się, że użytkownicy zwykłych desktopów nie będą ACL’i potrzebować. Jeśli jednak jakiś developer umieszcza przykładowo serwer z repozytorium u siebie albo jest administratorem jakiegoś serwera – myślę, że warto się zapoznać z poniższą tematyką.

Krok po kroku

Access Control Lists (ang. ACL), czyli listy kontroli dostępu są w jądrze Ubuntu wkompilowana domyślnie już od jakiegoś czasu. Niewiele stoi zatem nam na przeszkodzie, aby aktywnie zacząć z nich korzystać. ACL należy traktować jako rozszerzenie Unixowego systemu uprawnień plików i katalogów, dlatego zestaw komend takich jak chown czy chmod nadal obowiązuje.

Czego zatem potrzebujemy? Musimy uświadomić nasz system, że będziemy wykorzystywać ACL’e dla konkretnych systemów plików. No i przede wszystkim – musimy mieć narzędzia do zarządzania ACL’ami oraz wiedzieć, jak się ich używa :)

Zatem po kolei.

Sprawdźmy, czy mamy narzędzia do obsługi ACL’i. Narzędzia nazywają się setfacl, getfacl oraz chacl.

desktop repos # getfacl
Program getfacl nie jest obecnie zainstalowany.  Można go zainstalować wpisując:
apt-get install acl
getfacl: command not found
desktop repos #

Więc go sobie instalujemy:

sudo aptitude install acl

Spróbujmy ustawić jakąś rozszerzoną listę dostępu. Przejdźmy do katalogu domowego, załóżmy katalog test oraz nadajmy uprawnienia rwx użytkownikowi nobody.

cd
mkdir test
setfacl -R -m u:nobody:rwX test
setfacl: test: Operation not supported

Komunikat Operation not supported oznacza nic innego jak brak obsługi ACL w systemie plików. Jeśli nasz katalog domowy znajduje się na odrębnym systemie plików home, możemy aktywować obsługę ACL komendą:

sudo mount -o remount,acl /home

Teraz ustawianie rozszerzonych uprawnień powinno już działać. Ponowne wydanie komendy setfacl nie powinno już zwrócić błędu.

Przy okazji, możemy zobaczyć jak wyglądają uprawnienia naszego katalogu:

nme@desktop ~ $ setfacl -R -m u:nobody:rwX test
nme@desktop ~ $ ls -lad test/
drwxrwxr-x+ 2 nme nme 4096 2009-12-30 14:29 test/
nme@desktop ~ $ getfacl test
# file: test
# owner: nme
# group: nme
user::rwx
user:nobody:rwx
group::r-x
mask::rwx
other::r-x

Warto zwrócić uwagę na uprawnienia zwracane komendą ls -l: drwxrwxr-x+ – na końcu listy uprawnień znajduje się znak + oznaczający rozszerzone informacje. Takie uprawnienia możliwe są do odczytu za pośrednictwem getfacl co też uczyniłem powyżej. Wynik komendy jest dość czytelny.

Wracając do wydanej komendy:

setfacl -R -m u:nobody:rwX test

Co po naszemu brzmi – rekursywnie zmodyfikuj uprawnienia dla użytkownika nobody dla katalogu test ustawiając uprawnienia rwx dla katalogów i rw dla plików.

Dziecinne proste. Rozbudujmy komendę:

setfacl -Rm u:nobody:rwX,d:u:nobody:rwX test

(pierwsza część jest tak naprawde zbędna, ponieważ uprawnienia dla użytkownika już ustawiliśmy, ale chciałem przedstawić sposób w jaki możemy łączyć uprawnienia w obrębie jednej komendy)

d:u:... można zapisać również jako default:u:... co oznacza, że dla nowo zakładanych plików/katalogów, takie atrybuty mają być domyślnie dodawane.

Ważna sprawa, na koniec

Aby używać list dostępu, aktywowaliśmy opcję acl poprzez przemontowanie systemu pliku. Niestety, po restarcie, system plików nie będzie już obsługiwał list dostępu.

Co zatem zrobić?

Jeśli chcemy, aby nasz system plików pamiętał o tym, że ma obsługiwać rozszerzone listy dostępu, w pliku /etc/fstab należy to zaznaczyć, acl jako opcję dla naszego systemu plików:

/dev/mapper/desktop-home /home           ext3    defaults,acl        0       2

Więcej informacji, wraz z przykładami znaleźć możecie na stronach manuala komend do obsługi acl które przedstawiłem w tym tekscie.

Ailurus: wygodny tuning Ubuntu

Niestrudzony Adrian Nowak, na blogu Ubucentrum zamieścił wpis Ailurus – ułatwi początki z Linuksem.

Czym jest Ailurus? To wygodny interfejs produkcji “Thrusted Digital Technology Lab.” z siedzibą w Chinach, do tuningu systemu i obsługi systemu :)

Faktycznie, narzędzie jest faktycznie bardzo ciekawe. Nie znajduje się jednak w standardowym repozytorium. Dlatego myślę, że warto wspomnieć, w jaki sposób najwygodniej je zainstalować.

Nie zalecałbym metody którą proponuje Adrian – czyli instalacji pojedynczej paczki z serwisu GetDeb.net.

Instalowanie pojedynczych paczek jest zaśmiecaniem systemu.

Instalacja

W Ubuntu 9.10 możemy w wygodny sposób dodawać repozytoria, które sprawią, że jeśli pojawi się nowa wersja pakietu, przy aktualizacji systemu, pakiet zostanie również uaktualniony.

# przechodzimy na roota
sudo -i

# dodajemy nowe repozytorium
add-apt-repository ppa:ailurus

# aktualizujemy wykaz aktualnych pakietów
aptitude update

# instalujemy pakiet
aptitude install ailurus

Aplikacja, po instalacji jest dostępna poprzez Programy / Narzędzia systemowe / Ailurus.

Co oferuje nam pakiet?

  • Tips and tricks – warto przeglądnąć – informacje jak za pomocą gconf-editora wykonać tuning naszego Gnome’a
  • Wygodny frontend do konfiguracji i sprawdzenia parametrów systemu (typ procesora, ilość pamięci, czy procesor jest 64-bitowy, rodzaj karty graficznej i sieciowej)
  • Skróty do instalacji różnych przydatnych aplikacji, których nazwy należałoby w innym wypadku pamiętać albo trzeba byłoby się bardziej narobić, żeby je zainstalować
  • Ustawienia systemowe – innymi słowy – edycja plików konfguracyjnych, modifykacja menu kontekstowego Nautilusa itp
  • i wiele innych…

Kiedy można sobie ułatwić życie, warto to robić :)

Infrastruktura PKI na podstawie SSH

openssh_logoInfrastruktura kluczy publicznych (ang. Public Key Infrastructure, w skrócie PKI) jest podstawą współczesnej kryptografii. Miałem już styczność z wieloma osobami z branży IT, które kompletnie nie czuły o co właściwie w tym chodzi.Myślę, że poniższy tekst napewno się komuś przyda oraz, że warto mu poświęcić 5 minut. Spróbuję się maksymalnie streścić ;)

Klucze symetryczne i niesymetryczne

Większość szyfrowanych kanałów transmisji wykorzystuje jednocześnie klucze niesymetryczne jak i symetryczne.

Zaletą kluczy symetrycznych (takich jak AES, Blowfish czy DES) jest szybkość szyfrowania/deszyfrowania przy stosunkowo niskim obciążeniu procesora.

Wadą kluczy symetrycznych jest etap nawiązania transmisji. Jeśli oba komputery nie posiadają tego samego klucza do szyfrowania/deszyfrowania wiadomości – klucz taki musiałby być wysłany z jednego z nich do drugiego drogą nieszyfrowaną. Taką wymianę klucza można byłoby łatwo podsłuchać. Następnie, korzystając z tak zdobytego klucza – można podsłuchać resztę transmisji (taki atak nosi nazwę Man In The Middle).

Dlatego właśnie pojawiły się klucze niesymetryczne (np. stosowany standardowo w protokole ssh – algorytm RSA). Klucz niesymetryczny składa się z dwóch części – publicznej i prywatnej. Posiadacz części publicznej klucza jest w stanie zaszyfrować wiadomość. Posiadacz klucza prywatnego – może taką wiadomość odszyfrować. Proste. Dodatkowo – na podstawie klucza publicznego jesteśmy w stanie zweryfikować odcisk klucza (fingerprint) – jeśli się zgadza, wiemy, że rozmawiamy z właściwym serwerem.

Klucze w praktyce

Serwery Linuxowe na których pracuje usługa ssh mają również wygenerowane swoje klucze. Autentykacja może być różnoraka, jednak do najpopularniejszych należą – para użytkownik-hasło oraz łączenie się z wykorzystaniem kluczy.

Wykorzystanie haseł jest proszeniem się o kłopoty. Warto przesiąść się na klucze. Jak to zrobić?

Wygenerujmy sobie klucz. W obecnych czasach warto zaznaczyć, że chcemy mieć klucz 4096-bitowy, będzie się generował dłużej, ale będzie bezpieczniejszy. Warto też ustawić hasło dla klucza.

nme@notebook ~ $ ssh-keygen -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nme/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/nme/.ssh/id_rsa.
Your public key has been saved in /home/nme/.ssh/id_rsa.pub.
The key fingerprint is:
12:30:87:ca:06:81:d8:5a:32:41:81:4c:3a:74:33:a9 nme@notebook
The key's randomart image is:
+--[ RSA 4096]----+
|XO.++..          |
|X.+.++           |
|oB..  .          |
|.E+    .         |
| .    . S        |
|       .         |
|                 |
|                 |
|                 |
+-----------------+
nme@notebook ~ $

W katalogu .ssh pojawiły się dwa pliki id_rsa – będący naszym kluczem prywatnym oraz id_rsa.pub – czyli klucz publiczny.
Klucza publicznego nie trzeba specjalnie strzec. Ważne, aby nasz klucz prywatny nie dostał się w cudze ręce.

Po co ten obrazek w ASCII? Abyśmy nie musieli weryfikować znak po znaku naszych kluczy. Jeśli chcemy odczytać fingerprint klucza, wydajemy komendę:

ssh-keygen -l

Jeśli chcemy zobaczyć odcisk wraz z obrazkiem ASCII – wydajemy:

ssh-keygen -lv

Okej. Powiedzmy, że mamy klucze i serwer na który chcielibyśmy się łączyć za ich pomocą. Musimy umieścić zawartość naszego klucza publicznego w pliku .ssh/authorized_keys na serwerze docelowym. Możemy to zrobić komendą:

nme@notebook ~ $ ssh-copy-id serwer:
The authenticity of host 'serwer (x.x.x.x)' can't be established.
RSA key fingerprint is fe:2b:6b:71:6f:81:ef:07:74:89:72:e7:ef:ab:f8:62.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'serwer,x.x.x.x' (RSA) to the list of known hosts.
Password:
nme@notebook ~ $

teraz możemy już normalnie się zalogować:

nme@notebook ~ $ ssh serwer
nme@serwer ~ $

W pliku .ssh/authorized_keys możemy trzymać dowolną ilość kluczy.

Dobrą praktyką jest generowanie kluczy prywatnych na każdej stacji roboczej z której łączymy się na inne maszyny. W wypadku gdy np. ktoś ukradnie nam jedną z tych maszyn – wystarczy usunąć dane klucze z plików authorized_keys serwerów, do których mamy dostęp.

Skoro już opanowaliśmy klucze – warto wyłączyć autoryzację do naszych serwerów za pośrednictwem par użytkownik-hasło. Robimy to edytując plik /etc/ssh/sshd_config – weryfikujemy ustawienia:

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

Restart sshd we współczesnych Ubuntu czy RedHatach wykonujemy komendą:

sudo service ssh restart

Kiedy wyłączymy już logowanie na pary użytkownik-hasło i pozostawimy jedynie logowanie na klucze:

nme@notebook ~ $ ssh serwer
Permission denied (publickey).
nme@notebook ~ $

Gdzie poza SSH stosowane są jeszcze klucze?

Infrastruktura kluczy publicznych (PKI) stosowana jest również przykładowo w HTTPS czy w sieciach bezprzewodowych – WPA2 (AES). Klucze niesymetryczne stosowane są do nawiązania transmisji między klientem i serwerem – celem wymiany klucza symetrycznego, a następnie transmisja jest już oparta o klucz symetryczny.

Znajomość ogólnych zasad działania PKI jest bardzo praktyczna również w przypadku, jeśli przymierzamy się do wykorzystania OpenPGP czy certyfikatów SSL, które możemy traktować jak wyższe stopnie zaawansowania ;)

Python – Demonologia

artwork by ~laurD on DeviantART

Python jest świetnym językiem do całej palety zastosowań. Służy on pomocą zarówno administratorom systemów, osobom które potrzebują napisać prosty parser, a nawet twórcom aplikacji webowych – dzięki takim frameworkom jak Django. W poniższym tekscie chciałbym pokazać jak łatwo jest stworzyć usługę systemową (ang. daemon) w języku Python, która będzie wykonywała dla nas określoną czynność – jako przykład przedstawię fakedns – bardzo prostego daemona DNS, który na dowolne zapytanie o adres IP będzie zwracał zawsze ten sam.

Dlaczego Python? Co z innymi językami?

Nie lepiej mieć aplikację którą można skompilować? Absolwenci kierunków informatycznych jeszcze kilka lat temu dowiadywali się na studiach, że najbardziej zaawansowanym językiem do wszelakich zastosowań jest Java. Mieli praktyczne doświadczenie z tworzenia aplikacji w Javie… i zaczęli pisać. Kod który chciałbym tu przedstawić pisałem dwa lata temu. Zanim się za niego zabrałem, zacząłem od szukania już gotowego rozwiązania za pomocą Google. Znalazłem, nawet kilka. Jedno w Javie. O zgrozo. Ja wiem, że się da. Wiem, że Java jest naprawde zaawansowanym językiem. Gotowa aplikacja wymaga jednak dużego nadkładu. Trzeba przygotować środowisko, przygotować konkretną ilość pamięci… i czekać kiedy aplikacja się wyłoży. Takie mam przynajmniej doświadczenia z aplikacjami w Javie, które pisali programiści zaraz po studiach, pracując w profesjonalnej firmie software’owej.

A inne języki? Natualnie. Jest C. Świetny język, ale czy mamy wystarczająco dużo czasu aby w nim pisać nawet małe aplikacje? .NET ? Wolne żarty. Nie dość, że pod Linuxem jest bardzo grubymi nićmi przyszywany, to i nie mamy pewności, czy Microsoft nie powie pewnego dnia hola, jedynie na ich, komercyjnej platformie. Naddatek potrzebnej mocy obliczeniowej, pamięci, wymaganej przestrzeni dyskowej… i ta świadomość, że nie jest to dopracowane i pewnie nigdy nie będzie – niczym Samba próbująca naśladować również kalekie i dziurawe, Microsoftowe domeny.

A co ze skryptowymi? Mnie na myśl przychodzą trzy alternatywy – Lua, Ruby i skrypt w bashu.

Lua – niesamowicie przejrzysty język. Piekielnie szybki, realizowany przez wręcz mikroskopijną bibliotekę. Na jego niekorzyść trzeba jednak zaliczyć wręcz niemal konieczność liczenia się z faktem, że jeśli rozwiązanie które potrzebujemy stworzyć, będzie wymagało biblioteki – będziemy zmuszeni długo jej szukać lub przygotować samemu jej obsługę za pomocą języka C.

Ruby – chyba najbliższy Pythonowi. Dlaczego nie. Bibliotek jest coraz więcej, jest wydajny. Miałem okazję jakiś czas temu nawet coś napisać w tym języku (a dokładnie – przepisać mały framework z Pythona), ale… jakoś w Pythonie pisze mi się lepiej. Co ważne – Ruby jest głęboko zakorzeniony w Perlu. Programistom mówi się jak powinni pisać kod, jednak zawsze mogą robić w to w stylu Perlowym – pisać szybko i wydajnie, jednak przeczytanie i przeanalizowanie go po jakimś czasie staje się piekłem. Kod w Pythonie jest de facto zawsze taki sam, nie zależnie kto by go pisał – czytanie go jest proste i przyjemne.

No i jeszcze uzupełnie o język skryptowy – Bash. Można w nim naprawdę dużo zrobić. Warto jednak zastanowić się na ile aplikacja będzie zaawansowana i czy zależy nam na wydajności. Podam przykład. Stworzyłem kiedyś skrypt w bashu generujący w oparciu o kilka plików wejściowych reguły dla firewalla, reguły shapera oraz treść dhcpd.conf. Skrypt wewnątrz wywoływał po kilka tysięcy razy awk/sed’a itp. Na maszynie jednoprocesorowej (Pentium 4 1.4 GHz), która pełniła funkcję routera dla sieci 100 Mbit/s, przy mniejszym obciążeniu – skrypt wykonywał się kilka minut. Przy większym – godzinę. Za każdym razem uruchamiając awk, spawnował odrębnego basha. Cóż. Przepisałem rozwiązanie na język Lua. Skrypt niezależnie od obciążenia maszyny wykonywał się w 0.02 sekundy. Jeśli byłby to Python czy Ruby – efekt byłby zapewne zbliżony do Lua.

Tworzenie usługi systemowej dla Linux/Unix

OK, zaczynamy. Usługa systemowa powinna przede wszystkim:
- wiedzieć jak pisać do sysloga
- zrzucić uprawnienia root’a
- odkleić się od stdin i stdout i przejść w tło
Jeśli taka usługa dodatkowo potrzebuje obsługiwać jakiś systemowy port TCP/UDP (o numerze niższym niż 1024) – zanim zrzuci ona prawa roota, powinna otworzyć sobie określonego socketa.

Nie będę tłumaczył poszczególnych fragmentu kodu ponieważ uważam, że jest on wystarczająco przejżysty.

fakedns.py

#!/usr/bin/python -u
# -*- coding: utf-8 -*-
" Fake DNS server: Always answer with the same, defined as conf.destip reply, listen at conf.listen "

class conf:
    listen='ADRES_IP_NA_KTÓRYM_APLIKACJA_MA_NASŁUCHIWAĆ'
    destip='ADRES_IP_NA_KTÓRY_APLIKACJA_BĘDZIE_KIEROWAĆ'

import os,sys,pwd,grp
import logging,logging.handlers
import socket

log=logging.getLogger('fakedns')
logging.basicConfig()
logging.root.setLevel(level=logging.INFO)
#logging.root.setLevel(level=logging.DEBUG)
hdlr=logging.handlers.SysLogHandler('/dev/log')
log.addHandler(hdlr)

def drop_privileges(uid_name='nobody',gid_name='nogroup'):
    starting_uid=os.getuid()
    starting_gid=os.getgid()
    starting_uid_name=pwd.getpwuid(starting_uid)[0]
    log.info('fakedns: drop_privileges: started as %s/%s'%(pwd.getpwuid(starting_uid)[0],grp.getgrgid(starting_gid)[0]))
    if os.getuid()!=0:
        log.info("fakedns: drop_privileges: already running as '%s'"%starting_uid_name)
        return
    if starting_uid==0:
        # Get the uid/gid from the name
        running_uid = pwd.getpwnam(uid_name)[2]
        running_gid = grp.getgrnam(gid_name)[2]
        # Try setting the new uid/gid
        try:
            os.setgid(running_gid)
        except OSError,e:
            log.error('Could not set effective group id: %s'%e)
        try:
            os.setuid(running_uid)
        except OSError,e:
            log.error('Could not set effective user id: %s'%e)
        # Ensure a very convervative umask
        new_umask=077
        old_umask=os.umask(new_umask)
        log.info('fakedns: drop_privileges: Old umask: %s, new umask: %s'%(oct(old_umask),oct(new_umask)))
    final_uid=os.getuid()
    final_gid=os.getgid()
    log.info('fakedns: drop_privileges: running as %s/%s'%(pwd.getpwuid(final_uid)[0],grp.getgrgid(final_gid)[0]))

def become_daemon(home='.',stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    log.info('fakedns: deamonize')
    # perform first fork
    try:
        if os.fork()>0:
            sys.exit(0)
    except OSError,e:
        log.info("fakedns: 1st fork failed: %s"%e.strerror)
        sys.exit(1)
    os.setsid()
    os.chdir(home)
    os.umask(0)
    # second fork
    try:
        if os.fork()>0:
            sys.exit(0)
    except OSError,e:
        log.info("fakedns: 2nd fork failed: %s"%e.strerror)
        sys.exit(1)
    i=open(stdin,'r')
    o=open(stdout,'a+')
    e=open(stderr,'a+',0)
    os.dup2(i.fileno(),sys.stdin.fileno())
    os.dup2(o.fileno(),sys.stdout.fileno())
    os.dup2(e.fileno(),sys.stderr.fileno())

class DNSQuery:
    def __init__(self, data):
        self.data=data
        self.dominio=''

        tipo = (ord(data[2]) >> 3) & 15     # Opcode bits
        if tipo == 0: # Standard query
            ini=12
            lon=ord(data[ini])
            while lon != 0:
                self.dominio+=data[ini+1:ini+lon+1]+'.'
                ini+=lon+1
                lon=ord(data[ini])

    def respuesta(self, ip):
        packet=''
        if self.dominio:
            packet+=self.data[:2] + "\x81\x80"
            # Questions and Answers Counts
            packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'
            # Original Domain Name Question
            packet+=self.data[12:]
            # Pointer to domain name
            packet+='\xc0\x0c'
            # Response type, ttl and resource data length -> 4 bytes
            packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'
            # 4bytes of IP
            packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.')))
        return packet

if __name__ == '__main__':
    udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        udps.bind((conf.listen,53))
    except socket.error, (val,e):
        log.info("fakedns: %s"%e)
        sys.exit(1)
    log.info('fakedns: dom.query. 60 IN A %s' % conf.destip)
    drop_privileges()
    become_daemon()
    try:
        while 1:
            data, addr = udps.recvfrom(1024)
            #log.info(addr)
            p=DNSQuery(data)
            udps.sendto(p.respuesta(conf.destip), addr)
            #log.info('%s -> %s' % (p.dominio, conf.destip))
            log.info('fakedns: %s -> %s'%(p.dominio,addr[0]))
    except KeyboardInterrupt:
        log.info('fakedns: done.' % (p.dominio, conf.destip))
        udps.close()
    except:
        log.info('fakedns: crashed serving %s (%s)'%(addr, data))

Klikanie we Flasha w Ubuntu 9.10

Nowe Ubuntu umożliwia nam skorzystanie z najnowszej wersji Flasha. Będziemy mieli okazje zapoznać się z takimi nowymi ficzerami jak migotanie obrazu uniemożliwiające oglądanie YouTube na pełnym ekranie czy niemożność kliknięcia w jakiś element wewnątrz Flasha (np. podczas ustawiania zakresu dat w Google Analytics). Adobe’a, firmę za Flasha odpowiedzialną oraz za to jak pracuje on pod Linuxem, pozostawiam Waszej ocenie – mnie skończył się na dzisiaj jad ;)

Rozwiązanie drugiego z wyżej wymienionych problemów jest bardzo proste i znalazłem je tutaj. Ten wpis jest jedynie tłumaczeniem.

Gotowy?

* Naciśnij Alt+F2 i Enter
* gksudo gedit /usr/lib/nspluginwrapper/i386/linux/npviewer
* Dodaj następującą linię przed ostatnią linią tekstu
* export GDK_NATIVE_WINDOWS=1
* Zapisz.
* Zrestartuj aplikacje używające Flasha

Zawartość pliku ostatecznie powinna wyglądać tak:

flash_wrapper_edit

Starsze wpisy »