ot Vladimir "n3c" Beliashki(23-01-2004)

reiting (42)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

Vsichki ot nas, v edna ili druga stepen, sa zapoznati s ftp protokola i negovite osobenosti i vuzmozhnosti. Toi namira ogromno prilozhenie, a broiat na ftp survurite neprekusnato raste s navlizaneto i u nas na kabelnite vruzki, dostupni za masoviia potrebitel. V nastoiashtata statiia shte predlozha na vnimanieto Vi edin variant za realizirane na lichen ftp survur. Molia oburnete vnimanie, che tuk ne stava duma za puskane na standarten ftp survur, vurviasht na port 21/tcp.
Za kakvo po diavolite Vi e nuzhen "nestandarten" ftp survur? Mnogo prosto - za lichna upotreba. Poniakoga e udobno da imash napulno funktsionalno ftp, vurviashto na nestandarten port i nedopuskashto anonimni potrebiteli. Osobeno kogato sudurzhanieto mu e prednaznacheno samo za priiateli i poznati. I tui kato "nestandarten port" za ftp e vseki svoboden port razlichen ot 21/tcp (izklyuchvam razbira se www, mail i t.n. portovete), to spokoino mozhe da prehvurlim sistemnata bariera ot 1024 porta, kudeto samo root mozhe da se razporezhda. Tova puk pozvoliava startiraneto na survur ot neprivilegirovan potrebitel, koeto podobriava sistemnata sigurnost.


Zashto tochno pure-ftpd? Rezonen vupros.
Nai-napred, kakto samoto ime podskazva (pure - chist (b.a.)), pure-ftpd e edin survur realiziran bez izlishni uslozhneniia vuv funktsionalno, potrebitelsko ili administratorsko otnoshenie, koeto go pravi dosta lek i burz. Tova obache izobshto ne oznachava, che toi e "posten" shto se kasae do funktsii i predlagani vuzmozhnosti, dori naprotiv. Vsichko, koeto sledva da mozhe edin napulno moderen ftp survur, prisustva i v pure-ftpd - vuzmozhnost za anonimen i otoriziran dostup, virtualni potrebiteli, virtualni kvoti, ogranichavane na vhodiasht/izhodiasht trafik (samo za ftp vruzkite), kriptirane na ftp sesiiata, globing i t.n.
Pure-ftpd e sushto taka dosta guvkav shto se kasae do kompilatsionni optsii. Kontrolut vurhu tova kakvo da poddurzha survura i kakvo ne e respektirasht.
Predpolagam vsichki pone sa chuvali, che ftp se vodi kato edin dosta problemen po otnoshenie na sigurnostta protokol. V tova otnoshenie pure-ftpd mozhe da se prichisli kum malkoto sigurni ftp survuri. Do momenta na pisane na tazi statiia niama ofitsialen sluchai na kompromentiran pure-ftpd.
I vse pak ne e losho da se podsigurite sreshtu eventualni problemi v budeshte. Za tselta e dobre da pusnete Vashiia lichen ftp survur kato neprivilegirovan potrebitel.


Kakvo Vi e nuzhno?
Poslednata versiia na pure-ftpd, koiato mozhete da svalite ot ofitsialnoto ftp ili ot niakoi survur blizo do Vas. Ako polzvate instrumentite za instalirane i upravlenie na softuera vuv Vashata distributsiia, svalianeto stava avtomatichno.

Predi da preminete kum konfiguratsiia i instalatsiia e nuzhna malko predvaritelna podgotovka.

Kogato izbirate miasto za direktoriia, v koiato shte se pomeshtavat sudurzhanieto na ftp survura i sistemnite mu failove, ne zabraviaite, che sudurzhanieto na edin ftp survur mozhe da pridobie golemi razmeri i to sravnitelno burzo. Zatova suzdaite vuprosnata direktoriia na diskov dial s dostatuchno miasto. Ako niama da predostaviate vuzmozhnost za kachvane na failove pritesnenieto s miastoto otpada, tui kato vinagi mozhete da napravite link kum sushtestvuvasht sistemen resurs i da izbegnete mnozhestvoto mu kopiia na razlichni mesta.

