от Владимир "n3c" Беляшки(23-01-2004)

рейтинг (39)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Всички от нас, в една или друга степен, са запознати с ftp протокола и неговите особености и възможности. Той намира огромно приложение, а броят на ftp сървърите непрекъснато расте с навлизането и у нас на кабелните връзки, достъпни за масовия потребител. В настоящата статия ще предложа на вниманието Ви един вариант за реализиране на личен ftp сървър. Моля обърнете внимание, че тук не става дума за пускане на стандартен ftp сървър, вървящ на порт 21/tcp.
За какво по дяволите Ви е нужен "нестандартен" ftp сървър? Много просто - за лична употреба. Понякога е удобно да имаш напълно функционално ftp, вървящо на нестандартен порт и недопускащо анонимни потребители. Особено когато съдържанието му е предназначено само за приятели и познати. И тъй като "нестандартен порт" за ftp е всеки свободен порт различен от 21/tcp (изключвам разбира се www, mail и т.н. портовете), то спокойно може да прехвърлим системната бариера от 1024 порта, където само root може да се разпорежда. Това пък позволява стартирането на сървър от непривилегирован потребител, което подобрява системната сигурност.


Защо точно pure-ftpd? Резонен въпрос.
Най-напред, както самото име подсказва (pure - чист (б.а.)), pure-ftpd е един сървър реализиран без излишни усложнения във функционално, потребителско или администраторско отношение, което го прави доста лек и бърз. Това обаче изобщо не означава, че той е "постен" що се касае до функции и предлагани възможности, дори напротив. Всичко, което следва да може един напълно модерен ftp сървър, присъства и в pure-ftpd - възможност за анонимен и оторизиран достъп, виртуални потребители, виртуални квоти, ограничаване на входящ/изходящ трафик (само за ftp връзките), криптиране на ftp сесията, глобинг и т.н.
Pure-ftpd е също така доста гъвкав що се касае до компилационни опции. Контролът върху това какво да поддържа сървъра и какво не е респектиращ.
Предполагам всички поне са чували, че ftp се води като един доста проблемен по отношение на сигурността протокол. В това отношение pure-ftpd може да се причисли към малкото сигурни ftp сървъри. До момента на писане на тази статия няма официален случай на компроментиран pure-ftpd.
И все пак не е лошо да се подсигурите срещу евентуални проблеми в бъдеще. За целта е добре да пуснете Вашия личен ftp сървър като непривилегирован потребител.


Какво Ви е нужно?
Последната версия на pure-ftpd, която можете да свалите от официалното ftp или от някой сървър близо до Вас. Ако ползвате инструментите за инсталиране и управление на софтуера във Вашата дистрибуция, свалянето става автоматично.

Преди да преминете към конфигурация и инсталация е нужна малко предварителна подготовка.

Когато избирате място за директория, в която ще се помещават съдържанието на ftp сървъра и системните му файлове, не забравяйте, че съдържанието на един ftp сървър може да придобие големи размери и то сравнително бързо. Затова създайте въпросната директория на дисков дял с достатъчно място. Ако няма да предоставяте възможност за качване на файлове притеснението с мястото отпада, тъй като винаги можете да направите линк към съществуващ системен ресурс и да избегнете множеството му копия на различни места.

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

Реализация
В момента на писане на статията текущата версия на pure-ftpd е 1.0.17а. След като вече имате сорса може да пристъпите към прединсталационна конфигурация.

$ 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

По-вероятно (и препоръчително) е да използвате споменатите вече системни инструменти за инсталация на софтуер, което Ви спестява ръчното разархивиране. За целта е необходимо да подадете описаните по-горе след ./configure аргументи по време на прединсталационната конфигурация с команден ред и синтакс специфичен за Вашата дистрибуция или да редактирате Makefile, където е приложимо, като ги опишете в CONFIGURE_ARGS= секцията. Пълен списък на наличните аргументи и обяснение какво означават можете да намерите във файла README или тук. Ето и кратко описание на използваните в случая:

