Apache + MS SQL через внешнюю Java-авторизацию
Код testConnection.java
Ниже — пример простого клиента, который Apache вызывает для проверки учётных данных пользователя. Код читает имя и пароль из stdin и пытается подключиться к MS SQL через драйвер jTDS.
import java.sql.*;
import java.io.*;
import java.text.*;
public class testConnection
{
static InputStreamReader converter = new InputStreamReader (System.in);
static BufferedReader in = new BufferedReader (converter);
// Read a String from standard system input
public static String getString() {
try {
return in.readLine();
} catch( Exception e ) {
System.out.println("getString() exception, returning empty string");
return "";
}
}
public static void main(String[] args)
{
String userName;
String userPass;
// userName = args[0];
userName = getString();
// userPass = args[1];
userPass = getString();
DB db = new DB();
db.dbConnect(
"jdbc:jtds:sqlserver://xxx.xxx.xxx.xxx:1433/test",userName,userPass);
}
}
class DB
{
public DB() {}
public void dbConnect(String db_connect_string,
String db_userid, String db_password)
{
try
{
Class.forName("net.sourceforge.jtds.jdbc.Driver");
Connection conn = DriverManager.getConnection(
db_connect_string, db_userid, db_password);
System.out.println("connected");
System.exit(0);
}
catch (Exception e)
{
//e.printStackTrace();
System.out.println("failed");
System.exit(1);
}
}
};Краткие пояснения:
- JDBC URL использует порт 1433 по умолчанию для MS SQL.
- Драйвер: net.sourceforge.jtds.jdbc.Driver (jTDS). Убедитесь, что JAR драйвера в classpath при запуске.
Компиляция и упаковка
Скомпилируйте программу командой:
javac testConnection.javaУпакуйте в JAR с манифестом, указывающим главный класс:
jar cfm tc.jar manifest DB.class testConnection.classФайл manifest должен содержать имя главного класса, например:
Main-Class: testConnection
Я скопировал tc.jar в /usr/local/testConn/.
Конфигурация Apache
Ниже — пример добавления внешней авторизации в конфиг Apache (/etc/apache2/default-server.conf):
AddExternalAuth archive_auth "/usr/lib/java/bin/java -jar /usr/local/testConn/tc.jar"
SetExternalAuthMethod archive_auth pipe
И пример секции директории в httpd.conf, чтобы применить эту авторизацию к каталогу /srv/www/htdocs/secretarea:
Options Indexes FollowSymLinks
AllowOverride None
AuthType Basic
AuthName "Autorizacija!"
AuthExternal archive_auth
Require valid-user
После перезапуска Apache при обращении к http://xxx.xxx.xxx.xxx/secretarea сервер запросит логин и пароль, передаст их программе tc.jar через stdin, программа проверит их в MS SQL и вернёт успех или отказ.
Как это работает
- Клиент (браузер) вводит учётные данные при Basic Auth.
- Apache запускает внешний процесс (наш JAR) и передаёт логин/пароль по каналу.
- JAR использует JDBC для подключения к MS SQL и проверяет учётные данные.
- JAR возвращает код завершения (0 — успех, >0 — отказ), и Apache решает, дать доступ или нет.
Важно: Apache не хранит пароль в открытом виде дольше, чем нужно, но JAR всё равно получает пароль на stdin. Минимизируйте логирование чувствительных данных.
Соображения по безопасности
- Защитите файл JAR и каталог /usr/local/testConn от чтения посторонними.
- Запускайте Java с минимальными правами, не от root.
- По возможности используйте TLS/HTTPS, чтобы защитить Basic Auth на транспортном уровне.
- Рассмотрите централизованную авторизацию (LDAP/AD) как альтернативу, если у вас масштабная инфраструктура.
Отладка и распространённые ошибки
- ClassNotFoundException: драйвер jTDS не в classpath при запуске. Добавьте драйвер в java -cp или в системный classpath.
- Неправильный путь к java в AddExternalAuth: проверьте полный путь до исполняемого java.
- Сетевая ошибка: убедитесь, что сервер MS SQL доступен по указанному адресу и порту (обычно 1433).
- Неправильный JDBC URL или формат базы данных: проверьте строку подключения.
- Права SELinux/AppArmor или файловые права: проверьте логи и разрешения.
Примеры команд для проверки вручную:
echo -e "username\npassword" | /usr/lib/java/bin/java -jar /usr/local/testConn/tc.jarЭто имитирует вызов Apache и помогает локально проверить JAR.
Контрольный список внедрения
- Скомпилирован testConnection.java и собран tc.jar.
- Драйвер jTDS доступен Java (classpath).
- tc.jar расположен в защищённом каталоге (/usr/local/testConn/).
- Путь к java корректен в AddExternalAuth.
- В конфигурации Apache добавлены AddExternalAuth и SetExternalAuthMethod.
- Директория защищена настройками AuthExternal и Require valid-user.
- Проверены сетевые настройки и доступ к MS SQL (порт 1433).
- Включено TLS для защищённого обмена логином и паролем.
Критерии приёмки
- Попытка доступа к /secretarea запрашивает логин и пароль.
- При корректных учётных данных доступ разрешается.
- При некорректных — доступ запрещён.
- Логи не содержат открытых паролей.
- Решение работает стабильно в течение тестового окна.
Альтернативы и улучшения
- Использовать модуль авторизации, интегрированный с AD/LDAP (если есть необходимость централизованного управления).
- Применить модуль mod_authn_dbd или другой модуль, если хотите хранить учётные данные в безопасной БД с пулом соединений.
Краткое резюме
Этот подход прост и позволяет переиспользовать существующую логику проверки учётных записей через JDBC. Он подходит для небольших инсталляций или миграционных сценариев. Для боевой эксплуатации учтите соображения безопасности и масштабируемости.
Примечание: перед развёртыванием в проде протестируйте работу под тем же пользователем, от которого запускается Apache, и проверьте права доступа к файлам и сети.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента