Настройка сервера на Debian Ubuntu

Материал из Xgu.ru

Перейти к: навигация, поиск

Debian-icon.png

Статья описывает настройку семейства самых популярных и важных дистрибутивов GNU/Linux

Содержание

[править] Введение

Эта статья описывает установку «с нуля» сервера на linux, предназначенного, к примеру, для размещения сайтов.

Статья может пригодиться в качестве:

  • Шпаргалки/контрольного списка (чтобы не забыть что-либо);
  • Инструкции для начинающих;
  • Источника чужого опыта продвинутому администратору. Рассмотрим полезные штатные утилиты, о которых возможно вы не знали.
Все команды в этой статье выполняются от суперпользователя root, если не написано иное. Чтобы стать суперпользователем, необходимо набрать
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

Эти темы не раскрыты: Отличие от logwatch

[править] 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 Cc-by-sa.png версии 3.0 или более новой.