Документация по ОС FreeBSD Пятница, 19.04.2024, 01:20
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » FTP

Установка и настройка ProFTP + PgSQL [2008]
Многие сисадмины предпочитают использовать бд postgreSQL для хранения
данных и логов.Вот и все отличие данной статьи от статьи уважаемого автора lissyara
proftp+mysql.Ну разве что немного расширена конфигурация.

1)Устанавливаем PostgreSQL
Root>cd /usr/ports/databases/postgresql82-server/
Root>make install clean


2)Настраиваем и запускаем
Root>su – pgsql
$>initdb

Root> echo posgresql_enable="YES" >> /etc/rc.conf
Root>/usr/local/etc/rc.d/postgresql start

3)Создадим юзера ftp и разрешим ему создавать БД
Root>adduser ftp
Root>su – pgsql
$>createuser ftp


4)Создадим БД proftp и таблицы в ней
Root>su – ftp
ftp>createdb proftp
ftp>psql 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,'test','123','ftp',1010,1010,'/var/ftp','/sbin/\
sh','0',0,'0',0);
insert INTO users VALUES (2,'test1','345','ftp',1010,1010,'/var/ftp/test1','\
/sbin/sh','0',0,'0',0);

   Psql>exit
   Root>mkdir /var/ftp
   Root>mkdir /var/ftp/test1
   Roott>chown –R 1010:1010 /var/ftp


5)Ставим из портов:
Root>cd /usr/ports/ftp/proftpd/
Root>make config


[ ] IPV6 Use IPv6
[ ] LDAP Use LDAP
[ ] MYSQL Use MySQL
[X] POSTGRESQL Use Postgres
[ ] OPENSSL Include mod_tls
[X] QUOTA Include mod_quota
[ ] IFSESSION Include mod_ifsession
[X] README Include mod_readme
[X] RATIO Include mod_ratio
[X] REWRITE Include mod_rewrite
[X] WRAP Include mod_wrap
[ ] RADIUS Include mod_radius

root>make install clean

После инсталляции правим конфиг /usr/local/etc/proftpd.conf:
# имя сервера - показывается коннектящимся клиентам
ServerName "FTP server DNK"
# тип сервера standalone/inetd - сам или через inetd
ServerType standalone
# смысл следующей директивы такой: если клиент коннектится не на имя
# а на IP или на виртуальный хост, не описанный в конфиге, то при
# установке в `off` он получит отлуп, если же установлено `on` то
# он будет обслужен `сервером по-умолчанию`
DefaultServer on
# файло где хранится инфа о сессиях
#ScoreboardFile /var/run/proftpd.scoreboard
# порт на котором работает сервер
Port 21
# e-mail администратора (по идее для каждого ВиртуалХоста его можно
# поставить разный - но я делаю один сервер без извращений с
# виртуальными хостами)
ServerAdmin admin@dnk.ua
# Маска с которой создаются новые файлы (не совсем маска - маска получается
# из этого значения, путём его вычитания из 777 - т.е. в даном случае получится
# маска 755)
Umask 022
# Максимальное число `детей` (работает только в standalohe режиме)
# необходимо для защиты от атак типа `отказ в обслуживании` да и
# от перегрузки сервера поможет
MaxInstances 30
CommandBufferSize 512
# Юзер от которого работает сервер
# группа, под которой работает сервер
User ftp
Group ftp
# Normally, we want files to be overwriteable.
AllowOverwrite on
# Директории
<Directory ~>
AllowOverwrite on
<Limit Write>
AllowAll
</Limit>
<Limit READ>
AllowAll
</Limit>
</Directory>
<Limit SITE_CHMOD>
 DenyAll
</Limit>
#########################################################################
#Если нужен анонимный вход - раскоментируй
#########################################################################
#<Anonymous ~ftp>
# User users
# Group users
 ### We want clients to be able to login with "anonymous" as well as "ftp"
 # UserAlias anonymous ftp
 ### Limit the maximum number of anonymous logins
 # MaxClients 10
 ### We want 'welcome.msg' displayed at login, and '.message' displayed
 ### in each newly chdired directory.
 # DisplayLogin welcome.msg
 # DisplayFirstChdir .message
 ### Limit WRITE everywhere in the anonymous chroot
 # <Limit WRITE>
 # DenyAll
 # </Limit>
#</Anonymous>
#====================================================================================
# Тип авторизации (на самом деле - в каком виде хрянятся
# пароли в БД - в данном случае - открытым текстом)
SQLAuthTypes Plaintext
# Кого и как аутентифицируем - on - всех и вся :)
# Но - если поставить `on` то он ломится в БД за группами.
# мне группы никчему. Посему поставил `users`
SQLAuthenticate users
# инфа для соединения с PgSQL сервером:
# имя_базы_данных@хост_где_PgSQL:порт имя_пользователя пароль
SQLConnectInfo proftp@localhost ftp
# в каком порядке вернёт поля запрос - первое поле, это
# имя таблицы, где лежат пользователи
SQLUserInfo users username password uid gid homedir shell
# должен ли быть у юзера (для того, чтобы он мог коннектится),
# `реальный` shell описанный в /etc/shells
RequireValidShell off
# лог файл работы с SQL (после проверки работоспособности – закоментировать)
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=err_login_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 ~

