Защита Linux
Юзер без прав рута
Длоя начала, сделаем себе юзера, у которого не будет прав рута. Root имеет полные права в системе и если разрешать для него удаленное администрирование, то это будет не безопасно.
Новый пользователь создается командой adduser
, во время создания вводится имя пользователя, устанавливается пароль. По умолчанию, команда adduser
выберет первый доступный UID из диапазона обычных пользователей, заданного в файле настройки. UID может быть изменён с помощью параметра --uid
.
adduser user1
После, добавим созданного пользователя в группу, которая имеет право выполнять команды с повышением привилегий sudo
. В различных дистрибутивах это могут быть разные команды:
usermod -aG wheel <username>
usermod -aG sudo <username>
SSH Ключи вместо паролей
Пароли это конечно хорошо, но в случае утечки - это вектор атаки. Так же, не забываем, что пароль всегда можно подобрать через брутфорс. Если брутфорс можно отсеить через fail2ban, то как быть с утечкой? Все просто - можно вместо паролей использовать аутентификацию по ключам.
Рассмотрим самую популярную реализации протокола SSH - OpenSSH
sudo apt install openssh-client
# Установка на сервере
sudo apt install openssh-server
#Запуск демона SSH (sshd) на сервере под Ubuntu
sudo systemctl start sshd
#
Автоматический запуск демона при каждой загрузке
sudo systemctl enable sshd
Tip
Замечу, что серверная часть OpenSSH включает в себя клиентскую. То есть через openssh-server можно подключаться к другим серверам.
Нет смысла на обычном пк, не являющимся сервером, ставить полноценный сервер OpenSSH - это только даст возможность удалённого подключения к компьютеру (кроме случаев когда это дейсвтительно нужно)
После того, как OpenSSH поставлен, нужно сгенерировать ключи SSH на компьютере, с которого вы будете заходить на сервер:
ssh-keygen -t rsa
Публичный ключ хранится в файле .pub
и выглядит как строка случайных символов, которые начинаются с ssh-rsa
.
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname
Затем нужно из-под рута создать на сервере директорию SSH в домашнем каталоге пользователя и добавить публичный ключ SSH в файл authorized_keys, используя текстовый редактор вроде nano:
mkdir -p /home/user_name/.ssh && touch /home/user_name/.ssh/authorized_keys
nano /home/user_name/.ssh/authorized_keys
После устанавливаем корректные разрешения для файла и меняем владельца:
chmod 700 /home/user_name/.ssh && chmod 600 /home/user_name/.ssh/authorized_keys
chown -R username:username /home/username/.ssh
На стороне клиента указываем местоположение секретного ключа для аутентификации:
ssh-add DIR_PATH/keylocation
ssh [username]@hostname
Warning
Настоятельно рекомендую сделать несколько резервных копий приватного ключа. Так как если авторизация по паролю будет отключена, а приватный ключ утерян, то для того чтобы войти на сервер, нужен будет или прямой доступ к клавиатуре или KVM консоль.
По умолчанию, в Убунте отключен вход через ssh под рутом, но в Debian и других ОС нет. Чтобы отключить, нужно в файле /etc/ssh/sshd_config
найти строчку PermitRootLogin yes
и изменить значение на no
.
После, можно отключить авторизацию пользователя по паролю. Для этого все в том же файле /etc/ssh/sshd_config
меняем параметр у строки PasswordAuthentication
yes на no
.
Fail2Ban
Ранее, я уже уопминал про защиту от брутфорса, используя Fail2Ban. Fail2Ban - это сервис, который анализирует логи и считает количество авторизаций за период времени с каждого IP адреса. К примеру, можно блокировать доступ к серверу, если за последний час было 5 проваленных авторизаций.
Установка обычная, через пакет:
sudo apt install fail2ban
systemctl start fail2ban
systemctl enable fail2ban
/etc/fail2ban/fail2ban.conf
и /etc/fail2ban/jail.conf
. Параметры ограничений указываются во втором файле:
[DEFAULT]
ignorecommand =
bantime = 10m
findtime = 10m
maxretry = 5
Смена портов по умолчанию
По умолчанию, SSH работает на 22 порту и если не стоит fail2ban, а сервер смотрит в интернет, то в логах начнут попадатся брутфорс. Даже с учетом отключенной авторизации через пароли. Чтобы лишний раз не триггерить сканеры, рекоменудю сменить порт у SSH на любой другой.
Сделать это можно в файле /etc/ssh/sshd_config
в параметре Port 22
Чтобы подключиться к серверу через кастомный порт, используется команда вида:
ssh server -p port