11.10.2006 03:42
Администратор
Установка MySQL
Автор: lissyara. Оригинал: http://www.lissyara.su/articles/freebsd/programms/mysql/
Опять статья навеянная многочислеными просьбами трудящихся :) Заодно не придётся во всех новых статьях описывать установку MySQL :) Так что, в любом случае пригодится. Вообще, с MySQL вроде всё просто, но почему-то народ активно морозится баз данных, используя системных юзеров в почте, да всякие файлы текстовые, под почту да хранение трафика. Хотя с БД оно всё на порядок удобней получается. Итак, рассматривать будем установку и небольшую настройку двух версий MySQL - 5.0 и 3.23 под FreeBSD6.0. Почему именно они? На данный момент, 5.1 вроде всё ещё бета, потому используется на рабочих серверах только отъявленными маньяками, или теми у кого есть необходимость. А вот 3.23 нужна в случаях, когда на какой-нить старенькой машинке нужна "записная книжка" для почтовых юзеров, да БД куда складывать статистику по траффику инета, например. Подымать для этого 5.0 или 4.1 - расточительство оперативки и ресурсов слабенькой машинки. У меня и на некоторых, очень хороших машинах, стоит 3.23 - ибо его хватает. Итак, ставим 5.0/usr/home/lissyara/>cd /usr/ports/databases/mysql50-server/ /usr/ports/databases/mysql50-server/>make ===> Vulnerability check disabled, database not found
You may use the following build options:
WITH_CHARSET=charset Define the primary built-in charset (latin1). WITH_XCHARSET=list Define other built-in charsets (may be 'all'). WITH_COLLATION=collate Define default collation (latin1_swedish_ci). WITH_OPENSSL=yes Enable secure connections. WITH_LINUXTHREADS=yes Use the linuxthreads pthread library. WITH_PROC_SCOPE_PTH=yes Use process scope threads (try it if you use libpthread). BUILD_OPTIMIZED=yes Enable compiler optimizations (use it if you need speed). BUILD_STATIC=yes Build a static version of mysqld. (use it if you need even more speed). WITHOUT_INNODB=yes Disable support for InnoDB table handler. WITH_ARCHIVE=yes Enable support for Archive Storage Engine. WITH_FEDERATED=yes Enable support for Federated Storage Engine. WITH_NDB=yes Enable support for NDB Cluster.
===> Extracting for mysql-server-5.0.22 ^C /usr/ports/databases/mysql50-server/>
Прервал. Доступна куча опций, потому с ними и поиграемся, для чего в файл /etc/make.conf надо внести такие строки:# Для некоторых, особо тупых приложений, лучше указать версию MySQL, # что используется, тут. Но - для совсем тупых не поможет и это. DEFAULT_MYSQL_VER=50
# Директория где лежат порты PORTSDIR?= /usr/ports
# для сервера .if ${.CURDIR} == ${PORTSDIR}/databases/mysql50-server # Дефолтовая кодировка. Вообще, этим пунктом увлекаться не стоит - # могут возникнуть проблемы при переносе на другой сервер. На самом # деле и не проблемы вовсе - просто дамп перекодировать да поменять # кодировку-коллэйшен у таблиц в дампе, перед заливкой, но первый # раз столкнувшись, вызывает кучу проблем... WITH_CHARSET=cp1251 # Другие вкомпиленные кодировки. Можно задать 'all' - все. #WITH_XCHARSET=all # Дефолтовая кодировка сравнения (другого слова подобрать не могу...) WITH_COLLATION=cp1251_bin # Поддержка OpenSSL - для шифрования передаваемых данных. # Шифрование - это конечно хорошо, но - повышается нагрузка на # машину сервера и на машину клиента (если и тот и другой на одной # машине - вообще не вижу смысла в этом пункте.) #WITH_OPENSSL=yes # Интересная опция - позволяет работать в несколько "нитей", # обрабатывая несколько запросов одновременно - в результате # повышается производительность. WITH_LINUXTHREADS=yes # Программные треды FreeBSD (если я верно всё понял). Тестов на скорость, # в сравнении с линуксовыми не нашлось - потому не знаю, кто быстрей. # Кстати, видел рекомендацию - включать и те и другие треды одновременно. # Смысла, особого в этом не вижу, но и не утверждаю ничего. #WITH_PROC_SCOPE_PTH=yes # Собирать с флагами оптимизации (-O2), сам не мерял, но по слухам, # несколько процентов производительности можно выиграть. Будет # полезным на старых машинах, или высоконагруженных. BUILD_OPTIMIZED=yes # Собрать статическую версию mysqld (cо вкомпиленными либами, чтоль) # Также, как и предыдущая опция, позволит выиграть несколько процентов # производительности (по слухам - до 10% - но чё-то слабо верится...) BUILD_STATIC=yes # Отключить тип таблиц InnoDB (если не используете - будет поменьше # коду, и, соответственно, быстрей работать будет) WITHOUT_INNODB=yes # Специальный тип хранения данных (не всех, тока тех, что без индексов), # позволяет хранить их в виде архива, тем самым экономится дисковое # пространство (в ущерб производительности, я думаю... Так что смысл # есть, лишь если надо хранить кучу неиндексированных данных - # те же данные по траффику, к примеру, там всё равно перебором почти всё :)) #WITH_ARCHIVE=yes # Фенька, позволяющая работать с удалёнными (находящимися на другом хосте) # таблицами данных, как будто они находятся на локальной машине # (NFS, чтоль, уже отменили? :)) Хотя, если выборки будут идти на другом # хосте - то нагрузка на сеть будет меньшe, чем с NFS. Короче - не пробовал, # ничё не утверждаю... Пару строк в документации прочёл.) #WITH_FEDERATED=yes # Опция, нужная лишь в случае, если будете собирать кластер MySQL-серверов #WITH_NDB=yes .endif # для клиента .if ${.CURDIR} == ${PORTSDIR}/databases/mysql50-client # Многие из опция сервера, применяются и в клиенте. Вобщем-то, какие не # применяются, интуитивно понятно - то, что касается всяких фенек, типа # кластеров, архивных таблиц и прочего. Ставить их тут можно, но они не # произведут никакого действия. Также, хочу заметить, что кодировка, # 'по-умолчанию' бывает не тока у сервера, но и у клиента. Частенько, # именно на этом прокалываются. (И вовсе не обязательно она должна быть # такая же как у сервера.) # Также хочу заметить, что клиента не надо собирать с какими бы то ни # было тредами - линуксовыми, или родными - я прокололся на линуксовых, # вроде всё пашет, с консоли, а вот апач падает... Методом исключения # выяснил виновника - клиент с тредами - падает mysql-модуль PHP, # валит апача... WITH_CHARSET=cp1251 WITH_COLLATION=cp1251_bin BUILD_OPTIMIZED=yes .endif
Итак, собираем MySQL:/usr/home/lissyara/>cd /usr/ports/databases/mysql50-server/ /usr/ports/databases/mysql50-server/>make && make install && make clean
После инсталляции клиента сборка прекращается с ошибкой - не может найти библиотеку.===> Installing ldconfig configuration file ===> Compressing manual pages for mysql-client-5.0.22 ===> Registering installation for mysql-client-5.0.22 ===> Returning to build of mysql-server-5.0.22 Error: shared library "mysqlclient.15" does not exist *** Error code 1
Stop in /usr/ports/databases/mysql50-server. /usr/ports/databases/mysql50-server/>
Я перезагрузился, помогло, но можно и иначе, дать команду:/usr/home/lissyara/>/sbin/ldconfig -m /usr/local/lib/mysql /usr/home/lissyara/>
Должно помочь и без перезагрузки. Вообще, раньше, вместе с клиентом, инсталлся такой скрипт: /usr/local/etc/rc.d/000.mysql-client.sh#!/bin/sh
case "$1" in start) /sbin/ldconfig -m /usr/local/lib/mysql ;; stop) ;; *) echo "" echo "Usage: `basename $0` { start | stop }" echo "" exit 64 ;; esac
Нынче он не инсталлится. Если ошибки будут продолжаться, при сборке других приложений из портов, то можно его добавить в автозагрузку, или, что грамотней, добавить путь в /etc/rc.conf (подробности можно найти здесь, поиск в странице, по ключевому слову ldconfig_paths). После чего продолжаем инсталляцию:/usr/ports/databases/mysql50-server/>make install && make clean
По окончании инсталляции, стругаем конфиг для mysql - /usr/local/etc/my.cnf# Этот конфигурационный файл сделан на основе файла для маленьких # систем - /usr/local/share/mysql/my-small.cnf. Большую часть его # делал не я, а один знакомый. Имени, к сожалению, не помню... # Но всё же предупреждаю - копирайт на настройки конфига не мой :)) # # Вообще, конфигурационный файл можно положить в несколько мест: # /etc/my.cnf # /var/db/mysql/my.cnf # /usr/local/etc/my.cnf # В любом из них mysqld его найдёт, и достанет из него настройки. # Самое корректное место, если судить по стартовому скрипту, это # директория где лежат базы данных - /var/db/mysql/my.cnf.
# Опции для всех клиентов MySQL [client] # Пароль для подключения к БД #password = your_password # Порт на котором висит MySQL port = 3306 # Сокет MySQL socket = /tmp/mysql.sock
# Опции MySQL-сервера [mysqld] # Порт port = 3306 # Адрес, который будем слушать (если вам не нужно подключаться к # MySQL с других машин, то оставьте здесь 127.0.0.1) bind-address = 127.0.0.1 # Где лежит сокет socket = /tmp/mysql.sock # Не использовать средства системных блокировок. skip-locking # Вообще, в новых версиях, (после 3.21) этот пункт правильно называется # key_buffer_size, но можно использовать и старое имя. Значение этого # пункта - размер буфера, используемого для блоков индексов. Чтобы # улучшить обработку индексов (для всех операций чтения и записи нескольких # элементов), необходимо увеличить это значение настолько, насколько возможно. # Рекомендуется, 1/4 от объёма оперативки, но не более 1/2 - иначе система # может начать сохранять временные файлы на диске, что значительно # снизит производительность. key_buffer = 16K # Максимальный размер одного пакета. Изначально размер буфера сообщений # устанавливается в net_buffer_length байтов, но при необходимости может # возрасти до max_allowed_packet байтов. Это значение по умолчанию не # настолько велико, чтобы отсеивать большие (возможно ошибочные) пакеты. # Если используются большие столбцы BLOB, его необходимо увеличить. # Значение должно быть не меньше самого большого BLOB, который будет # использоваться. Ограничение протокола для max_allowed_packet # составляет 16 Мб в MySQL 3.23 и 1Гб в MySQL 4.0. max_allowed_packet = 1M # Количество открытых таблиц для всех потоков. С увеличением этого # значения увеличивается количество дескрипторов файлов, необходимых # для mysqld. Чтобы узнать, необходимо ли изменять значение кэша таблиц, # следует проверить значение переменной Opened_tables. # Если у этой переменной большое значение, а команда FLUSH TABLES # (которая закрывает все таблицы, а потом открывает их повторно) # используется не часто, то необходимо увеличить ее значение. table_cache = 4 # Каждый поток, которому необходимо произвести сортировку, выделяет # буфер данного размера. Увеличение данного значения позволит ускорить # выполнение операторов ORDER BY или GROUP BY. sort_buffer_size = 64K # Каждый поток, осуществляющий последовательное сканирование, выделяет # буфер указанного размера для каждой сканируемой таблицы. Если # проводится много последовательных сканирований, это значение # можно увеличить. read_buffer_size = 256K # При считывании строк, после проведения сортировки, в отсортированном # порядке строки считываются через буфер, чтобы избежать операций поиска # по диску. Это может улучшить выполнение ORDER BY весьма и весьма, # если параметр установлен в большое значение. Т.к. эта переменная # имеет отношение к потоку, то не устанавливайте слишком большое # значение глобально, но просто меняйте его при выполнении некоторых # больших запросов. read_rnd_buffer_size = 256K # В данное значение устанавливается, в промежутках между запросами, # буфер соединения. Обычно это значение не изменяется, но если у вас # очень мало памяти, можно установить его по размеру ожидаемого # запроса (т.е. равным предполагаемой длине операторов SQL, отправляемых # клиентами; если оператор превысит указанную длину, буфер будет # автоматически увеличен как максимум до max_allowed_packet байтов). net_buffer_length = 2K # Размер стека для каждого потока. От данного значения зависит большое # количество ограничений, обнаруживаемых при помощи теста crash-me. # По умолчанию этот размер достаточен для нормальной работы. thread_stack = 64K
# Вообще не слушать порты TCP/IP. Это может применяться для большей # безопасности, если все процессы, соединяющиеся с MySQL висят на томже # хосте, что и mysqld. Все взаимодействия с mysqld будут осуществляться # через Unix-сокеты, или именованые каналы. # Заметтьте, что использование этой опции под форточками, без включчения # именованных каналов (используйте опцию "enable-named-pipe") сделает # работу MySQL бесполезной - ибо с mysqld никто не сможет соединиться :) skip-networking # Если Вы используете InnoDB, то закомментируйте эту опцию skip-innodb # С этой опцией MySQL не будет инициализировать библиотеку Berkeley DB, # что позволит сэкономить большое количество памяти. skip-bdb # Hекоторое уникальное число между 2 и 2^32-1. Значения server-id должны # быть различными на каждом сервере, участвующем в репликации. Если # значение server-id не определено, оно будет установлено в 1, если # также не определено значение master-host, оно будет установлено в 2. # Обратите внимание, что если значение server-id опущено, то головной # сервер будет отказывать в соединении всем подчиненным серверам, а # подчиненный сервер - отказывать в соединении головному серверу. # Таким образом, опускать установку значения server-id можно лишь в # случае резервного копирования с использованием двоичного журнала. server-id = 1 # Раскомментируйте эту опцию, для включения логгирования всех запросов # Заметтьте - тока на время отладки! Потом надо закомментить и # рестартануть MySQL! # Файл должен существовать, с соответствующими правами на него: # touch /var/log/mysql.log # chown mysql:wheel /var/log/mysql.log # chmod 640 /var/log/mysql.log log = /var/log/mysql.log
# Указывает местоположение двоичного журнала обновлений, # в котором будут вестись записи. #log-bin=mysql-bin
[mysqldump] # Если задан этот параметр, то обработчик таблицы при выполнении # удаления не будет объединять индексы - в некоторых случаях это # может ускорить данную операцию quick # Максимальная величина пакета, посылаемого/принимаемого с сервера max_allowed_packet = 16M
[mysql] # Отключает автоматическое рехеширование. rehash следует использовать # для получения хеша таблиц и полей. Это обеспечивает более # быстрый старт mysql. no-auto-rehash # Опция, которую рекомендуется раскомментить начинающим :) # Разрешает выполнять только операции UPDATE и DELETE, используя ключи. #safe-updates
[isamchk] key_buffer = 8M sort_buffer_size = 8M
[myisamchk] key_buffer = 8M sort_buffer_size = 8M
[mysqlhotcopy] # Допускать простой длительностью interactive_timeout секунд (вместо # wait_timeout секунд) перед закрытием данного соединения. interactive-timeout
# P.S. Большинство текста - это из мануала по MySQL 4.0, за который # мы не так давно воевали на www.mysql.com (его убирали на некоторое # время, типа он по старой версии, потому не актуален... # но - отвоевали, вернули :))))
C таким конфиг-файлом mysqld занимает в 6 раз меньше памяти, чем без него. Итак, запускаем:/usr/home/lissyara/>echo 'mysql_enable="YES"' >> /etc/rc.conf /usr/home/lissyara/>/usr/local/etc/rc.d/mysql-server.sh start Starting mysql. /usr/home/lissyara/> /usr/home/lissyara/>ps -axj | grep mysqld mysql 44512 1 44510 504 0 S p0 0:00,08 /bin/sh /usr/local/bin mysql 44530 44512 44510 504 0 SN p0 0:00,15 /usr/local/libexec/mys mysql 44531 44530 44510 504 0 SN p0 0:00,00 /usr/local/libexec/mys mysql 44532 44531 44510 504 0 SN p0 0:00,00 /usr/local/libexec/mys mysql 44533 44531 44510 504 0 SN p0 0:00,00 /usr/local/libexec/mys root 44548 507 44547 504 2 S+ p0 0:00,02 grep mysqld /usr/home/lissyara/>
Так много процессов - потому как с тредами (на самом деле он один...).
С 5-кой разобрались. Теперь пример установки, для самой старой версии mysql, что есть в портах - 3.23./usr/home/lissyara/>cd /usr/ports/databases/mysql323-server/ /usr/ports/databases/mysql323-server/>make && make install && make clean ===> Vulnerability check disabled, database not found
You may use the following build options:
WITH_CHARSET=charset Define the primary built-in charset (latin1). WITH_XCHARSET=list Define other built-in charsets (may be 'all'). WITH_OPENSSL=yes Enable secure connections. WITH_LINUXTHREADS=yes Use the linuxthreads pthread library. WITH_PROC_SCOPE_PTH=yes Use process scope threads (try it if you use libpthread). BUILD_OPTIMIZED=yes Enable compiler optimizations (use it if you need speed). BUILD_STATIC=yes Build a static version of mysqld. (use it if you need even more speed). WITHOUT_INNODB=yes Disable support for InnoDB table handler.
===> Extracting for mysql-server-3.23.59.n.20050301_3 ^C /usr/ports/databases/mysql323-server/>
Чтож, опции, в большинстве своём, точно такие же, как и у 5.0. Соответсвенно правим файл /etc/make.conf (приведено без комментов, ибо нового ничё нет - смотрите предыдущий листинг)# Для некоторых, особо тупых приложений, лучше указать версию MySQL, # что используется, тут. Но - для совсем тупых не поможет и это. DEFAULT_MYSQL_VER=323
# Директория где лежат порты PORTSDIR?= /usr/ports
# для сервера .if ${.CURDIR} == ${PORTSDIR}/databases/mysql323-server BUILD_OPTIMIZED=yes BUILD_STATIC=yes # Единственный пункт, по которому нужны, наверно, пояснения. # Просто без него у меня не заводилось... #WITHOUT_INNODB=yes .endif # для клиента .if ${.CURDIR} == ${PORTSDIR}/databases/mysql323-client .endif
После рихтовки /etc/make.conf снова запускаем компиляцию:/usr/ports/databases/mysql323-server/>make && make install && make clean
Которая по окочании установки клиента вываливается с ошибкой, похожей на ту, что и у mysql 5.0:===> Installing ldconfig configuration file ===> Compressing manual pages for mysql-client-3.23.59.n.20050301_2 ===> Registering installation for mysql-client-3.23.59.n.20050301_2 ===> Returning to build of mysql-server-3.23.59.n.20050301_3 Error: shared library "mysqlclient.10" does not exist *** Error code 1
Stop in /usr/ports/databases/mysql323-server. /usr/ports/databases/mysql323-server/>
Лечение тоже самое - перезагрузка, или/usr/home/lissyara/>/sbin/ldconfig -m /usr/local/lib/mysql /usr/home/lissyara/>
После чего всё нормально доинсталлируеся. Можно создавать конфиг /usr/local/etc/my.cnf# Этот конфигурационный файл сделан на основе файла для маленьких # систем - /usr/local/share/mysql/my-small.cnf. # # Вообще, конфигурационный файл можно положить в несколько мест: # /etc/my.cnf # /var/db/mysql/my.cnf # /usr/local/etc/my.cnf # В любом из них mysqld его найдёт, и достанет из него настройки. # Самое корректное место, если судить по стартовому скрипту, это # директория где лежат базы данных - /var/db/mysql/my.cnf.
# Опции для всех клиентов MySQL [client] # Пароль для подключения к БД #password = your_password # Порт на котором висит MySQL port = 3306 # Сокет MySQL socket = /tmp/mysql.sock
# Опции MySQL-сервера [mysqld] # Порт port = 3306 # Адрес, который будем слушать (если вам не нужно подключаться к # MySQL с других машин, то оставьте здесь 127.0.0.1) bind-address = 127.0.0.1 # Где лежит сокет socket = /tmp/mysql.sock # Не использовать средства системных блокировок. skip-locking
# Вообще не слушать порты TCP/IP. Это может применяться для большей # безопасности, если все процессы, соединяющиеся с MySQL висят на томже # хосте, что и mysqld. Все взаимодействия с mysqld будут осуществляться # через Unix-сокеты, или именованые каналы. # Заметтьте, что использование этой опции под форточками, без включчения # именованных каналов (используйте опцию "enable-named-pipe") сделает # работу MySQL бесполезной - ибо с mysqld никто не сможет соединиться :) skip-networking # Если Вы используете InnoDB, то закомментируйте эту опцию skip-innodb # С этой опцией MySQL не будет инициализировать библиотеку Berkeley DB, # что позволит сэкономить большое количество памяти. skip-bdb # Hекоторое уникальное число между 2 и 2^32-1. Значения server-id должны # быть различными на каждом сервере, участвующем в репликации. Если # значение server-id не определено, оно будет установлено в 1, если # также не определено значение master-host, оно будет установлено в 2. # Обратите внимание, что если значение server-id опущено, то головной # сервер будет отказывать в соединении всем подчиненным серверам, а # подчиненный сервер - отказывать в соединении головному серверу. # Таким образом, опускать установку значения server-id можно лишь в # случае резервного копирования с использованием двоичного журнала. server-id = 1 # Раскомментируйте эту опцию, для включения логгирования всех запросов # Заметтьте - тока на время отладки! Потом надо закомментить и # рестартануть MySQL! # Файл должен существовать, с соответствующими правами на него: # touch /var/log/mysql.log # chown mysql:wheel /var/log/mysql.log # chmod 640 /var/log/mysql.log log = /var/log/mysql.log
# Указывает местоположение двоичного журнала обновлений, # в котором будут вестись записи. #log-bin=mysql-bin
[mysqldump] # Если задан этот параметр, то обработчик таблицы при выполнении # удаления не будет объединять индексы - в некоторых случаях это # может ускорить данную операцию quick
[mysql] # Отключает автоматическое рехеширование. rehash следует использовать # для получения хеша таблиц и полей. Это обеспечивает более # быстрый старт mysql. no-auto-rehash # Опция, которую рекомендуется раскомментить начинающим :) # Разрешает выполнять только операции UPDATE и DELETE, используя ключи. #safe-updates
[isamchk] key_buffer = 8M sort_buffer_size = 8M
[myisamchk] key_buffer = 8M sort_buffer_size = 8M
[mysqlhotcopy] # Допускать простой длительностью interactive_timeout секунд (вместо # wait_timeout секунд) перед закрытием данного соединения. interactive-timeout
Можно заметить, что отличия от 5.0 минимальны - отсутствуют опции буферов, да и всё, пожалуй. Запускаем:/usr/home/lissyara/>echo 'mysql_enable="YES"' >> /etc/rc.conf /usr/home/lissyara/>/usr/local/etc/rc.d/mysql-server.sh start Starting mysql. /usr/home/lissyara/>ps -axj | grep mysql mysql 8848 1 8846 504 0 S p0 0:00,07 /bin/sh /usr/local/bi mysql 8868 8848 8846 504 0 S p0 0:00,06 /usr/local/libexec/my root 8870 507 8869 504 2 L+ p0 0:00,01 grep mysql root 8754 5368 8754 5344 1 S+ p1 0:00,02 tail -f /var/db/mysql /usr/home/lissyara/>
Всё пашет.
Теперь общие вопросы. По дефолту, в MySQL заведено несколько пользователей, типа гостей, и прочих. Я их обычно удаляю - нефига гостям по БД шляться..../usr/home/lissyara/>mysql --database=mysql --execute="SELECT COUNT(*) FROM user" +----------+ | COUNT(*) | +----------+ | 4 | +----------+ /usr/home/lissyara/>mysql --database=mysql --execute="DELETE FROM user \ ? WHERE User=''" /usr/home/lissyara/>mysql --database=mysql --execute="SELECT COUNT(*) FROM user" +----------+ | COUNT(*) | +----------+ | 2 | +----------+ /usr/home/lissyara/>mysql --database=mysql --execute="DELETE FROM user \ ? WHERE Host != 'localhost'" /usr/home/lissyara/>mysql --database=mysql --execute="SELECT COUNT(*) FROM user" +----------+ | COUNT(*) | +----------+ | 1 | +----------+ /usr/home/lissyara/> /usr/home/lissyara/>mysql --database=mysql --execute="UPDATE user SET \ ? Password = PASSWORD('тут ввести пароль рута')" /usr/home/lissyara/>mysql --database=mysql --execute="FLUSH privileges" /usr/home/lissyara/>mysql --database=mysql --execute="SELECT * FROM user" ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO) /usr/home/lissyara/>
Всё. Без пароля к БД не добраться. Вообще, общая рекомендация - если плохо знаете MySQL - либо займитесь изучением, либо поставьте графический интерфейс, типа phpMyAdmin. Я вначале пошёл по второму пути, щас пытаюсь свернуть на первый :))) Единственное - не забывайте его запаролить.
P.S. При проблемах (не запускается), смотрим лог ошибок:/usr/home/lissyara/>tail -f /var/db/mysql/`uname -a | awk '
Обновлено 28.05.2010 13:49
07.01.2010 21:32
Администратор
Защищаем FreeBSD (defender +1)
Автор: Raven2000. Оригинал: http://www.lissyara.su/articles/freebsd/security/armored_bsd/
Как и любую другую систему FreeBSD нужно так же защищать от посягательств на нее. Она не так уж защищена, как много людей о ней думают и ее можно так же сломать и крякнуть, как и тот же Windows просто FreeBSD мало распространена и мало есть спецов, которые с ней работают, а тем более которые знают ее в совершенстве, так что чем больше спецов ее ломают тем больше дыр и руткитов будет открыто и использовано.
Да и на будущее я не претендую на аса в построение защиты и т.д. т.п. а лишь попробую (для себя, чтобы не забыть :) и друзей) описать некоторые моменты защиты, а остальное будет дополняться по мере просьб и необходимости. Т.к. невозможно охватить все, да и абсолютно защищенный сервер, которого невозможно сломать это как вечный двигатель в теории есть но на практике, увы :). Хотя я знаю такой - это тот, который на глубине 100 метров под землей в фольге и с вырубленным питанием :) Статья будет дополнятся и изменятся по ходу обсуждений. Ну ладно, попробуем немного защитится от спецов :)
Защиту разделим по двум видам: I) Защита от внешних атак II) Защита от внутренних атак
Атака изнутри – атакующий является легальным \ авторизированным пользователем с этим типом атак бывает сложнее т.к. у пользователя есть не только данные о системе, но и валидный юзер. Внешняя атака – Все, что на передовой.
Теперь определим фронт защиты:
I) Атака извне: 1.1) Apache - http.conf + mod_security 1.2) PHP - php.ini + mod_security + отключение опасных функций + Ограничения ресурсов 1.3) FTP – Разделение привилегий + chroot + квоты + отдельный HDD 1.4) Firewall – грамотно настроенный фаервол 1.5) Сhroot
II) Атака внутри: 2.1) Ограничения ресурсов - /etc/login.conf + /etc/sysctl.conf 2.2) Разделение привилегий - /etc/sysctl.conf + chmod + структура папок 2.3) Логии (logcheck) 2.4) top/ps
III) Общие меры 3.1) Разбор fstab 3.2) Доступ к серверу 3.3) DNS – chroot + noroot
Теперь пройдем по пунктам (некоторые пункты будут вкратце описаны т.к. обший принцип защиты пересекается с другими пунктами) как и чем можно защитить и ограничить:
I) Прикрытие внешних дыр.
1.1) Apache + виртуальные хосты + mod_security Прикроем дырки этого сервиса для начала нам необходимо задать ограничения в конфиге для каждого вхоста. Добавляем следующие параметры:<IfModule mod_php4.c> # Включаем Safe mode php_admin_flag safe_mode on php_admin_flag safe_mode_gid on php_admin_value open_basedir /home/domain.ru # Папка, выше которой скрипт не может видеть php_admin_value safe_mode_exec_dir /home/domain.ru # Temp диры юзера php_admin_value upload_tmp_dir /home/domain.ru/tmp # Не начинать PHP сессию автоматически php_admin_flag session.auto_start off # Где сохранять файлы сессий php_admin_value session.save_path /home/domain.ru/tmp </IfModule>
Как известно, немалая часть взломов (SQL Injection, XSS атаки, инклюдинг) происходит по сути посредством хитрого HTTP запроса. Логично предположить, что эти самые запросы неплохо было бы фильтровать. Решение проблемы существует в виде модуля к Апачу, и называется оно mod_security. Ставим:# cd /usr/ports/www/mod_security/ && make install clean
После установки – идем конфигурировать. Открываем любой конфиг виртуального хоста, например 001.admin.hosting.ru, над которым мы уже экспериментировали. Все значения надо вводить между тегами <Virtualhost *:80> и </Virtualhost>.# Включаем mod_security SecFilterEngine On # Проверяем запросы SecFilterScanPOST On # Проверяем ответы SecFilterScanOutput On # Проверяем, правильно ли закодирован URL SecFilterCheckURLEncoding On # Включаем этот параметр, если сайт в Unicode SecFilterCheckUnicodeEncoding Off # Задаем диапазон байтов SecFilterForceByteRange 1 255 # Сохраняем в лог только срабатывания механизма SecAuditEngine RelevantOnly # Где живет лог :) SecAuditLog logs/audit_log # Возвращаем ошибку 500 при срабатывании SecFilterDefaultAction "deny,log,status:500" # Перекрываем dots-bug SecFilter "\.\./" # Не забываем про XSS SecFilter "<(.|\n)+>" # SQL injection, куда же без него :) SecFilter "<[[:space:]]*script" SecFilter "delete[[:space:]]+from" SecFilter "insert[[:space:]]+into" SecFilter "select.+from" # Перекрываем возможность передачи переменных PHP SecFilterSelective ARG_b2inc "!^$" # Исключаем возможность раскрытия пути SecFilterSelective OUTPUT "Fatal error:"
Для и для apache 1.x в httpd.conf закоментите:#SecFilterScanOutput #OUTPUT #OUTPUT_STATUS
У этого модуля – на редкость удачная дефолтная конфигурация. К ней мало, что можно добавить, так как большинство настроек – специфичны. Общий принцип составления правил мы рассмотрели, а остальное можно добавить по своему усмотрению.
1.2) PHP В дополнение смотри пункт – 2.1 Рассмотрим самое уязвимое место хостинговой системы – выполняемые файлы, в частности, PHP скрипты. Открываем конфиг PHP:# ee /usr/local/etc/php.ini
Меняем следующие параметры:magic_quotes_gpc = Off # Экранирование спецсимволов disable_functions = system, exec, passthru # Выключаем опасные функции:
Выключить эти функции очень важно. Хоть они и недоступны при включенном safe mode, пользователь может без труда провести успешную атаку, указав в файле .htaccess: php_flag safe_mode off
1.3) FTP Настройка Proftpd установите далее по разделение привилегий смотрим -2.1 в котором я указал то что вам нужно, а по Chroot см раздел 1.5 Желательно ftp ставить на отдельный HDD чтобы непроизошло переполнения раздела и все шайтан майфун :) а если у вас он на /etc или /var находился все хана логам и тд :)
1.4) IPFW - штатный файрволл FreeBSD
1.5) Chroot Chroot - песочница это конечно с одной стороны хорошо с другой – потеря производительности, для некоторых программ лишний дополнительный модуль + конфиг к нему. Я считаю грамотный chmod дает тот же результат , но без заморочек и потерь ресурсов. В основном к chroot прибегают, когда нужно обезопасить сервис, который не совсем безопасный как например BIND(о нем ниже). Jail - мы не будем это рассматривать ось внутри оси довольно заморочено и плохо документировано, а если все вхосты придется загонять в jail то мало непокажется. Я пока небуду jail рассматривать :)
II) Настраиваем тыл внутренние защитные меры.
2.1) Ограничения ресурсов Бывает так кроме основного действия PHP скрипта функция N зацикливается, попутно вычисляя некое сложное действие. Как результат – высокая загрузка процессора. Это очень типичная ситуация для хостинга. Чтобы предотвратить подобные ненамеренные (и намеренные) атаки, необходимо ограничивать юзера в плане ресурсов. У *BSD для таких целей существует система профилей пользователей. Это значит, что мы можем легко ограничить ресурсы каждого пользователя в отдельности. Открываем /etc/login.conf и добавляем:# Имя профиля hosting: \ :copyright=/etc/COPYRIGHT: \ :welcome=/etc/motd: \ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K: \ :path=~/bin /bin /usr/bin /usr/local/bin: \ :manpath=/usr/share/man /usr/local/man: \ :nologin=/var/run/nologin: \ # Мах время использования процессора :cputime=1h30m: \ # Мах кол-во памяти, выделяемой программе под данные # Сам код программы и стэк не учитываются :datasize=10M: \ # Сколько выделяем для стека программы :stacksize=3M: \ # Мах размер физической памяти, выделяемой процессу :memoryuse=16M: \ # Мах размер файла :filesize=50M: \ # Мах размер core файлов :coredumpsize=1M: \ # Сколько файлов может открывать каждый процесс :openfiles=128: \ # Сколько процессов может запускать пользователь :maxproc=64: \ # Пускать юзера в систему только если его домашняя дира существует и доступна юзеру :requirehome:true \ # Время устаревания пароля :passwordtime=90d: \ # Остальное берем из профиля default :tc=default:
Здесь я указал лишь основные параметры. Список всех параметров и их описание можно найти в Handbook. Теперь перейдем к настройке операционки. Открываем /etc/sysctl.conf и пишем туда следующее:# Запрещает юзерам видеть процессы соседа&root security.bsd.see_other_uids=0 # Запрещает видеть групповые процессы security.bsd.see_other_gids=0 # Пускаем запросы на закрытые порты в черные дыры net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1 # Указываем размер очереди сокета kern.ipc.somaxconn=1024 # Отрубаем ip-редиректы net.inet.icmp.drop_redirect=1 net.inet.icmp.log_redirect=1 net.inet.ip.redirect=0
# Назначаем размеры буфера для TCP-подключений. Если на сервер ожидается большая # нагрузка, и у него много памяти – лучше поставить 65535. Значение выше 65535 # не рекомендуется. net.inet.tcp.sendspace=32768 net.inet.tcp.recvspace=32768 # Обновляем ARP-таблицу каждые 20 минут net.link.ether.inet.max_age=1200 # Запрещаем отвечать на все лишние запросы. net.inet.icmp.maskrepl=0 net.inet.ip.sourceroute=0 net.inet.ip.accept_sourceroute=0 net.inet.icmp.bmcastecho=0
Здесь указаны не все параметры sysctl остальные смотримMAN SYSCTL(8) Есть статья Некоторые опции sysctl но она еще не совсем дописана (просьба просить lissyara чтобы доконца перевел ;)). Многие параметры для sysctl можно изменять и динамически:sysctl <параметр>=<значение>
Например:sysctl kern.maxprocperuid=1000
Должно быть похоже на# sysctl kern.maxprocperuid=1000 kern.maxprocperuid: 3546 -> 1000
Теперь необходимо продублировать часть настроек в /etc/rc.conf: Дублируем настройки sysctlicmp_drop_redirect="YES" icmp_log_redirect="YES" icmp_bmcastecho="NO" tcp_drop_synfin="YES"
2.3) Логи Очень важным аспектом системного администрирования является слежение за сервера. Но ковырять логии самому заморочено тогда для ленивых существует отличная утилита logcheck ее и поставим.# cd /usr/ports/security/logcheck && make install clean
Утилита написана на sh скриптах, и занимает всего 29 Кб в архиве. После установки в /usr/local/etc у вас появятся четыре конфига: переименуй их, убрав из названия файла «sample»:
logcheck.hacking – о каких странностях сообщать; logcheck.violations – о каких попытках взлома сообщать; logcheck.ignore – какие странности игнорировать; logcheck.violations.ignore – какие попытки взлома игнорировать.
В целом и общем, первый файл от второго ничем не отличается, равно как и третий от четвертого :).Просто разработчики скрипта решили разнести сообщения о подозрительной активности и сообщения о явной атаке в разные конфиги.
Запускаем скрипт по крону, хотя бы раз в сутки. Дописываем в cron:0 4 * * * /bin/sh /usr/local/etc/logcheck.sh
При большой активности хостящихся сайтов, логи веб-сервера начнут занимать немало места. И в то же время их надо сохранять. Можно использовать утилиту logrotate# /usr/ports/sysutils/logrotate && make install clean
III) Общие меры
3.1) HDD Сделаем в fstab некоторые изменения для предотвращения нехороших действий. Укажем где и что можно и нельзя делать системе. /dev/ad4s3b none swap sw 0 0 /dev/ad4s3a / ufs rw 1 1 /dev/ad4s3e /tmp ufs rw,noexec 2 2 /dev/ad4s3f /usr ufs rw 2 2 /dev/ad4s3f /usr/home ufs rw,nosuid,nodev 2 2 /dev/ad4s3d /var ufs rw,nodev 2 2
noexec – эта опция дает понять что на данном разделе запрещено запускать что либо даже правах на файл chmod 777 (Я знаю что некоторые защищенные сервера ломали именно через /tmp :) в последствии админы советовали прикрывать эту дыру. И незабываем, что в /tmp может писать почти любой сервис в системе)
nosuid – при этом значении система игнорирует suid-биты. Юзер не сможет сделать #su и подняться до рута, даже если он знает его пароль рута и находится в группе wheel (но необходимо понять что нужным юзверям которым нужно #su домашняя директория будет /usr, а тем кого нужно ограничит директория будет /usr/home)
nodev – запрещаем создание\существование в данном разделе специальных устройств.
3.2) Доступ Доступ к серверу следует ограничить. Т.е. серверы убрать в недоступное простым смертным людям и закрыть на ключ. В дополнение не забываем, снять с них все причиндалы мониторы клавы мышки и т.д. Для чего это должно быть понятно, например если я вижу общедоступный \ физически сервер FreeBSD я тут же по любопытности хочу в него залезть и поковыряться в нем. Но вы скажете, а как же пароль root и т.д. то слушаем дальше, если вы забыли чужой пароль :) а так бывает то делаем так:
А) Загружаемся в однопользовательском режиме , для этого в приглашении загрузчика введите boot –s Б) Смонтируйте командой mount –u / корневой раздел в режим чтения-записи. Затем с помощью mount –a примонтируем все что есть (т.е. только что указанно в fstab без опции noauto) B) Теперь меняйте пароль рута. :)
Чтобы люди не cмогли зайти без пароля рута в однопользовательском режиме делаем так:# ee /etc/ttys
Измените в строчке console пункт secure на insecure. Если вы сделаете это, FreeBSD даже при загрузке в однопользовательском режиме будет запрашивать пароль root. Будьте осторожны при изменении этого значения на insecure. Если вы забудете пароль root, загрузка в однопользовательский режим сильно усложнится. Это все еще возможно, но несколько более сложно.# name getty type status comments # # If console is marked "insecure", then init will ask for the root password # when going to single-user mode. console none unknown off insecure
3.3) DNS Засунем DNS в песочницу # named –u 53 –t /var/named
-u – значение UID присваемое процессу named -t – указывает корневой каталог для демона Незабываем, что корневой каталог недолжен, быть пустым, он должен содержать все файлы необходимые для нормальной работы демона. Если named скомпилирован так чтобы библиотеки компоновались статически и не нужно было думать что ему надо еще в корневую положить чтобы он запустился :) Так же некоторые советуют в конфиге DNS убрать строчку об версии демона дескать оно сможет помочь атакующему и т.д. я не считаю это критически она может подсказкой и самому админу.
Литература: 1) Unix руководство системного администратора (3 изд.) 2) Хакер спец 07/68/июль/2006 3) Жизнь :)
Обновлено 28.05.2010 12:17
|
11.10.2006 20:14
Администратор
Подсчет трафика с помощью pf Автор: fr33man Оригинал: http://www.lissyara.su/articles/freebsd/traffic_count/pfctl/
Решил считать трафик на внешнем интерфейсе. Сначала хотел считать с помощью trafd, но подумал, что лишняя программа в памяти не есть гуд. Второй моей мыслью был snmp, но нагружать машинку еще и snmp запросами я не решился. И тут я вспомнил, что это роутер, на котором стоит packet filter. Считать решил именно pf.
Итак, приступим. Я предполагаю, что pf у Вас уже настроен и работает. Добавляем в pf.conf следующую строку:
set loginterface ng0
Теперь проверяем работоспособность конфига:
shield@/usr/ports/net> pfctl -nf /etc/pf.conf
shield@/usr/ports/net>
И подгружаем правила:
shield@/usr/ports/net> pfctl -f /etc/pf.conf
shield@/usr/ports/net>
Вот и все. Давайте посмотрим, сколько трафика набежало:
shield@/usr/ports/net> pfctl -s info
Status: Enabled for 1 days 23:43:24 Debug: Urgent
Hostid: 0x153793d2
Interface Stats for ng0 IPv4 IPv6
Bytes In 41872728 0
Bytes Out 90656050 0
Packets In
Passed 547083 0
Blocked 29 0
Packets Out
Passed 556623 0
Blocked 2 0
State Table Total Rate
current entries 4
searches 6146672 35.8/s
inserts 3730 0.0/s
removals 3726 0.0/s
Counters
match 3946799 23.0/s
bad-offset 0 0.0/s
fragment 0 0.0/s
short 0 0.0/s
normalize 0 0.0/s
memory 0 0.0/s
bad-timestamp 0 0.0/s
congestion 0 0.0/s
ip-option 0 0.0/s
proto-cksum 0 0.0/s
state-mismatch 0 0.0/s
state-insert 0 0.0/s
state-limit 0 0.0/s
src-limit 0 0.0/s
synproxy 0 0.0/s
shield@/usr/ports/net>
В самом верху видно, сколько байт принято и сколько отправлено.
Могу только добавить, чтобы очистить счетчик можно воспользоваться командой pfctl:
shield@/usr/ports/net> pfctl -F info
pf: statistics cleared
shield@/usr/ports/net>
Я не стал писать полный конфиг pf, так как я сейчас пишу статью про Policy Based Routing и pf. ))
Обновлено 28.05.2010 12:18
07.01.2010 22:10
Администратор
ffsinfo - программа создания дампа метаинформации UFS
Автор: lissyara. Оригинал: http://www.lissyara.su/articles/freebsd/file_system/ffsinfo/
`Исчо` одна интересная програмулина для ковыряния FS - ffsinfo. Позволяет делать дамп всей метаинформации файловой системы UFS. Разумеется всю FS дампить никто не заставляет (если дампить всю, то объём дампа составит до 2% от размера FS), при желании можно сделать частичный дамп, определённой группы цилиндров, или даже одной иноды. Ключики: -g cylinder_group этот ключ ограничит дамп только информацией об этой группе цилиндров. 0 - первая группа цилинров, -1 - последняя -i inode - ограничит дамп только информацией об этой иноде. Минимальная разрешённая инода - 2. Если инода не выбрана, но группа цилиндров определена, то будет создан дамп только для инод в пределах этой группы цилиндров. -l level - уровень детализации дампа. Значение `по-умолчанию` - 255. -o outfile - имя файла в который будет сделан дамп. Должен быть обязательно. Если задать - то дамп будет выведен на стандартный вывод (в трубу, или на экран.).
Вот примеры использования:/usr/home/lissyara/>ls -i 4945922 .cshrc 4945927 .mailrc 4945931 distfiles 4945924 .login 4945928 .profile 4945930 distfiles.tar.bz2 4945926 .login_conf 4945925 .rhosts 4946193 file.txt 4945923 .mail_aliases 4945929 .shrc /usr/home/lissyara/>ffsinfo -o - -i 4945927 -l 0x100 /dev/ad1s1c ===== START UFS2 INODE DUMP ===== # 0@80a4700: Inode 0x004b7807 mode u_int16_t 0100644 nlink int16_t 0x0001 uid u_int32_t 0x000003e9 gid u_int32_t 0x00000000 blksize u_int32_t 0x00000000 size u_int64_t 0x000000000000014b blocks u_int64_t 0x0000000000000004 atime ufs_time_t 1137673537 mtime ufs_time_t 1137673537 ctime ufs_time_t 1137673537 birthtime ufs_time_t 1137673537 mtimensec int32_t 0x00000000 atimensec int32_t 0x00000000 ctimensec int32_t 0x00000000 birthnsec int32_t 0x00000000 gen int32_t 0x1649ada8 kernflags u_int32_t 0x00000000 flags u_int32_t 0x00000000 extsize int32_t 0x00000000 db ufs2_daddr_t[0] 0x 12d7d9f ===== END UFS2 INODE DUMP ===== /usr/home/lissyara/>
Это инфа по одной иноде. Можно достать информацию, например по суперблоку:/usr/home/lissyara/>ffsinfo -o - -l 0x001 /dev/ad1s1c ===== START SUPERBLOCK ===== # 0@80808c4: primary sblock sblkno int32_t 0x00000028 cblkno int32_t 0x00000030 iblkno int32_t 0x00000038 dblkno int32_t 0x00000bb8 old_cgoffset int32_t 0x00000000 old_cgmask int32_t 0x00000000 old_time int32_t 0 old_size int32_t 0x00000000 old_dsize int32_t 0x00000000 ncg int32_t 0x000000d6 bsize int32_t 0x00004000 fsize int32_t 0x00000800 frag int32_t 0x00000008 minfree int32_t 0x00000008 old_rotdelay int32_t 0x00000000 old_rps int32_t 0x00000000 bmask int32_t 0xffffc000 fmask int32_t 0xfffff800 bshift int32_t 0x0000000e fshift int32_t 0x0000000b maxcontig int32_t 0x00000008 maxbpg int32_t 0x00000800 fragshift int32_t 0x00000003 fsbtodb int32_t 0x00000002 sbsize int32_t 0x00000800 spare1 int32_t[2] 0x00000000 0x00000000 nindir int32_t 0x00000800 inopb int32_t 0x00000040 old_nspf int32_t 0x00000000 optim int32_t 0x00000000 old_npsect int32_t 0x00000000 old_interleave int32_t 0x00000000 old_trackskew int32_t 0x00000000 id int32_t[2] 0x43cf81c1 0x85c2eb4f old_csaddr int32_t 0x00000000 cssize int32_t 0x00001000 cgsize int32_t 0x00004000 spare2 int32_t 0x00000000 old_nsect int32_t 0x00000000 old_spc int32_t 0x00000000 old_ncyl int32_t 0x00000000 old_cpg int32_t 0x00000000 ipg int32_t 0x00005c00 fpg int32_t 0x00016f88 ===== START CYLINDER SUMMARY ===== # 1@8080984: internal old_cstotal ndir int32_t 0x00000000 nbfree int32_t 0x00000000 nifree int32_t 0x00000000 nffree int32_t 0x00000000 ===== END CYLINDER SUMMARY ===== fmod int8_t 0x00 clean int8_t 0x00 ronly int8_t 0x00 old_flags int8_t 0xffffff80 fsmnt u_char[MAXMNTLEN] "/usr" volname u_char[MAXVOLLEN] "" swuid u_int64_t 0x0000000000000000 pad int32_t 0x00000000 cgrotor int32_t 0x00000017 old_cpc int32_t 0x00000000 maxbsize int32_t 0x00004000 sblockloc int64_t 0x0000000000010000 ===== START CYLINDER SUMMARY TOTAL ===== # 1@8080cb4: internal cstotal ndir int64_t 0x00000000000063fc nbfree int64_t 0x000000000022a1f5 nifree int64_t 0x00000000004a9303 nffree int64_t 0x0000000000008a21 numclusters int64_t 0x0000000000000000 ===== END CYLINDER SUMMARY TOTAL ===== time ufs_time_t 1137745993 size int64_t 0x0000000001324af1 dsize int64_t 0x000000000128a067 csaddr ufs2_daddr_t 0x0000000000000bb8 pendingblocks int64_t 0x0000000000000000 pendinginodes int32_t 0x00000000 snapinum int32_t[ 0] 0x00000000 avgfilesize int32_t 0x00004000 avgfpdir int32_t 0x00000040 save_cgsize int32_t 0x00000000 flags int32_t 0x00000002 contigsumsize int32_t 0x00000008 maxsymlinklen int32_t 0x00000078 old_inodefmt int32_t 0x00000000 maxfilesize u_int64_t 0x000080100202ffff qbmask int64_t 0x0000000000003fff qfmask int64_t 0x00000000000007ff state int32_t 0x00000000 old_postblformat int32_t 0x00000000 old_nrpos int32_t 0x00000000 spare5 int32_t[2] 0x00000000 0x00000000 magic int32_t 0x19540119 ===== END SUPERBLOCK ===== /usr/home/lissyara/>
Другие примеры приводить не буду, тока один, чтобы был понятен общий объём инфы:/usr/home/lissyara/> /usr/home/lissyara/>ffsinfo -o - -l 255 /dev/ad1s1c | wc -l 54452 /usr/home/lissyara/>ffsinfo -o file.txt -l 255 /dev/ad1s1c /usr/home/lissyara/>ls -lah | grep file.txt -rw-r--r-- 1 root wheel 13M Jan 20 11:53 file.txt /usr/home/lissyara/>
Обновлено 28.05.2010 13:21
|