Настройка сервера на Debian Ubuntu
Материал из Xgu.ru
Статья описывает настройку семейства самых популярных и важных дистрибутивов GNU/Linux |
[править] Введение
Эта статья описывает установку «с нуля» сервера на linux, предназначенного, к примеру, для размещения сайтов.
Статья может пригодиться в качестве:
- Шпаргалки/контрольного списка (чтобы не забыть что-либо);
- Инструкции для начинающих;
- Источника чужого опыта продвинутому администратору. Рассмотрим полезные штатные утилиты, о которых возможно вы не знали.
sudo -iили
su -В этом режиме надо быть предельно осторожным — например, если перепутать /dev/sda с /dev/sdb, то операция будет произведена с другим жёстким диском.
Команды в статье начинаются с символа «#» — его вводить не надо, это приветствие терминала, нужно чтобы в статье отличить вводимую команду от вывода.
[править] Работа в терминале
Если вы раньше не работали в консоли Linux, запомните несколько правил:
- Прочтите статьи для начинающих, например http://help.ubuntu.ru/manual/терминал;
- Регистр букв имеет значение. Чаще всего, команды пишутся с маленькой буквы. Если написать команду с большой буквы, система сообщит вам, что команда не найдена;
- Удобно пользоваться автодополнением, чтобы не ошибаться при наборе команды. Когда наберёте первые символы, просто нажмите TAB один-два раза;
[править] Выбор сервера
Если у вас ещё нет своего сервера — не беда, можно взять его в аренду, например (в алфавитном порядке):
[править] Выбор операционной системы
Debian 7 или Ubuntu 14.04 — на ваш выбор, для новичка разницы нет. Если Ubuntu, то только LTS (14.04, например). На виртуальный сервер с менее 4 ГБ оперативной памяти устанавливаем 32-разрядную систему, на «железный» сервер — 64-разрядную. Устанавливаем в минимальном виде, без графики и дополнительных пакетов.
[править] editor
Если вам нравится стиль встроенных редакторов Far manager / Norton commander, то вам, наверное, понравится редактор mcedit. Установите Midnigth commander:
apt-get install mc -y
В статье везде для редактирования используется команда editor — она является ссылкой на ваш любимый консольный редактор. Поменять его можно командой:
update-alternatives --config editor
[править] sudo
Если у нас Debian, то лучше сразу установить sudo:
su -c "apt-get update" su -c "apt-get -y install sudo"
и добавить себя в группу sudo:
su -c "addgroup ваш_логин sudo"
(если вы забыли, как назвали своего пользователя при установке системы, посмотрите вывод команды getent passwd, он скорее всего последний в списке).
[править] Базовые настройки
В файле /etc/default/rcS прописываем «FSCKFIX=yes», чтобы в случае аварийной перезагрузки ошибки были по-возможности исправлены автоматически.
editor /etc/default/rcS
[править] Пользователи
Для каждого человека, имеющего доступ к серверу, надо делать отдельные логин и пароль. Тогда:
- у пользователя будет свой
парольSSH ключ для входа (или несколько SSH ключей, если надо входить с разных устройств), - у пользователя будет своя домашняя директория, к примеру удобно понять, кого спросить если заканчивается место на диске,
- у пользователя будет свои настройки терминала и редакторов,
- у пользователя будет своя история команд, чтобы вытаскивать из неё,
- командами
w
илиwho
можно посмотреть, кто сейчас залогинен на сервере, - можно видеть в логах, кто когда входил на сервер,
- в списке процессов видно, кто запускал процесс.
Поменяем настройки по-умолчанию, чтобы у вновь созданных пользователей домашние директории были доступны для чтения только самим этим пользователям:
editor /etc/adduser.conf
заменяем «DIR_MODE=0755» на «DIR_MODE=0750».
Добавлять пользователей в систему можно командой
adduser новый_пользователь
Если пользователь будет подключаться только удалённо, создаём его без пароля (см. раздел #SSH):
adduser --disabled-password новый_пользователь
Если нужно предоставить пользователю права суперпользователя (через sudo), добавляем его в группу sudo:
addgroup новый_пользователь sudo
[править] Генерация пароля
Не надо пытаться генерировать пароли самому, для этого есть множество отличных способов:
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 30 ; echo
или
pwgen 30 1
или
apg -m 30 -s
[править] Локальный сервер
Пара советов ниже важны, если сервер у вас не удалённый, а находится в локальной сети.
[править] Именование сетевых интерфейсов
Если у вас сервер, находящийся на границе локальной сети и интернет, и у него несколько сетевых интерфейсов, то интерфейс, смотрящий в локальную сеть, принято именовать eth0, соответственно вторая сетевая карта, подключенная к внешней сети, будет называться eth1. Поменять названия интерфейсов можно, отредактировав файл:
editor /etc/udev/rules.d/70-persistent-net.rules
Настройки применятся после перезагрузки.
[править] arpwatch
Полезен, чтобы узнавать о новых устройствах в локальной сети (и конфликтах адресов, если они у вас бывают). В /etc/default/arpwatch правим ARGS="-N -p -i eth0", чтобы он слушал только на интерфейсе локальной сети, а не пытался отслеживать сеть провайдера.
Письма будет присылать на root, так что обязательно читаем ниже про почту.
Если точно не надо отправлять почту от arpwatch, добавьте "-Q" к опциям.
[править] IP-адресация
[править] Репозитории
Репозитории — это специальные серверы-хранилища, с которых скачиваются deb-пакеты с программами для установки. Скорее всего, у вас уже указаны все необходимые репозитории, но можете проверить:
[править] Ubuntu
Пример файла /etc/apt/sources.list для Ubuntu 14.04:
deb http://ru.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb-src http://ru.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse deb http://ru.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse deb-src http://ru.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse deb http://ru.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse deb-src http://ru.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse deb-src http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse #deb http://archive.canonical.com/ubuntu trusty partner #deb-src http://archive.canonical.com/ubuntu trusty partner #deb http://extras.ubuntu.com/ubuntu trusty main #deb-src http://extras.ubuntu.com/ubuntu trusty main
[править] Debian
Пример файла /etc/apt/sources.list для Debian 7:
deb http://ftp.ru.debian.org/debian/ wheezy main contrib non-free deb-src http://ftp.ru.debian.org/debian/ wheezy main contrib non-free deb http://ftp.ru.debian.org/debian/ wheezy-updates main contrib non-free deb-src http://ftp.ru.debian.org/debian/ wheezy-updates main contrib non-free deb http://security.debian.org/ wheezy/updates main contrib non-free deb-src http://security.debian.org/ wheezy/updates main contrib non-free
[править] Точное время
Время на сервере должно быть точным.
Просто установите службу ntp:
apt-get -y install ntp
Протестировать можно через несколько минут:
ntpq -pn remote refid st t when poll reach delay offset jitter ============================================================================== +192.168.155.1 85.21.78.8 3 u 13 256 377 0.126 3.582 0.403 *10.100.12.14 89.109.251.22 2 u 20 256 377 0.408 -1.304 0.202 +10.100.12.15 89.109.251.23 2 u 222 256 377 0.543 -1.068 0.248
Если у одного из ip-адресов слева стоит символ «*», значит всё в порядке.
[править] Часовой пояс
dpkg-reconfigure tzdata
Выбираем то, что вам удобнее, например, Азия → Екатеринбург.
[править] Имя сервера
Имя сервера должно быть «полным» — например, srv01.example.com. Команда «host srv01.example.com», выполненная на другом компьютере, должна выдавать ip-адрес сервера, а команда «host ip-адрес_сервера» должна выдавать его полное имя.
Это имя прописываем в /etc/hosts напротив ip-адреса сервера, после полного имени через пробел пишем сокращённое имя, например:
192.168.0.1 srv01.example.com srv01
Применить полное имя на ходу можно командой hostname, например
hostname srv01.example.com
В файл /etc/hostname прописываем сокращённое имя (см. man 1 hostname).
[править] У меня нет своего домена
Если у вас не куплено своё уникальное внешнее имя (например, example.com), то можно использовать выдуманное имя, но тогда сервер будет доступен по имени только в локальной сети. Для вымышленного имени не рекомендуется использовать .local, т.к. этот домен зарезервирован для служебных целей. Выберите другое имя, например .zone. Если же вам нужен доступ к серверу по имени из интернета, или купите свой домен, или возьмите у знакомых поддомен бесплатно.
[править] У меня есть свой домен
Добавьте к вашему домену произвольное имя, например srv01, и назовите ваш сервер полученным «srv01.example.com». Не называйте сервер «example.com», чтобы не путать его с вашим сайтом (которых потом может стать несколько). К тому же, сайт через какое-то время вы можете перенести на другой сервер (например, srv02.example.com), и настройки для srv01 не придётся менять.
[править] Локализация
[править] Ubuntu
В Ubuntu предварительно установить пакет language-pack-ru (он потянет за собой лишний firefox-locale-ru, ну и ладно):
apt-get -y install language-pack-ru
[править] Debian
Запускаем конфигуратор:
dpkg-reconfigure locales
ставим пробелом галочки на en_US.utf8 и ru_RU.utf8, жмём «Ok», в следующем окне по-умолчанию рекомендую выбрать en_US.utf8.
Также в Debian можно добавить строку в файл:
echo ': ${LANG:=en_US.utf8}; export LANG' >> /etc/profile
[править] Почтовая система
Почтовая система нужна на сервере, чтобы получать различные отчёты о его работе.
Проверяем, что команда «hostname -f» выдаёт полное имя сервера.
Устанавливаем Postfix:
apt-get -y install postfix
В Debian будет предложено удалить Exim, это нормально. В начальной конфигурации выбираем «Internet Site», дальше со всем соглашаемся.
В конфигурации Postfix оставляем 25-й порт открытым только для локальных сервисов, иначе нас быстро завалит спамом:
editor /etc/postfix/main.cf
правим строку:
inet_interfaces = loopback-only
Перезапускаем почтовый сервер:
service postfix restart
Большинство программ отправляют отчёты о своей работе и ошибки в локальный ящик суперпользователю root. Настроим почтовую систему, чтобы она отправляла копии этих писем на удалённый ящик:
editor /etc/aliases
правим строку, начинающуюся с «root:»
root: root, yourmail@test.ru
Применим настройки:
newaliases
Для теста, отправим письмо на свой внешний почтовый ящик:
mail -s "Test" yourmail@test.ru
Далее вводим текст письма, затем [Enter], точка и ещё раз [Enter], например:
Test .
Если будет запрос «Cc:» — просто нажимаем [Enter]. Если письмо не пришло, следует изучить содержимое файла /var/log/mail.log
[править] SSH
Очень важно правильно настроить на сервере удалённый доступ, чтобы боты не подобрали пароль.
apt-get -y install openssh-server editor /etc/ssh/sshd_config
Рекомендуется изменить номер порта на нестандартный и запретить логиниться руту.
Номер порта для SSH-сервера выбираем случайный от 1024 до 65535:
python3 -c 'import random; print(random.randint(1024, 65535))'
Приводим соответствующие строки примерно к такому виду:
Port 42837 AllowUsers ваш_логин PermitRootLogin no
Применяем настройки:
service ssh reload
Теперь проверьте из отдельного терминала (этот не закрывайте!), что SSH-доступ работает.
Крайне рекомендую пользоваться SSH ключами и отключить вход на сервер по паролю указанием PasswordAuthentication no
, подробнее про SSH здесь: https://vazhnov.dreamwidth.org/10833.html.
[править] MySQL
Если нужен SQL сервер, то для примера установим MySQL. Надо заранее подготовить хороший пароль, сохраним его в вашу базу паролей (я генерирую и храню пароли в KeePassX) и пропишем в /root/.my.cnf:
[client] password = "c8M2oWUJSrYrc2kiqQ"
apt-get -y install mysql-server
При установке будет просьба ввести новый пароль для администрирования MySQL — вводите заранее подготовленный.
Немного обезопасим БД:
mysql_secure_installation
Ответы:
- Change the root password? [Y/n] n
- Remove anonymous users? [Y/n] y
- Disallow root login remotely? [Y/n] y
- Remove test database and access to it? [Y/n] y
- Reload privilege tables now? [Y/n] y
[править] Тюнинг
Скорее всего, ничего настраивать не нужно. Если же сильно нужно поковырять MySQL на предмет тонкой настройки, стоит попробовать https://github.com/rackerhacker/MySQLTuner-perl
[править] Web-сервер
Принимать подключения и распределять их будем с помощью быстрого Nginx, а «за ним» можно будет ставить каждому сайту своё, здесь рассмотрим Apache.
[править] Nginx
Устанавливаем:
apt-get -y install nginx
Защитим конфигурацию и файлы журналов от просмотра любыми пользователями:
chmod 750 /etc/nginx /var/log/nginx chgrp adm /var/log/nginx
rm /etc/nginx/sites-enabled/default
[править] Apache
Разделять пользователей сайтов будем с помощью mpm-itk. Перед установкой остановим Nginx, иначе установка Apache завершиться ошибкой из-за занятого http-порта 80.
service nginx stop apt-get -y install apache2 apache2-mpm-itk service apache2 stop
Отключаем опасный в неумелых руках модуль:
a2dismod autoindex
Редактируем файлы /mods-available/status.conf /mods-available/info.conf
Так как у нас соединения на 80 порту принимает Nginx, то Apache не может занимать 80 порт. Пропишем ему, например, порт 8080, да ещё и чтобы не был доступен удалённо:
editor /etc/apache2/ports.conf
NameVirtualHost 127.0.0.1:8080 Listen 127.0.0.1:8080
editor /etc/apache2/sites-enabled/000-default
приводим строку к следующему виду:
<VirtualHost 127.0.0.1:8080>
Устанавливаем libapache2-mod-rpaf, он нужен чтобы в журналах Apache были ip-адреса клиентов, а не проксирующего Nginx:
apt-get -y install libapache2-mod-rpaf
service apache2 start
Убедимся, что Apache принимает соединения только на локальном 8080:
netstat -tupln | grep apache tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 12941/apache2
[править] phpMyAdmin
Перед добавлением сайтов, установим phpMyAdmin, чтобы удобно было администрировать базу данных. Вам понадобится пароль, который мы задавали при установке MySQL!
apt-get -y install phpmyadmin
От автоматического конфигурирования Apache/Lighttpd отказываемся. Соглашаемся с «Configure database for phpmyadmin with dbconfig-common». На первый запрос пароля вводим пароль для администрирования MySQL, на второй запрос ничего не вводим — пароль для БД phpmyadmin будет сгенерирован автоматически, он нам не нужен.
Создаём файл:
editor /etc/nginx/sites-available/phpmyadmin.example.com.conf
server { server_name phpmyadmin.example.com www.phpmyadmin.example.com; root /usr/share/phpmyadmin; auth_basic "Restricted"; auth_basic_user_file /home/example/www/htpasswd; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }
ln -s /etc/nginx/sites-available/phpmyadmin.example.com.conf /etc/nginx/sites-enabled/
Файл конфигурации для Apache /etc/apache2/sites-available/phpmyadmin.example.com сделан на основе файла /etc/apache2/conf.d/phpmyadmin.conf из комплекта поставки в Debian:
<VirtualHost 127.0.0.1:8080> DocumentRoot /usr/share/phpmyadmin ServerName phpmyadmin.example.com ServerAlias www.phpmyadmin.example.com <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_admin_flag allow_url_fopen Off php_value include_path . php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/ </IfModule> </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> </VirtualHost>
a2ensite phpmyadmin.example.com apachectl -t service apache2 reload
С помощью phpMyAdmin добавим SQL-пользователя и пустую базу данных для будущего сайта. Заходим в браузере по адресу: http://example.com/phpmyadmin/ Вводим доступы к базе данных:
- Пользователь: root
- Пароль: c8M2oWUJSrYrc2kiqQ
- Привилегии → Добавить нового пользователя
- Имя пользователя: example
- Хост: Локальный
- Пароль: придумываем новый хороший пароль, или генерируем, например, такой: cehckfv#vOFaSQdeQI
- Внизу обязательно ставим галочку «Создать базу данных с именем пользователя в названии и предоставить на нее полные привилегии».
- Нажимаем на ОК в самом низу.
[править] Добавляем сайт
Для примера, запустим сайт на WordPress. Добавляем в систему отдельного пользователя example, от которого будут запускаться процессы этого сайта:
adduser --disabled-password --gecos "example.com" example
Создаём директорию для будущего сайта:
chgrp www-data /home/example mkdir -p /home/example/www/example.com
Создаём конфигурацию нашего сайта в Nginx:
editor /etc/nginx/sites-available/example.com.conf
Конфигурация будет примерно такой (позаимствовано отсюда http://wiki.nginx.org/Wordpress + http://kbeezie.com/apache-with-nginx/ + дополнил для /wp-admin):
server { server_name example.com www.example.com; root /home/example/www/example.com; limit_req_zone $binary_remote_addr zone=dosexample:2m rate=3r/s; location / { limit_req zone=dosexample burst=10 nodelay; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location = /wp-admin { auth_basic "Restricted"; auth_basic_user_file /home/example/www/htpasswd; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; } }
Здесь limit_req не даёт обращаться к php-скриптам с одного ip-адреса чаще 3 раз в секунду, при этом не затрагивая выдачу статики. Таким образом, мы защищаем наш сайт от простейших DoS-атак.
Панель администрирования дополнительно защищена http-авторизацией, параметры которой берутся из файла /home/example/www/htpasswd. Заведём в нём пользователя:
htpasswd -c /home/example/www/htpasswd examplehttpuser
Два раза вводим придуманный пароль. Он будет запрашиваться перед входом в админку.
«Включаем» сайт:
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Проверяем, что в конфигурации Nginx нет ошибок:
nginx -t
перезагружаем Nginx:
service nginx reload
Дальше часть команд мы будем делать от нового пользователя example, чтобы по неосторожности не испортить что-нибудь в системе (у этого пользователя просто нет прав на такое). Становимся им:
su - example
Приглашение в терминале должно было смениться с «#» на «$» — это значит, что теперь мы не обладаем правами суперпользователя. Установим свежий WordPress (кто-нибудь знает ссылку на всегда свежий WordPress?):
mkdir -p /home/example/www/example.com cd /home/example/www/example.com wget "http://ru.wordpress.org/wordpress-3.7.1-ru_RU.tar.gz" tar -xzpf "wordpress-3.7.1-ru_RU.tar.gz"
В результате у нас получится директория ~/www/example.com/wordpress, а нам надо ~/www/example.com. Переместим файлы:
mv ~/www/example.com/wordpress/* ~/www/example.com/
Выходим из-под пользователя example:
exit
Создаём место для журналов:
mkdir -p /var/log/apache2/example.com
Создаём конфигурацию Apache.
editor /etc/apache2/sites-available/example.com
с подобным содержимым:
<VirtualHost 127.0.0.1:8080> DocumentRoot "/home/example/www/example.com" ServerName example.com ServerAlias www.example.com CustomLog /var/log/apache2/example.com/access.log common ErrorLog /var/log/apache2/example.com/error.log <IfModule mpm_itk_module> AssignUserId example example </IfModule> </VirtualHost>
«Включаем» сайт:
a2ensite example.com
Проверяем, что в конфигурации Apache нет ошибок:
apachectl -t
Перезагружаем Apache:
service apache2 reload
Заходим в своём браузере на свой сайт: http://example.com/
Выбираем в полученном окне:
- Создать файл настроек
- Имя базы данных: example
- Имя пользователя: example
- Пароль: cehckfv#vOFaSQdeQI
- Сервер базы данных: localhost
- Префикс таблиц: wp_
Всё, сайт готов. Что делать дальше с WordPress, можно почитать здесь: http://codex.wordpress.org/%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B5_%D1%88%D0%B0%D0%B3%D0%B8_%D1%81_WordPress
[править] Добавляем второй сайт
Добавляем системного пользователя, SQL базу данных и пользователя, настраиваем Nginx, Apache.
[править] Резервное копирование
Информацию с сервера необходимо периодически копировать куда-либо, чтобы в случае потери сервера (отказ оборудования, ошибка в работе администратора) было из чего восстанавливать его настройки и сохранённые на сервере данные. Если есть отдельный сервер, на нём можно запустить BackupPC. (rdiff-backup? rsnapshot?)
К базовым бэкапам (файлы, БД) хорошо бы добавить резервное копирование информации о разделах и загрузочную область (может, использовать для этого vbackup?). Сделать это можно так:
sfdisk -d
[править] Резервное копирование MySQL
Просто устанавливаем AutoMySQLBackup:
apt-get -y install automysqlbackup
Можно ничего не настраивать, если вы хотите хранить дампы базы MySQL на том же сервере (что небезопасно) в каталоге /var/lib/automysqlbackup/.
Структура папок, создаваемая AutoMySQLBackup:
ls -l /var/lib/automysqlbackup drwxr-xr-x 4 root root 40 00:20 daily drwxr-xr-x 2 root root 40 00:20 monthly drwxr-xr-x 4 root root 40 00:20 weekly
Таким образом, ротация резервных копий происходит в рамках каталогов с ежедневными, еженедельными и ежемесячными архивами. Для более точной настройки см. файл конфигурации /etc/automysqlbackup/myserver.conf
[править] Резервное копирование PostgreSQL
Есть скрипт autopostgresqlbackup, установим его:
apt-get -y install autopostgresqlbackup
Он будет автоматически каждый день делать резервную копию всех баз данных PostgreSQL в /var/lib/autopostgresqlbackup.
[править] BackupPC
Если есть другой сервер, на котором есть много свободного места, можно установить на него BackupPC и настроить.
[править] Обновления
Установите пакет apticron, чтобы получать на почту информацию о необходимых обновлениях. Чтобы автоматически устанавливать обновления, связанные с безопасностью, установите unattended-upgrades:
apt-get -y install unattended-upgrades
Выберем режим обновления:
dpkg-reconfigure unattended-upgrades
Ручное обновление:
apt-get update apt-get dist-upgrade
В пределах выбранного вам релиза (например, Debian 7 или Ubuntu 12.04) при обновлении ничего не должно ломаться, можете смело обновляться. А вот при переходе между релизами могут возникать проблемы.
[править] Защита
От подбора паролей по SSH можно защититься, просто установив fail2ban. Его же можно настроить и на отражение некоторых других атак.
apt-get -y install fail2ban
[править] Межсетевой экран
Чтобы правила межсетевого экрана автоматически загружались при загрузке системы, установим специальный пакет:
apt-get -y install iptables-persistent
Прописываем правила, не забывая менять 22222 на ваш SSH-порт:
editor /etc/iptables/rules.v4
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :fail2ban-ssh - [0:0] # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Allow PING -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # Allow HTTP -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # Fail2ban -A INPUT -p tcp -m multiport --dports 22222 -j fail2ban-ssh -A fail2ban-ssh -j RETURN # Allow SSH -A INPUT -p tcp -m tcp --dport 22222 -j ACCEPT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Reject all other -A INPUT -j REJECT --reject-with icmp-port-unreachable COMMIT
editor /etc/iptables/rules.v6
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # HTTP -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # SSH -A INPUT -p tcp -m tcp --dport 22222 -j ACCEPT # http://www.sixxs.net/wiki/IPv6_Firewalling # Allow multicast -A INPUT -d ff00::/8 -j ACCEPT -A OUTPUT -d ff00::/8 -j ACCEPT # Allow ICMP -A INPUT -p icmpv6 -j ACCEPT -A OUTPUT -p icmpv6 -j ACCEPT -A INPUT -j REJECT --reject-with icmp6-adm-prohibited COMMIT
В первый раз применяем правила командой iptables-apply — она после применения спросит, стоит ли их оставить. Если вы сможете ответить «y» — значит, удалённый доступ у вас остался. Если же ответа некоторое время не будет, правила будут откачены.
#iptables-apply /etc/iptables/rules.v4 #ip6tables-apply /etc/iptables/rules.v6
[править] Защита от ошибочного выключения
Когда много сидишь в консоли, есть риск вместо своего компьютера выключить удалённый сервер. Чтобы избежать этого, просто установим на сервер molly-guard. С ним, при попытке выключить/перезагрузить сервер по SSH, будет выдан запрос имени сервера.
[править] Ведение истории изменений конфигурации
Просто устанавливаем etckeeper, в файле /etc/etckeeper/etckeeper.conf комментируем все «VCS=», кроме «VCS="git"», потом:
cd /etc etckeeper init etckeeper commit "Initial commit"
Теперь когда что-нибудь меняем в директории /etc, то вносим изменения в систему контроля версий:
cd /etc etckeeper commit "Changing: blabla"
[править] Ротация журналов
[править] Наблюдение
[править] logwatch
Чтобы получать на почту ежедневные отчёты о работе системы, установите пакет logwatch. Он объединяет информацию полученную от других служб — к примеру, если в системе установлена и запущена служба smartd (см. ниже), то в ежедневном отчёте будет информация об изменении состояния жёстких дисков (например, температуры).
[править] logcheck
[править] atop/sysstat
Также можно установить пакеты atop и sysstat, чтобы можно было посмотреть, к примеру, какой процесс вызвал нагрузку 2 часа назад, или сколько вчера было свободной памяти на сервере. В файле /etc/default/atop можно увеличить частоту записи информации о текущих процессах, например, до 1 раза в минуту: INTERVAL=60
Смотрим историю так (перемотка вперёд-назад клавишами t и T, выход по q): atop -r /var/log/atop/atop_20131118
[править] smokeping
Если у вас есть постоянно включенный другой компьютер, можно установить на него SmokePing. Он строит симпатичные графики, показывающие основные параметры сетевых соединений. Удобен для быстрого определения проблем с сетью. Желательно добавить в наблюдение цепочку узлов, идущих в Интернет, чтобы было видно, на каком из них возникают проблемы: ближайший маршрутизатор (выясняем с помощью traceroute), сайт провайдера, какой-нибудь сервер из точки обмена трафиком (ntp.ix.ru), rr0.mtu.ru и 4.2.2.2.
[править] Monit
Для мониторинга одного сервера, возможно, будет достаточно Monit — он может перезапустить зависший процесс, отправить письмо при высокой нагрузке и т.п.
Настройка Monit: TODO.
[править] nagios/zabbix
Для более серъёзного наблюдения за параметрами системы и для оперативного уведомления о проблемах, необходимо разбираться с такими системами, как например Nagios или Zabbix, здесь они рассмотрены не будут.
[править] Оборудование
[править] Жёсткие диски
Для получения уведомлений о состоянии жёстких дисков, просто установите smartmontools и разрешите запуск его службы в файле /etc/default/smartmontools, убрав символ комментария «#» из строки:
start_smartd=yes
Запускаем службу:
service smartd start
В ежедневных отчётах не стоит обращать внимание на небольшие колебания «Raw_Read_Error_Rate».
[править] Система охлаждения
Чтобы посмотреть температуру системных компонентов и скорости вращения вентиляторов, установите lm-sensors:
apt-get install lm-sensors
После чего запускаем процесс поиска (иногда и без него всё работает — попробуйте перейти сразу к следующему пункту):
sensors-detect
Пример вывода:
sensors atk0110-acpi-0 Adapter: ACPI interface Vcore Voltage: +1.10 V (min = +0.85 V, max = +1.60 V) +3.3 Voltage: +3.26 V (min = +2.97 V, max = +3.63 V) +5 Voltage: +4.92 V (min = +4.50 V, max = +5.50 V) +12 Voltage: +12.10 V (min = +10.20 V, max = +13.80 V) CPU FAN Speed: 1486 RPM (min = 600 RPM) CHASSIS FAN Speed: 1115 RPM (min = 600 RPM) POWER FAN Speed: 0 RPM (min = 600 RPM) CPU Temperature: +39.0°C (high = +60.0°C, crit = +95.0°C) MB Temperature: +42.0°C (high = +45.0°C, crit = +95.0°C) k10temp-pci-00c3 Adapter: PCI adapter temp1: +29.0°C (high = +70.0°C) (crit = +83.5°C, hyst = +81.5°C)
[править] Что дальше?
Теперь, когда сервер настроен, остаётся:
- Читать почту — отчёты от LogWatch, apticron и, в худшем случае, от smartd;
- своевременно обновлять пакеты сервере;
- при изменениях настроек, вносить их в etckeeper;
[править] Ссылки
Использованы материалы статей, также распространяющихся по лицензии CC-BY-SA:
[править] См. также
[править] Лицензия на текст
Текст доступен на условиях лицензии Creative Commons Attribution/Share-Alike версии 3.0 или более новой.