Prywatne repo git’a cz.1
Jakiś czas temu pisałem jak za pomocą git’a i pendirve’a można w łatwy sposób zabezpieczyć się przed utratą projektu. Dziś przedstawię bardziej skomplikowane podejście, a mianowicie postawimy repozytorium git’a na serwerze. W moich założeniach takie repozytorium nie będzie dostępnie publicznie (w przeciwieństwie do rozwiązania jakie na starcie proponuje GitHub; mają też rozwiązanie płatne w którym to możemy mieć prywatne repo, ale ja wole mieć je u siebie
).
Moje oczekiwania od takiego repo są następujące:
- dostępność do repo z każdego zakątka świata (czyli serwer musi być dostępny szeroko pojętej sieci)
- możliwość dostępu do repo tylko dla wybranych użytkowników
- możliwość przeglądania repo z poziomu www
- bezpieczeństwo stosowanego rozwiązania (https, ssh)
Jakie wybrałem oprogramowanie ?
- systemem bazowym będzie Debian (znany, lubiany i standardowy linux)
- gitosis (prosty soft do hostowania repozytorium git’a z równie prostą kontrolą dostępu, IMO rozwiązanie w sam raz do moich potrzeb)
- lighttpd (mały i szybki httpd)
- mod_ssl oraz mod_auth do wyżej wymienionego httpd
- cgit odpowiednik gitweb’a ale moim zdaniem ładniejszy i bardziej przejrzysty
We własnym zakresie trzeba zadbać o system bazowy, oraz jego konfigurację
. Zakładam, że Debian jest już zainstalowany, skonfigurowany, zabezpieczony oraz podpięty do sieci.
Zaczynamy od instalacji i konfiguracji lighttpd
apt-get install lighttpd apache2-utils
Pakiet apache2-utils będzie nam potrzebny do wygenerowania hash‘a hasła potrzebnego do mod_auth (swoją drogą system pakietowania debiana coraz bardziej mnie zadziwia … nie rozumiem po co w zależnościach do tego pakietu znajduje się libmysqlclient …). Po zainstalowaniu włączamy dwa interesujące nas moduły:
lighttpd-enable-mod auth lighttpd-enable-mod ssl
Oraz przechodzimy do konfiguracji zarówno httpd jak i modułów. Zaczniemy od mod_auth, czyli edytujemy pliczek /etc/lighttpd/conf-enabled/05-auth.conf, w którym to wybieramy backend (czyli algorytm szyfrowania haseł oraz miejsce ich zapisu) oraz konfigurujemy miejsca do których dostęp będzie strzeżony hasłem. Po modyfikacjach plik konfiguracyjny powinien wyglądać mniej więcej tak:
## Authentication for lighttpd ## ## Documentation: /usr/share/doc/lighttpd-doc/authentication.txt.gz ## http://www.lighttpd.net/documentation/authentication.html server.modules += ( "mod_auth" ) # htdigest jest najmocniejszym dostepnym "algorytmem" szyfrujacym auth.backend = "htdigest" auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd-htdigest.user" auth.require = ( "/" => ( "method" => "digest", "realm" => "secure content", "require" => "valid-user" ) )
Opcja auth.require zawiera tylko jeden element, którym jest root serwera httpd, czyli dostęp do dowolnego pliku na serwerze będzie chroniony hasłem. Warto tutaj wspomnieć, że hash hasła zostanie posolony wartością w realm, dzięki temu uzyskujemy prosty mechanizm kontroli dostępu (tj. gdybyśmy mieli dwa zasoby z różnymi wartościami w realm, każdego użytkownika który powinien posiadać dostęp do obu powinniśmy dodać osobno). Teraz wystarczy tylko dodać użytkownika:
htdigest -c /etc/lighttpd/lighttpd-htdigest.user 'secure content' user_name
Po wydaniu tej komendy zostaniemy poproszeni o podanie oraz potwierdzenie hasła dla tego użytkownika.
Po skonfigurowaniu mod_auth przechodzimy do konfiguracji mod_ssl, w tym celu edytujemy /etc/lighttpd/conf-enabled/10-ssl.conf. Ja zdecydowałem się udostępniać usługę http tylko na porcie 443 z szyfrowaniem (czyli popularny https
), więc w konfiguracji mod_ssl wskazałem na którym dokładnie adresie IP oraz na jakim porcie ma nasłuchiwać daemon; plik konfiguracyjny wygląda mniej więcej tak:
## lighttpd support for SSLv2 and SSLv3 ## ## Documentation: /usr/share/doc/lighttpd-doc/ssl.txt ## http://www.lighttpd.net/documentation/ssl.html #### SSL engine $SERVER["socket"] == "111.222.3.4:443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/server.pem" }
następnie generujemy certyfikat self-signed dla naszego serwera:
openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
Który to kopujemy do /etc/lighttpd/server.pem.
Ostatnią częścią konfiguracji lighttpd będzie ogólna konfiguracja serwera, czyli edytujemy plik
/etc/lighttpd/lihttpd.conf. W którym to odkomentowujemy tylko linie:
server.bind = "localhost"Spowoduje to, że port 80 zostanie otwarty tylko na interfejsie loopback, co w konsekwencji prowadzi do tego, że wszystkie połączenia (z sieci) do portu 80 będą odrzucane (za to akceptowane będą połączenia do portu 443, zgodnie z konfiguracją w pliku 10-ssl.conf).
Na razie to wszystko w kwestii konfiguracji lighttpd, wrócimy jeszcze do niej podczas konfiguracji cgit’a. W następnej części zajmiemy się konfiguracją gitosis.
PS. Tutaj jest część druga.
