Ez egy nem is új és nem is bonyolult megoldás, és általában minden webszerver beépített szolgáltatása. Kétféle módja van, az úgynevezett Basic, és a Digest. A Basic (ahogy az sejthető) a legegyszerűbb hitelesítési módszer, nincs szükség sem munkamenetkezelésre, sem sütikre (legfeljebb ha megéhezünk), speciális modulra, semmire. Beállítása sem túl bonyolult. Először is, hozzunk létre egy fájlt, amiben eltároljuk a belépésre jogosult felhasználó nevét és kódolt jelszavát, amit majd a webszerver szépen összehasonlít a kapott adatokkal, és ha egyezik, továbbenged. A fájl létrehozásához használhatjuk az apache saját htpasswd nevű programját, vagy ugyanennek a programnak egy python implementációját, esetleg egy olyan weboldalt, ahol online létrehozhatjuk a jelszót. Hasznos, ha a fájl a webszerver root-ján kívül van, így véletlenül sem juthat hozzá a webszerveren át senki. Legyen mondjuk az etc-ben, az nginx könyvtárában. Ha a python programot használjuk, akkor így:
sudo python2 htpasswd.py -b -c /etc/nginx/.htpasswd bendeguz sanyisanyikamEz egy sima crypt-et használ, 2 véletlenkarakterrel sózva, tulajdonképpen elég. Ha mégsem, hanem pl.: mégiscsak az apache által is használt kódolást szeretnénk, akkor az openssl-t is felhasználhatjuk, így:
printf "bendeguz:$(openssl passwd -apr1 sanyisanyikam)\n" > /etc/nginx/.htpasswdEz utóbbi talán egy kicsit jobb, a crypt csak az első 8 karaktert veszi figyelembe, vagyis a "sanyialo" és a "sanyialovagloperec" ugyanazt a hasht kellene eredményezze. (Kellene, de mégsem, mert bár az eredeti DES algoritmus csak az első 8-at veszi figyelembe, a változó sózás miatt nem lesz ugyanaz) Ha az 'apr1' helyére 'crypt'-et írunk, akkor megspóroltuk a python programot.
Akárhogy is, ha létrejött a jelszófájlunk, akkor mutassuk be ezt az nginx-nek, védjünk meg egy könyvtárat vele, pl, jelen esetben a rutorrentünket. Ehhez csak a rootjának a definíciójába kell beállítanunk, ami az nginx.conf-jában van, valahogy így:
location / { root /var/www/rutorrent; auth_basic "Raspi Rutorrent bejelentkezes"; auth_basic_user_file /etc/nginx/.htpasswd; index index.html index.htm index.php; }Ez már szerepel benne, nyilván, csak két új sorral egészítettük ki. Az első egy üzenet, a második meg hogy hol vannak az engedélyezett userek. Mentsük el, indítsuk újra webszervert:
sudo systemctl restart nginx.serviceHa megpróbáljuk elérni a rutorrentet, kérni fogja a usernevet-jelszót. Egyszerű, ugye?
Ehhez hasonló, de kicsit bonyolultabb a Digest azonosítás, itt másféle jelszófájl kell, és jön egy plusz tulajdonság, a "realm", ami amolyan terület, névtér, tartomány, amire az adott védelem vonatkozik. Ez annyiban biztonságosabb az előzőnél, hogy a jelszó/azonosító páros nem sima szövegként megy a szerverig, nem olyan egyszerű kibogarászni. Persze, session lopás ellen nem védett, de már javul a helyzet. Használatához szükség lesz egy scriptre, ami a jelszófájlt generálja, ez ugyanaz szinte mint az előző, csak MD5-öt használ, és belerakja a realm-ot is. Natehát, a digest nagyon egyszerű szerkezetű, ezért most kézzel fogjuk elkészíteni, mert mókás. :) Dobjuk is össze a parancssorban, nem kell script sem. Az md5-öt az md5sum-al fogjuk csinálni, a cut azért kell, mert az md5sum egy '-' -et is ír a végére, de az nekünk nem kell. A userünk legyen 'bendeguz', a realm legyen 'titkos terület', a jelszó meg 'szilvasgomboc'. Valahogy így néz ki a parancs:
echo `echo -n "bendeguz:titkos terulet:" && echo -n "bendeguz:titkos terulet:szilvasgomboc" | md5sum | cut -c1-32` > /etc/nginx/.htpasswd.digestHa most belenézünk a digest fájlba, valami ilyesmi lesz ott:
cat /etc/nginx/.htpasswd.digest bendeguz:titkos terulet:b7cf679ce02627397c6f98199e2416abPersze, aki gondolja, kereshet hozzá külön programot, ami megcsinálja, csak, akárcsak az elsőnél, felesleges. Azért van ilyen, persze.
Hogy csak még izgalmasabb legyen, közölnöm kell, hogy a http-auth-digest modul nem része az alap nginx-nek, vagyis ha az előbbieket beleírtuk a nginx.conf-ba, és újra is indítottuk szegényt, akkor közli hogy nincs ilyen modul, és nem indul el. Semmi baj, két lehetőség is áll előttünk. Az egyik, hogy kitöröljük a digest-es opciókat (mind a két sort), és elhisszük, hogy ilyen van.
Ha viszont szeretnénk használni, akkor újra kell fordítanunk az nginx-et forrásból, a http-digest modullal. (Ugyanis az nginx nem támogat dinamikus modulbetöltést, csak a fordításkor belekerült modulokat tudja használni.) Akik nem akarnak ezzel vívódni, azoktól el kell köszönjek, a többiek figyeljenek, elmesélem hogy csináltam.
Egyébként nem nagy dolog, pár parancs az egész. A szokásos, pureftpd-nél leírt módot választom, csomagot generálok belőle, azt könnyebb eltávolítani is, meg "hivatalosabb", mint ha kihagynám a csomagkezelőt a történetből. Csináljunk egy nginx-with-digest könyvtárat, bele a szokásos pkg és src könyvtárakat, bele egy PKGBUILD fájlt, és nyissuk is meg:
mkdir nginx-with-digest && cd nginx-with-digest && mkdir {src,pkg} && vim PKGBUILDA PKGBUILD-ban legyen valami ilyesmi:
# Maintainer: mortein79 <mortein79@gmail.com> pkgname=nginx-with-digest pkgver=1.2.4 pkgrel=1 pkgdesc="nginx server with http-digest module" arch=('arm') url="http://nginx.org" license=('custom') depends=('openssl' 'passenger') backup=('etc/nginx/nginx.conf' 'usr/sbin/nginx') source=("http://nginx.org/download/nginx-${pkgver}.tar.gz") build() { cd ${srcdir} wget https://github.com/samizdatco/nginx-http-auth-digest/tarball/master -O nginx-http-auth-digest-latest.tar.gz tar xvf nginx-http-auth-digest-latest.tar.gz cd ${srcdir}/nginx-${pkgver} ./configure --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin/nginx --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --user=http --group=http --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/client-body --http-proxy-temp-path=/var/lib/nginx/proxy --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-imap --with-imap_ssl_module --with-ipv6 --with-pcre-jit --with-file-aio --with-http_dav_module --with-http_gzip_static_module --with-http_realip_module --with-http_ssl_module --with-http_stub_status_module --add-module=/usr/lib/passenger/ext/nginx --add-module=${srcdir}/samizdatco-nginx-http-auth-digest-* make } package() { mv /etc/nginx /etc/nginx.original # nem szép megoldás, de nem akartam sokat babrálni vele... cd ${srcdir}/nginx-${pkgver} make DESTDIR=${pkgdir} install } md5sums=('a7c9a515f632c8cbb07ab67392208088')Elméletileg menni fog, szépen letölti a legutolsó stabil nginx-et (illetve a beleégetett 1.2.4-et) és a modult, kicsomagolja, beállítja, lefordítja. A konfigurálási opciók ugyanazok, mint a "gyári", nginx-é (az "nginx -V" (nagyvé!) paranccsal tudjuk megnézni őket), csak hozzáadtam a frissen letöltött és kicsomagolt http-digest modult. A fordítás nekem kb. 10 percig tartott. Ha "sudo makepkg -i " -vel csináljátok, telepíti is a fordítás után. Ilyenkor felül is írja a jelenleg hivatalos csomagból származó binárist, vagyis ha rendszerfrissítésnél jön egy új nginx a hivatalos repoban, akkor a mienknek annyi. Ilyenkor vagy újra lefordítjuk az újat, vagy feltelepítjük újra ezt. Ha ezt akarjuk megtartani, és megakadályozni, hogy a pacman az új nginx-ekkel folyton felülírja a mienket, akkor az /etc/pacman.conf-ba írjuk bele:
IgnorePkg=nginxÍgy a pacman nem fogja frissíteni az nginx-et. Remélem, minden jól ment, ha mégsem, próbáljuk kézzel lefordítani, a szokásos módon, ahogy a makepkg is csinálja, configure, make, hátha kiderül mi a hiba. Ha viszont elrontunk valamit, csak állítsuk vissza az eredeti nginx-et, egyetlen fájl csak:
mv /usr/sbin/nginx.pacnew /usr/sbin/nginxMerthogy a pacman a régi fájlt ilyen néven backupolta el. (PKGBUILD fájl, 11. sor) Vagy ha így sem jó valami, nyugodtan újratelepíthetjük az egész nginx-et, (miután kiszedtük a hatástalanítást a pacman-conf-ból), szépen visszaáll minden. Az eredeti conf fájlok is ott vannak, az /etc/nginx.original könyvtárban.
Nincsenek megjegyzések:
Megjegyzés küldése