# у меня хитрее сделано - себе я разрешил шариться по всему серверу
# а остальных за`chroot`ил. Если, например, надо чтобы пользователи
# могли по серверу шариться а анонимоусы нет, то надо указать !users
# также можно указать определённую группу.
#DefaultRoot ~ !ftp
MaxClients 55 "Слишком много соединений с сервером"
MaxClientsPerHost 24 "%m клиента уже подключены с Вашего хоста, больше не разрешено"
MaxLoginAttempts 3 "Слишком много попыток войти"
AccessDenyMsg "ATTENTION!!! ALL CONNECTIONS LOGED"
AccessGrantMsg "Now upload/download files"
DisplayGoAway "Go Away"

#Возможно определить с каких 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

6) Запускаемся
Root>echo proftpd_enable=”YES”>> /etc/rc.conf
Root>/usr/local/etc/rc.d/proftpd start


7)Для ленивых скриптик на Perl для добавления пользователя

Для запуска скрипта (от root) необходимо установить из портов
/usr/ports/database/p5-DBI и /usr/ports/database/p5-DBD-Pg

#!/usr/bin/perl
use DBI;
#данные о БД и пользователе
$dbname='proftp';
$user='ftp';
$passwd='';
#шаблон для нового пользователя
$username='';
$password='';
$groupname='ftp';
$uid=1010;
$gid=1010;
$homedir='/var/ftp';
$shell='/bin/sh';

L1:
print "Username=>";$s=<STDIN>;chomp($s);
if($s eq ""){goto L1;}else{$username=$s;}
L2:
print "Password=>";$s=<STDIN>;chomp($s);
if($s eq ""){goto L2;}else{$password=$s;}
print "Groupname (default $groupname)=>";$s=<STDIN>;chomp($s);
if($s ne ""){$groupname=$s;}
print "UID (default $uid)=>";$s=<STDIN>;chomp($s);
if($s ne ""){$uid=$s;}
print "GID (default $gid)=>";$s=<STDIN>;chomp($s);
if($s ne ""){$gid=$s;}
print "Homedir (default $homedir)=>";$s=<STDIN>;chomp($s);
if($s ne ""){$homedir=$s;}
print "Shell (default $shell)=>";$s=<STDIN>;chomp($s);
if($s ne ""){$shell=$s;}

print "\n\n\n=========================================\n";
print "Username=$username\nPassword=$password\nGroupname=$groupname\n
 UID=$uid\nGID=$gid\nDir=$homedir\nShell=$shell\n";
print "=========================================\n";
print "Insert (default 'y')?=>";$s=<STDIN>;chomp($s);
if($s eq ""){$s='y';}
if($s eq 'y' or $s eq 'Y')
{
$dbh=DBI->connect("DBI:Pg:dbname='$dbname'","$user","$passwd");
$sth=$dbh->prepare("insert into users (username,password,groupname,
 uid,gid,homedir,shell,last_login,login_count,last_error_login,login_error_count) \
values('$username','$password','$groupname',$uid,$gid,'$homedir','$shell','',0,'',0)");
$sth->execute();$sth->finish();$dbh->disconnect();print "SUCCESS\n";
}

@a=`su - $user -c ' /usr/local/bin/psql proftp -c "select * from users;"'`;
print @a;

Логи сохраняются в таком виде :

# psql proftp
Welcome to psql 8.2.5, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
 \h for help with SQL commands
 \? for help with psql commands
 \g or terminate with semicolon to execute query
 \q to quit

proftp=# \d
 Список отношений
 Схема | Имя | Тип | Владелец
--------+-----------------+--------------------+----------
 public | errorlog | таблица | ftp
 public | errorlog_id_seq | последовательность | ftp
 public | users | таблица | ftp
 public | users_id_seq | последовательность | ftp
 public | worklog | таблица | ftp
 public | worklog_id_seq | последовательность | ftp
(6 rows)

proftp=# SELECT * from worklog;
 id | date | user_name | file_and_path | bytes | send_time | client_ip | client_name | client_command
----+---------------------+-----------+---------------------------------------+----------+-----------+--------------+--------------+----------------
 1 | 2008-07-31 06:45:57 | test | /var/ftp/VirtualBox-1.6.0-Win_x86.msi | 22353408 | 27.678 | 192.168.1.83 | 192.168.1.83 | STOR
 2 | 2008-07-31 06:46:05 | test | /var/ftp/VirtualBox-1.6.0-Win_x86.msi | 0 | 0.0 | 192.168.1.83 | 192.168.1.83 | DELE
(2 rows)

proftp=# SELECT * from users;
 id | username | password | groupname | uid | gid | homedir | shell | last_login | login_count | last_error_login | login_error_count
----+----------+----------+-----------+------+------+----------+----------+---------------------+-------------+------------------+-------------------
 1 | test | 123 | ftp | 1010 | 1010 | /var/ftp | /sbin/sh | 2008-07-31 06:45:10 | 3 | 0 | 0
(1 запись)

proftp=#



Источник: http://www.lissyara.su/?id=1725
Категория: FTP | Добавил: oleg (01.08.2008) | Автор: DNK
Просмотров: 2202 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024