от Vladsun(2-08-2007)

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

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

1. Увод

Статията ще разгледа проблемите и решенията при създаване на home директориите на FTP потребителите, структурата им и правата на потребителите в тях. Вниманието е концентрирано върху конфигурирането на FTP сървер със специфични изисквания към структурата на директориите и поддиректориите.

ProFTP е един от популярните ftp сървери и тъй като аз работя предимно с него ще разгледам неговата конфигурация.

2. Обща конфигурация

След като FTP сървера се конфигурира и пусне в действие е необходимо да се добавят потребители, които да имат достъп до тази услуга.
Нека предположим, че сме създали потребител ftp към група ftp и сървера е пуснат с този потребител. Също така сме създали директорията /home/ftp със собственик ftp:ftp.
При тези условия, искаме да добавяме директориите на потребителите като поддиректории на /home/ftp/. Добавянето може да стане по различен начин - примерно чрез mySQL или LDAP модулите за автентификация на ProFTP. Друг начин е чрез използването на useradd командата.
Най-често това става чрез:

useradd
useradd -g ftp -s /bin/false -d /home/ftp/ivan -pPAROLA ivan


Използването на /bin/false за shell на FTP потребителите е препоръчително.
В тази статия ще разгледам конфигурирането на ProFTP сървер с MySQL автентификация. Самият инсталационен процес няма да бъде разглеждан.

Ето какво представлява /etc/proftpd/proftpd.conf:
/etc/proftpd/proftpd.conf
 Include /etc/proftpd/modules.conf
 
 UseIPv6				off
 
 ServerName			"ServerName of you choice"
 ServerType			standalone
 DeferWelcome			off
 
 MultilineRFC2228		on
 DefaultServer			on
 ShowSymlinks			on
 
 TimeoutNoTransfer		600
 TimeoutStalled			600
 TimeoutIdle			1200
 
 ListOptions         "-l"
 
 Port				21
 
 MaxInstances			30
 
 User				ftp
 Group				ftp
 
 Umask				022  022
 AllowOverwrite			on
 
 DenyFilter			\*.*/
 DenyFilter			".ftpaccess"
 
 DefaultRoot			~
 
 TransferLog			/var/log/proftpd/xferlog
 SystemLog			/var/log/proftpd/proftpd.log
 
 <IfModule mod_tls.c>
 TLSEngine off
 </IfModule>
 
 <IfModule mod_quota.c>
 QuotaEngine on
 </IfModule>
 
 <IfModule mod_ratio.c>
 Ratios on
 </IfModule>
 
 <IfModule mod_delay.c>
 DelayEngine on
 </IfModule>
 
 <IfModule mod_ctrls.c>
 ControlsEngine        on
 ControlsMaxClients    2
 ControlsLog           /var/log/proftpd/controls.log
 ControlsInterval      5
 ControlsSocket        /var/run/proftpd/proftpd.sock
 </IfModule>
 
 <IfModule mod_ctrls_admin.c>
 AdminControlsEngine on
 </IfModule>
 
 SQLConnectInfo		proftpd@localhost proftpd_database proftpd_password
 SQLAuthenticate		users groups
 SQLAuthTypes		Crypt Backend
 SQLDefaultHomedir	~
 SQLUserInfo		users userid passwd uid gid homedir shell
 SQLGroupInfo		groups groupid gid members
 
 SQLLogFile		/var/log/proftpd.sql_log
 
 # Count number of logins for each user
 SQLLog                PASS logincount
 SQLNamedQuery         logincount UPDATE "login_count=login_count+1 WHERE userid='%u'" users
 
 # Save last login
 SQLLog                PASS lastlogin
 SQLNamedQuery         lastlogin UPDATE "last_login=now() WHERE userid='%u'" users
 
 # Count number of bytes/files downloaded and uploaded
 SQLLog RETR           dlbytescount
 SQLNamedQuery         dlbytescount UPDATE "dl_bytes=dl_bytes+%b WHERE userid='%u'" users
 SQLLog RETR           dlcount
 SQLNamedQuery         dlcount UPDATE "dl_count=dl_count+1 WHERE userid='%u'" users
 SQLLog STOR           ulbytescount
 SQLNamedQuery         ulbytescount UPDATE "ul_bytes=ul_bytes+%b WHERE userid='%u'" users   
 SQLLog STOR           ulcount
 SQLNamedQuery         ulcount UPDATE "ul_count=ul_count+1 WHERE userid='%u'" users
 
 # Do not let disabled or expired users to login
 SQLUserWhereClause    "disabled!=1 and (NOW()<=expires or expires=-1)"
 
 # Do not require a valid shell, this might be a good thing to turn on for SQL-users
 # This might simplify the configuration a little bit
 RequireValidShell	off


Естествено, вашият конфигурационен файл може да се различава, особено в MySQL частта. В случая съм използвал готово решение за web интерфейс - "ProFTPd management", в което има задание за таблиците и конфигурацията на ProFTP.
До тук нищо интересно.

3. Създаване на директории при поискване

