- Как защитить виртуальный сервер VDS Linux
- Смена пароля пользователя root
- Создание обычного пользователя
- Установка удобного редактора
- Права администратора
- Запрет входа как root по SSH
- Вход на сервер по ключу
- Установка нестандартного порта SSH
- Настройка брандмауэра
- Настройка резервного копирования
- Установка админки
- Заключение
После покупки виртуального сервера, первым делом необходимо его настроить и позаботится о защите VDS. В статье покажу, как правильно настроить и защитить виртуальный сервер на Linux. Погнали!
Еще по теме: Форензик кейс взлома серверов под управлением Linux
Как защитить виртуальный сервер VDS Linux
Мы будем рассматривать настройку VDS на примере дистрибутива Ubuntu, но инструкция, также актуальна для других дистрибутивов.
Сначала прочитайте инструкцию, вникните, поймите, что вам нужно, а что нет, и только после этого используйте рекомендации! Если просто скопируете и примените некоторые команды в консоли под рутом, то можете потерять доступ к серверу. Поддержка вам, разумеется, поможет и восстановит доступ, но восстановить потраченное время, вам никто не сможет.
Смена пароля пользователя root
Обычно, после покупки виртуального сервера вам должны сообщить его IP-адрес и пароль пользователя. Пароль можно найти в панели управления сервером. Обычно пароль создается генератором паролей и хранится в базе данных. Такие пароли не всегда отвечают требования. Это говорим о том, что его лучше сразу изменить.
Зайдите по SSH с правами root и введите следующую команду:
1 |
passwd |
При изменении пароля символы не будут отображаться — это нормально. Введите новый пароль и нажми Enter. На данном этапе мы уже себя немного обезопасили. Теперь можно приступить к последующей настройке.
Из соображений безопасности, стоит изменять пароль минимум раз в пол года (чем чаще, тем лучше).
Есть разные стратегии обеспечения безопасности учетной записи root:
Вы создаете учетную запись пользователя с известным только вам именем, предоставляете ей возможность использовать команду sudo (чтобы вы могли редактировать файлы конфигурации и устанавливать ПО), а затем отключаете вход для пользователя root по SSH. На выходе мы получим парольную аутентификацию, но будет использована учетная запись, имя которой известно только вам. Преимущества такие: никто не взломает учетную запись root, поскольку она всегда будет выключена. Недостаток один — парольная аутентификация не настолько надежна, как аутентификация по публичному ключу.
Вторая стратегия заключается в использовании публичного ключа. Недостаток заключается в более сложной настройке, именно для конечных пользователей: им придется генерировать пару ключей, и для пользователя, который никогда этого не делал, будет сложно. Большое преимущество аутентификации по публичному ключу заключается в том, что никто не сможет сбрутить пароль и получить доступ к вашему виртуальному серверу.
Если собираетесь использовать аутентификацию по ключу, тогда можете пропустить главы 2 и 4 — не необходимости создавать дополнительную учетную запись и вносить ее в sudoers. А вот главу 3 стоит прочитать, так как хороший редактор вам очень пригодится.
Создание обычного пользователя
После покупки виртуального сервера VDS клиенту сообщают пароль root, после чего, пользователь вставляет его в профиль своего SSH-клиента. Но так поступать нельзя. Во‑первых, учетка root — это всем известное имя пользователя, и, когда хакер начнет пытаться взломать ваш сервер методом перебора, он начнет именно с учетной записи root. Учетные записи созданные вами он не знает, а root знают все. Поэтому нам нужно создать обычного пользователя, под которым вы будете работать всегда.
Создайте свою учетную запись (обязательно измените имя на свое):
1 2 |
adduser user passwd user |
- Команда adduser добавит нового пользователя с именем user.
- Команда passwd изменит пароль новой учетной записи.
Только не стоит создавать пользователя admin, пожалуйста!
Чтобы данный пользователь мог работать с правами root, надо будет добавить его в sudoers. Для этого нужен редактор, не просто редактор, а удобный редактор!
Установка удобного редактора
Используемый подавляющим большинством провайдеров редактор по умолчанию Vi очень неудобный и требует дополнительных знаний, что может напугать начинающего пользователя.
Перед установкой ПО всегда начинайте с обновления списков пакетов. Сделать это можно с помощью команды apt update. Обновлять список пакетов надо как минимум один раз — перед первой установкой. Потом выполняют обновление по мере необходимости.
1 |
# apt update |
Итак, установите любой удобный текстовый редактор, который вам нравится. Мне нравится редактор nano:
1 |
# apt install nano |
Запустить отдельно можете с помощью команды nano. Находим местоположение редактора:
1 |
which nano |
Как правило он находится здесь /bin/nano. Теперь, настроим его редактором по умолчанию. В последних версиях Ubuntu это делается таким образом:
1 |
update-alternatives --config editor |
Теперь выберите nano из списка. Если этот способ не работает (нет команды update-alternatives), пропишите переменную окружения EDITOR:
1 |
export EDITOR=/bin/nano |
Для автоматического запуска при каждом входе, отредактируйте файл .bashrc, который лежит в домашнем каталоге пользователя. Добавьте в него команду
1 |
export EDITOR=/bin/nano |
Эту операцию надо проделать для каждого пользователя. Для учетной записи root домашний каталог — /root. Для учетной записи spysoftnet — /home/spysoftnet.
После этих манипуляций, все команды будут вызывать редактор nano. Одна из них — visudo.
Права администратора
Ранее мы создали обычного пользователя user. Теперь нужно превратить его в администратора, то есть предоставить возможность использовать sudo. Введите в терминале команду
1 |
visudo |
Эта команда запустит текстовый редактор для изменения файла конфигурации sudoers. Найдите и раскомментируйте строчку:
1 |
wheel ALL=(ALL) ALL |
Указанная строчка разрешает всем пользователям группы wheel использовать команду sudo. Если она уже раскомментирована, ничего делать не нужно. Нажмите F10 для выхода из редактора.
После этого добавьте нашего пользователя user в группу wheel:
1 |
usermod -aG wheel user |
Далее отключитесь от SSH-сервера и попытайтесь войти как пользователь user с заданным ранее паролем. Обратите внимание, что, когда вы работали как пользователь root, приглашение командной строки имело вид #, теперь оно выглядит как $. Залогинившись, введите команду:
1 |
sudo bash |
Если приглашение командной строки поменялось на #, теперь у вас есть права root. Такой трюк позволяет вводить команды от имени root без использования команды sudo, что, несомненно, удобнее.
Запрет входа как root по SSH
Дело осталось за малым — запретить пользователю root входить в систему по SSH. Для этого, работая уже под новым пользователем user, введите команду:
1 |
sudo mcedit /etc/ssh/sshd_config |
Добавьте в конфигурационный файл сервера SSH такую строку (или раскомментируйте ее):
1 |
PermitRootLogin no |
Сохраните файл конфигурации, перезагрузите SSH (systemctl restart ssh) и попробуйте подключиться как пользователь root — у вас не получится.
Перезагружать SSH нужно только в том случае, если вы убедились, что можете войти как пользователь user (от имени этого пользователя можно ввести команду sudo)! Иначе есть риск потерять доступ к серверу, и тогда придется обращаться в поддержку.
Как вариант, можно не отключать вход под учетной записью root, а настроить вход по ключу (см. далее) и лишь после того, как убедитесь, что можете войти как root по ключу, в конфиг SSH добавить строчку:
1 |
PermitRootLogin without-password |
Конечно, после этого нужно опять перезагружать SSH.
Вход на сервер по ключу
Существует практика аутентификации по ключу (public key authentication), а не по паролю. Преимущества и недостатки этого метода рассматривать не будем, здесь одни преимущества — пароль никто не подберет, так как его попросту нет. Это самый надежный способ аутентификации.
Принцип аутентификации по ключу следующий: создается пара ключей (открытый и закрытый). Закрытый ключ хранится на стороне клиента, и в идеале он не доступен ни для кого. Открытый загружается на сервер, к которому нужно получить доступ.
В идеальном мире ключи должны генерировать сами пользователи. Сгенерировать их можно с помощью команды ssh-keygen, а также используя функциональность SSH-клиента (например, возможность создания ключевой пары есть в Bitvise SSH Client и во многих других клиентах). Если у вас Linux, никакой дополнительный софт устанавливать не нужно. Введите команду:
1 |
$ mkdir ~/.ssh; ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa |
Здесь мы генерируем RSA-ключи длиной 2048 бит. После того как ключи будут сгенерированы, публичный ключ станет доступен по имени:
1 |
~/.ssh/id_rsa.pub |
Далее нужно передать открытый ключ на сервер. Самый простой и правильный способ сделать это — использовать команду ssh-copy-id:
1 |
ssh-copy-id username@remote_host |
При выполнении этой команды вы можете увидеть это:
Ваш локальный компьютер просто не распознает удаленный сервер — это нормально при первом подключении. Введите yes (именно yes, а не y) и нажмите Enter. Команда ssh-copy-id найдет созданный ключ и отправит его на сервер. Содержимое ключа ~/.ssh/id_rsa.pub будет скопировано в файл ~/.ssh/authorized_keys удаленной учетной записи. Данный способ сработает, если пока еще действует аутентификация по паролю.
На этапе первоначальной настройки это обычное дело — сначала все пользователи генерируют ключевые пары и загружают на сервер свои открытые ключи, а затем закрывается вход по паролю. Но если вход по паролю уже отключен, а вам надо загрузить ключ для нового пользователя, то потребуется найти способ доставить ключ (файл id_rsa.pub) на сервер. Далее нужно перейти в каталог ~/.ssh учетной записи, для которой настраивается ключ, и поместить содержимое id_rsa.pub в конец файла authorized_keys:
1 |
cat id_rsa.pub >> authorized_keys |
Но не будем строить лишние предположения и усложнять себе жизнь. Считаем, что доступ по паролю пока открыт и достаточно использовать команду ssh-copy-id для загрузки ключей на сервер. Когда открытые ключи всех пользователей загружены, можно отключить вход по паролю. Для этого откройте в любом текстовом редакторе файл /etc/ssh/sshd_config и установите в значение No директиву PasswordAuthentication:
1 |
PasswordAuthentication no |
Также нужно убедиться, что три следующие директивы установлены таким образом:
1 2 3 |
PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys PermitRootLogin without-password |
Первая включает аутентификацию по публичному ключу, а вторая указывает имя файла, в котором должны храниться ключи. Третья разрешает вход как root без использования пароля (по ключу).
Осталось перезагрузить SSH:
1 |
systemctl restart ssh |
На стороне клиента войти по ключу на SSH-сервер можно так:
1 |
ssh -i ~/.ssh/id_rsa.pub user@example.com |
Здесь мы указываем имя файла ключа, имя пользователя и имя сервера. В Windows нужно настраивать используемый вами SSH-клиент, например в Bitvise SSH Client необходимо нажать кнопку‑ссылку Client key manager на вкладке Login и в появившемся окне нажать кнопку Generate New. В окне Generate New Keypair можно просто воспользоваться кнопкой Generate. А можно дополнительно защитить ключевую пару паролем — для этого ввести пароль, подтвердить его и нажать кнопку Generate. Рекомендуется использовать парольную фразу — если во время вашего отсутствия кто‑то запустит SSH-клиент и попробует подключиться к серверу, используя ваш открытый ключ, у него ничего не получится, так как он не знает пароль.
Пароль нужен для доступа к ключевой паре только на локальном компьютере, он не передается в каком бы то ни было виде на сервер. После того как ключевая пара сгенерирована, нужно нажать кнопку Export для экспорта публичного ключа. Формат — OpenSSH. После того как вы сохраните открытый ключ в каком‑нибудь файле, загрузите этот ключ на сервер и добавьте его содержимое в файл:
1 |
~/.ssh/authorized_keys |
Способов много, например можно использовать учетку, в которой уже настроена аутентификация для загрузки этого файла. Можно загрузить ключ на какой‑то сайт и на сервере скачать его с помощью команды:
1 |
wget http://адрес/имя_файла |
В общем, проявите фантазию, и у вас все получится. После того как сервер «узнает» ваш ключ, в основном окне клиента выберите Initial method — publickey, а из списка Client Key — профиль, в котором вы сохранили ключ.
Установка нестандартного порта SSH
По умолчанию SSH использует порт 22. Но вы можете перенастроить его на другой порт из соображений безопасности — тогда для подключения по SSH нужно знать еще и номер порта. Откройте /etc/ssh/sshd_config и найди директиву Port. Вместо 22 укажите другой порт:
1 |
Port 2206 |
После этого перезапустите SSH и перелогиньтесь. При входе в настройках клиента укажите новый номер порта.
Настройка брандмауэра
Разобравшись с безопасностью пользователей, нужно настроить брандмауэр. Традиционно в качестве брандмауэра (фильтра пакетов) в Ubuntu используется iptables, но поскольку Ubuntu позиционируется как простой дистрибутив, то и оболочка для iptables была разработана соответствующая — UFW (Uncomplicated Firewall). Это несложный файрвол. Первым делом убедитесь, что пакет ufw вообще установлен, и установите его, если это не так:
1 |
sudo apt install ufw |
Базовая настройка брандмауэра
Теперь посмотрим состояние брандмауэра:
1 |
sudo ufw status verbose |
По умолчанию фильтр пакетов выключен, поэтому команда выведет сообщение Status: inactive. Не нужно спешить включать файрвол: сначала его требуется настроить. Ведь если порт 22 окажется по умолчанию недоступен, то вы потеряете доступ к своему VDS. Конечно, саппорт поможет, но это напрасная трата времени.
С базовыми настройками брандмауэр запрещает все входящие соединения и разрешает все исходящие. Такая политика идеальна с точки зрения безопасности — ведь если кто‑то (и вы в том числе) захочет к нему подключиться, у него это не получится. В то же время приложения на сервере смогут создавать исходящие соединения.
Рассмотрим две команды:
1 2 |
ufw default deny incoming ufw default allow outgoing |
Эти два правила как раз и задают политику по умолчанию: запрещаются все входящие соединения и разрешаются все исходящие.
Итак, все входящие соединения запрещены. Чтобы до сервера можно было достучаться по определенному порту, его нужно сначала открыть. UFW хорош тем, что админу даже не требуется помнить номер порта — необходимо знать только название сервиса. Например, вот как можно разрешить подключение по SSH:
1 |
ufw allow ssh |
При этом UFW сам создаст правило для порта 22 — именно этот порт используется для SSH. Брандмауэр знает порты и имена всех распространенных служб (HTTP, SSH, FTP, SFTP и так далее).
Однако если вы перенастроили SSH на нестандартный порт, нужно явно указать номер порта:
1 |
ufw allow 2206 |
После разрешения SSH (это главное, чтобы сейчас файрвол нам не разорвал соединение) можно включить ufw следующей командой:
1 |
ufw enable |
Необходимо подтвердить запуск:
Разберемся, что произошло. Сначала мы разрешили SSH и получили ответ Rules updated, то есть правила обновлены. Затем мы включаем файрвол и получаем сообщение, что он активен и будет запускаться при загрузке системы. На этом базовая настройка выполнена — SSH успешно работает, и мы можем приступить к дальнейшей настройке фильтра пакетов.
Создание правил для сервисов
Теперь нужно разрешить работу других приложений. Как правило, требуется разрешить службу HTTP (веб‑сервер), FTP (если этот сервис вам нужен) и постараться не забыть о HTTPS (что очень важно в последнее время):
1 2 3 |
ufw allow http ufw allow https ufw allow ftp |
Сделать то же самое можно было бы и по номерам портов:
1 2 3 |
ufw allow 80 ufw allow 443 ufw allow 21 |
При желании можно разрешить целый диапазон портов, указав при этом транспортный протокол (UDP или TCP):
1 2 |
sudo ufw allow 2000:2200/tcp sudo ufw allow 4000:4400/udp |
Разрешение IP-адресов
Ufw позволяет разрешить определенному IP-адресу доступ ко всем портам сервера, например:
1 |
ufw allow from 111.222.33.44 |
Если нужно разрешить доступ конкретному IP-адресу только к определенному порту, то делается это так:
1 |
ufw allow from 111.222.33.44 to any port 22 |
Здесь мы разрешаем не все подключения к SSH, а только подключения с IP-адреса 111.222.33.44.
Делать это нужно только в том случае, если у вас постоянный IP — такой IP можно получить за дополнительную плату у вашео провайдера. Обычно у пользователей динамические IP-адреса — если вы прямо сейчас посмотрите свой внешний IP, укажете его в команде выше, то, как только ваш IP поменяется, вы лишитесь доступа к серверу. Так что будьте осторожны!
Разрешить доступ целого диапазона IP-адресов (например, когда у админа динамический IP) можно таким образом:
1 |
ufw allow from 123.45.67.89/24 to any port 22 |
Запрещение IP-адреса и службы
Чтобы запретить доступ с определенного IP-адреса, воспользуйтесь вот такой командой:
1 |
ufw deny from 123.45.67.89 |
При желании можно запретить все подключения к определенной службе:
1 |
ufw deny ftp |
Удаление и сброс правил
Сбросит все правила следующая команда:
1 |
ufw reset |
Но до того, как вводить эту команду, убедитесь, что отключили файрвол (команда ufw disable), иначе потеряете доступ по SSH.
Удалить конкретное правило можно по номеру. Сначала введите следующую команду, чтобы узнать номер правила:
1 |
ufw status numbered |
Далее введите команду такого вида:
1 |
ufw delete <номер правила> |
Настройка резервного копирования
Как правило, в админке управления серверами и другими услугами провайдера есть возможность настроить резервное копирование для каждого сервера. В зависимости от условий тарифного плана бэкап может быть бесплатным (то есть вы можете использовать какой‑то объем пространства под бэкапы), а может быть платным. Как показывает практика, часто провайдеры требуют плату за хранение бэкапов, поэтому сама возможность резервного копирования хоть и имеется, но выключена, чтобы у клиента не было дополнительных трат.
У вас, как у админа VDS, есть два варианта. Первый — использовать средства резервного копирования провайдера, второй — настроить резервное копирование на своем сервере. Бэкап на стороне провайдера надежнее, так как резервная копия хранится за пределами сервера. Второй вариант менее надежен, поскольку если что‑то случится с файловой системой сервера, то вы потеряете все свои данные.
Как быть? Лучше всего использовать комбинированную систему — настроить бэкапы на стороне провайдера со средней периодичностью, скажем раз в неделю. При такой периодичности счет за бэкапы не будет космическим. Зато, если что‑то случится с файловой системой, сможете восстановить данные, пусть и не самые актуальные, но это лучше, чем начинать все с нуля.
А теперь поговорим о бэкапе вручную на стороне сервера. Есть целые решения для резервного копирования. Нужны они или нет — решать вам. Я же предлагаю пойти по самому простому пути. Первым делом надо определиться, какие данные стоит резервировать.
Если у вас на сервере сайт (например, интернет‑магазин), то копировать нужно только файлы корневого каталога веб‑сервера ( DocumentRoot, обычно это /var/www/html, но зависит от настроек сервера) и базу данных.
Файлы веб‑сервера можно копировать раз в неделю — они меняются относительно нечасто. Если вы делаете бэкап средствами провайдера, скажем каждую пятницу, то бэкап файлов сервера можно делать в середине недели — в среду. Тогда у вас будет на всякий случай две резервные копии за неделю. Можно и чаще — главное, чтобы хватило места на диске. Если у вас 1 Тбайт, а сайт весит 250 Гбайт, то очень часто бэкапы создавать не придется.
Создать архив с резервной копией файлов сайта можно командой:
1 |
zip -r /backups/latest.zip /var/ww/html |
Эту команду нужно добавить в расписание crontab. Введите команду crontab –e и добавьте строчку:
1 |
0 2 * * 3 /usr/bin/zip –r /backups/latest.zip /var/ww/html |
Делать бэкап лучше всего ночью, чтобы снизить нагрузку на сервер. Здесь копия будет создаваться по средам в два часа ночи. Распаковать архив можно с помощью команды unzip.
Теперь о базе. Изменения в базу данных вносятся постоянно: менеджеры добавляют информацию о продуктах, какой‑то скрипт импорта изменяет цены и остатки товаров, а посетители делают заказы. Поэтому копия базы должна создаваться раз в день. Для копии используем mysql-dump:
1 |
mysqldump -u cp_user -p --opt cp_main_v2 --max_allowed_packet=100M > db-latest.sql |
Здесь cp_user — имя пользователя БД, cp_main_v2 — имя базы данных, опция max_allowed_packet задает максимальный размер пакета — на случай, если БД занимает несколько гигов, эта опция вас спасет. Бэкап делается в файл db-latest.sql. Восстановиться можно так:
1 |
mysql --host=127.0.0.1 --port=3310 --max_allowed_packet=100M -u cp_user -p cp_main_v2 < /db-latest.sql |
Назначение параметров должно быть понятно. Параметры host и port можно не указывать, если MySQL работает на localhost и использует стандартный порт. Команду создания дампа нужно запускать каждый день, поэтому в crontab добавляем строку
1 |
0 1 * * * /usr/bin/mysqldump -u cp_user -p --opt cp_main_v2 --max_allowed_packet=100M > /root/db-latest.sql |
Бэкап будет сниматься каждый день в час ночи (а в два мы запускаем создание бэкапа файлов).
Кроме бэкапов не забывайте о снапшотах! Перед каждым значимым изменением на сервере (вроде установки расширения, пересборки CMS, обновления ПО, например установки новой версии PHP) делайте снапшот. Да, всегда можно восстановиться из бэкапа, но бэкап у нас не самый свежий, да и времени такое восстановление занимает больше, чем восстановление из снапшота. Снапшоты тоже платные, но их цена ничтожна на фоне простоя production-сервера.
Установка админки
Лично мне проще и привычнее управлять сервером через SSH. Но если нужен графический интерфейс для выполнения ежедневных рутинных задач, можете установить панель управления. Выбор конкретной панели зависит от двух факторов: необходимой функциональности и стоимости панели управления. Если нужны бесплатные решения, смотрите в сторону Webmin и VestaCP. Остальные варианты менее популярны.
Заключение
Собственно, на этом все — базовая настройка и защита виртуального сервера VDS завершена. Теперь можно приступить к установке и настройке необходимого ПО (Nginx, MySQL, PHP и все такое).
ПОЛЕЗНЫЕ ССЫЛКИ:
- Как зашифровать трафик на Linux
- Инструменты для защиты сервера VPS
- Обзор инструментов аудита безопасности Linux