Перед поднятием непосредственно различных сервисов, было бы неплохо произвести хоть какую то первичную настройку на сервере: обновить пакеты/поставить нужные пакеты, отключить ненужные сервисы, создать пользователя, настроить sshd_config (поменять порт, запретить коннет от root) и ещё много всего.
Но обо всём по порядку...
Поскольку я показываю на примере дистрибутива Debian, вводимые команды будут только для этого дистибутива и для дистрибутивов основанных на Debian (Ubuntu)!
Итак, приступим.
Обновляем пакеты:
apt-get update && apt-get upgrade
Выскочит уведомление, в котором нужно утвердительно ответить Yes
Если не хотите постоянно нажимать y при обновлении, то вводите эту команду:
apt-get update && apt-get upgrade -y
После завершения обновляния установим, так сказать, пакеты первой необходимости.
Пришло время погрузиться в обычные будни системного администратора Linux:
apt-get install net-tools cron wget curl nano mc htop python
python-pip git ufw sudo git tcptrack vnstat screen
Обычно многие из данных пакетов установлены в системе изначально, но не всегда. Далее выпадет возможность поработать с каждым из них и каждый будет рассмотрен.Еще можно поставить следующие пакеты, но не обязательно (они предназначены для сборки
пакетов из open source code, а по простому - из открытого исходного кода):
apt-get install build-essential make automake autoconf pkg-config
Настроим языковые локали в системе:
dpkg-reconfigure locales
выбираем только:
en_US.UTF-8 UTF-8
Для этого вводим номер 146 и для выбора осуществляем нажатие на клавишу Enter. Затем вводим номер 3 и снова нажимаем на клавишу Enter. Это применит изменения.
Произведём конфигурация часовых поясов:
dpkg-reconfigure tzdata
Выбираем исключительно (это номера 13 и 33 соответственно):
None of the above->UTC
ОБЯЗАТЕЛЬНО поменяем пароль от суперпользователя root:
passwd root
Система предложит дважды ввести пароль. При его вводе символы на экране не будут отображаться. Так должно быть и это нормальная практика в Linux. Помогает защитить пароль от посторонних.
Далее, нам нужно ОБЯЗАТЕЛЬНО создать пользователя следующей командой:
useradd -m -s /bin/bash Hanzo
где:
useradd - команда, создающая пользователя
-m - создаёт домашнюю папку пользователя в /home/<имя пользователя>/ и по-умолчанию
имеет такое же название, как и имя пользователя
-s - указывает, какой shell, то есть оболочку командной строки, использовать
Hanzo - имя пользователя (это для примера и вы естественно выбираете своё)
После создания пользователя, вам ОБЯЗАТЕЛЬНО нужно создать ему пароль. Потому что
мы будем использовать именно этого юзера для соединения по ssh:
passwd LOL
Система, так же как и для суперпользователя root, предложит дважды ввести пароль. При этом символы на экране так же не будут отображаться.
Далее, нужно посмотреть какие сервисы запущены и отключить их (потому что, как правило, они светят наружу ненужными портами, как новогодняя ёлка и создают брешь в защите):
netstat -tulpn
На данном этапе в идеале должен быть запущен только сервис sshd. Поскольку у меня установлена Debian-minimal, то так и есть.
Команда netstat -tulpn выдаёт только:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
204/sshd
tcp6 0 0 :::22 :::* LISTEN
204/SSH
Но обычно может быть запущен какой-нибудь веб-сервер, mail-server, еще что либо... Не знаю, что запущено у вас, поэтому поочерёдно вводите следующие команды:
/etc/init.d/apache2 stop
update-rc.d apache2 disable
/etc/init.d/postfix stop
update-rc.d postfix disable
/etc/init.d/nginx stop
update-rc.d nginx disable
/etc/init.d/exim4 stop
update-rc.d exim4 disable
/etc/init.d/rpcbind stop
update-rc.d rpcbind disable
/etc/init.d/nfs-common stop
update-rc.d nfs-common disable
/etc/init.d/rsyslog stop
update-rc.d rsyslog disable
Это должно отключить то, что обычно запущено уже при создании сервера.
Убедитесь что
никаких левых сервисов не запущено. Такие, как например ntpd, avahi-daemon, dhcpcd,
exim4-base, exim4-config, mutt, procmail.
Совершенно не нужны они на сервере, поэтому всё
лишнее удаляем через:
apt-get purge имя_пакета
либо через:
apt-get autoremove имя_пакета
Теперь нужно настроить sshd. Из соображений безопасности поменяем порт со стандартного
на нестандартный и запретим подключение от суперпользователя root.
Редактируем файл /etc/ssh/sshd_config при помощи текстового редактора nano:
nano /etc/ssh/sshd_config
Вкратце расскажу основные горячие клавиши при работе с консольным редактором nano:
nano <путь до файла> - открываем файл в nano
Ctrl+O - сохранить и записать изменения в файл. Нажимаем Ctrl+O, потом Enter
Ctrl+X - выйти из nano
Ctrl+K - вырезать целую строку. Она будет скопирована в буфер обмена
Ctrl+U - вставить вырезанную строку, которая находится в буфере обмена
Ctrl+W - поиск по файлу. Поиск в редакторе, вводим что нужно -> нажимаем Enter
Если хотим скопировать часть текста, то в самом редакторе выделяем мышкой нужный
текст и нажимаем клавиатурную комбинацию Ctrl+Shift+C
Для того того чтобы вставить текст, который сейчас находится в буфере обмена,
нажимаем комбинацию Ctrl+Shift+V
Не забывайте вводить sudo nano если редактируете файл, к которому у вас нет прав на
запись. То есть если работаете от пользователя, а не от суперпользователя root.
Но не будем уходить далеко от темы. В файле /etc/ssh/sshd_config ищем строку Port (будет
где-то наверху), и меняем ее значение на другое, отличное от стандартного 22, в диапазоне от
1024 до 64000.
Так же, если строка закомментирована, то есть вначале стоит символ #, то
убираем его. Должно получиться примерно как в данном случае:
Port 2282
Ищем строку PermitRootLogin и меняем её значение с without-password или yes на no
Так же, если строка закомментирована, то есть вначале стоит символ #, то убираем и его:
PermitRootLogin no
Внимательно проверяем, запоминаем порт, сохраняем и закрываем документ.
Важно все сделать нормально. Потому что если вы где то допустите ошибку в этом
файле, например напишите один порт, а потом его забудете, или запретите логин от root,
а другого пользователя у вас нет, то вы просто не сможете подключиться к серверу.
Обычно данная проблема решается в личном кабинете, там можно соединиться по SSH (вот
где пригодится пункт в меню - получить гостевой доступ по SSH в случае аварии -
Console), далее залогиниться под root и изменить в файле всё что нужно. В крайнем случае
выполните переустановку ОС.
После всех манипуляций в файле /etc/ssh/sshd_config, перезапускаем службу sshd:
service sshd restart
или если не работает, то:
systemctl restart SSH
Добавим службу sshd в автозагрузку (она у нас уже добавлена, но на всякий случай покажу):
update-rc.d sshd enable
Изменения применятся. Разница в командах зависит лишь от установленных в ОС демонах (в
Linux так называются службы автозапуска, если обьяснить проще) и не более того.
Настроим SSH для постоянной работы. Создадим новые ключи и сменим их с дефолтных по умолчанию.
Для безопасности, да и просто, чтобы не занимали лишнее место на сервере:
update-rc.d -f ssh remove
update-rc.d -f ssh defaults
cd /etc/ssh/
dpkg-reconfigure openssh-server
Следующее ваше соединение по SSH будет выглядеть следующим образом:
ssh Hanzo@ip -p 2282
где:
Hanzo - пользователь, отличный от root. Под рутом не получится подключиться
ip - IP адрес VPS
-p 2282 - порт SSH, который вы указывали в /etc/ssh/sshd_config
Теперь вы будете соединяться по SSH на сервер через вашего пользователя. У него нет почти
никаких прав, он даже не суперпользователь. Поэтому, для того чтобы производить какие-то
дальнейшие манипуляции на сервера, требующие повышенных привилегий (обычная политика безопасности Linux в действии), нужно залогиниться под рутом.
Для этого под обычным пользователем вводим следующую незамысловатую команду:
su -
Далее вводим пароль от суперпользователя root. Все - можете дальше делать на сервере что
хотите. Чтобы выйти из-под рута, вводите:
exit
Эта же команда служит для отключения обычного пользователя от сервера.
Для перезагрузки сервера вводим команду:
reboot
Для выключения сервера вводите команду (но учтите, что сам он не включится и прийдется
делать это вручную в личном кабинете на сайте хостера):
shutdown -h now
Давайте на следующем этапе отключим соединение по протоколу ipv6
Если эта дрянь поставляется с сервером автоматом - отрубайте! У этого хостера точно
поставляется.
Проверяем:
ifconfig a
В нашем случае смотрим на активный сетевой интерфейс (eth0 либо venet0) и если есть ipv6,
то редактируем файл /etc/sysctl.conf в текстовом редакторе nano:
nano /etc/sysctl.conf
Дописываем в конце следующие строки:
# disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Сохраните и закройте файл. Затем используйте опцию -p для перезагрузки конфигурации файла /etc/sysctl.conf:
sysctl IP
Вывод должен быть:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Проверяем:
ifconfig a
Теперь ipv6 должно исчезнуть навсегда, унеся в небытие деанон нашего сервера.
Так же сменим следующие параметры:
Имя хоста. На что нибудь иное. Ваш сервер так будет идентифицироваться в сети.
Я для примера выбрал whoami, но вы выбирайте своё. Для примера, что то типа
srv327543
nano /etc/hosts
Если отказывается меняться имя хоста из терминала, а такое бывает - делайте это в личном
кабинете на сайте хостера, предоставляющего VPS.
Motd (Message of the Day - сообщение дня)
nano /etc/more
Можно сгенерировать, скопировать и уставить надпись, чтобы каждый вход на
VPS посредством SSH в терминале радовал вас.
Редактируем в текстовом редакторе nano:
nano /etc/issue.net
Issue.net и Motd не должны содержать подробную информацию о пользователе или сессии!
Давайте создадим скрипт. Это такие мини-программы, написанные на bash.
Скрипт призван упростить обновление системы и создаётся уже на сервере:
nano /bin/update
Заполняем его содержимым и сохраняем:
#!/bin/sh
apt-get update && apt-get upgrade -y
Делаем данный скрипт исполняемым:
chmod +x /bin/update
Теперь введя в терминале просто
update
мы избавим себя от ввода длинных команд для обновления системы.
Но это для ленивцев.
Проверьте, кто уже пытался войти в вашу систему:
cat /var/log/auth.log | grep 'sshd.*Invalid'
Не хорошо, правда?
Злые хакеры пытаются атаковать ваш VPS. Через несколько минут в сети
VPS, боты пытаясь сканировать открытые порты и атаковать их, используют атаку типа
bruteforce или по словарю.
Пусть стараются лучше.
Но всё же стоит настроить файервол.
Внимание! Есть смысл сразу же разрешить входящий и исходящий трафик для SSH,
иначе при включении фаервола можно потерять коннект к машине:
sudo ufw allow 22
вместо 22 необходимо вставить ваш порт SSH, например 2282
Включаем ufw (sudo опустим, так как все команды будем выполнять от root):
ufw enable
Выключается он аналогично:
ufw disable
Просмотреть существующие правила можно выполнив:
ufw status numbered
Все что (v6) в этом списке можете смело удалять!
ufw delete НОМЕР_СТРОКИ
В нашем случае это будет строка 2. Проверяем вывод:
ufw status
Результат:
Status: active
To Action From
-- ------ ----
2282 ALLOW Anywhere
Позже мы научимся модифицировать прафила файервола для разных сервисов, но это в
процессе.
Почему не iptables а ufw, спросит кто то?
UFW - межсетевой экран (Firewall) для Linux, который является надстройкой над iptables.
В отличии от iptables является более интуитивно понятным, т.к. по сути все правила к нему пишутся на английском языке. UFW полностью совместим с iptables и его можно совмещать с ним при необходимости.
UFW не является полноценной заменой iptables, очень сложные правила на нём не напишешь, но необходимый минимумом, который обычно
требуется простому пользователю, он имеет.
ЭТО ПРОСТО ДЛЯ ПРИМЕРА И ВЫПОЛНЯТЬ НЕ ОБЯЗАТЕЛЬНО!
Введя параметры по умолчанию для входящего трафика, заблокируйте все:
sudo ufw default deny incoming
Для исходящего трафика, разрешение на все:
sudo ufw default allow outgoing
Включение защиты от открытия всех возможных портов:
sudo nano /etc/ufw/before.rules
После строк:
# Don't delete these required lines, otherwise there will be
errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
добавьте:
# Limit to 10 concurrent connections on port 80 per IP
-A ufw-before-input -p tcp --syn --dport 80 -m connlimit --
connlimit-above 10 -j DROP
и:
# Limit to 20 connections on port 80 per 2 seconds per IP
-A ufw-before-input -p tcp --dport 80 -i eth0 -m state --state NEW
-m recent --set
-A ufw-before-input -p tcp --dport 80 -i eth0 -m state --state NEW
-m recent --update --seconds 2 --hitcount
20 -j DROP
По моему достаточно.
Давайте лучше настроим генератор шума на сервере.
Это делается затем чтобы забить канал информационным мусором и отбить у самозванцев желание прослушивать трафик.
Ваш поднятый на сервере VPN будет с ним как капля в море. Но имеет смысл проворачивать такое лишь на сервере с безлимитным трафиком.
В нашем случае наш сервер таким и является. Но встречается в природе к сожалению и обратное.
pip install requests
git clone
cd noisy
python noisy.py --config config.json
Всё, генератор работает!
В файле config.json можете посмотреть сайты куда он ходит. Можете изменить на свои при должном желании. Это дело пары минут.
Можно запустить tcptrack,
подключившись к серверу со второго терминала (да, так тоже можно!), посмотреть что скрипт отрабатывает как нужно и убедиться в этом воочию, увидев множественные подключения с разных IP адресов:
tcptrack -i venet0
где venet0 - мой сетевой интерфейс.
Свой смотрите на сервере через
ifconfig -i
Можете так же посмотреть запущенные на сервере процессы через утилиту htop
Это очень удобная утилита для контроля за сервером, можно выключать ненужные процессы, следить за нагрузкой. И ещё очень много всего можно с ней сделать полезного.
Не очень удобно держать кучу окон открытыми, да и если выйти, то генератор перестанет работать. Но есть решение, которое исправит ситуацию.
Редактируем cron, который выполнит задание по расписанию и даже после перезагрузки:
crontab -e
В cron добавляем чтобы, в случае переполнения RAM, раз в сутки сервер перезагружался и собственно наш скрипт с генератором шума:
0 0 * * * /sbin/reboot
cd /root/noisy/ && python noisy.py --config config.json
После config.json не забывайте оставить пустую строку чтобы cron работал!
Просто нажмите Enter один раз.
Сохраняйте всё как в nano делали до этого. Теперь выполните команду
reboot для перезагрузки и применения изменений. Заходите на сервер - всё уже работает!
Каждый новичок в Linux, задаётся вопросом - как улучшить работу с удаленными серверами, а именно - как исключить некорректное завершение запущенной команды при обрыве
соединения или закрытии SSH клиента?
Консольная утилита screen очень удобна для решения всевозможных задач в консоли на удаленных серверах. Работая в сессии screen на удаленном сервере, можно запускать различные утилиты, отсоединяться от сессии screen и отключаться от удаленных серверов,
при этом утилиты будут продолжать работать.
Например, зайдя в сессию screen и запустив обновление системы, можно отсоединиться от сессии и сервера, а процесс при этом не прервётся. Чтобы зайти в screen, запускаем его на удаленном сервере командой:
screen
Далее можно запускать любые консольные утилиты, например, копирование файлов.
Отсоединение от сессии screen (deattach) осуществляется сочетанием клавиш Ctrl+a+d
После чего появится сообщение
[detached]
Далее вы можете уже выходить с удаленного хоста, или запускать новые сессии screen.
Просмотр сессий screen:
screen -ls
Присоединение (reattach) к сессии screen:
screen -r ваша_сессия
После чего вы попадаете в оставленную сессию screen, где продолжаются выполнятся запущенные вами утилиты.
«Умершие» сессии утилиты screen можно убрать командой:
screen -wipe
Это лишь необходимый минимум возможных ключей и команд утилиты screen, достаточный для начала работы с ней.
Более подробно об этой утилите смотрите help и man:
screen —help
man screen
Запомните! В Linux почти 90% информации по работе с той или иной программой можно легко узнать, используя подсказки в утилитах help и man.
Это подсказка вам на будущее.
Можно легко и наглядно мониторить сетевой трафик на сервере с помощью следующей утилиты.
vnStat - это сетевой монитор трафика с открытым исходным кодом и лицензией
GPL на базе консоли. Он легковесен и может использоваться без привилегий root. Статистика трафика хранится в базе данных и предоставляется по сетевым интерфейсам. Каждый интерфейс имеет свою собственную базу данных.
Демон vnstatd будет автоматически запущен после его установки. И он автоматически запускается при загрузке Debian/Ubuntu.
Вы можете проверить это с помощью systemctl:
systemctl status vnstat
"Enabled" означает автоматический запуск при загрузке системы.
После установки vnStat в
Debian/Ubuntu, база данных будет автоматически инициализирована для каждого сетевого
интерфейса. /var/lib/vnstat - это каталог базы данных для vnStat.
Новая база данных может быть создана с помощью следующей команды. Замените eth0 на
интерфейс, который необходимо контролировать.
На этом сервере он будет venet0:
vnstat --create -i eth0
Чтобы удалить базу данных для интерфейса, выполните следующую команду.
Замените eth0 интерфейсом, который вы больше не хотите контролировать.
vnstat --delete -i eth0
Чтобы просмотреть сетевой трафик в реальном времени, выполните эту команду:
vnstat -i eth0 -l
Префикс -i указывает на интерфейс (замените eth0 на свой интерфейс), l- говорит о включении live режима контроля в реальном времени. Нажмите Ctrl+C, чтобы выйти.
Так же можете заменить префикс -l в конце на следующие:
-h - за последние 24 часа
-d - за последние 30 дней
-m - за последние 7 дней
-w - за месяц*
-t - за последние 10 дней
Открою страшный секрет. Я не стал вам рассказывать об этом инструменте вначале.
Просто не хотел чтобы вы слишком ленились и учились вбивать в терминал всё руками. Это хорошее качество и когда нибудь сыграет вам на руку. Поверьте.
Может помните из винды, были там раньше файловые менеджеры Norton Commander или Far. Так это то же самое, только под Linux. Называется Midnight Commander. Или если по простому то просто mc.
Работа в нём проста и интуитивно понятна. Это двухпанельный менеджер и переключение
осуществляется нажатием на Tab. У него богатый функционал, кроме обычных операций с папками и файлами, можно ещё назначать права, передавать файлы на сервер и многое многое другое.
Не помешало бы отключить историю хранения набора в терминале.
Сделать это можно в скрытом файле /root/.bashrc для суперпользователя root.
Для обычного пользователя в его
домашней папке в таком же скрытом файле соответственно. Достаточно добавить строки:
export HISTFILE=''
export HISTSIZE=0
Ну и не забудьте почистить от уже накопившейся истории файлы
/root/.bash_history
для суперпользователя root. Для обычного пользователя соответственно очищаем такой же скрытый файл в его домашней папке.
В нашем случае это
/home/codeby/.bash_history
Ну и напоследок в завершении добавим пользователя Hanzo к группе sudo, чтобы он имел хоть какие то права:
usermod -g sudo Hanzo
Редактируем файл sudo:
visudo
Находим строки со следующим содержимым:
# User privilege specification
root ALL=(ALL:ALL) ALL
Добавляем ниже следующие строки:
# Allow members of group sudo to execute any command
Hanzo ALL=(ALL:ALL) ALL
Теперь перезагружаемся командой reboot и при входе на сервер видим, что истории в терминале больше нет (ничего не листается клавишами ВВЕРХ и ВНИЗ на клавиатуре).
Так же в суперпользователя root мы теперь можем перейти не только по команде
su -
Но и по следующей команде:
sudo I
Так же теперь простой выход с сервера осуществляется для суперпользователя root и
обычного пользователя (в нашем случае hanzo) по следующей команде:
exit
На такой славной ноте предлагаю завершить. Вам много предстоит
изучить и настроить. Но у вас обязательно всё получится при должной внимательности.
С просторов инета.
Но обо всём по порядку...
Поскольку я показываю на примере дистрибутива Debian, вводимые команды будут только для этого дистибутива и для дистрибутивов основанных на Debian (Ubuntu)!
Итак, приступим.
Обновляем пакеты:
apt-get update && apt-get upgrade
Выскочит уведомление, в котором нужно утвердительно ответить Yes
Если не хотите постоянно нажимать y при обновлении, то вводите эту команду:
apt-get update && apt-get upgrade -y
После завершения обновляния установим, так сказать, пакеты первой необходимости.
Пришло время погрузиться в обычные будни системного администратора Linux:
apt-get install net-tools cron wget curl nano mc htop python
python-pip git ufw sudo git tcptrack vnstat screen
Обычно многие из данных пакетов установлены в системе изначально, но не всегда. Далее выпадет возможность поработать с каждым из них и каждый будет рассмотрен.Еще можно поставить следующие пакеты, но не обязательно (они предназначены для сборки
пакетов из open source code, а по простому - из открытого исходного кода):
apt-get install build-essential make automake autoconf pkg-config
Настроим языковые локали в системе:
dpkg-reconfigure locales
выбираем только:
en_US.UTF-8 UTF-8
Для этого вводим номер 146 и для выбора осуществляем нажатие на клавишу Enter. Затем вводим номер 3 и снова нажимаем на клавишу Enter. Это применит изменения.
Произведём конфигурация часовых поясов:
dpkg-reconfigure tzdata
Выбираем исключительно (это номера 13 и 33 соответственно):
None of the above->UTC
ОБЯЗАТЕЛЬНО поменяем пароль от суперпользователя root:
passwd root
Система предложит дважды ввести пароль. При его вводе символы на экране не будут отображаться. Так должно быть и это нормальная практика в Linux. Помогает защитить пароль от посторонних.
Далее, нам нужно ОБЯЗАТЕЛЬНО создать пользователя следующей командой:
useradd -m -s /bin/bash Hanzo
где:
useradd - команда, создающая пользователя
-m - создаёт домашнюю папку пользователя в /home/<имя пользователя>/ и по-умолчанию
имеет такое же название, как и имя пользователя
-s - указывает, какой shell, то есть оболочку командной строки, использовать
Hanzo - имя пользователя (это для примера и вы естественно выбираете своё)
После создания пользователя, вам ОБЯЗАТЕЛЬНО нужно создать ему пароль. Потому что
мы будем использовать именно этого юзера для соединения по ssh:
passwd LOL
Система, так же как и для суперпользователя root, предложит дважды ввести пароль. При этом символы на экране так же не будут отображаться.
Далее, нужно посмотреть какие сервисы запущены и отключить их (потому что, как правило, они светят наружу ненужными портами, как новогодняя ёлка и создают брешь в защите):
netstat -tulpn
На данном этапе в идеале должен быть запущен только сервис sshd. Поскольку у меня установлена Debian-minimal, то так и есть.
Команда netstat -tulpn выдаёт только:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
204/sshd
tcp6 0 0 :::22 :::* LISTEN
204/SSH
Но обычно может быть запущен какой-нибудь веб-сервер, mail-server, еще что либо... Не знаю, что запущено у вас, поэтому поочерёдно вводите следующие команды:
/etc/init.d/apache2 stop
update-rc.d apache2 disable
/etc/init.d/postfix stop
update-rc.d postfix disable
/etc/init.d/nginx stop
update-rc.d nginx disable
/etc/init.d/exim4 stop
update-rc.d exim4 disable
/etc/init.d/rpcbind stop
update-rc.d rpcbind disable
/etc/init.d/nfs-common stop
update-rc.d nfs-common disable
/etc/init.d/rsyslog stop
update-rc.d rsyslog disable
Это должно отключить то, что обычно запущено уже при создании сервера.
Убедитесь что
никаких левых сервисов не запущено. Такие, как например ntpd, avahi-daemon, dhcpcd,
exim4-base, exim4-config, mutt, procmail.
Совершенно не нужны они на сервере, поэтому всё
лишнее удаляем через:
apt-get purge имя_пакета
либо через:
apt-get autoremove имя_пакета
Теперь нужно настроить sshd. Из соображений безопасности поменяем порт со стандартного
на нестандартный и запретим подключение от суперпользователя root.
Редактируем файл /etc/ssh/sshd_config при помощи текстового редактора nano:
nano /etc/ssh/sshd_config
Вкратце расскажу основные горячие клавиши при работе с консольным редактором nano:
nano <путь до файла> - открываем файл в nano
Ctrl+O - сохранить и записать изменения в файл. Нажимаем Ctrl+O, потом Enter
Ctrl+X - выйти из nano
Ctrl+K - вырезать целую строку. Она будет скопирована в буфер обмена
Ctrl+U - вставить вырезанную строку, которая находится в буфере обмена
Ctrl+W - поиск по файлу. Поиск в редакторе, вводим что нужно -> нажимаем Enter
Если хотим скопировать часть текста, то в самом редакторе выделяем мышкой нужный
текст и нажимаем клавиатурную комбинацию Ctrl+Shift+C
Для того того чтобы вставить текст, который сейчас находится в буфере обмена,
нажимаем комбинацию Ctrl+Shift+V
Не забывайте вводить sudo nano если редактируете файл, к которому у вас нет прав на
запись. То есть если работаете от пользователя, а не от суперпользователя root.
Но не будем уходить далеко от темы. В файле /etc/ssh/sshd_config ищем строку Port (будет
где-то наверху), и меняем ее значение на другое, отличное от стандартного 22, в диапазоне от
1024 до 64000.
Так же, если строка закомментирована, то есть вначале стоит символ #, то
убираем его. Должно получиться примерно как в данном случае:
Port 2282
Ищем строку PermitRootLogin и меняем её значение с without-password или yes на no
Так же, если строка закомментирована, то есть вначале стоит символ #, то убираем и его:
PermitRootLogin no
Внимательно проверяем, запоминаем порт, сохраняем и закрываем документ.
Важно все сделать нормально. Потому что если вы где то допустите ошибку в этом
файле, например напишите один порт, а потом его забудете, или запретите логин от root,
а другого пользователя у вас нет, то вы просто не сможете подключиться к серверу.
Обычно данная проблема решается в личном кабинете, там можно соединиться по SSH (вот
где пригодится пункт в меню - получить гостевой доступ по SSH в случае аварии -
Console), далее залогиниться под root и изменить в файле всё что нужно. В крайнем случае
выполните переустановку ОС.
После всех манипуляций в файле /etc/ssh/sshd_config, перезапускаем службу sshd:
service sshd restart
или если не работает, то:
systemctl restart SSH
Добавим службу sshd в автозагрузку (она у нас уже добавлена, но на всякий случай покажу):
update-rc.d sshd enable
Изменения применятся. Разница в командах зависит лишь от установленных в ОС демонах (в
Linux так называются службы автозапуска, если обьяснить проще) и не более того.
Настроим SSH для постоянной работы. Создадим новые ключи и сменим их с дефолтных по умолчанию.
Для безопасности, да и просто, чтобы не занимали лишнее место на сервере:
update-rc.d -f ssh remove
update-rc.d -f ssh defaults
cd /etc/ssh/
dpkg-reconfigure openssh-server
Следующее ваше соединение по SSH будет выглядеть следующим образом:
ssh Hanzo@ip -p 2282
где:
Hanzo - пользователь, отличный от root. Под рутом не получится подключиться
ip - IP адрес VPS
-p 2282 - порт SSH, который вы указывали в /etc/ssh/sshd_config
Теперь вы будете соединяться по SSH на сервер через вашего пользователя. У него нет почти
никаких прав, он даже не суперпользователь. Поэтому, для того чтобы производить какие-то
дальнейшие манипуляции на сервера, требующие повышенных привилегий (обычная политика безопасности Linux в действии), нужно залогиниться под рутом.
Для этого под обычным пользователем вводим следующую незамысловатую команду:
su -
Далее вводим пароль от суперпользователя root. Все - можете дальше делать на сервере что
хотите. Чтобы выйти из-под рута, вводите:
exit
Эта же команда служит для отключения обычного пользователя от сервера.
Для перезагрузки сервера вводим команду:
reboot
Для выключения сервера вводите команду (но учтите, что сам он не включится и прийдется
делать это вручную в личном кабинете на сайте хостера):
shutdown -h now
Давайте на следующем этапе отключим соединение по протоколу ipv6
Если эта дрянь поставляется с сервером автоматом - отрубайте! У этого хостера точно
поставляется.
Проверяем:
ifconfig a
В нашем случае смотрим на активный сетевой интерфейс (eth0 либо venet0) и если есть ipv6,
то редактируем файл /etc/sysctl.conf в текстовом редакторе nano:
nano /etc/sysctl.conf
Дописываем в конце следующие строки:
# disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Сохраните и закройте файл. Затем используйте опцию -p для перезагрузки конфигурации файла /etc/sysctl.conf:
sysctl IP
Вывод должен быть:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Проверяем:
ifconfig a
Теперь ipv6 должно исчезнуть навсегда, унеся в небытие деанон нашего сервера.
Так же сменим следующие параметры:
Имя хоста. На что нибудь иное. Ваш сервер так будет идентифицироваться в сети.
Я для примера выбрал whoami, но вы выбирайте своё. Для примера, что то типа
srv327543
nano /etc/hosts
Если отказывается меняться имя хоста из терминала, а такое бывает - делайте это в личном
кабинете на сайте хостера, предоставляющего VPS.
Motd (Message of the Day - сообщение дня)
nano /etc/more
Можно сгенерировать, скопировать и уставить надпись, чтобы каждый вход на
VPS посредством SSH в терминале радовал вас.
Редактируем в текстовом редакторе nano:
nano /etc/issue.net
Issue.net и Motd не должны содержать подробную информацию о пользователе или сессии!
Давайте создадим скрипт. Это такие мини-программы, написанные на bash.
Скрипт призван упростить обновление системы и создаётся уже на сервере:
nano /bin/update
Заполняем его содержимым и сохраняем:
#!/bin/sh
apt-get update && apt-get upgrade -y
Делаем данный скрипт исполняемым:
chmod +x /bin/update
Теперь введя в терминале просто
update
мы избавим себя от ввода длинных команд для обновления системы.
Но это для ленивцев.
Проверьте, кто уже пытался войти в вашу систему:
cat /var/log/auth.log | grep 'sshd.*Invalid'
Не хорошо, правда?
Злые хакеры пытаются атаковать ваш VPS. Через несколько минут в сети
VPS, боты пытаясь сканировать открытые порты и атаковать их, используют атаку типа
bruteforce или по словарю.
Пусть стараются лучше.
Но всё же стоит настроить файервол.
Внимание! Есть смысл сразу же разрешить входящий и исходящий трафик для SSH,
иначе при включении фаервола можно потерять коннект к машине:
sudo ufw allow 22
вместо 22 необходимо вставить ваш порт SSH, например 2282
Включаем ufw (sudo опустим, так как все команды будем выполнять от root):
ufw enable
Выключается он аналогично:
ufw disable
Просмотреть существующие правила можно выполнив:
ufw status numbered
Все что (v6) в этом списке можете смело удалять!
ufw delete НОМЕР_СТРОКИ
В нашем случае это будет строка 2. Проверяем вывод:
ufw status
Результат:
Status: active
To Action From
-- ------ ----
2282 ALLOW Anywhere
Позже мы научимся модифицировать прафила файервола для разных сервисов, но это в
процессе.
Почему не iptables а ufw, спросит кто то?
UFW - межсетевой экран (Firewall) для Linux, который является надстройкой над iptables.
В отличии от iptables является более интуитивно понятным, т.к. по сути все правила к нему пишутся на английском языке. UFW полностью совместим с iptables и его можно совмещать с ним при необходимости.
UFW не является полноценной заменой iptables, очень сложные правила на нём не напишешь, но необходимый минимумом, который обычно
требуется простому пользователю, он имеет.
ЭТО ПРОСТО ДЛЯ ПРИМЕРА И ВЫПОЛНЯТЬ НЕ ОБЯЗАТЕЛЬНО!
Введя параметры по умолчанию для входящего трафика, заблокируйте все:
sudo ufw default deny incoming
Для исходящего трафика, разрешение на все:
sudo ufw default allow outgoing
Включение защиты от открытия всех возможных портов:
sudo nano /etc/ufw/before.rules
После строк:
# Don't delete these required lines, otherwise there will be
errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
добавьте:
# Limit to 10 concurrent connections on port 80 per IP
-A ufw-before-input -p tcp --syn --dport 80 -m connlimit --
connlimit-above 10 -j DROP
и:
# Limit to 20 connections on port 80 per 2 seconds per IP
-A ufw-before-input -p tcp --dport 80 -i eth0 -m state --state NEW
-m recent --set
-A ufw-before-input -p tcp --dport 80 -i eth0 -m state --state NEW
-m recent --update --seconds 2 --hitcount
20 -j DROP
По моему достаточно.
Давайте лучше настроим генератор шума на сервере.
Это делается затем чтобы забить канал информационным мусором и отбить у самозванцев желание прослушивать трафик.
Ваш поднятый на сервере VPN будет с ним как капля в море. Но имеет смысл проворачивать такое лишь на сервере с безлимитным трафиком.
В нашем случае наш сервер таким и является. Но встречается в природе к сожалению и обратное.
pip install requests
git clone
cd noisy
python noisy.py --config config.json
Всё, генератор работает!
В файле config.json можете посмотреть сайты куда он ходит. Можете изменить на свои при должном желании. Это дело пары минут.
Можно запустить tcptrack,
подключившись к серверу со второго терминала (да, так тоже можно!), посмотреть что скрипт отрабатывает как нужно и убедиться в этом воочию, увидев множественные подключения с разных IP адресов:
tcptrack -i venet0
где venet0 - мой сетевой интерфейс.
Свой смотрите на сервере через
ifconfig -i
Можете так же посмотреть запущенные на сервере процессы через утилиту htop
Это очень удобная утилита для контроля за сервером, можно выключать ненужные процессы, следить за нагрузкой. И ещё очень много всего можно с ней сделать полезного.
Не очень удобно держать кучу окон открытыми, да и если выйти, то генератор перестанет работать. Но есть решение, которое исправит ситуацию.
Редактируем cron, который выполнит задание по расписанию и даже после перезагрузки:
crontab -e
В cron добавляем чтобы, в случае переполнения RAM, раз в сутки сервер перезагружался и собственно наш скрипт с генератором шума:
0 0 * * * /sbin/reboot
cd /root/noisy/ && python noisy.py --config config.json
После config.json не забывайте оставить пустую строку чтобы cron работал!
Просто нажмите Enter один раз.
Сохраняйте всё как в nano делали до этого. Теперь выполните команду
reboot для перезагрузки и применения изменений. Заходите на сервер - всё уже работает!
Каждый новичок в Linux, задаётся вопросом - как улучшить работу с удаленными серверами, а именно - как исключить некорректное завершение запущенной команды при обрыве
соединения или закрытии SSH клиента?
Консольная утилита screen очень удобна для решения всевозможных задач в консоли на удаленных серверах. Работая в сессии screen на удаленном сервере, можно запускать различные утилиты, отсоединяться от сессии screen и отключаться от удаленных серверов,
при этом утилиты будут продолжать работать.
Например, зайдя в сессию screen и запустив обновление системы, можно отсоединиться от сессии и сервера, а процесс при этом не прервётся. Чтобы зайти в screen, запускаем его на удаленном сервере командой:
screen
Далее можно запускать любые консольные утилиты, например, копирование файлов.
Отсоединение от сессии screen (deattach) осуществляется сочетанием клавиш Ctrl+a+d
После чего появится сообщение
[detached]
Далее вы можете уже выходить с удаленного хоста, или запускать новые сессии screen.
Просмотр сессий screen:
screen -ls
Присоединение (reattach) к сессии screen:
screen -r ваша_сессия
После чего вы попадаете в оставленную сессию screen, где продолжаются выполнятся запущенные вами утилиты.
«Умершие» сессии утилиты screen можно убрать командой:
screen -wipe
Это лишь необходимый минимум возможных ключей и команд утилиты screen, достаточный для начала работы с ней.
Более подробно об этой утилите смотрите help и man:
screen —help
man screen
Запомните! В Linux почти 90% информации по работе с той или иной программой можно легко узнать, используя подсказки в утилитах help и man.
Это подсказка вам на будущее.
Можно легко и наглядно мониторить сетевой трафик на сервере с помощью следующей утилиты.
vnStat - это сетевой монитор трафика с открытым исходным кодом и лицензией
GPL на базе консоли. Он легковесен и может использоваться без привилегий root. Статистика трафика хранится в базе данных и предоставляется по сетевым интерфейсам. Каждый интерфейс имеет свою собственную базу данных.
Демон vnstatd будет автоматически запущен после его установки. И он автоматически запускается при загрузке Debian/Ubuntu.
Вы можете проверить это с помощью systemctl:
systemctl status vnstat
"Enabled" означает автоматический запуск при загрузке системы.
После установки vnStat в
Debian/Ubuntu, база данных будет автоматически инициализирована для каждого сетевого
интерфейса. /var/lib/vnstat - это каталог базы данных для vnStat.
Новая база данных может быть создана с помощью следующей команды. Замените eth0 на
интерфейс, который необходимо контролировать.
На этом сервере он будет venet0:
vnstat --create -i eth0
Чтобы удалить базу данных для интерфейса, выполните следующую команду.
Замените eth0 интерфейсом, который вы больше не хотите контролировать.
vnstat --delete -i eth0
Чтобы просмотреть сетевой трафик в реальном времени, выполните эту команду:
vnstat -i eth0 -l
Префикс -i указывает на интерфейс (замените eth0 на свой интерфейс), l- говорит о включении live режима контроля в реальном времени. Нажмите Ctrl+C, чтобы выйти.
Так же можете заменить префикс -l в конце на следующие:
-h - за последние 24 часа
-d - за последние 30 дней
-m - за последние 7 дней
-w - за месяц*
-t - за последние 10 дней
Открою страшный секрет. Я не стал вам рассказывать об этом инструменте вначале.
Просто не хотел чтобы вы слишком ленились и учились вбивать в терминал всё руками. Это хорошее качество и когда нибудь сыграет вам на руку. Поверьте.
Может помните из винды, были там раньше файловые менеджеры Norton Commander или Far. Так это то же самое, только под Linux. Называется Midnight Commander. Или если по простому то просто mc.
Работа в нём проста и интуитивно понятна. Это двухпанельный менеджер и переключение
осуществляется нажатием на Tab. У него богатый функционал, кроме обычных операций с папками и файлами, можно ещё назначать права, передавать файлы на сервер и многое многое другое.
Не помешало бы отключить историю хранения набора в терминале.
Сделать это можно в скрытом файле /root/.bashrc для суперпользователя root.
Для обычного пользователя в его
домашней папке в таком же скрытом файле соответственно. Достаточно добавить строки:
export HISTFILE=''
export HISTSIZE=0
Ну и не забудьте почистить от уже накопившейся истории файлы
/root/.bash_history
для суперпользователя root. Для обычного пользователя соответственно очищаем такой же скрытый файл в его домашней папке.
В нашем случае это
/home/codeby/.bash_history
Ну и напоследок в завершении добавим пользователя Hanzo к группе sudo, чтобы он имел хоть какие то права:
usermod -g sudo Hanzo
Редактируем файл sudo:
visudo
Находим строки со следующим содержимым:
# User privilege specification
root ALL=(ALL:ALL) ALL
Добавляем ниже следующие строки:
# Allow members of group sudo to execute any command
Hanzo ALL=(ALL:ALL) ALL
Теперь перезагружаемся командой reboot и при входе на сервер видим, что истории в терминале больше нет (ничего не листается клавишами ВВЕРХ и ВНИЗ на клавиатуре).
Так же в суперпользователя root мы теперь можем перейти не только по команде
su -
Но и по следующей команде:
sudo I
Так же теперь простой выход с сервера осуществляется для суперпользователя root и
обычного пользователя (в нашем случае hanzo) по следующей команде:
exit
На такой славной ноте предлагаю завершить. Вам много предстоит
изучить и настроить. Но у вас обязательно всё получится при должной внимательности.
С просторов инета.