# mkdir -p /full/path/to/dir/ftp
# mkdir /full/path/to/dir/ftp/pub

Realizatsiia
V momenta na pisane na statiiata tekushtata versiia na pure-ftpd e 1.0.17a. Sled kato veche imate sorsa mozhe da pristupite kum predinstalatsionna konfiguratsiia.

$ su
# tar zxvf pure-ftpd-1.0.17a.tar.gz
# cd pure-ftpd-1.0.17a
# ./configure --with-altlog --with-cookie --with-diraliases \
--with-nonroot --with-peruserlimits --with-puredb \
--with-quotas --with-throttling --with-boring --with-tls \
--with-certfile=/full/path/to/dir/ftp/pure-ftpd.pem --without-inetd

Po-veroiatno (i preporuchitelno) e da izpolzvate spomenatite veche sistemni instrumenti za instalatsiia na softuer, koeto Vi spestiava ruchnoto razarhivirane. Za tselta e neobhodimo da podadete opisanite po-gore sled ./configure argumenti po vreme na predinstalatsionnata konfiguratsiia s komanden red i sintaks spetsifichen za Vashata distributsiia ili da redaktirate Makefile, kudeto e prilozhimo, kato gi opishete v CONFIGURE_ARGS= sektsiiata. Pulen spisuk na nalichnite argumenti i obiasnenie kakvo oznachavat mozhete da namerite vuv faila README ili tuk. Eto i kratko opisanie na izpolzvanite v sluchaia:

--with-altlog: informatsiia svurzana s rabotata na survura se logva vuv fail s opredelen format. Poddurzhanite v momenta formati sa CLF, Stats i W3C.
--with-cookie: pri vlizane na potrebitel se izvazhda privetstveno suobshtenie ot fortune (ako prisustva v sistemata) ili predefiniran baner.
--with-diraliases: poddruzhka na psevdonimi za direktorii pri upotrebata na komanda cd.
--with-nonroot: vuzmozhnost za puskane na survura s potrebitel razlichen ot root.
--with-peruserlimits: vuzmozhnost za ogranichavane na broia aktivni sesii za vseki potrebitel.
--with-puredb: poddruzhka za virtualni potrebiteli, nezavisimi ot sistemnite akaunti (poveche informatsiia ima vuv faila README.Virtual-Users ili tuk).
--with-quotas: poddruzhka za virtualni kvoti (ako planirate da predostaviate vuzmozhnost za kachvane na failove).
--with-throttling: poddruzhka za ogranichavane na vhodiashta/izhodiashta skorost (poveche informatsiia ima vuv faila README ili tuk).
--with-boring: pokazva "profesionalno izglezhdashti" suobshteniia.
--with-tls: poddruzhka za kriptirane na kontrolnata vruzka (nuzhen e SSL sertifikat, poveche informatsiia ima vuv faila README.TLS ili tuk).
--with-certfile: ukazva koi sertifikat da se izpolzva za kriptirane na sesiiata.
--without-inetd: izklyuchva poddruzhkata za startirane na survura prez inetd i pozvoliava startirane samo kato otdelen survur.

Predlaganite vuzmozhnosti vklyuchvat oshte: poddruzhka za potrebitelski bazi danni s mysql/postgresql; smiana na ezika, na koito survura "govori" (bulgarski oshte niama :)); legitimatsiia chrez pam moduli; modul za izvikvane na vunshna programa sled kachvane na nov fail na survura i mnogo drugi.

Sled kato e napravena zhelanata konfiguratsiia se pristupva kum kompilirane i instalirane:

# make
# make install

Ako polzvate sistemnite instrumenti protsesut i tuk e avtomatiziran. Veche imate instaliran ftp survur.

