Найти в Дзене
Умный дом с проводами

Wirenboard по SSH: запрещаем root-доступ

Оглавление

В основе контроллера Wirenboard лежит полноценная операционная система Debian Linux, поэтому здесь применимы наработанные годами рекомендации по безопасности.

И первое правило - никогда не работать под root. Обладая неограниченными привилегиями в системе, пользователь root - настоящий подарок для взломщика. Поэтому создадим учётную запись обычного пользователя.

Важно! Перед прочтением данной статьи ознакомьтесь со стандартной инструкцией Wiren Board о подключении к консоли контроллера по SSH.

Также, статья не является заменой рекомендациям по защите контроллера, а лишь дополняет их.

С целью обеспечения достоверности, все команды последовательно выполнялись на сброшенном до заводских настроек контроллере Wirenboard 8.5, а для подключений по SSH использовался стандартный Терминал Windows.

Чтобы случайно не потерять доступ к контроллеру в ходе подобных экспериментов, удобно для начала потренироваться на виртуальном образе Debian, развёрнутом на рабочем компьютере в подсистеме Windows для Linux.

Добавление учётной записи обычного пользователя

Подключившись к контроллеру по SSH, введём в консоли команду

adduser username


Вместо
username можно указать любое имя. Однако, чтобы не столкнуться со сложностями и неожиданным поведением, оно должно вводиться на латинице, начинаться с буквы или подчёркивания. При этом может содержать буквы и цифры, подчёркивания, дефисы.

Добавление учётной записи в контроллере Wirenboard
Добавление учётной записи в контроллере Wirenboard

На дополнительные вопросы системы отвечать не обязательно, допустимо оставить поля пустыми и несколько раз нажать клавишу Enter.

Предоставление разрешения на запрос повышенных привилегий

Как быть, если при работе с обычной учётной записью требуется выполнить действие от имени суперпользователя? Для этого предназначена команда sudo. Обращаться к ней позволено лишь тем пользователям, которые состоят в группе sudo.

Добавим нашего пользователя username в группу sudo. Для этого выполним следующую команду:

usermod -aG sudo username

Для отображения списка пользователей, состоящих в группе sudo, можно использовать команду

getent group sudo


🟥 С осторожностью:
существует возможность ограничения списка команд, выполняемых пользователями при помощи sudo. Настройка осуществляется через редактирование файла /etc/sudoers путём вызова команды sudo visudo. Однако, неправильная конфигурация или ошибки синтаксиса в файле конфигурации способны привести к некорректной работе системы.

Проверить возможности пользователя в режиме sudo можно командой

sudo -l -U username


Теперь пользователь
username готов к работе. Можно завершить сеанс root и скорректировать строку подключения SSH, заменив root@ на username@.

Подключение к контроллеру по SSH под обычным пользователем
Подключение к контроллеру по SSH под обычным пользователем

Перед командами, требующими административного доступа, обычному пользователю придётся набирать словечко sudo. При первом вызове такой команды запрашивается пароль текущего пользователя username. Если между несколькими вызовами sudo возникнет большой временной промежуток, то пароль будет запрошен снова.

ℹ️ Примечание: к преимуществам работы через sudo можно отнести запись активности. Проверить, что пользователи делали с повышенными привилегиями, в Debian можно через вызов команды

sudo journalctl /usr/bin/sudo -p 5

Подключение через SSH по ключу

Второе правило безопасности - при подключении к контроллеру вместо пароля использовать SSH-ключи.

Создаётся ключевая пара, состоящая из открытого (публичного) и закрытого (приватного) ключей, связанных между собой.

Публичный ключ размещается на сервере и используется для шифрования отправляемых вам сообщений. Расшифровать содержимое такой «посылки» может лишь закрытый ключ.

Приватный ключ нужно хранить в надёжном месте и нельзя никому показывать. Он используется для шифрования ответных сообщений и гарантирует, что информация поступила именно от вас.

ℹ️ На заметку: шифрование с использованием публичного и приватного ключей называют асимметричным.

Как создать ключ

Оригинальное руководство по SSH для Wirenboard предполагает хранение закрытого ключа на компьютере. Более подходящим местом для таких важных ключей может стать специальный ключевой носитель, с виду похожий на обычную флешку, но при этом обладающий встроенными криптографическими средствами. Ключевая пара создаётся внутри этого устройства, а закрытая часть становится неизвлекаемой - она никогда не покинет пределы носителя. Для соединения с контроллером Wirenboard потребуется подключить токен к USB-порту компьютера, с которого осуществляется доступ, а также ввести пин-код.

О создании ключа для SSH с использованием ключевого носителя было рассказано в прошлой статье из серии «Wirenboard по SSH», защита соединения при помощи Рутокен ЭЦП.

Здесь лишь обозначим, что файл с ключами на контроллере для каждого пользователя свой. И если для копирования ключа установить соединение SSH под root, то по умолчанию ключ будет установлен именно для root. Чтобы этого не произошло, сеанс SSH начинаем от имени пользователя username.