--with-altlog: информация свързана с работата на сървъра се логва във файл с определен формат. Поддържаните в момента формати са CLF, Stats и W3C.
--with-cookie: при влизане на потребител се изважда приветствено съобщение от fortune (ако присъства в системата) или предефиниран банер.
--with-diraliases: поддръжка на псевдоними за директории при употребата на команда cd.
--with-nonroot: възможност за пускане на сървъра с потребител различен от root.
--with-peruserlimits: възможност за ограничаване на броя активни сесии за всеки потребител.
--with-puredb: поддръжка за виртуални потребители, независими от системните акаунти (повече информация има във файла README.Virtual-Users или тук).
--with-quotas: поддръжка за виртуални квоти (ако планирате да предоставяте възможност за качване на файлове).
--with-throttling: поддръжка за ограничаване на входяща/изходяща скорост (повече информация има във файла README или тук).
--with-boring: показва "професионално изглеждащи" съобщения.
--with-tls: поддръжка за криптиране на контролната връзка (нужен е SSL сертификат, повече информация има във файла README.TLS или тук).
--with-certfile: указва кой сертификат да се използва за криптиране на сесията.
--without-inetd: изключва поддръжката за стартиране на сървъра през inetd и позволява стартиране само като отделен сървър.

Предлаганите възможности включват още: поддръжка за потребителски бази данни с mysql/postgresql; смяна на езика, на който сървъра "говори" (български още няма :)); легитимация чрез pam модули; модул за извикване на външна програма след качване на нов файл на сървъра и много други.

След като е направена желаната конфигурация се пристъпва към компилиране и инсталиране:

# make
# make install

Ако ползвате системните инструменти процесът и тук е автоматизиран. Вече имате инсталиран ftp сървър.

За да може да се добавят виртуални потребители, които да ползват сървъра оторизирано, Ви е нужен системен акаунт, правата на който се делегират при влизане в сървъра. Това може да е всеки съществуващ вече акаунт (без root) или акаунт създаден специално за целта. Добавете потребител "ftpuser" в група "ftpgroup" примерно. В Linux/OpenBSD/NetBSD/Solaris/HPUX и други Unix-подобни системи това става с:

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

А във FreeBSD с:

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

В горните примери заместете $SHELL с пълен път към валиден шел присъстващ в системата Ви.
Прехвърлете тези директории на ftpuser и сменете правата им:

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

Разбира се можете да дадете и по-рестриктивни права, но съвсем резонно е, който има достъп до системата да има достъп и до съдържанието на ftp-то, без значение дали имате само локални или и отдалечени потребители. Ако само Вие ползвате машината - нещата са повече от ясни.

Пускане на сървъра.
Пускането на ftp сървъра става с помощта на системен скрипт, който се слага в съответната директория, за да може да се изпълнява автоматично при зареждане на системата. Ето примерно съдържание:

#!/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"