Za da mozhe da se dobaviat virtualni potrebiteli, koito da polzvat survura otorizirano, Vi e nuzhen sistemen akaunt, pravata na koito se delegirat pri vlizane v survura. Tova mozhe da e vseki sushtestvuvasht veche akaunt (bez root) ili akaunt suzdaden spetsialno za tselta. Dobavete potrebitel "ftpuser" v grupa "ftpgroup" primerno. V Linux/OpenBSD/NetBSD/Solaris/HPUX i drugi Unix-podobni sistemi tova stava s:

# groupadd ftpgroup
# useradd -g ftpgroup -d /full/path/to/dir/ftp -s $SHELL ftpuser

A vuv FreeBSD s:

# pw groupadd ftpgroup
# pw useradd ftpuser -g ftpgroup -d /full/path/to/dir/ftp -s $SHELL

V gornite primeri zamestete $SHELL s pulen put kum validen shel prisustvasht v sistemata Vi.
Prehvurlete tezi direktorii na ftpuser i smenete pravata im:

# chown -R ftpuser:ftpgroup /full/path/to/dir/ftp
# chmod -R 755 /full/path/to/dir/ftp

Razbira se mozhete da dadete i po-restriktivni prava, no suvsem rezonno e, koito ima dostup do sistemata da ima dostup i do sudurzhanieto na ftp-to, bez znachenie dali imate samo lokalni ili i otdalecheni potrebiteli. Ako samo Vie polzvate mashinata - neshtata sa poveche ot iasni.

Puskane na survura.
Puskaneto na ftp survura stava s pomoshtta na sistemen skript, koito se slaga v suotvetnata direktoriia, za da mozhe da se izpulniava avtomatichno pri zarezhdane na sistemata. Eto primerno sudurzhanie:

#!/full/path/to/bash
su ftpuser -c "/full/path/to/pure-ftpd -4 -A -B -c 10 -C 2 -d -E \
-F /full/path/to/fortune/zippy -g /full/path/to/dir/ftp/ftpd.pid -H -I 10 \
-j /full/path/to/dir/ftp/pub -k 98 -K -l puredb:/full/path/to/dir/ftp/ftpd.db \
-O clf:/full/path/to/dir/ftp/ftpd.log -p 35000:40000 -R \
-S $FTP_SERVER_IP,$PORT -u 100 -U 333:022 -Y 1 -Z"