Перед копированием ключа на контроллер понадобится создать каталог .ssh в директории пользователя username:

mkdir /home/username/.ssh

В противном случае запрос на передачу открытого ключа в контроллер закончится ошибкой, как при выполнении первой команды на скриншоте ниже:

Передача открытого ключа на контроллер
Передача открытого ключа на контроллер

Проверить наличие открытого ключа на контроллере можно, выполнив в терминале Wirenboard команду

cat /home/username/.ssh/authorized_keys

Как задействовать ключ

Чтобы ключевая пара использовалась при подключении к контроллеру, нужно отредактировать файл с конфигурацией демона SSH. Откроем его в текстовом редакторе командной строки от имени username, но с повышенными привилегиями:

sudo nano /etc/ssh/sshd_config


ℹ️ На заметку:
демонами в Linux называют процессы, которые работают в фоновом режиме без прямого участия пользователя.

Найдём упоминание PubkeyAuthentication и разрешим аутентификацию по ключам SSH:

PubkeyAuthentication yes


Найдём и раскомментируем опцию PasswordAuthentication, убрав перед ней символ решётки. После чего отключим вход с использованием пароля:

PasswordAuthentication no

каким бы надёжным ни был пароль, всегда существует вероятность его подбора.

Чтобы изменения вступили в силу, после сохранения отредактированной конфигурации нужно перезапустить сервис sshd.

sudo systemctl restart sshd

Запрет подключения от имени root

Теперь, когда у нас появился обычный пользователь с возможностью повышения sudo, пришло время установить запрет на подключение к контроллеру от имени root.

В разделе #Authentication файла sshd_config найдём директиву PermitRootLogin и установим ей значение no. После каждого редактирования конфигурации не забудьте перезапустить сервис.

Прочие оптимизации

Тема безопасности не стоит на месте и нуждается в постоянном отслеживании. Совершенствуются как средства защиты, так и средства взлома. Появляются новые опции настройки, а какие-то из старых рекомендаций теряют актуальность.

Рассмотрим несколько дополнительных директив файла sshd_config. Применяйте их обдуманно, чтобы случайно не сломать доступ к контроллеру.

Доступ по SSH только для заданных пользователей

Запретив использование учётной записи root, неплохо было бы указать явно, какие пользователи могут подключаться к контроллеру:

AllowUsers username

У этой директивы есть расширенные возможности. Например, для конкретного пользователя можно разрешить доступ с конкретного IP-адреса или даже подсети:

AllowUsers username@10.200.200.1
AllowUsers username@192.168.20.0/24

Здесь последовательно применяются две разрешающие директивы, доступ будет предоставлен как для адреса 10.200.200.1, так и для любых адресов из указанной подсети.

🟥 Осторожно! Неправильно заданная маска подсети способна сломать sshd и помешать его запуску. Прежде чем перезапускать сервис, протестируйте конфигурацию на наличие ошибок, набрав в консоли

sshd -t


Если нужно исключить доступ с отдельной машины, то перед директивой
AllowUsers следует прописать DenyUsers:

DenyUsers username@192.168.20.25
AllowUsers username

Здесь пользователю username разрешается доступ отовсюду, кроме устройства с адресом 192.168.20.25

ℹ️ Примечание: при попытке доступа с запрещённых IP, учётная запись будет распознана и потребует ввести пароль или предоставить ключ (смотря, что настроено). Вне зависимости от результата аутентификации, появится надпись "Permission denied, please try again".

Прослушивание с определённых адресов

В контроллере несколько сетевых интерфейсов - точка доступа Wi-Fi и пара портов Ethernet, отладочный порт. Каждому присваивается собственный адрес для входящих соединений. По умолчанию в параметрах sshd используется значение 0.0.0.0, что означает «любой». При необходимости, можно настроить систему так, что она будет ожидать подключений по SSH лишь на конкретном интерфейсе, например через отладочный порт

ListenAddress 10.200.200.1

Если нужно перечислить более одного интерфейса, укажите несколько директив ListenAddress последовательно

ListenAddress 10.200.200.1
ListenAddress 192.168.42.1

Смена порта для подключений

Можно уменьшить количество возможных атак, сменив порт SSH по умолчанию и указав значение в диапазоне от 1024 до 65535, например

Port 2020

Теперь при каждом подключении к контроллеру понадобится указывать порт:

ssh -p 2020 username@10.200.200.1

ℹ️ Примечание: для атакующего не представляет никакой сложности обнаружить новый порт. Данная мера способна защитить лишь от простейших средств взлома.

Отключение при бездействии

На просторах сети можно встретить рекомендацию, в которой интервал проверки устанавливается в 600 секунд, а число попыток связи в ноль:

ClientAliveInterval 600
ClientAliveCountMax 0

Согласно оригинальной задумке, это должно отключать неактивные соединения при бездействии в течение 10 минут.

🟥 Внимание! Совет потерял актуальность и является примером устаревших инструкций: начиная с версии SSH-сервера 8.2, установка ClientAliveCountMax в 0 отключает проверку активности клиента.