Продолжая развивать идею идеального сервера на Debian 6.0 которые опубликованны в статьях Идеальный сервер - Debian 6.0 [ISPConfig 3], а далее дополненной в Идеальный сервер - Debian 6.0 с BIND и Courier [ISPConfig 3]. Этот материал объясняет, как изменить порты по умолчанию (SSH, ISPConfig, Webmin), как установить некоторые полезные приложения (webmin, roundcube, atop, htop, multitail, tiger и так далее), как периодически обновлять Awstats (чаще одного раза в день) или когда Вы этого захотите, как создать клиентов резервного копирования данных с доступом в папку, и наконец, она объясняет, как настроить производительность Вашей системы (mysqltuner, tuning-primer) или безопасности (пользовательские правила брандмауэра, ((D)Dos Deflate, fail2ban изменения ). На нашем форуме имеется скрипт предназначеный для автоматической установки веб-клиента roundcube 0.7.1 со всеми фишками ISPConfig 3. Все действия на сервере выполняются из под root. Проверено пока на Ubuntu 10.04.03 и Debian-6.0.4. С благодарностью к SinglWolf администрация проекта mini Server. >>> [How To]Автоматическая установка Roundcube для ISPConfig 3
Конкретно в этом учебнике объясняется, как:
- Установим Webmin и изменим его порт с 10000 на 50000
- Изменим порт используемый для ISPConfig с 8080 до 50443
- Установим Roundcube, так как все пользователи смогут получать доступ к нему на SSL (порт 50443 - как ISPConfig) на Web почте
- Расширить fail2ban (для Webmin, RoundCube, SSH) и применить небольшой патч
- Установим multitail и используем простые команды для просмотра всех полезных журналов
- Изменим порт для SSH с 22 на 50022
- Доступ к PhpMyAdmin через SSL (порт 50443 - как ISPConfig) при различных URL, в отличии от адреса по умолчанию (например, /mydomaindb)
- Установим некоторые полезные приложения / расширения на Ваш сервер (htop, php-apc, iptraf, logwatch и так далее)
- Обновление awstats производится вручную или автоматический, когда Вы захотите
- Скорректируем настройки MySQL с помощью сценариев, как mysqltuner или tuning-primer, которые предлагают параметры для настройки вашей MySQL установки
- Ваша система научится с помощь простых шагов, блокировать определенные - настойчивые - IP-адреса или сети, с помощью пользовательских правил для защиты сервера от простых DDoS-атак, в сопутствии с (D)Dos Deflate.
- Создадим ежедневные резервные копирования папок клиентов сети и их баз данных в пользовательские папки, так что бы они могли были в состоянии загрузить их сами.
Для работы с этим руководством Вы должны прочитать и выполнить следующее:
- Идеальный сервер - Debian 6.0 [ISPConfig 3] и Идеальный сервер - Debian 6.0 с BIND и Courier [ISPConfig 3]
- Если Вы хотите получить доступ к ISPConfig Группам и веб-почте через SSL Я также предполагаю, что вы следовали инструкции Включение SSL для ISPConfig для веб-интерфейс ISPConfig 3 (Это необходимо, если только Вы хотите получить доступ к панели управления и веб-интерфейс ISPConfig 3 через SSL на порту 8080).
Чтобы не иметь проблем после будущего обновления сделайте это:
|
И отредактировать /etc/apache2/sites-enabled/000-ispconfig.vhost, удалив строки, которые Вы вставили, и раскомментировать строки по умолчанию для SSL:
|
Содержание должно выглядеть так:
[...] # SSL Configuration SSLEngine On SSLCertificateFile /usr/local/ispconfig/interface/ssl/ispserver.crt SSLCertificateKeyFile /usr/local/ispconfig/interface/ssl/ispserver.key [...]
Если Вы следовали за вышеупомянутым, то я могу предполагть, что Вы читали работу о suExec и ISPConfig 3 в этом посте: ISPConfig 3 configuration.
Этот материал, является (основой) обновленной версией RoundCube (через SSL) и Webmin с fail2ban для ISPConfig 3 на Debian 6.0 с намного большим количеством дополнений.
{xtypo_warning}Перед началом работ убедитесь, что Ваш сервер является рабочим, и Вы довольны его функциональность. Вам прейдется сделать много изменений по этому руководству, и в случае ошибки прейдется много отладкить!{/xtypo_warning}
Webmin
Перед установкой Webmin нам надо установить некоторые зависимости:
|
Загрузите последнюю версию Webmin с официального сайта:
|
и установить его:
|
{xtypo_alert}Перед изменением порта на какой либо другой, в отличии от порта по умолчанию, не забудьте добавить порт в брандмауэре. Если Вы используете стандартный порт ISPConfig, перейти: Система - Файрволл (Firewall) и добавить запись Firewall, порт выберети на свое усмотрение (В этом руководстве мы будем использовать 50000 для Webmin, 50443 для ISPConfig, 50022 для SSH). Сохраним не удаляя старые порты (8080, 10000, 22), пока Вы абсолютноне будете уверены, что новые порты работают.{/xtypo_alert}
Чтобы изменить порт Webmin по умолчанию, отредактируем файл /etc/webmin/miniserv.conf :
|
и изменить port = 10000 и listen = 10000 на port = 50000 и listen 50000. Перезапустим Webmin:
|
Посетите https://www.example.com:50000 для установки обновлений через интерфейс Webmin. Вам придется принять предупреждение системы безопасности, о сертификате Webmin.
Установим другой порт для панель управления ISPConfig
{xtypo_alert}Перед изменением порта на какой либо другой, отличный от порта по умолчанию, не забудьте добавить порт в брандмауэре. Если Вы используете стандартный порт ISPConfig, перейти: Система - Файрволл (Firewall) и добавить запись Firewall, порт выберети на свое усмотрение (В этом руководстве мы будем использовать 50000 для Webmin, 50443 для ISPConfig, 50022 для SSH). Сохраним не удаляя старые порты (8080, 10000, 22), пока Вы абсолютноне будете уверены, что новые порты работают.{/xtypo_alert}
Чтобы изменить порт (8080) по умолчанию панели управления ISPConfig, на другой (например 50443):
|
и убедитесь, что все предпоссылки на 8080 заменены на 50443. Выглядит это следующим образом (показаны только первые строки):
[...] Listen 50443 NameVirtualHost *:50443 <VirtualHost _default_:50443> [...]
Перезапустите Apache и проверте доступ к панели управления на https://www.example.com:50443 :
|
Продолжая материал, Вы можете установить RoundCube через apt-get. Однако прдерживаясь другой логике (если у Вас есть время и храбрость), Вы можете установить roundcube в своей собственной подобласти, вручную.
В материалах "Идеальный сервер" Вы обычно установливали SquirrelMail. Однако, если Вы не хотите, то можете удалить его:
|
и удалить /etc/apache2/conf.d/squirrelmail.conf :
|
Или если Вы хотите его изменить измените /etc/apache2/conf.d/squirrelmail.conf на что-то вроде webmail1.
Установить RoundCube. (Вы должны иметь пароль MySQL администратора, прежде чем приступить. Вам будут заданы несколько вопросов о пароле администратора базы данных и пароль нового пользователя, который будет создан для RoundCube:
|
Examle answers: "Configure database for roundcube with dbconfig-common?" ... Yes "Database type to be used by roundcube: ... MySQL "Password of the database's administrative user:" ... Ваш пароль администратора БД "MySQL application password for roundcube:" ... Пароль для входа пользователя roundcube "Password confirmation:"... Пароль для входа пользователя roundcube
Если что-то пойдет не так, Вы всегда можете запустить:
|
Для получения дополнительной информации, пожалуйста, см. этот пост.
Для каждого пользователя для доступа к своей электронной почте (через его доменное имя), Вы должны создать или отредактировать файл /etc/apache2/conf.d/roundcube с тем чтобы установить псевдоним для "электронной почты". Если вы хотите SSL Вы должны включить последние две директивы (IfModule mod_rewrite.c), чтобы Apache Всегда перенаправлял ISPConfig на SSL.
|
# Those aliases do not work properly with several hosts on your apache server # Uncomment them to use it or adapt them to your configuration # Alias /roundcube/program/js/tiny_mce/ /usr/share/tinymce/www/ Alias /roundcube /var/lib/roundcube Alias /webmail /var/lib/roundcube # Access to tinymce files <Directory "/usr/share/tinymce/www/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny allow from all </Directory> <Directory /var/lib/roundcube/> Options +FollowSymLinks # This is needed to parse /var/lib/roundcube/.htaccess. See its # content before setting AllowOverride to None. AllowOverride All order allow,deny allow from all </Directory> # Protecting basic directories: <Directory /var/lib/roundcube/config> Options -FollowSymLinks AllowOverride None </Directory> <Directory /var/lib/roundcube/temp> Options -FollowSymLinks AllowOverride None Order allow,deny Deny from all </Directory> <Directory /var/lib/roundcube/logs> Options -FollowSymLinks AllowOverride None Order allow,deny Deny from all </Directory> <IfModule mod_rewrite.c> <IfModule mod_ssl.c> <Location /webmail> RewriteEngine on RewriteCond %{HTTPS} !^on$ [NC] RewriteRule . https://%{HTTP_HOST}:50443%{REQUEST_URI} [L] </Location> </IfModule> </IfModule> <IfModule mod_rewrite.c> <IfModule mod_ssl.c> <Location /roundcube> RewriteEngine on RewriteCond %{HTTPS} !^on$ [NC] RewriteRule . https://%{HTTP_HOST}:50443%{REQUEST_URI} [L] </Location> </IfModule> </IfModule>
Изменить /var/lib/roundcube/config/main.inc.php :
|
и установить некоторые переменные в файле (если вы первый раз изменяете файл - строки 60 и 66):
auto_create_user = TRUE; $rcmail_config['default_host'] = 'localhost';
Если Вы установите следующие плагины (авторизация которой помогжет fail2ban), Вы должны будете расширить список плагинов в том же самом файле. Если это единственный плагин - другие будут установленны пойзже, Вы должны отредактировать строку (42) как указано ниже:
$rcmail_config['plugins'] = array('fail2ban');
Установить плагин регистратор RoundCube.
В общем, Вы должны скачать файл (fail2ban.php) и вставьте этот fail2ban в папку plugins RoundCube каталога. Теперь, Вы должны получить этот файл: /usr/share/roundcube/plugins/fail2ban/fail2ban.php. Выполните команду:
|
Этот плагин будет обновлять файл журнала с каждой неудачной попыткой аторизации: /var/log/roundcube/userlogins
Не забудьте изменить ссылку на Web почтe в ISPConfig (Система -> Конфиг интерфейса (System Config) - (вкладка) Mail) и установить его в /webmail. И наконец, перезапустить Apache.
|
Теперь можно получить доступ на Web почту http://www.example.com/webmail
Fail2ban
Расширение jail.local файл, которое предлагается в предыдущих статьях Идеальный сервер - Debian 6.0 [ISPConfig 3] и Идеальный сервер - Debian 6.0 с BIND и Courier [ISPConfig 3]: /etc/fail2ban/jail.local
|
Вы должны добавить или изменить следующие:
[roundcube] enabled = true port = http,50443 filter = roundcube logpath = /var/log/roundcube/userlogins maxretry = 5 [webmin-auth] enabled = true port = 50000 filter = webmin-auth logpath = /var/log/auth.log maxretry = 3 [ssh] enabled = true port = 50022 filter = sshd logpath = /var/log/auth.log maxretry = 6
50443 порт в RoundCube требуется, только если Вы включили перенаправление на HTTPS (смотрите в начале материала). 50000 порт в Webmin-аутентификации является измененным портом (смотрите в начале материала). 50022 портов в SSH является измененным портом (смотрите в следующих разделах этого учебника).
Последняя (и очень важное), не забудьте создать roundcube.conf файл /etc/fail2ban/filter.d/roundcube.conf .
|
со следующим содержанием:
[Definition] failregex = FAILED login for .*. from <host> ignoreregex =
Удачно созданная Webmin-авторизации и фильтры SSH уже непосредственно создаст fail2ban. Перезагрузите fail2ban:
|
Если кто-то добавляет много тюрем в fail2ban, то некоторые из них не могут зайти (ошибки в /var/log/fail2ban.log но не выходят !!!). Смотрим это выполнив:
|
К сожалению, решение немного кривое ... но по крайней мере это работает:
В файле /usr/bin/fail2ban-client в строке 145 нужно вставить time.sleep (0,1) или time.sleep (0,05) :
|
Так выглядит файл перед изменением:
[...] def __processCmd(self, cmd, showRet = True): beautifier = Beautifier() for c in cmd: beautifier.setInputCmd(c) try: [...]
Так выглядит потом:
[...] def __processCmd(self, cmd, showRet = True): beautifier = Beautifier() for c in cmd: time.sleep(0.05) beautifier.setInputCmd(c) try: [...]
Перезагрузите снова fail2ban:
|
Вы можете проверить, что все тюрьмы являются активными командой:
|
multitail
В Debian multitail устанавливается через apt:
|
Создайте папку /root/scripts (если Вы не сделали этого раньше) и вставить команду, которая позволит Вам видеть несколько файлов одновременно:
|
Вставим строки:
#!/bin/bash multitail -ci yellow -e "ailed" -n 1000 /var/log/auth.log -ci red -e "Ban" -n 1000 -I /var/log/fail2ban.log -ci red -e "iopen" -n 1000 -I /var/log/messages -ci green -e "Unban" \ -n 1000 -I /var/log/messages -ci blue -e "fail" -n 1000 -I /var/log/syslog
Сохранитt, выйдети и сделать его исполняемым для root'а:
|
Запустите его (чтобы увидеть результат) с помощью команды (нажмите "Q" для выхода):
|
SSH более 50022 портов
{xtypo_alert}Перед изменением порта на какой либо другой, отличный от порта по умолчанию, не забудьте добавить порт в брандмауэре. Если Вы используете стандартный порт ISPConfig, перейти: Система - Файрволл (Firewall) и добавить запись Firewall, порт выберети на свое усмотрение (В этом руководстве мы будем использовать 50000 для Webmin, 50443 для ISPConfig, 50022 для SSH). Сохраним не удаляя старые порты (8080, 10000, 22), пока Вы абсолютноне будете уверены, что новые порты работают.{/xtypo_alert}
В Debian SSH сервер установливается (если у Вас его еще нет) с apt-get. После этого отредактируйте конфигурационной файла /etc/ssh/sshd_config
|
Добавте Port 50022 сразу после Port 22. Сохраните изменения, закройте и перезапустите SSH:
|
{xtypo_info}Вы должны войти снова через SSH на порту 50022. После выполненной модификации выше, даже SFTP будет доступен через порт 50022. Если удалить порт 22, то Вы можете получить доступ к SSH и SFTP только по порту 50022.{/xtypo_info}
Если Вам удастся Войти с использованием порта 50022 (с помощью следующей команды), Вы можете удалить строку Port 22 в /etc/ssh/sshd_config :
|
Если Вы не вошли, то вы должны переопределить SSH тюрьмы и изменить порт fail2ban SSH тюрьмы (от SSH к 50022) в /etc/fail2ban/jail.local .
(Если вы следовали этому материалу с самого начала, Вы уже сделали это в разделе Fail2ban.)
PhpMyAdmin под разными URL + SSL
Чтобы получить доступ к PhpMyAdmin через SSL под mydomaindb, (или другом уникальном именем), Вы можете применить ту же самую подсказку, как с RoundCube (для SSL). Что касается новых URL, Вы должны отредактировать /etc/apache2/conf.d/phpmyadmin.conf, изменив псевдоним "/phpmyadmin" на "/mydomaindb" и убедитесь, что у Вас в нем есть следующие строки. Заметьте последние строки от <IfModule mod_rewrite.c> до.... </IfModule>, которые используются, чтобы перенаправить на SSL):
# phpMyAdmin default Apache configuration Alias /mydomaindb /usr/share/phpmyadmin <Directory /usr/share/phpmyadmin> Options FollowSymLinks DirectoryIndex index.php <IfModule mod_php5.c> AddType application/x-httpd-php .php php_flag magic_quotes_gpc Off php_flag track_vars On php_flag register_globals Off php_value include_path . </IfModule> </Directory> # Authorize for setup <Directory /usr/share/phpmyadmin/setup> <IfModule mod_authn_file.c> AuthType Basic AuthName "phpMyAdmin Setup" AuthUserFile /etc/phpmyadmin/htpasswd.setup </IfModule> Require valid-user </Directory> # Disallow web access to directories that don't need it <Directory /usr/share/phpmyadmin/libraries> Order Deny,Allow Deny from All </Directory> <Directory /usr/share/phpmyadmin/setup/lib> Order Deny,Allow Deny from All </Directory> <IfModule mod_rewrite.c> <IfModule mod_ssl.c> <Location /mydomaindb> RewriteEngine on RewriteCond %{HTTPS} !^on$ [NC] RewriteRule . https://%{HTTP_HOST}:50443%{REQUEST_URI} [L] </Location> </IfModule> </IfModule>
После этого, перезапустите Apache
|
Не забудьте изменить ссылку PhpMyAdmin в ISPConfig 3 GUI (Система - System Config (конфиг интерфейса - закладка Sites - пункт PhpMyAdmin).
Установика PHP accelarator и другое
В этом разделе мы установим APC (PHP accelarator), который разработан парнями, которые разрабатывают php и некоторые приложения (htop, iptraf, logwatch, tiger).
|
Изменим /etc/php5/conf.d/apc.ini , для того чтобы увеличить кэш-память:
|
И добавьте следующие строки:
apc.shm_size=128
Теперь перезапустите Apache:
|
С htop Вы можете видеть системную информацию лучшим способом чем с iptraf, Вы можете видеть статистику реального времени для своего соединения с logwatch, у Вас может быть своя система, отправляемая Вам по почте сводку файлов журнала, а с tiger Вам можно было бы обеспечить отправку себе отчетов по почте уязвимостей системы безопасности с периодичностью(если это необходимо).
Поскольку много сценариев/приложений отправляет много писем к пользовательскому root, Вы можете исправить почту root на более 'реальный' адрес электронной почты. Gосле того, как Вы устанавмте 'реальную' почту для Вашего example.com домена, Вы можете отредактировать псевдонимы и добавить псевдоним к пользователю root:
|
и измененим строку
root:root
на
root:Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Если Вы хотите установить Drupal (или других CMS), Вам необходимо Propably uploadprogress и JSON. Чтобы выполнить их установку, сделайте следующее:
|
И добавьте следующую строку:
extension=uploadprogress.so
Наконец перезапустим Apache:
|
В этом разделе Вы можете применить модификацию, которая позволит Вам обновлять awstats в любое время, когда Вы захотите, или (при использовании cron) даже чаще. Прежде, чем продолжим дальше, мы должны изменить формат регистрации по умолчанию для awstats. В Debian формат по умолчанию 4, но мы необходимо в 1. Отредактируете файл /etc/awstats/awstats.conf или файл /etc/awstats/awstats.conf.local. Я предпочитаю второй, потому что он позволияет мне не отставать от обновлений:
|
и добавьте строку: LogFormat = 1
После этого файл должен выглядеть следующим образом:
# You can overrides config directives here. # This is particularly useful for users with several configs for # different virtual servers, who want to reuse common parameters. # Also, this file is not updated with each new upstream release. LogFormat=1
Теперь у нас есть для ежедневного копирования по умолчанию cron в ISPConfig, изменим его ... На самом деле мы должны изменить его A LOT (новое название файла: mycron.php). В основном мы должны вырезать много строк и сохранить только некоторые из них.
|
и вставить все следующие строки:
<?php /* Copyright (c) 2007, Till Brehm, projektfarm Gmbh All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of ISPConfig nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ require('/usr/local/ispconfig/server/lib/config.inc.php'); require('/usr/local/ispconfig/server/lib/app.inc.php'); set_time_limit(0); // make sure server_id is always an int $conf['server_id'] = intval($conf['server_id']); // Load required base-classes $app->uses('ini_parser,file,services,getconf'); ####################################################################################################### // Create awstats statistics ####################################################################################################### $sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE stats_type = 'awstats' AND server_id = ".$conf['server_id']; $records = $app->db->queryAllRecords($sql); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); foreach($records as $rec) { $logfile = escapeshellcmd($rec['document_root'].'/log/access.log'); $domain = escapeshellcmd($rec['domain']); $statsdir = escapeshellcmd($rec['document_root'].'/web/stats'); $awstats_pl = $web_config['awstats_pl']; $awstats_buildstaticpages_pl = $web_config['awstats_buildstaticpages_pl']; $awstats_conf_dir = $web_config['awstats_conf_dir']; $awstats_website_conf_file = $web_config['awstats_conf_dir'].'/awstats.'.$domain.'.conf'; if(is_file($awstats_website_conf_file)) unlink($awstats_website_conf_file); if(!is_file($awstats_website_conf_file)) { $awstats_conf_file_content = 'Include "'.$awstats_conf_dir.'/awstats.conf" LogFile="/var/log/ispconfig/httpd/'.$domain.'/access.log" SiteDomain="'.$domain.'" HostAliases="www.'.$domain.' localhost 127.0.0.1"'; file_put_contents($awstats_website_conf_file,$awstats_conf_file_content); } if(!@is_dir($statsdir)) mkdir($statsdir); // awstats_buildstaticpages.pl -update -config=mydomain.com -lang=en -dir=/var/www/domain.com/web/stats -awstatsprog=/path/to/awstats.pl $command = "$awstats_buildstaticpages_pl -update -config='$domain' -lang=en -dir='$statsdir' -awstatsprog='$awstats_pl'"; if($awstats_pl != '' && $awstats_buildstaticpages_pl != '' && fileowner($awstats_pl) == 0 && fileowner($awstats_buildstaticpages_pl) == 0) { exec($command); rename($rec['document_root'].'/web/stats/awstats.'.$domain.'.html',$rec['document_root'].'/web/stats/index.html'); $app->log('Created awstats statistics with command: '.$command,LOGLEVEL_DEBUG); } else { $app->log("No awstats statistics created. Either $awstats_pl or $awstats_buildstaticpages_pl is not owned by root user.",LOGLEVEL_WARN); } } die("finished.\n"); ?>
Этот сценарий отсекает файла по умолчанию cron ISPConfig. Говоря простыми словами, сценарий читает файл access.log каждой области и не делает изменений, кроме того, что она воспроизводит HTML файлы для AWStats. Имейте в виду, что по умолчанию ISPConfig cron будет работать как обычно, а в 00:30, он просто будет добавлять в БД статистику и воссоздать HTML файлы.
В приведенном выше сценарий можно изменить язык произведенный awstats, если Вы просто изменить буквы после "LANG =" на те, которые представляют свою страну.
Чтобы запускать скрипт каждые 4 часа, сначала создайте файл /root/scripts/mycron.sh, сделать его исполняемым, а затем добавить его в список Cronjob:
|
и вставить следующее:
#!/bin/sh PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin /usr/bin/php -p /root/scripts/mycron.php
Добавить Cronjob:
|
Добавьте следующую строку, сохраните файл и выйдите:
45 0,4,8,12,16,20 * * * /root/scripts/mycron.sh
Вы можете также инициировать создание статистика в любое время:
|
MySQL tuning
Скачайте tuning-primer.sh и mysqltuner.pl. Это поможет вам улучшить файла конфигурации MySQL.
|
Для их выполнения:
|
Сценарии (скрипты) зададут некоторые простые вопросы (пользователь/пароль) и покажут красным цветом их предложениях для критических параметров настройки. Вы можете использовать их предложения, чтобы повысить производительности mysql-сервера.
Прежде всего, убедитесь, что Вы установили "High" уровень безопасности ISPConfig 3 панели: Система - Конфигурация сервера - Web (вкладка).
{xtypo_warning}Следующие инструкции предназначены только для демонстрации. Полностью разберитесь в них (прочитайте документацию в интернете), прежде чем применять и использовать их.{/xtypo_warning}
В общем, если Вы будете следовать им, Вы сможете ограничивать скорость трафика по определенным портам, снизить sun соединения и предотвратить вторжение, которое используют похожие плохие пакеты. Чтобы применить их создадим папкуr /root/scripts (если она еще не существует), и следующие 5 файлов. (Loadfw, unloadfw, IPS, fwrules и reloadfail2ban). Первый будет содержать скрипт для загрузки правил, второй сценарий для выгрузки правила, третий будет содержать "плохие" IP-адреса и "плохие" хосты, четвертый пользовательские правила и пятый некоторые команды, чтобы перезагрузить eveything (включая fail2ban).
|
Вставим следующие:
#!/bin/bash # Simple iptables IP/subnet load script # ---------------------------------------------------------- cd /root/scripts/ IPT=/sbin/iptables DROPMSG="fwBLOCKED " BADIPS=$(egrep -v -E "^#|^$" /root/scripts/IPs) while read fwrule do $IPT -I INPUT $fwrule done < /root/scripts/fwrules for ipblock in $BADIPS do $IPT -I INPUT -s $ipblock -j DROP $IPT -I INPUT -s $ipblock -j LOG --log-prefix "$DROPMSG" done
Изменим unloadfw:
|
Вставим следующие:
#!/bin/bash # Simple iptables IP/subnet unload script # --------------------------------------------------------- cd /root/scripts/ IPT=/sbin/iptables DROPMSG="fwBLOCKED " BADIPS=$(egrep -v -E "^#|^$" /root/scripts/IPs) while read fwrule do $IPT -D INPUT $fwrule done < /root/scripts/fwrules for ipblock in $BADIPS do $IPT -D INPUT -s $ipblock -j DROP $IPT -D INPUT -s $ipblock -j LOG --log-prefix "$DROPMSG"done
Изменим IP адреса:
|
Вставьте раздражающие IP (например, IP, запрещенные многократно fail2ban) или целые сети. Вы можете добавить здесь IP или сеть в любое время, но прежде, чем Вы сделаете любую модификацию (особенно, если Вы удаляете sth), Вы должны выполнить /root/scripts/unloadfw. Позже Вы можете отредактировать файл, вставив IP или сети, и наконец Вы должны выполнить /root/scripts/loadfw (см. ниже),
#IP x.y.z.w x.q.a.r #netwroks d.r.t.h/24 #mailservers a.g.h.j
(Вы можете использовать http://www.countryipblocks.net, чтобы видеть сети, которые ассоциируются с каждой страной).
|
Вставьте следующие (и что-либо еще, что может быть вставлено (-I) или удалено (-D) в/из ВХОДНОЙ цепочки. Правила для серверов с единственным сетевым интерфейсом (eth0). Пожалуйста, измените их, чтобы соответствовало Вашим потребностям (например, изменив eth0, если Ваш сетевой интерфейс отличается).
-p tcp --dport 50022 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw50022 -j DROP -p tcp --dport 50022 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw50022 -j LOG --log-prefix "LMfwport50022" -p tcp --dport 50022 -i eth0 -m state --state NEW -m recent --set --name fw50022 -p tcp --dport 50000 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw50000 -j DROP -p tcp --dport 50000 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw50000 -j LOG --log-prefix "LMfwport50000" -p tcp --dport 50000 -i eth0 -m state --state NEW -m recent --set --name fw50000 -p tcp --dport 10000 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw10000 -j DROP -p tcp --dport 10000 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw10000 -j LOG --log-prefix "LMfwport10000" -p tcp --dport 10000 -i eth0 -m state --state NEW -m recent --set --name fw10000 -p tcp --dport 25 -i eth0 -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 20 --name fw25 -j DROP -p tcp --dport 25 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name fw25 -j LOG --log-prefix "LMfwport25" -p tcp --dport 25 -i eth0 -m state --state NEW -m recent --set --name fw25 -p tcp --dport 110 -i eth0 -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 20 --name fw110 -j DROP -p tcp --dport 110 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name fw110 -j LOG --log-prefix "LMfwport110" -p tcp --dport 110 -i eth0 -m state --state NEW -m recent --set --name fw110 -p tcp --dport 50443 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw50443 -j DROP -p tcp --dport 50443 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw50443 -j LOG --log-prefix "LMfwport50443" -p tcp --dport 50443 -i eth0 -m state --state NEW -m recent --set --name fw7443 -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw22 -j DROP -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw22 -j LOG --log-prefix "LMfwport22" -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set --name fw22 -p tcp --dport 20 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw20 -j DROP -p tcp --dport 20 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw20 -j LOG --log-prefix "LMfwport20" -p tcp --dport 20 -i eth0 -m state --state NEW -m recent --set --name fw20 -p tcp --dport 21 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw21 -j DROP -p tcp --dport 21 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw21 -j LOG --log-prefix "LMfwport21" -p tcp --dport 21 -i eth0 -m state --state NEW -m recent --set --name fw21 -p tcp --dport 143 -i eth0 -m state --state NEW -m recent --rcheck --seconds 60 --hitcount 20 --name fw143 -j DROP -p tcp --dport 143 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 --name fw143 -j LOG --log-prefix "LMfwport143" -p tcp --dport 143 -i eth0 -m state --state NEW -m recent --set --name fw143 -p tcp --dport 53 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw53 -j DROP -p tcp --dport 53 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw53 -j LOG --log-prefix "LMfwport53" -p tcp --dport 53 -i eth0 -m state --state NEW -m recent --set --name fw53 -p tcp --dport 443 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw443 -j DROP -p tcp --dport 443 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw443 -j LOG --log-prefix "LMfwport443" -p tcp --dport 443 -i eth0 -m state --state NEW -m recent --set --name fw443 -p tcp --dport 8081 -i eth0 -m state --state NEW -m recent --rcheck --seconds 30 --hitcount 20 --name fw8081 -j DROP -p tcp --dport 8081 -i eth0 -m state --state NEW -m recent --update --seconds 30 --hitcount 20 --name fw8081 -j LOG --log-prefix "LMfwport8081" -p tcp --dport 8081 -i eth0 -m state --state NEW -m recent --set --name fw8081 -p icmp -j DROP -p icmp -m limit --limit 2/s -j ACCEPT -p tcp --syn --dport 80 -m connlimit --connlimit-above 25 -j DROP -p tcp --syn --dport 80 -m connlimit --connlimit-above 25 -j LOG --log-prefix "BLfwsyn80" -p tcp --syn --dport 443 -m connlimit --connlimit-above 25 -j DROP -p tcp --syn --dport 443 -m connlimit --connlimit-above 25 -j LOG --log-prefix "BLfwsyn443" -p tcp --syn --dport 50443 -m connlimit --connlimit-above 25 -j DROP -p tcp --syn --dport 50443 -m connlimit --connlimit-above 25 -j LOG --log-prefix "BLfwsyn50443" -p tcp --syn --dport 50022 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 50022 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn50022" -p tcp --syn --dport 22 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 22 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn22" -p tcp --syn --dport 50000 -m connlimit --connlimit-above 15 -j DROP -p tcp --syn --dport 50000 -m connlimit --connlimit-above 15 -j LOG --log-prefix "BLfwsyn50000" -p tcp --syn --dport 10000 -m connlimit --connlimit-above 15 -j DROP -p tcp --syn --dport 10000 -m connlimit --connlimit-above 15 -j LOG --log-prefix "BLfwsyn10000" -p tcp --syn --dport 25 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 25 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn25" -p tcp --syn --dport 20 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 20 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn20" -p tcp --syn --dport 21 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 21 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn21" -p tcp --syn --dport 110 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 110 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn110" -p tcp --syn --dport 143 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 143 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn143" -p tcp --syn --dport 53 -m connlimit --connlimit-above 10 -j DROP -p tcp --syn --dport 53 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLfwsyn53" -i eth0 -p tcp --tcp-flags ALL ALL -j DROP -i eth0 -p tcp --tcp-flags ALL ALL -j LOG --log-level 4 --log-prefix "FLAAfw" -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-level 4 --log-prefix "FINGfw" -i eth0 -f -j DROP -i eth0 -f -m limit --limit 6/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "FRAGfw" -i eth0 -p tcp --tcp-flags ALL NONE -j DROP -i eth0 -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULLfw" -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMASfw" -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-level 4 --log-prefix "SYNRTSfw" -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-level 4 --log-prefix "SYNRTSACKfw" -i eth0 -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j DROP -i eth0 -p tcp --tcp-flags ALL ACK,RST,SYN,FIN -j LOG --log-level 4 --log-prefix "SYNRTSYNSfw" -i eth0 -p tcp ! --syn -m state --state NEW -j DROP -i eth0 -p tcp ! --syn -m state --state NEW -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "DROSYNCfw"
Изменим reloadfail2ban:
|
Вставив следующее:
#!/bin/bash /etc/init.d/fail2ban restart sleep 2 /root/scripts/unloadfw sleep 2 /root/scripts/loadfw
Наконец выполним:
|
Если вы хотите, чтобы начать после каждой перезагрузки пасты линия: /root/scripts/loadfw в конце /etc/init.d/rc.local :
|
и добавьте:
[...] /root/scripts/loadfw
(D) DoS Deflate, легкий Bash сценарий оболочки, разработанный, чтобы помочь в процессе блокирования атаки отказ в обслуживании. Это создает список IP адресов, подключенных с серверу, наряду с их общим количеством соединений. Это - один из самых простых и самых легкий устанавливаемых решений на уровне программного обеспечения.
IP адреса по предварительно сконфигурированному числу соединений автоматически блокируются в брандмауэре сервера, который может быть прямым iptables или Усовершенствованным Брандмауэром Политики (APF). Чтобы установить (D) DoS, выполните:
|
Изменим /usr/local/ddos/ddos.conf и применим последующие изменения, которые будут отключать брандмауэр APF и использовать обычную Iptables, электронную почту событий в root и блокировать IP с более чем 100 соединений в минуту.
[...] APF_BAN=0 EMAIL_TO="root" NO_OF_CONNECTIONS=100 [...]
Вышеупомянутое - только набор предложений. Вы можете расширить их, как Вам нравится.
РЭто только ожин из способов их реализации. Вы можете использовать решение для брандмауэра как APF, Shorewall и т.д.
Следующий сценарий - это легкий способ сделать копию Ваших клиентских данных и Ваших клиентских баз данных в их папке веб-сайта. Как Вы можете знать в ISPConfig 3, у каждого клиента есть папка в виде /var/www/clients/clientXY, в котором есть все его веб-сайты. Сценарий поддержит все его веб-сайты в каждой веб-папке в комплекте с его базами данных, что бы клиент будел в состоянии загрузить их сам. Сценарий также сохраняет прошлые 3 дня этих файлов, и прошлые 3 воскресенья для администраторского использования в каталоге Вашего на выбор (значение по умолчанию /var/backup/sites).
Это очень простой сценарий. Для более продвинутых решение посмотреть на этот пост.
Создайте сценарий, сделав его исполняемым и изменить его:
|
Содержание должно быть следующим: (Измените переменные ispUSER, ispPASS, ispHOST, DEST and SITES в соответствии со своими потребностями):
# # Last updated: March - 2011 # -------------------------------------------------------------------- # This is a free shell script under GNU GPL version 2.0 or above # Copyright (C) 2011 iopen.gr # Feedback/comment/suggestions : http://iopen.gr # -------------------------------------------------------------------- # # INTENDED for the ISPConfig 3.0.x and above # # This script will back up every web folder (web, stats, cgi e.t.c # of every client in companion with all the client's DBs # The backups will be placed in the website client's folder # The scipt will keep the current and the 2 previous backup # It will also keep the last 3 sundays # -------------------------------------------------------------------- # Database credentials. Use a DB user with full read access or use the root user ispUSER="root" # DB user ispPASS="---yourpass---" # user's password ispHOST="localhost" # Hostname CURDIR="$(pwd)" # Variables with full path to binaries MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" CHOWN="$(which chown)" CHMOD="$(which chmod)" GZIP="$(which gzip)" TAR="$(which tar)" # Your Server's Main Backup Directory DEST="/var/backup" # Sites (ONLY) backup directory in your Main Backup Directory SITES="$DEST/sites" # Variables for Dates in yymmdd format TODAY=`date +%Y%0m%0d` YESTERDAY=`date -d '1 day ago' +%Y%0m%0d` BACK2=`date -d '2 day ago' +%Y%0m%0d` BACK3=`date -d '3 day ago' +%Y%0m%0d` BACK22=`date -d '22 day ago' +%Y%0m%0d` [ ! -d $SITES ] && mkdir -p $SITES || : # Give Only root access to backups in this scripts folders $CHOWN 0.0 -R $SITES $CHMOD 0600 $SITES # -------------------------------------------------------------------------- # Remove previous (current) backups of the client directory # The backups are in the form : # xyzBU.tar.gz for the web sites # xyzBU.gz for the databases # -------- CAUTION --------- # Do not store any other file in this form in the clients directory # -------------------------------------------------------------------------- echo "-------------------------------------------------------------" QRY="use dbispconfig; SELECT web_domain.system_user, web_domain.system_group, \ web_domain.document_root, web_domain.domain FROM web_domain WHERE \ web_domain.type!='alias' AND web_domain.system_user IS NOT NULL AND LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) ;" echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line do # ${col[0]}=domain user / folder name / system user, ${col[1]}=clientID / system group , while read -a col # ${col[2]}=path to website, ${col[3]}= domain name do echo " CLEANING OLD BACKUPS in ${col[2]} folder " [ -f ${col[2]}/*BU.tar.gz ] && rm ${col[2]}/*BU.tar.gz [ -f ${col[2]}/*BU.gz ] && rm ${col[2]}/*BU.gz done done # -------------------------------------------------------------------------- # Remove anything that is older than 22 days old and have the form : # xyzBU.tar.gz for the web sites # xyzBU.gz for the databases # from server's $SITES directory # -------------------------------------------------------------------------- echo "-------------------------------------------------------------" echo " CLEANING OLD BACKUPS in SITES folder " [ -f $SITES/*.$BACK22.gz ] && rm $SITES/*.$BACK22.gz [ -f $SITES/*.$BACK22.tar.gz ] && rm $SITES/*.$BACK22.tar.gz echo "-------------------------------------------------------------" echo " " echo " " # -------------------------------------------------------------------------- # For each client, backup his database in his website folder # Furthermore copy today's backup in the server's $SITES directory # Remove the backup that is older than 3 days from server's $SITES directory # Keep the last 3 Sundays # -------------------------------------------------------------------------- QRY="use dbispconfig; SELECT web_database.database_name , web_database.database_user ,\ web_domain.system_user, web_domain.system_group, web_domain.document_root, \ web_domain.domain FROM web_database, web_domain WHERE web_database.sys_userid=web_domain.sys_userid \ AND web_database.sys_groupid=web_domain.sys_groupid AND web_domain.type!='alias' \ AND web_domain.system_user IS NOT NULL AND LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) ;" echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line do # ${col[0]} = dbname, ${col[1]}=dbuser , ${col[2]}=domain user / folder name / system user, while read -a col #${col[3]}=clientID / system group , ${col[4]}=path to website, ${col[5]= domain name do echo " DB: "${col[0]} echo "-------------------------------------------------------------" echo "Backing Up DB:" ${col[0]} "in :" ${col[4]}/${col[0]}BU.gz $MYSQLDUMP -u $ispUSER -h $ispHOST -p$ispPASS -c --add-drop-table --add-locks \ --all --quick --lock-tables ${col[0]} | $GZIP -9 > ${col[4]}/${col[0]}BU.gz cp ${col[4]}/${col[0]}BU.gz $SITES/${col[0]}.$TODAY.gz if [ `date -d '3 day ago' +%u` -ne 7 ] # if 3 days ago is not Sunday then #remove the backup [ -f $SITES/${col[0]}.$BACK3.gz ] && rm $SITES/${col[0]}.$BACK3.gz fi $CHOWN ${col[2]}:${col[3]} ${col[4]}/${col[0]}BU.gz $CHMOD 0660 ${col[4]}/${col[0]}BU.gz echo "-------------------------------------------------------------" echo " " done done # -------------------------------------------------------------------------- # For each client, backup his sites in his website folder # Furthermore copy today's backup in the server's $SITES directory # Remove the backup that is older than 3 days from server's $SITES diriectory # Keep the last 3 Sundays # -------------------------------------------------------------------------- QRY="use dbispconfig; SELECT web_domain.system_user, web_domain.system_group,\ web_domain.document_root, web_domain.domain FROM web_domain WHERE \ web_domain.type!='alias' AND web_domain.system_user \ IS NOT NULL AND LENGTH(web_domain.redirect_path)<5 OR web_domain.redirect_path IS NULL) ;" echo $QRY | mysql -u $ispUSER -h $ispHOST -p$ispPASS | while read -r line do # ${col[0]}=domain user / folder name / system user, ${col[1]}=clientID / system group , while read -a col # ${col[2]}=path to website, ${col[3]}= domain name do echo " " echo " Site:" ${col[3]} echo "-------------------------------------------------------------" echo "Backing Up site: " ${col[2]}/ "in :" ${col[2]}/${col[3]}BU.tar.gz cd ${col[2]} $TAR -czf ${col[2]}/${col[3]}BU.tar.gz . cp ${col[2]}/${col[3]}BU.tar.gz $SITES/${col[3]}.$TODAY.tar.gz if [ `date -d '3 day ago' +%u` -ne 7 ] # if 3 days ago is not Sunday then #remove the backup [ -f $SITES/${col[3]}.$BACK3.tar.gz ] && rm $SITES/${col[3]}.$BACK3.tar.gz fi $CHOWN ${col[0]}:${col[1]} ${col[2]}/${col[3]}BU.tar.gz $CHMOD 0660 ${col[2]}/${col[3]}BU.tar.gz echo "-------------------------------------------------------------" echo " " done done cd $CURDIR
Вы можете запустить скрипт резервного копирования, выполнив:
|
или Вы можете добавить его в качестве расписанию (например, каждый день в 22:30):
|
и добавьте следующую строку:
30 22 * * * /root/scripts/mybackup.sh > /dev/null 2>> /var/log/backup.log
Обсуждение темы на форуме Идеальный сервер - Debian 6.0 [ISPConfig 3]. На нашем форуме имеется скрипт предназначеный для автоматической установки веб-клиента roundcube 0.7.1 со всеми фишками ISPConfig 3. Все действия на сервере выполняются из под root. Проверено пока на Ubuntu 10.04.03 и Debian-6.0.4. С благодарностью к SinglWolf администрация проекта mini Server. >>> [How To]Автоматическая установка Roundcube для ISPConfig 3