Доброй ночи!
Довелось мне заняться очень увлекательным делом. Мне потребовалось настроить 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