Ако се опитате да влезете във FTP сървера с потребител създаден от www интерфейса и по горния конфигурационен файл, то ще получите грешка поради факта, че няма създадена home директория за потребителя. Причините за липсата на тази директория са две:

  • www сървера не би трябвало да има права за създаване на директории в /home/ftp/;
  • нямате зададена опция в конфигурационния файл на ProFTP за автоматично създаване на директорията.

  • Едина от опциите в случая е:
    SQLHomedirOnDemand
    SQLHomedirOnDemand	on


    Т.е. при първото влизане на потребителя неговата home директория ще се създаде автоматично със съответните собственик, група и права. За правата ще говорим по-долу.
    Друга опция, с по-големи възможности е:
    CreateHome
    CreateHome on

    Ако са зададени и двете опции, то CreateHome е с приоритет.
    Опцията е в следния формат:
    CreateHome
    CreateHome off|on [<mode>] [skel <path>] [dirmode <mode>]

    В най-простия вариант имаме:
    CreateHome
    CreateHome on

    В този случай ще се създават автоматично директории за потребителите, като правата за директорията са 0700 - стойността на mode по премълчаване.
    Ако искаме да променим правата, прим. на 711, то ще използваме:
    CreateHome
    CreateHome on 711

    Използването на dirmode параметъра се налага в случаите, когато създаваме home директория за потребител, която се намира в несъществуваша(и) директория(и). Примено имаме потребител hasan. Искаме така да организираме дървото на FTP потребителските директории, че то да е подредено по азбучен ред от втори ред. Т.е. директорията на hasan трябва да е /home/ftp/h/ha/hasan. Ако hasan е първия потребител с буквата "h", то директориите /home/ftp/h и /home/ftp/h/ha все още не съшествуват. В такива случаи използваме следното:
    CreateHome
    CreateHome on 700 dirmode

    В този случай правата върху директориите /home/ftp/h и /home/ftp/h/ha са отново 0700. Ако искаме да променим правата върху директориите /home/ftp/h и /home/ftp/h/ha (прим на 0711), то използваме:
    CreateHome
    CreateHome on 700 dirmode 711

    В някои случаи се налага да се изгради структура от поддиректории за всеки потрбител. Примерно всеки потребител трябва да има директории out, in, temp при това с различни права върху тях.
    Реализацията на подобна функционалност се задава чрез skel параметъра:
    CreateHome
    CreateHome on skel /etc/ftpd/skel

    Стойността на този параметър де факто е пътя до директорията, която съдържа модела (скелета) за създаване на структурата на директориите заедно с файловете в тях за всеки потребител.
    Според примера по-горе в /etc/ftpd/skel трябва да имаме имаме:

    /etc/ftpd/skel/in
    /etc/ftpd/skel/out
    /etc/ftpd/skel/temp


    Тогава при първото влизане на потребителя hasan ще се получи следното дърво на директориите:

    /home/ftp/hasan/in
    /home/ftp/hasan/out
    /home/ftp/hasan/temp


    Ако използваме и примера за dirmode, то ще се получи следното дърво на директориите:

    /home/ftp/h/ha/hasan/in
    /home/ftp/h/ha/hasan/out
    /home/ftp/h/ha/hasan/temp


    В този случай пълната опция е:
    CreateHome
    CreateHome on 700 skel /etc/ftpd/skel dirmode 711


    В "скелетната" директория може да има и файлове - те също ше се създадат в директорият на потребителя. Най-уместно е тези файлове да са .ftpaccess файлове, с които да се задават допълнително ограничения по действията на потребителя за всяка директория. Именно този файл ще разгледаме в следващата точка.

    4. Използване на .ftpaccess файла

    Файл с такова име, намиращ се в директория принадлежаща на FTP потребител действа като директивите в секция на конфигурационния файл на ProFTP. Ето защо е наложително да защитим достъпа до този файл чрез използването на:
    .ftpaccess
    DenyFilter			".ftpaccess"

    в конфигурационния файл.
    Естествено, няма да описвам всички възможни опции, които можете да зададете в този файл. Ще разгледам само някои случаи за ограничаване на правата за писане, четене, триене и редакция на файлове от потребителя.

    4.1. Само за четене


    .ftpaccess
    <Limit ALL>
     DenyAll
     </Limit>
     
     <Limit CDUP CWD XCWD XCUP PWD XPWD LIST>
     AllowAll
     </Limit>
     
     <Limit READ>
     AllowAll
     </Limit>



    4.2. Само за запис, без триене


    .ftpaccess
    <Limit ALL>
     DenyAll
     </Limit>
     
     <Limit CDUP CWD XCWD XCUP PWD XPWD LIST>
     AllowAll
     </Limit>
     
     <Limit STOR STOU>
     AllowAll
     </Limit>



    4.3. Само запис, без триене, без редакция

    Важно е да се отбележи забраната за CHMOD командата.
    .ftpaccess
    <Limit ALL>
     DenyAll
     </Limit>
     
     <Limit CDUP CWD XCWD XCUP PWD XPWD LIST>
     AllowAll
     </Limit>
     
     <Limit STOR STOU>
     AllowAll
     </Limit>
     
     Umask	222

    За повече информация относно FTP командите, които можете да използвате по описания по-горе начин:
    http://www.nsftools.com/tips/RawFTP.htm


    5. Използвани материали

    http://www.nsftools.com/tips/RawFTP.htm
    http://www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-CreateHome.html
    http://www.khoosys.net/single.htm?ipg=848
    http://ppmy.sourceforge.net/HOWTO



    << | >>