Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> proftpd,pgsql,web

Proftpd с автризацией в postgresql и web управлением

Автор: DNK.


Пришлось недавно помочь товарищу с установкой proftpd сервера с авторизацией
в postgresql, заодно и web интерфейс управления навоял. Собственно я уже
писал такую статью раньше (уберу ее , что бы не плодить лишнего), но время
идет и все меняется. Изменился немного принцип установки, плюс добавил
форму управления пользователями.Кроме того, сразу уберем ошибку proftpd_sql_pgsql
связанную с кодировкой БД.
Итак начнем.
Устанавливать будем на freebsd10. При создании сервера я сразу разметил диск
с директорией /ftp , это будет наша корневая директория для FTP сервера ( вы
можете изменить ее на другую потом).
Как обычно, все делаем копи-пастом.
Устанавливаем :

cd /usr/ports/www/apache24/
make config-recursive
make install clean

cd /usr/ports/lang/php5
make config

[x] APACHE Build Apache Module


make install clean

cd /usr/ports/databases/postgresql90-server/
make config-recursive
make install clean

cd /usr/ports/databases/postgresql90-contrib/
make config-recursive
make install clean

cd /usr/ports/ftp/proftpd/
make install clean

cd /usr/ports/databases/proftpd-mod_sql_postgres/
make install clean

mkdir -p /srv/www/PAS
echo 'postgresql_enable="YES"' >> /etc/rc.conf
echo 'apache24_enable="YES"' >> /etc/rc.conf
echo 'proftpd_enable="YES"' >> /etc/rc.conf
chown -R nobody:nogroup /ftp
htpasswd -c /srv/www/PAS/.htpasswd admin

С установкой покончили, конфигурим.
Редактируем файл /usr/local/etc/apache24/httpd.conf
Ищем <IfModule mime_module>
и вставляем
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Ищем <Directory />
и меняем
#    Require all denied
    Allow from all

Ищем DirectoryIndex index.html
и дописываем
DirectoryIndex index.html index.php

Так же меняем
ServerName nash_server
Listen 9999

Создаем файл /usr/local/etc/apache24/Includes/webftp.conf
такого содержания
<VirtualHost *:9999>
    ServerAdmin webmaster@nash_server.ua
    DocumentRoot "/srv/www/webftp"
    <Directory / >
        Allowoverride All
    </Directory>
    ServerName nash_server.ua
    ErrorLog "/var/log/webftp.error_log"
    CustomLog "/var/log/webftp.access_log" common
</VirtualHost>

Для забывчивых : в /etc/hosts вставляем ваш IP с именем сервера.
Убираем ошибку модуля SQL proftpd :
открываем файл /usr/local/etc/rc.d/postgresql и меняем строку
postgresql_initdb_flags=${postgresql_initdb_flags:-
"--encoding=utf-8 --lc-collate=C"}
на
postgresql_initdb_flags=${postgresql_initdb_flags:-
"--encoding=koi8-r --lc-collate=C"}
(строки разбил на 2 - т.к. не влазит в 1 строку)

Вообще странно, почему разрабы не устраняют ошибку, связанную с использованием
кодировки utf-8.
Приводим конфиг /usr/local/etc/proftpd.conf
к следующему виду


LoadModule mod_sql.c
LoadModule mod_sql_postgres.c
SQLBackend postgres

ServerName                      "FTP server"
# тип сервера standalone/inetd - сам или через inetd
ServerType                      standalone
DefaultServer                   on
Port                            21
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#для открытия доступа в пассивном режиме
#когда сервер за роутером
#MasqueradeAddress Внешний_IP_на шлюзе
#<Global>
#PassivePorts 60126 60128
#</Global>
#в pf.conf вставить 2 строчки
#rdr on $ext_if1 inet proto tcp to $ext_if1 port 21 -> IP-СЕРВЕРА
#rdr on $ext_if1 inet proto tcp to $ext_if1 port 60126:60128 -> IP-СЕРВЕРА
#========================================================================

ServerAdmin             admin@vash_domen.ua
# Маска с которой создаются новые файлы (не совсем маска - маска получается
# из этого значения, путём его вычитания из 777 - т.е. в даном случае получится
# маска 755)
Umask                           022
MaxInstances                    50
CommandBufferSize       512

User                            nobody
Group                           nogroup

AllowOverwrite          on
# Директории
<Directory ~>
AllowOverwrite          on
<Limit Write>
AllowAll
</Limit>
<Limit READ>
AllowAll
</Limit>
</Directory>
<Limit SITE_CHMOD>
  DenyAll
</Limit>

SQLAuthTypes            Plaintext
SQLAuthenticate         users
SQLConnectInfo          proftp@localhost proftp
SQLUserInfo             users username password uid gid homedir shell
RequireValidShell off
#SQLLogFile      /var/log/proftpd.log

SQLLog          PASS            counter_login
SQLNamedQuery   counter_login   UPDATE "\
        last_login=date_trunc ( 'seconds' ,\
        timestamp without time zone 'now' ),\
        login_count=login_count+1 WHERE \
        username='%u'" users

# пишем неудачные логины в БД
SQLLog          ERR_PASS        counter_err
SQLNamedQuery   counter_err     UPDATE "\
        last_error_login=date_trunc ( 'seconds' ,\
        timestamp without time zone\'now' ), \
        login_error_count=login_error_count+1 WHERE \
        username='%U'" users

