Для начала немного лирики, то есть я расскажу казалось бы очевидные вещи, однако для многих они не очевидны.
После того как "Красная шапочка" окончательно прикончила проект CentOS, сделав из него по сути бесконечную beta версию своего RHEL, у многих встал вопрос, а что собственно дальше делать и какой теперь дистрибутив использовать?
А в мире .rpm их не так и много, помимо самого RHEL есть ещё Open SUSE, но она не полностью совместима с пакетной базой RHEL и в данной статье рассматриваться не будет. И выбор остаётся не велик, либо Oracle Linux, либо Alma Linux, и тут у Альмы есть серьёзное преимущество. Так как все компоненты в ней не имеют проприетарных лицензий, её можно использовать к коммерческой эксплуатации, как и когда-то CentOS, и Альма 100% совместима с пакетной базой RHEL.
Всё описанное в статье было применено к Alma Linux 8.5 в редакции minimal, а сам дистрибутив взят отсюда.
Статья в первую очередь предназначена для новичков в мире Linux и не претендует на истину в последней инстанции, тем более опытные Linux админы поленятся настраивать сервер руками и сделают это с помощью системы управления конфигурацией типа Ansible или любой другой.
1. Настройка сетевых подключений
В общем случае, сеть в Alma Linux настраивается с помощью NetworkManager и его консольной утилиты nmtui. Она идет в базовой установке системы. Там простой и понятный графический интерфейс.
Для того чтобы туда попасть, пишем следующие команды
nmtui
Выбираем пункт "Edit a connection"
Выбираем нужный нам интерфейс
Активируем чек-бокс "Automatically connect"
2. Обновление системы
dnf update
3. Установка текстового редактора nano
А теперь, дабы не испытывать "боль и унижение" от текстового редактора vi, предлагаю установить nano:
dnf install nano
4. Исправление русской локализации
Если во время установки вы выбрали русский язык, то есть весьма большой шанс получить "квадратики" вместо русских символов в терминале.
Для того чтобы это исправить, делаем простые шаги:
cd /etc
nano /etc/vconsole.conf
приводим конфиг к такому виду:
KEYMAP="ru"
FONT="UniCyr_8x16"
После перезагружаемся:
reboot
5. Добавление репозитория EPEL
dnf -y install epel-release
6. Установка и настройка bash-completion
Чтобы стал доступен весь список команд после ввода пары символов, используется утилита bash-completion. Это реально удобно, TAB и готово!
dnf install bash-completion
cat /etc/profile.d/bash_completion.sh
source /etc/profile.d/bash_completion.sh
7. Установка необходимых утилит для работы с сетью
dnf install net-tools
в этот пакет входят такие утилиты как:
- ifconfigl;
- netstat.
А теперь поставим утилиту для работы с DNS, которая входит в пакет bind-utils:
dnf install bind-utils
8. Дисковое пространство
Для того чтобы понять, что и сколько занимает, а также для чистки/удаления, нам понадобится утилита ncdu
:
dnf install ncdu
9. Тop"ы
dnf install iftop
dnf install htop
dnf install atop
10. Отключение SELinux
Поскольку это руководство для новичков, то тут мы рассмотрим работу без использования SELinux, но отключать его крайне не рекомендуется!
cd /etc/sysconfig/
nano selinux
//меняем значение на SELINUX=disabled:
setenforce 0
12. Настройка SSH
Продолжаем настраивать centos. Внесем некоторые изменения в работу ssh для небольшого увеличения безопасности. Хотя речь стоит вести больше не о безопасности, а об удобстве и эффективности.
По-умолчанию, сервис ssh работает на 22 порту и если все оставить как есть, то мы получим огромное количество попыток авторизоваться. Боты сканят непрерывно интернет и подбирают пароли к ssh. Это не доставляет в реальности каких-то серьезных хлопот и тем не менее, подобные запросы забивают лог secure и тратят некоторые ресурсы сервера, как минимум на установку соединения и рукопожатия (handshake).
Чтобы немного закрыть себя от сканов простых ботов, изменим порт, на котором работает ssh. Можно выбрать любой пятизначный номер, это не принципиально. От автоматического сканирования это защитит. Повесим демон ssh на 2222 порт. Для этого редактируем файл /etc/ssh/sshd_config.
Но с начала отключим стандартный Firewall:
systemctl status firewalld
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
Возвращаемся к ssh. Раскомментируем строку Port 22 и заменим значение 22 на 2222:
cd /etc/ssh/
nano /etc/ssh/sshd_config
systemctl restart sshd
netstat -tulpn | grep sshd
Видим:
tcp | 0 | 0 0.0.0.0:2222 | 0.0.0.0:* | LISTEN | 720/sshd |
tcp6 | 0 | 0 :::2222 | :::* | LISTEN | 720/sshd |
13. Отключение суперпользователя по ssh
Для того чтобы отключить, откройте конфигурационный файл ssh:
nano /etc/ssh/sshd_config
Измените строку следующим образом:
PermitRootLogin no
Сохраните файл и перезапустите сервер SSH, выполнив следующие команды:
systemctl restart sshd
Для повторного включения учетной записи суперпользователя, просто поместите символ # для директивы PermitRootLogin в файл и сохраните его. Перезапустите SSH сервер.
14. Настраиваем синхронизацию времени через chrony
dnf install chrony
//Запускаем chrony и добавляем в автозагрузку: systemctl start chronyd
systemctl enable chronyd
//Проверяем, нормально ли запустился:
systemctl status chronyd
15. Настройка хранения истории bash
Как известно, история команд в Linux хранится в файле ~/.bash_history
. Для редактирования пишем:
nano ~/.bashrc
Размер файла ограничен списком из 500 последних выполненных команд, которые затираются по мере заполнения этого файла.
500 команд — это довольно мало, вы легко можете потерять полезную команду, которую выполнили, скажем неделю назад.
Чтобы увеличить размер хранимой истории, необходимо в файл ~/.bashrc
добавить строки:
export HISTSIZE=10000
export HISTFILESIZE=10000
//HISTSIZE — количество команд, которые необходимо запоминать в списке истории (по умолчанию — 500);// //HISTFILESIZE — максимальное количество строк, содержащееся в файле истории ~/.bash_history (по умолчанию — 500);
Теперь у нас будет храниться история последних 10 тыс. команд. Для применения настроек нужно выполнить:
source ~/.bashrc
Или перезайти в терминал.
Идем дальше, если вы выполните команду history, то заметите, что выполненные подряд одни и те же команды повторяются в истории. Это жутко неудобно, давайте отключим такое поведение. Для этого в файл ~/.bashrc
добавим строку:
export HISTCONTROL=ignoreboth:erasedups
Опция HISTCONTROL контролирует каким образом список команд сохраняется в истории.
- ignorespace — не сохранять строки, начинающиеся с символа <пробел>;
- ignoredups — не сохранять строки, совпадающие с последней выполненной командой;
- ignoreboth — использовать обе опции ‘ignorespace’ и ‘ignoredups’;
- erasedups — удалять ВСЕ дубликаты команд из истории.
Не забываем выполнить source ~/.bashrc
для применения настроек на лету.
Следующая полезная настройка отвечает за игнорирование определенных команд при добавлении в историю, это HISTIGNORE.
Давайте не будем сохранять в истории команды ls, ps и history с доп. опциями. Для этого в файл ~/.bashrc
добавим строку:
export HISTIGNORE='ls:ps:history*'
source ~/.bashrc
По умолчанию, Bash записывает историю команд в ~/.bash_history только при завершении сессии. Если Ваша сессия будет отключена некорректно, то как правило история команд в текущем сеансе не сохраниться — это неудобно. Чтобы это исправить нужно добавить в ~/.bashrc
следующую строку:
PROMPT_COMMAND='history -a'
Как вы уже заметили, вывод истории команд не учитывает дату и время выполнения этой команды, а иногда бывает очень нужно понимать, когда же Вы выполнили эту команду. Но все можно поправить, чтобы добавить дату к списку команд, нужно изменить формат вывода истории, для этого в ~/.bashrc нужно добавить строку:
export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S:'
source ~/.bashrc
И в конце, все вышеописанные опции можно добавить в ~/.bashrc
с помощью одной команды:
cat <> ~/.bashrc
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTCONTROL=ignoreboth:erasedups
PROMPT_COMMAND='history -a'
export HISTIGNORE='ls:ps:history*'
export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S: '
EOT
source ~/.bashrc
Иногда случаются ситуации, когда необходимо очистить историю команд Linux. Например, вы случайно ввели в консоли команду, содержащую пароль в открытом виде. В этом случае Вам потребуется либо удалить всю историю, либо только определенную ее часть.
Если нужно удалить конкретную строку в истории, то выполните:
history -wd 231
Для удаления всей истории команд выполните:
history -c
Если нужно очистить историю команд только для текущей сессии, то выполните:
history -r
Следует обратить внимание, что если вы сохраняете историю сразу по факту выполнения команды (настройка PROMPT_COMMAND=’history -a’
), а не по выходу из сессии, как это предусмотрено по умолчанию, то полную очистку истории указанными выше способами (опции -c и -r) вы не сделаете, история в файле ~/.bash_history сохраниться. Тогда для полной очистки истории команд нужно очистить файл ~/.bash_history
, для этого выполните:
echo>~/.bash_history
и закройте текущую сессию, тогда история будет очищена полностью.
По умолчанию, история команд включена всегда и все введенные команды можно использовать повторно, не затрачивая времени на их набор. Но при желании функцию ведения истории можно временно отключить. В Bash история команд в текущей сессии отключается с помощью команды:
set +o history
Для включения ведения истории команд в текущей сессии выполните:
set -o history
16. Автоматическое обновление системы
Для поддержания безопасности сервера на должном уровне необходимо, как минимум, своевременно его обновлять - как само ядро с системными утилитами, так и остальные пакеты. Можно делать это вручную, но для более эффективной работы лучше настроить автоматическое выполнение. Не обязательно именно устанавливать обновления автоматически, но как минимум проверять их появление.
dnf install dnf-automatic
systemctl enable --now dnf-automatic.timer
Дефолтный таймер настроен на запуск dnf-automatic через час после загрузки сервера и ежедневное повторение. Конфиг таймера живет тут - /etc/systemd/system/multi-user.target.wants/dnf-automatic.timer.
17. FireWall или межсетевой экран!
Итак, самое интересное я оставил напоследок, по поводу «какой межсетевой экран лучше» написано много статей и там в основном сравнивают iptables с nftables и кто-то даже рассказывает, что один безопаснее другого.
На самом же деле в Linux с самого начала был и есть всего один межсетевой экран и называется он NetFilter, и поставляется NetFilter с ядром Linux. А всеми любимые iptables с nftables являются утилитами для управления и настройки, а не самим межсетевым экраном.
Но тут мы рассмотрим другой более удобный и современный инструмент для взаимодействия с NetFilter, а именно UFW.
Установим межсетевой экран:
dnf install ufw
Проверим список доступных приложений:
ufw app list
Включим межсетевой экран:
ufw enable
Разрешим ssh (ssh просто как пример):
ufw allow 'SSH'
Проверим статус:
ufw status
И увидим примерно следующее:
В | Действие | Из |
-- | -- | -- |
SSH | ALLOW | Anywhere |
224.0.0.251 mDNS | ALLOW | Anywhere |
SSH (v6) | ALLOW | Anywhere (v6) |
ff02::fb mDNS | ALLOW | Anywhere (v6) |
С помощью правил limit можно ограничить количество подключений к определённому порту с одного IP-адреса, это может быть полезно для защиты от атак перебора паролей. По умолчанию подключения блокируются, если пользователь пытается создать шесть и больше подключений за 30 секунд:
ufw limit ssh/tcp
18. Изменение названия localhost
По умолчанию, во время установки Alma Linux ставит имя хоста localhost.localdomain. Если вы его не поменяли, то можно это сделать позже. Для начала давайте проверим, какое имя хоста у вас установлено. Делается это с помощью команды в консоли hostname, либо с помощью uname:
hostname
localhost.localdomain
uname -n
Для того чтобы изменить имя хоста в Alma Linux, необходимо отредактировать файл /etc/hostname.
cat /etc/hostname
localhost.localdomain
Сохраняем файл и проверяем:
hostname
Alma Linux.localhost
Есть готовая команда, которая сразу устанавливает необходимое имя сервера:
hostnamectl set-hostname Alma Linux.localhost
Вот собственно и всё, сервер настроен и готов, нет не к работе – к тонкой настройке под конкретные нужды. Можно было бы к статье добавить ещё описание настройки ssh авторизации по ключу, а также настройку Port Knocking и Fail2ban, но это уже была бы не базовая настройка.