Razbira se vsichko mozhe da bude napisano na edin neprekusnat red bez "\"-te, a sushto taka zamestvate putekite, taka che da reflektirat adekvatno vurhu sustoianieto na sistemata Vi. Imenata na failovete mogat da budat smeneni po Vashe usmotrenie (primerno vmesto ftpd.log mozhe da bude ftp.log, pure-ftpd.log, pure.log ili kakvoto Vi e udobno za upotreba). Edinstvenoto pravilo e da znaete tochno kak ste gi imenuvali, koeto vinagi mozhete da proverite kato vidite sudurzhanieto na direktoriiata /full/path/to/dir/ftp. $FTP_SERVER_IP zamestvate s IP adresa, na koito shte raboti survura, a $PORT s porta, na koito shte slusha. Oburnete vnimanie, che v sluchaia IP i port ne se zadavat kato IP:port.
Kakvo vsushtnost oznachava tazi konfiguratsiia: survurut se startira v rezhim za suvmestimost s IPv4 (-4); vsichki potrebiteli rabotiat v chroot sreda (-A); survurut stava demon sled startiraneto si (-B); priemat se obshto 10 ednovremenni sesii (-c 10); priemat se maksimum po dve ednovremenni sesii ot IP adres (-C 2); logvat se debug suobshteniia (-d); razreshenie za dostup samo na otorizirani potrebiteli (-E); put do fortune bazata danni, ot koiato se pokazvat sluchaini suobshteniia pri vlizane v survura (-F ...); put i ime na faila, v koito se zapisva protsesa na survura (-g ...); IP adresite na posetitelite ne se prevezhdat, a se logvat kato IP-ta (-H); vreme v minuti, sled koeto vruzkite kum bezdeistvashtite potrebiteli se prekusvat (-I 10); direktoriia, v koiato avtomatichno da se suzdavat domashni direktorii na virtualnite potrebiteli (-j ...); zabrana za kachvane na novi failove ako diskoviia dial e tolko protsenta pulen (-k 98); razreshavane za produlzhavane na prekusnat vhodiasht transfer, no zabrana za triene ili preimenuvane na transferiranite failove (-K); vid na legitimatsionnata baza danni i put kum faila, v koito se sudurzha tia (-l ...); format na logvaneto i pulen put do faila, v koito se logva (-O ...); obhvat ot portove, v koito survurut raboti v pasiven rezhim (-p 35000:40000); zabrana za zapisvane vurhu sushtestvuvashti failove (-r); IP adres i port, na koito slusha survurut (-S $FTP_SERVER_IP,$PORT); minimalen potrebitelski nomer, za koito se razreshava dostup (-u 100); maski za novi failove:direktorii (-U 333:022); izpolzvane na kriptiran/nekriptiran kanal za kontrolnata vruzka, v zavisimost ot vuzmozhnostite na ftp klienta (-Y 1); predotvratiavane na niakoi "glupavi" deistviia poradi nedoglezhdane (-Z).
Preporuchitelno e da prochetete pulniia spisuk na predlaganite optsii i da izberete konfiguratsiia, koiato udovletvoriava nai-dobre Vashite nuzhdi. Pulen spisuk sus sukratena informatsiia ima v man pure-ftpd, a s podrobna informatsiia vuv faila README ili tuk.
Taka nastroeniiat survur raboti s pravata na neprivilegirovaniia potrebitel "ftpuser" i ne pozvoliava anonimen dostup. Imenno tova e prichinata da ukazvate direktorii za logvane, pid fail i baza danni na virtualnite potrebiteli razlichni ot podrazbirashtite se v sistemata, tui kato v podrazbirashtite se (/var/log/, /var/run/) samo root bi sledvalo da ima prava za pisane.

Za kriptirane na vruzkata pure-ftpd izpolzva SSL/TLS. Tova oznachava, che na mashinata, na koiato shte vurvi ftp survura triabva da ima instalirani OpenSSL biblioteki i SSL sertifikat. Za da polzvate SSL/TLS triabva da razpolagate s fail /full/path/to/dir/ftp/pure-ftpd.pem, koito da sudurzha chasten klyuch za hosta Vi i suotvetniia sertifikat. Generiraneto na nov sertifikat stava po sledniia nachin:

# openssl req -x509 -nodes -newkey rsa:1024 -keyout \
/full/path/to/dir/ftp/pure-ftpd.pem \
-out /full/path/to/dir/ftp/pure-ftpd.pem
# chown ftpuser /full/path/to/dir/ftp/pure-ftpd.pem
# chmod 600 /full/path/to/dir/ftp/pure-ftpd.pem

Edinstvenoto, koeto Vi ostava da reshite e dali da priemate kriptirana/nekriptirana vruzka (tova zavisi ot vuzmozhnostite na ftp klienta) ili samo kriptirana (na klientite nepoddurzhashti kriptirane se otkazva dostup) i da go zadadete kato parametur v startirashtiia skript (optsiiata -Y v skripta po-gore). Validnite kombinatsii sa:
-Y 0: ne se polzva kriptirane;
-Y 1: priemat se i kriptirani, i nekriptirani sesii;
-Y 2: priemat se samo kriptirani sesii.
Za poveche informatsiia prochetete faila README.TLS ili tuk.
Vnimanie! Ne vsichki ftp klienti sa v sustoianie da se vuzpolzvat ot kriptografski uslugi.

S tova nastroikite na ftp survura se izcherpvat i veche spokoino mozhe da preminete kum startirane. Napravete go ot komanden red kato izpolzvate optsiite, izbrani ot Vas, ot startirashtiia skript (ne zabraviaite da smenite potrebitelia, s koito startirate survura - su ftpuser). Ako vsichko e nared survura shte trugne bez da vurne nikakvo suobshtenie, v protiven sluchai niama da bude startiran. Zatova proveriavate dali ima rabotesht survur:

