Доброй ночи!
Довелось мне заняться очень увлекательным делом. Мне потребовалось настроить ftp сервер, да еще и с аутентификацией через Microsoft SQL Server.

Установка и настройка  Microsoft SQL Server 

Был выбран  Microsoft® SQL Server® 2008 Express with Tools в силу его бесплатности и наличия в комплекте SQL Server Management Studio.

Вовремя установки  я выбрал режим SQL Server Authentication добавил пользователя с именем user1 и паролем password1. Все остальные настройки оставил по умолчанию.

Отключаем или настраиваем виндовый firewall.

Теперь нужно разрешить входящие TCPIP подключения к нашему SQL Server.

  • Открываем  SQL Server Configuration Manager
  • Разворачиваем SQL Server Network Configuration
  • Выбираем Protocols for SQLEXPRESS
  • На TCP/IP заходим в Properties
  • Enable = Yes
  • Переходи на вкладку IP Addresses
  • В секции IPAll установить значение TCP Port = 1433
  • Перезапустить сервис базы

Если у вас уже был установлен SQL Server но была выбрана была Windows Authentication - необходимо (источник):

  • Зайти в SQL Server Management Studio 
  • Подключиться к серверу
  • Правой кнопкой на серваке в Object Explorer, выбрать Properties
  • Перейти на вкладку Security в секции Server authentication  выбрать SQL Server and  Windows Authentication mode
  • В  Object Explorer открыть папку SecurityLogins выбрать пользователя sa,  выбрать Properties
  • Установить новый пароль
  • На вкладке Status в секчии Login установить Enable
  • Перезапустить сервис

Пришло время создать базу данных которая будет хранить информацию о наших пользователях.

В  SQL Server Management Studio  создаем базу с именем TestDB, в ней две таблицы:

ftp_users:

CREATE TABLE [dbo].[ftp_users] (
    [username] NVARCHAR (256)  NOT NULL,
    [password] NCHAR (32)     NOT NULL,
    [uid]      INT            NOT NULL,
    [gid]      INT            NOT NULL,
    [homedir]  NVARCHAR (256) NOT NULL,
    [shell]    NCHAR (10)     NOT NULL
);

 ftp_groups:

CREATE TABLE [dbo].[ftp_groups] (
    [groupname] NVARCHAR (50)  NOT NULL,
    [gid]       INT            NOT NULL,
    [members]   NVARCHAR (MAX) NULL
);

База готова!

Установка и настройка FreeTDS

В консоли будущего ftp сервера выполнить:

sudo apt-get install freetds-dev sqsh tdsodbc

Редактируем /etc/freetds/freetds.conf 

sudo nano /etc/freetds/freetds.conf

Добавляем в конец:

[YOU_SERVER_NAME]
host = 192.168.0.100
port = 1433
tds version = 7.0

YOU_SERVER_NAME - имя подключения, может быть любым.

192.168.0.100 - адрес вашего SQLExpress (меняем на свой).

Проверяем подключение к  SQLExpress.

 sqsh -S YOU_SERVER_NAME -U user1 -P password1

В ответ должны получить:

sqsh-2.1 Copyright (C) 1995-2001 Scott C. Gray
This is free software with ABSOLUTELY NO WARRANTY
For more information type 'warranty'
1> quit

Установка и настройка unixODBC

Устанавливаем:

sudo apt-get install unixodbc-bin unixodbc-dev

Добавляем в ~/.profile следующие записи:

export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
export FREETDSCONF=/etc/freetds/freetds.conf

и выполняем их в консоли.

Добавляем в /etc/odbc.ini

[YOU_SERVER_NAME]
Driver = FreeTDS
Description = ODBC connection via FreeTDS
Trace = No
Servername = YOU_SERVER_NAME
Database = TestDB

Добавляем в /etc/odbcinst.ini

[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 1

У вас в системе   libtdsodbc.so и  libtdsS.so могут находиться в другом месте, например /usr/lib/odbc/ узнать их местоположение можно так:

dpkg -S libtds

Тестируем подключение:

isql -v YOU_SERVER_NAME user1 password1

В ответ должны получить:

+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> quit

Установка и настройка proftpd

Ставим:

sudo apt-get install proftpd proftpd-mod-odbc

Выбираем standalone режим

В /etc/shells добавить

/bin/false

В /etc/proftpd/proftpd.conf  нужно раскоментировать строку

DefaultRoot ~

В  /etc/proftpd/modules.conf раскоментить

LoadModule mod_sql.c
LoadModule mod_sql_odbc.c
LoadModule mod_sql_passwd.c

Создадим /etc/proftpd/conf.d/odbc.conf

SQLLogFile /var/log/proftpd/sql.log

<IfModule mod_sql_odbc.c>
SQLBackend odbc
SQLEngine on
SQLAuthenticate on

# Use both a crypted or plaintext password
SQLAuthTypes MD5
SQLConnectInfo YOU_SERVER_NAME <strong>user1</strong> <strong>password1</strong>
SQLUserInfo ftp_users username password uid gid homedir shell
SQLGroupInfo ftp_groups groupname gid members
SetEnv LD_LIBRARY_PATH /usr/lib
SetEnv ODBCINI /etc/odbc.ini
</IfModule>

Пароль в базе будем хранить в виде md5 хешей (лучше добавить соль).

Создайте /etc/proftpd/conf.d/passwd.conf

<IfModule mod_sql_passwd.c>
  SQLPasswordEngine on
  SQLPasswordEncoding hex
</IfModule>

Перезапустите ptoftpd

sudo service proftpd restart

Наш FPT сервер готов к работе.

Тестирование

Добавим тестового юзера в базу:

INSERT INTO [dbo].[ftp_users]
           ([username]
           ,[password]
           ,[uid]
           ,[gid]
           ,[homedir]
           ,[shell])
     VALUES
           ('testlogin'
           ,'698d51a19d8a121ce581499d7b701668'
           ,7777
           ,7777
           ,'/home/testlogin'
           ,'/bin/false')
GO

Создадим пользовательскую папку и дадим пользователю права:

sudo mkdir /home/testlogin
sudo chown 7777 /home/testlogin

Пользователя с UID 7777 может и не быть в системе, главное что бы на каталоге был соответствующий владелец.

Логинимся к нашему ftp, login: testlogin, password: 111 и пробуем загрузить файло. Все должно работать.

Полезные ссылки:

HowtoConnectToMicrosoftSQLServerFromRailsOnLinux

Connecting to MSSQL with Ruby on Ubuntu

 ProFTPD module mod_sql_odbc

ProFTPD module mod_sql_passwd

ProFTPD module mod_sql

ProFTPD mini-HOWTO Index