Разбира се всичко може да бъде написано на един непрекъснат ред без "\"-те, а също така замествате пътеките, така че да рефлектират адекватно върху състoянието на системата Ви. Имената на файловете могат да бъдат сменени по Ваше усмотрение (примерно вместо ftpd.log може да бъде ftp.log, pure-ftpd.log, pure.log или каквото Ви е удобно за употреба). Единственото правило е да знаете точно как сте ги именували, което винаги можете да проверите като видите съдържанието на директорията /full/path/to/dir/ftp. $FTP_SERVER_IP замествате с IP адреса, на който ще работи сървъра, а $PORT с порта, на който ще слуша. Обърнете внимание, че в случая IP и порт не се задават като IP:порт.
Какво всъщност означава тази конфигурация: сървърът се стартира в режим за съвместимост с IPv4 (-4); всички потребители работят в chroot среда (-A); сървърът става демон след стартирането си (-B); приемат се общо 10 едновременни сесии (-c 10); приемат се максимум по две едновременни сесии от IP адрес (-C 2); логват се debug съобщения (-d); разрешение за достъп само на оторизирани потребители (-E); път до fortune базата данни, от която се показват случайни съобщения при влизане в сървъра (-F ...); път и име на файла, в който се записва процеса на сървъра (-g ...); IP адресите на посетителите не се превеждат, а се логват като IP-та (-H); време в минути, след което връзките към бездействащите потребители се прекъсват (-I 10); директория, в която автоматично да се създават домашни директории на виртуалните потребители (-j ...); забрана за качване на нови файлове ако дисковия дял е толко процента пълен (-к 98); разрешаване за продължаване на прекъснат входящ трансфер, но забрана за триене или преименуване на трансферираните файлове (-К); вид на легитимационната база данни и път към файла, в който се съдържа тя (-l ...); формат на логването и пълен път до файла, в който се логва (-O ...); обхват от портове, в който сървърът работи в пасивен режим (-p 35000:40000); забрана за записване върху съществуващи файлове (-r); IP адрес и порт, на които слуша сървърът (-S $FTP_SERVER_IP,$PORT); минимален потребителски номер, за който се разрешава достъп (-u 100); маски за нови файлове:директории (-U 333:022); използване на криптиран/некриптиран канал за контролната връзка, в зависимост от възможностите на ftp клиента (-Y 1); предотвратяване на някои "глупави" действия поради недоглеждане (-Z).
Препоръчително е да прочетете пълния списък на предлаганите опции и да изберете конфигурация, която удовлетворява най-добре Вашите нужди. Пълен списък със съкратена информация има в man pure-ftpd, а с подробна информация във файла README или тук.
Така настроеният сървър работи с правата на непривилегирования потребител "ftpuser" и не позволява анонимен достъп. Именно това е причината да указвате директории за логване, pid файл и база данни на виртуалните потребители различни от подразбиращите се в системата, тъй като в подразбиращите се (/var/log/, /var/run/) само root би следвало да има права за писане.

За криптиране на връзката pure-ftpd използва SSL/TLS. Това означава, че на машината, на която ще върви ftp сървъра трябва да има инсталирани OpenSSL библиотеки и SSL сертификат. За да ползвате SSL/TLS трябва да разполагате с файл /full/path/to/dir/ftp/pure-ftpd.pem, който да съдържа частен ключ за хоста Ви и съответния сертификат. Генерирането на нов сертификат става по следния начин:

# 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

Единственото, което Ви остава да решите е дали да приемате криптирана/некриптирана връзка (това зависи от възможностите на ftp клиента) или само криптирана (на клиентите неподдържащи криптиране се отказва достъп) и да го зададете като параметър в стартиращия скрипт (опцията -Y в скрипта по-горе). Валидните комбинации са:
-Y 0: не се ползва криптиране;
-Y 1: приемат се и криптирани, и некриптирани сесии;
-Y 2: приемат се само криптирани сесии.
За повече информация прочетете файла README.TLS или тук.
Внимание! Не всички ftp клиенти са в състояние да се възползват от криптографски услуги.

С това настройките на ftp сървъра се изчерпват и вече спокойно може да преминете към стартиране. Направете го от команден ред като използвате опциите, избрани от Вас, от стартиращия скрипт (не забравяйте да смените потребителя, с който стартирате сървъра - su ftpuser). Ако всичко е наред сървъра ще тръгне без да върне никакво съобщение, в противен случай няма да бъде стартиран. Затова проверявате дали има работещ сървър:

$ ps aux | grep pure-ftpd

Трябва да получите отговор подобен на

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

Ако няма работещ сървър опитайте повторно стартиране, но без опцията -B (режим демон). Веднага ще получите съобщение за грешка, по което може да се ориентирате каква точно нередност пречи на функционирането на сървъра.

След като се сдобиете с нормално работещ ftp сървър остава само да добавите съответните виртуални потребителски акаунти. За управление на виртуалните акаунти pure-ftpd предлага няколко вградени средства.


Управление на виртуалните потребители
Всички администраторски функции в pure-ftpd, касаещи управлвнието на виртуалните потребители, се осъществяват посредством инструмента pure-pw и различни параметри подавани към него. Добавяне на нов потребител "goshko" става по следния начин:

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