$ ps aux | grep pure-ftpd

Triabva da poluchite otgovor podoben na

ftpuser 86170 9.0 0.3 2448 1636 ?? Ss 3:47PM 0:02.09 pure-ftpd (SERVER) (pure-ftpd)

Ako niama rabotesht survur opitaite povtorno startirane, no bez optsiiata -B (rezhim demon). Vednaga shte poluchite suobshtenie za greshka, po koeto mozhe da se orientirate kakva tochno nerednost prechi na funktsioniraneto na survura.

Sled kato se sdobiete s normalno rabotesht ftp survur ostava samo da dobavite suotvetnite virtualni potrebitelski akaunti. Za upravlenie na virtualnite akaunti pure-ftpd predlaga niakolko vgradeni sredstva.


Upravlenie na virtualnite potrebiteli
Vsichki administratorski funktsii v pure-ftpd, kasaeshti upravlvnieto na virtualnite potrebiteli, se osushtestviavat posredstvom instrumenta pure-pw i razlichni parametri podavani kum nego. Dobaviane na nov potrebitel "goshko" stava po sledniia nachin:

$ pure-pw useradd goshko -u ftpuser -d /full/path/to/dir/ftp/pub -f /full/path/to/dir/ftp/ftpd.passwd

-u pokazva s pravata na koi sistemen potrebitel shte se identifitsira virtualniia "goshko". -d e domashnata direktoriia na "goshko". S -f se ukazva v koi fail se namira potrebitelskata bazi danni, kudeto da se dobavi novosuzdadeniia "goshko". Pri ukazvane na domashna direktoriia mozhe da izberete dva podhoda: 1) vsichki virtualni potrebiteli podeliat edna obshta domashna direktoriia (kakto v gorniia sluchai); 2) vseki virtualen potrebitel ima svoia sobstvena domashna direktoriia, koiato se iaviava i / za nego (v tozi sluchai tia se definira kato -d /full/path/to/dir/ftp/pub/goshko v komandniia red na pure-pw i pri nalichie na optsiia -j v startirashtiia skript biva suzdadena avtomatichno pri purvoto vlizane v survura). Razlikite pri dvata podhoda sa ochevidni - pri "1)" tsialoto sudurzhanie na ftp-to e dostupno za vseki, dokato pri "2)" se poluchava virtualno razdelenie (tui kato vseki e zaklyuchen s chroot v domashnata si direktoriia). Oburnete vnimanie, che sudurzhanieto na ftp-to mozhe da se slozhi direktno v /full/path/to/dir/ftp/pub pri "1)", a pri "2)" e neobhodimo resursite polagashti se na vseki virtualen potrebitel da se linkvat v damashnata mu direktoriia.
Vnimanie! Pri nikakvi obstoiatelstva ne biva da dobaviate virtualen potrebitel s domashna direktoriia /full/path/to/dir/ftp, tui kato tam se suhraniavat sistemnite failove na ftp survura.

Tova sa zadulzhitelnite parametri, bez koito ne mozhe da dobavite virtualen potrebitel, no te ne sa edinstvenite. Imate vuzmozhnost da postaviate kvoti za diskovo prostranstvo i za ogranichavane skorostta na trafika, da otkazvate ili razreshavate dostup na virtualen potrebitel ot opredeleni hostove, da slagate limitirashto suotnoshenie mezhdu svaleni/kacheni broi failove ili trafik i t.n. Pulen spisuk i opisanie mozhe da namerite v dokumentatsiiata (faila README.Virtual-Users) ili tuk.

Vednuzh suzdaden profilut na virtualniia potrebitel ne se zaklyuchva. Imate vuzmozhnost da pravite kolkoto i kakvito promeni iskate, v razmkite na reglamentiranoto. Naprimer na slozhite kvota na "goshko":

$ pure-pw usermod goshko -n 1000 -N 10 -f /full/path/to/dir/ftp/ftpd.passwd