# логируем что сохраняет и тащщит с сервера:
# переменные
# %u - имя пользователя (с которым залогинился)
# %f - полный путь и имя файла который был скачан
# %b - число байт, которые были скачаны
# %h - имя клиента (из DNS), если не удалось разрешить - IP
# %a - IP-адрес клиента
# %m - имя команды полученной от клиента (RETR/STOR)
# %T - время (секунд) ушедшее на передачу файла клиенту
SQLLog          DELE,RETR,STOR,         log_work

SQLNamedQuery  log_work FREEFORM "\
INSERT INTO worklog (\
         date,\
         user_name,\
         file_and_path,\
         bytes,\
         send_time,\
         client_ip,\
         client_name,\
         client_command) \
VALUES(\
date_trunc ( 'seconds' , timestamp without time zone 'now' ),\
'%u','%f','%b','%T','%a','%h','%m')"


# записываем ошибки при сохранении и чтении файлов
# (в одну строку не влезли - но работает и в таком виде :))

SQLLOG    ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO log_error
SQLNamedQuery  log_error FREEFORM "\
INSERT INTO errorlog (\
         date,\
         user_name,\
         file_and_path,\
         bytes,\
         send_time,\
         client_ip,\
         client_name,\
         client_command) \
VALUES(\
date_trunc ( 'seconds' , timestamp without time zone 'now' ),\
'%u','%f','%b','%T','%a','%h','%m')"
# если вылезет проблема, типа тормозов при подключении
# (в момент установления коннекта `задумывается` на 10-20 секунд)
# то раскомментируйте следующие две строки
#UseReverseDNS     off
#IdentLookups      off

# ВСЕ пользователи по ftp ограниченны
# своей домашней директорией
DefaultRoot     ~

DefaultRoot             ~       !admin
MaxClients 55 "Слишком много соединений с сервером"
MaxClientsPerHost 24 "%m клиента уже подключены с Вашего хоста"
MaxLoginAttempts 3 "Слишком много попыток войти"
AccessDenyMsg "ATTENTION!!! ALL CONNECTIONS LOGED"
AccessGrantMsg "Now upload/download files"

#Возможно определить с каких ip соединения допустимы или запрещены
#UseHostsAllowFile /etc/proftpd.allow
#UseHostsDenyFile /etc/proftpd.deny

# Установим ограничения по времени
#TimeoutIdle 180
#TimeoutLogin 120
#TimeoutNoTransfer 360
#TimeoutStalled 640

# Логи
SyslogLevel notice
UseReverseDNS off
#TransferLog /var/log/proftpd-tranfer.log
#SystemLog /var/log/proftpd-error.log
#ExtendedLog /var/log/proftpd-extended.log read,write

#Для кодировки win-cp1251
#(корректо отображается вин кодировка, а не кракозябры)
LangEngine on
UseEncoding KOI8-R CP1251

#Для корректного отображения времени
TimesGMT  off
SetEnv TZ :/etc/localtime

Теперь стягиваем web морду,
webftp.tgz
файл скачан размер размещён примечание
webftp.tgz
198 3.1kb 2014-01-30 web interface

заходим в /srv/www/, распаковываем ее (получим директорию webftp)
Редактируем /srv/www/webftp/webftp.conf :
меняем $server='10.10.10.10'; на ваш IP.(иначе не откроются
FTP соединения в браузере с вашим сервером)

/usr/local/etc/rc.d/postgresql initdb
/usr/local/etc/rc.d/postgresql start
su - pgsql
createuser proftp
exit
createdb -Uproftp proftp
psql -Uproftp proftp

Создаем таблицы

CREATE TABLE users (id serial PRIMARY KEY,username varchar(20),password varchar
(20),groupname varchar(24),uid int,gid int,homedir varchar(70),shell varchar
(20),last_login varchar(30),login_count int,last_error_login varchar
(30),login_error_count int);
CREATE TABLE worklog (id serial PRIMARY KEY,date varchar(30),user_name varchar
(20),file_and_path text,bytes int8,send_time varchar(9),client_ip varchar
(15),client_name text,client_command varchar(5));
CREATE TABLE errorlog (id serial PRIMARY KEY,date varchar(30),user_name varchar
(20),file_and_path text,bytes int8,send_time varchar(9),client_ip varchar
(15),client_name text,client_command varchar(5));
insert INTO users VALUES (1,'admin','12345876','nobody',65534,65533,
'/ftp','/bin/sh','0',0,'0',0);


exit
/usr/local/etc/rc.d/apache24 start
/usr/local/etc/rc.d/proftpd start

Заходим на http://ваш_ip:9999/

PS вин-кодировка будет корректно отображаться по ls. За внешний вид web не ругайте :)
пива было мало, настроение было серое.И еще, со временем логи в БД будут расти,
поэтому, сделал отображение только последних 100 строчек.
И на последок, если вам нужен ftp сервер для 5-10 пользователей :) не заморачивайтесь
с данным решением.



размещено: 2014-01-30,
последнее обновление: 2014-01-30,
автор: DNK


hopto, 2014-06-05 в 23:06:32

Где указывать пароль к БД в proftpd.conf
Веб интрефейс пишет только "An error occured."

DNK, 2014-06-06 в 9:43:17

SQLConnectInfo          proftp@localhost proftp
в данном случае БД на локалхосте, юзер без пароля.
SQLConnectInfo          proftp:passwd@localhost proftp



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0527 секунд
Из них PHP: 37%; SQL: 63%; Число SQL-запросов: 79 шт.
Исходный размер: 33709; Сжатая: 9117