-u показва с правата на кой системен потребител ще се идентифицира виртуалния "goshko". -d е домашната директория на "goshko". С -f се указва в кой файл се намира потребителската бази данни, където да се добави новосъздадения "goshko". При указване на домашна директория може да изберете два подхода: 1) всички виртуални потребители поделят една обща домашна директория (както в горния случай); 2) всеки виртуален потребител има своя собствена домашна директория, която се явява и / за него (в този случай тя се дефинира като -d /full/path/to/dir/ftp/pub/goshko в командния ред на pure-pw и при наличие на опция -j в стартиращия скрипт бива създадена автоматично при първото влизане в сървъра). Разликите при двата подхода са очевидни - при "1)" цялото съдържание на ftp-то е достъпно за всеки, докато при "2)" се получава виртуално разделение (тъй като всеки е заключен с chroot в домашната си директория). Обърнете внимание, че съдържанието на ftp-то може да се слoжи директно в /full/path/to/dir/ftp/pub при "1)", а при "2)" е необходимо ресурсите полагащи се на всеки виртуален потребител да се линкват в дамашната му директория.
Внимание! При никакви обстоятелства не бива да добавяте виртуален потребител с дoмaшна директория /full/path/to/dir/ftp, тъй като там се съхраняват системните файлове на ftp сървъра.

Това са задължителните параметри, без които не може да добавите виртуален потребител, но те не са единствените. Имате възможност да поставяте квоти за дисково пространство и за ограничаване скоростта на трафика, да отказвате или разрешавате достъп на виртуален потребител от определени хостове, да слагате лимитиращо съотношение между свалени/качени брой файлове или трафик и т.н. Пълен списък и описание може да намерите в документацията (файла README.Virtual-Users) или тук.

Веднъж създаден профилът на виртуалния потребител не се заключва. Имате възможност да правите колкото и каквито промени искате, в размките на регламентираното. Например на сложите квота на "goshko":

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

Току-що ограничихте "goshko" да разполага с 1000 файла и 10МБ дисково пространство на ftp сървъра. Както сами виждате usermod работи по същия начин като useradd с тази разлика, че редактира съществуващ виртуален профил. Изчистване на атрибути става като подадете '' (два апострофа или ударения, както ги наричате) вместо стойност към съответния параметър:

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

Изтриване на потребител, както сигурен съм вече се досещате, става с помощта на userdel:

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

А смяна на потребителска парола, също се досещате, с passwd:

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

Когато сте готови с промените или просто искате да проверите настройките на нечий виртуален профил, използвайте show:

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

Получавате достатъчно подробна, ясна и прегледна информация надявам се.

Забележка: за изтриване на виртуален потребител или за смяна настройките на съществуващ, може да прибегнете и към ръчна редакция на файла с пароли. За повече информация относно синтакса на потребителски запис се консултирайте с документацията.
Забележка: делегирайте цялата ftp дирктория рекурсивно на ftpuser:ftpgroup и сменета правата за достъп до ftpd.passwd на 600

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

Всички промени, които правихте до сега се записват и съхраняват в съответния passwd файл. Но за да могат те да станат реалност и ftp сървъра да ги ползва, трябва от въпросния passwd файл да се създаде база данни. Това се осъществява с помощта на pure-pw mkdb. Синтаксът на командата е прост:

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

Така всички направени промени влизат в сила веднага, без да се налага рестартиране на ftp сървъра. За да се ползва базата данни от pure-ftpd, системният потребител, от чието име върви сървъра, трябва да има права за четене на db файла. Ето и един прост пърл скрипт за автоматизация на въвеждане промените в сила:

#!/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");

За да работи този скрипт го копирайте в /full/path/to/dir/ftp/. Ако сте сменяли, за Ваше удобство, името на файла с пароли, направете необходимите корекции и в скрипта.

Забележка: при използване на която и да е от pure-pw командите не е нужно да въвеждате пълния път до файла с паролите, при условие, че се намирате в директорията, където се съхранява той.



Специални благодарности на Симеон "Blackmore" Симеонов за пърл скрипта и за неоценимата помощ, оказана при реализирането на горния сценарии.


<< Публични информационни системи с Линукс терминали | Помогнете на Fedora >>