Toku-shto ogranichihte "goshko" da razpolaga s 1000 faila i 10MB diskovo prostranstvo na ftp survura. Kakto sami vizhdate usermod raboti po sushtiia nachin kato useradd s tazi razlika, che redaktira sushtestvuvasht virtualen profil. Izchistvane na atributi stava kato podadete '' (dva apostrofa ili udareniia, kakto gi narichate) vmesto stoinost kum suotvetniia parametur:

$ pure-pw usermod goshko -n '' -N '' -f /full/path/to/dir/ftp/ftpd.passwd

Iztrivane na potrebitel, kakto siguren sum veche se doseshtate, stava s pomoshtta na userdel:

$ pure-pw userdel goshko -f /full/path/to/dir/ftp/ftpd.passwd

A smiana na potrebitelska parola, sushto se doseshtate, s passwd:

$ pure-pw passwd goshko -f /full/path/to/dir/ftp/ftpd.passwd

Kogato ste gotovi s promenite ili prosto iskate da proverite nastroikite na nechii virtualen profil, izpolzvaite show:

$ pure-pw show goshko -f /full/path/to/dir/ftp/ftpd.passwd

Poluchavate dostatuchno podrobna, iasna i pregledna informatsiia nadiavam se.

Zabelezhka: za iztrivane na virtualen potrebitel ili za smiana nastroikite na sushtestvuvasht, mozhe da pribegnete i kum ruchna redaktsiia na faila s paroli. Za poveche informatsiia otnosno sintaksa na potrebitelski zapis se konsultiraite s dokumentatsiiata.
Zabelezhka: delegiraite tsialata ftp dirktoriia rekursivno na ftpuser:ftpgroup i smeneta pravata za dostup do ftpd.passwd na 600

# chown -R ftpuser:ftpgroup /full/path/to/dir/ftp
# chmod 600 /full/path/to/dir/ftp/ftpd.passwd

Vsichki promeni, koito pravihte do sega se zapisvat i suhraniavat v suotvetniia passwd fail. No za da mogat te da stanat realnost i ftp survura da gi polzva, triabva ot vuprosniia passwd fail da se suzdade baza danni. Tova se osushtestviava s pomoshtta na pure-pw mkdb. Sintaksut na komandata e prost:

$ pure-pw mkdb /full/path/to/dir/ftp/ftpd.db -f /full/path/to/dir/ftp/ftpd.passwd

Taka vsichki napraveni promeni vlizat v sila vednaga, bez da se nalaga restartirane na ftp survura. Za da se polzva bazata danni ot pure-ftpd, sistemniiat potrebitel, ot chieto ime vurvi survura, triabva da ima prava za chetene na db faila. Eto i edin prost purl skript za avtomatizatsiia na vuvezhdane promenite v sila:

#!/full/path/to/perl -w

#### CONFIGURATION ####
##########################

#### ftpd.db configuration ####
## ftpd.db user ##
$pure_user = "ftpuser";

## ftpd.db group ##
$pure_group = "ftpgroup";

## ftpd.db privileges##
$priv = "600";

##########################
######## THE END ########

system("pure-pw mkdb ftpd.db -f ftpd.passwd");
system("chown $pure_user:$pure_group ftpd.db ftpd.passwd");
system("chmod $priv ftpd.db ftpd.passwd");
print("\nDone!!\n");

Za da raboti tozi skript go kopiraite v /full/path/to/dir/ftp/. Ako ste smeniali, za Vashe udobstvo, imeto na faila s paroli, napravete neobhodimite korektsii i v skripta.

Zabelezhka: pri izpolzvane na koiato i da e ot pure-pw komandite ne e nuzhno da vuvezhdate pulniia put do faila s parolite, pri uslovie, che se namirate v direktoriiata, kudeto se suhraniava toi.



Spetsialni blagodarnosti na Simeon "Blackmore" Simeonov za purl skripta i za neotsenimata pomosht, okazana pri realiziraneto na gorniia stsenarii.


<< Publichni informatsionni sistemi s Linuks terminali | Pomognete na Fedora >>