Как укрепить сервер SSH?

Какие меры можно / нужно предпринять, чтобы обеспечить абсолютную непроницаемость безопасности вокруг моего SSH-сервера?

Это будет вики сообщества с самого начала, поэтому давайте посмотрим, что люди делают для защиты своих серверов. [ 111]

128
задан 31.01.2015, 04:27

13 ответов

Сделайте так, чтобы IP-адреса клиента блока sshd, которые не смогли предоставить правильную информацию для входа в систему « DenyHØsts », могут выполнять эту работу достаточно эффективно. Я установил это на все свои Linux-боксы, которые каким-то образом доступны снаружи.

Это гарантирует, что силовые атаки на SSHD не будут эффективными, но помните (!), Что вы можете заблокировать себя, если забудете пароль. Это может быть проблемой на удаленном сервере, к которому у вас нет доступа.

21
ответ дан 10.09.2019, 17:29
  • 1
    Есть ли какая-нибудь опция, например, 10 неудачных попыток входа в систему до запрета IP-адреса? – Tjorriemorrie 27.02.2014, 03:48

Я бы предложил:

  • Использование fail2ban для предотвращения попыток входа в систему методом подбора.

  • Отключение входа в систему как root через SSH. Это означает, что злоумышленник должен был определить как имя пользователя, так и пароль, что затрудняет атаку.

    Добавьте PermitRootLogin no к /etc/ssh/sshd_config.

  • Ограничение пользователей, которые могут SSH к серверу. Либо по группе, либо только по конкретным пользователям.

    Добавьте AllowGroups group1 group2 или AllowUsers user1 user2, чтобы ограничить число тех, кто может использовать SSH на сервере.

72
ответ дан 10.09.2019, 17:29
  • 1
    AllowUsers и AllowGroups не принимают запятую , в качестве разделителя. Убедитесь, что вы не пытаетесь сделать это удаленно. Я продолжаю блокироваться из своего NAS, делая это неправильно. – Lie Ryan 22.04.2015, 08:42
  • 2
    Всегда проверяйте , что ваша sshd конфигурация верна, прежде чем перезапускать sshd, чтобы избежать блокировки себя из машины. См. в этом блоге для получения подробной информации - просто запустите sshd -T после изменения конфигурации, прежде чем перезапустить основной sshd. Кроме того, имеет сеанс SSH, открытый на машине, когда вы вносите изменение конфигурации, и не закрывайте его, пока вы не проверили конфигурацию, как упомянуто, и, возможно, не выполнили тестовую регистрацию SSH. – S.Lott 10.08.2017, 18:47

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

Переместите сервер из порта 22 к другому. Либо на вашем шлюзе, либо на сервере.

Это не повышает безопасность, но означает, что все случайные интернет-сканеры не будут загромождать ваши файлы журналов.

24
ответ дан 10.09.2019, 17:29
  • 1
    Для тех, кто верит в безопасность по незаметности ( en.wikipedia.org/wiki/Security_through_obscurity ), имеет смысл использовать другой порт. Я не хотя .. –  16.08.2010, 00:19
  • 2
    Речь идет не о безопасности через неизвестность (хотя неизвестность может иметь незначительный положительный эффект). Речь идет о снижении фонового шума бесконечных попыток грубой силы. Вы не можете с пользой проверять журналы сбоев доступа, если они полны автоматических атак; fail2ban не уменьшает объем достаточно, учитывая количество атакующих и распространенность (ботнет) и ограниченные атаки. Если ssh подключен к необычному порту, вы знаете, атаки, которые вы видите в журналах, исходят от реального злоумышленника, заинтересованного в вашей коробке. Я настоятельно рекомендую это. – User 12.10.2010, 14:19
  • 3
    Поскольку вы можете запрашивать интернет-сервисы, такие как shodan, о ssh-серверах, обращенных к сети, или использовать nmap и захват баннеров, изменение порта по умолчанию практически бессмысленно. Я бы посоветовал против этого. – pitchblack408 03.08.2017, 02:38
  • 4
    Shodan не захватывает все порты 65k, поэтому переход на высокий порт, скорее всего, удалит его из сканирования. Кроме того, если вы перейдете на случайный высокий порт, злоумышленнику, вероятно, потребуется выполнить 65K-сканирование TCP (очень шумно), чтобы найти ваш сервис, чтобы начать атаковать его. И то и другое выигрывает с точки зрения безопасности, поэтому переход на высокий порт - это, как правило, хороший план. Другая причина заключается в том, что при переходе на высокий порт вы можете лучше понять, что кто-то, кто вас атакует, нацелен на ваши системы, а не просто на общий фоновый шум в Интернете. – Community 23.12.2017, 20:51

Включить двухфакторную аутентификацию с помощью HOTP или TOTP . Это доступно с 13.10 и далее.

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

Резюме:

  1. sudo apt-get install libpam-google-authenticator

  2. Пусть каждый пользователь запускает команду google-authenticator, которая генерирует ~/.google-authenticator и помогает им настроить их двухфакторные устройства (например, приложение Google Authenticator для Android).

  3. Отредактируйте /etc/ssh/sshd_config и установите:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. Выполните sudo service ssh reload, чтобы забрать ваши изменения в /etc/ssh/sshd_config.

  5. Отредактируйте /etc/pam.d/sshd и замените строку:

    @include common-auth
    

    на:

    auth required pam_google_authenticator.so
    

Более подробную информацию о различных параметрах конфигурации можно найти в моем блоге. сообщение от прошлого года: Лучше двухфакторная аутентификация ssh в Ubuntu .

23
ответ дан 10.09.2019, 17:29

Используйте пары открытого и закрытого ключей для аутентификации вместо паролей.

  1. Создание ключа SSH, защищенного парольной фразой, для каждого компьютера, которому требуется доступ к серверу:

    ssh-keygen

  2. Разрешите доступ по SSH с открытым ключом с разрешенных компьютеров:

    Скопируйте содержимое ~/.ssh/id_rsa.pub с каждого компьютера в отдельные строки ~/.ssh/authorized_keys на сервере или запустите ssh-copy-id [server IP address] на каждом компьютере, на котором вы находитесь предоставление доступа (вам нужно будет ввести пароль сервера в командной строке).

  3. Отключить пароль доступа по SSH:

    Откройте /etc/ssh/sshd_config, найдите строку с надписью #PasswordAuthentication yes и измените ее на PasswordAuthentication no. Перезапустите демон сервера SSH, чтобы применить изменение (sudo service ssh restart).

Теперь, единственный возможный путь для SSH на сервер - это использовать ключ, который соответствует строке в ~/.ssh/authorized_keys. Используя этот метод, мне наплевать на атаки методом перебора, потому что даже если они угадают мой пароль, он будет отклонен. Грубое принуждение пары открытый / закрытый ключ невозможно с современной технологией.

108
ответ дан 10.09.2019, 17:29
  • 1
    -1: как правило, доступ предоставляется отдельным компьютерам, а не создавать ключ для каждого потенциального клиентского компьютера, подключающегося к серверу. Ваше последнее утверждение неверно, в соответствии с вашим предложением, а также потому, что вы не предлагали задавать фразу-пароль для закрытых ключей, имеющих доступ / компрометацию к любой из клиентских систем, автоматически предоставит доступ к SSH-серверу. Рекомендуется аутентификация по ключу SSH, но закрытые ключи должны быть надлежащим образом защищены, и их следует использовать на индивидуальной основе, а не распределенным образом, как описано. – saladi 15.08.2010, 08:41
  • 2
    "Обычно доступ предоставляется отдельным, а не компьютерам, поэтому создание ключа для каждого потенциального клиентского компьютера, подключающегося к серверу, нецелесообразно". Существует много вариантов, и я думаю, что описание безопасной передачи секретного ключа каждому клиенту выходит за рамки этого вопроса. Я не представляю все варианты, просто простой, который, я думаю, люди могут понять. "... следует использовать на индивидуальной основе, а не распределенным образом, как описано" Это, кажется, противоречит вашему предыдущему утверждению, и я не описал ничего как распространенное. – tatlar 15.08.2010, 17:17
  • 3
    & Quot; невозможно & Quot; возможно, переусердствовал немного. – khiner 17.08.2010, 05:46
  • 4
    Вот почему я говорю «невозможно». Ни у кого нет компьютеров так быстро, так мало или столько времени. "Представьте себе компьютер размером с песчинку, который может проверять ключи на наличие некоторых зашифрованных данных. Также представьте, что он может проверить ключ в течение времени, которое требуется для его прохождения. Затем рассмотрим группу этих компьютеров, настолько много, что, если бы вы покрыли ими землю, они покрыли бы всю планету до высоты 1 метра. Кластер компьютеров взломает 128-битный ключ в среднем за 1000 лет. & Quot; – hynekcer 17.08.2010, 06:22
  • 5
    @ ThorbjørnRavnAndersen & quot; Невозможно & quot; не слишком преувеличивать, если вы используете сильный ключ. Я не могу найти цитату прямо сейчас, но при текущей длине ключа атаки методом "грубой силы" невозможны ", пока компьютеры не состоят из чего-то иного, чем материя, и не займут что-то иное, чем пространство". – Jason Christa 07.12.2018, 07:37

На эту тему есть статья по администрированию Debian. Он охватывает базовую конфигурацию сервера SSH, а также правила брандмауэра. Это может быть также интересно для защиты SSH-сервера.

См. Там статью: Обеспечение безопасности доступа SSH .

8
ответ дан 10.09.2019, 17:29
  • 1
    Немного поздно, но, пожалуйста, когда отвечаете на вопросы, скопируйте важные части из ссылки, чтобы, если ссылка исчезает, информация все еще была здесь. – fredless 28.08.2012, 18:54
  • 2
    Отличная идея. Хотя я нахожусь в период с гораздо меньшим количеством времени для участия. Мой ответ - "сообщество вики" поэтому не стесняйтесь добавлять информацию о ссылке, если у вас есть время. – Drise 12.09.2012, 09:42

Вот одна простая вещь: установить ufw («несложный брандмауэр») и использовать его для ограничения количества входящих соединений.

В командной строке введите:

$ sudo ufw limit OpenSSH 

Если ufw не установлен, сделайте это и повторите попытку:

$ sudo aptitude install ufw 

Многие Злоумышленники попытаются использовать ваш SSH-сервер для перебора паролей. Это позволит только 6 подключений каждые 30 секунд с одного и того же IP-адреса.

20
ответ дан 10.09.2019, 17:29
  • 1
    +1 Использование лимита может быть хорошо. Однако следует отметить, что я столкнулся с проблемами при использовании встроенного сервера sftp, так как он ограничивает соединения для этого. – Drise 15.08.2010, 23:40
  • 2
    @ Марк - хорошая мысль, но разве это не похоже на плохо написанный SFTP-клиент? Зачем им продолжать подключаться к порту SSH, когда они могут просто открыть больше каналов SSH? – Donald Miner 24.08.2010, 18:32

Если я хочу иметь дополнительную безопасность или мне нужен доступ к SSH-серверам глубоко внутри какой-либо корпоративной сети, я устанавливаю скрытую службу с помощью программного обеспечения анонимизации Tor .

  1. Установите Tor и настройте сам сервер SSH.
  2. Убедитесь, что sshd слушает только на localhost.
  3. Открыть /etc/tor/torrc. Установите HiddenServiceDir /var/lib/tor/ssh и HiddenServicePort 22 127.0.0.1:22.
  4. Посмотрите на var/lib/tor/ssh/hostname. Есть имя типа d6frsudqtx123vxf.onion. Это адрес скрытой службы.
  5. Откройте $HOME/.ssh/config и добавьте несколько строк:

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

Кроме того, мне нужен Tor на моем локальном хосте. Если он установлен, я могу ввести ssh myhost, и SSH открывает соединение через Tor. Сервер SSH на другой стороне открывает свой порт только на локальном хосте. Так что никто не может подключить его через «обычный интернет».

12
ответ дан 10.09.2019, 17:29
  • 1
    Безопасность продвинутой неизвестностью, но очень интересная. – Donald Miner 29.08.2013, 23:25

Вы можете воспользоваться приложением FreeOTP от RedHat вместо использования Google Authenticator. Иногда при обновлении приложения они блокируют вас! ; -)

Если вы хотите использовать другие аппаратные токены, такие как Yubikey или eToken PASS или NG, или если у вас много пользователей или много серверов, вы можете использовать бэкэнд двухфакторной аутентификации с открытым исходным кодом. [112 ]

В последнее время я написал Howto об этом .

1
ответ дан 10.09.2019, 17:29

Недавно я написал небольшое руководство по этому вопросу. По сути, вам нужно использовать PKI, и в моем руководстве также показано, как использовать двухфакторную аутентификацию для еще большей безопасности. Даже если вы не используете ни одну из этих вещей, есть также некоторые хитрости относительно защиты сервера путем удаления слабых комплектов шифров и других основ. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

0
ответ дан 10.09.2019, 17:29

Для большого количества пользователей / сертификатов рассмотрите возможность интеграции с LDAP. Крупные организации используют LDAP в качестве хранилища для учетных данных пользователей и сертификатов, хранящихся на бейджах или брелках, независимо от того, используются ли сертификаты для аутентификации или подписывания электронных писем. Примеры включают openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ...

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

Вот ссылка на интеграцию с CentOS: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html

0
ответ дан 10.09.2019, 17:29

Вы также можете заблокировать в зависимости от страны происхождения, используя базу данных geoIP.

Обычно, если вы живете в США, у кого-то в России нет причин подключаться к вашему SSH, поэтому они будут автоматически заблокированы.

Сценарий можно найти здесь: https://www.axllent.org/docs/view/ssh-geoip/

Вы также можете добавить команды iptables в это (я сделал для моих дроплетов) для автоматического отбрасывания всего трафика на / с этих IP-адресов.

0
ответ дан 10.09.2019, 17:29
  • 1
    Иногда базы данных GeoIP могут быть неправильными - меня спросили, был ли я вчера в Москве ... да нет! :) – Abgan 25.10.2017, 01:19

Мой подход к укреплению SSH ... сложен. Следующие пункты касаются того, как я это делаю, от самой крайней границы моей сети (сетей) до самих серверов.

  1. Фильтрация трафика на пограничном уровне через IDS / IPS с помощью известных сервисных сканеров и подписей в черном списке. Я достигаю этого с Snort через мой пограничный межсетевой экран (это мой подход, устройство pfSense). Иногда я не могу этого сделать, например, с моими VPS.

  2. Брандмауэр / Сетевая фильтрация портов SSH. Я явно разрешаю только определенным системам доступ к моим SSH-серверам. Это делается либо через брандмауэр pfSense на границе моей сети, либо через брандмауэры на каждом сервере, которые явно настраиваются. Однако есть случаи, когда я не могу этого сделать (что почти никогда не происходит, за исключением частных лабораторий по тестированию пером или тестированием безопасности, где брандмауэры не помогают тестировать вещи).

  3. В сочетании с моим pfSense или пограничным межсетевым экраном, который подключается к внутренней сети и отделяется от Интернета и систем, VPN-доступ только к серверам . Нужно подключить VPN к моим сетям, чтобы добраться до серверов, потому что нет портов с выходом в Интернет как таковых. Это определенно не работает для всех моих VPS, но в сочетании с # 2, я могу сделать один VPS «шлюзом» путем VPN-подключения к этому серверу, а затем разрешить его IP-адреса другим блокам. Таким образом, я точно знаю, что может или не может SSH - моя единственная коробка, которая является VPN. (Или в моей домашней сети за pfSense, моим VPN-соединением, и я единственный, кто имеет VPN-доступ).

  4. Там, где № 3 не выполнимо, fail2ban, настроенный для блокировки после 4 неудачных попыток и блокировки IP-адресов на час или более , является достойной защитой от людей, постоянно атакующих с помощью брутфорса - просто блокировка их на брандмауэре автоматически с fail2ban, и meh. Конфигурирование fail2ban - это боль, хотя ...

  5. Обфускация портов путем изменения порта SSH. Тем не менее, это НЕ хорошая идея, чтобы обойтись без каких-либо дополнительных мер безопасности - мантра «Безопасность через неизвестность» уже опровергнута и оспаривается во многих многих случаях. Я сделал это в сочетании с IDS / IPS и сетевой фильтрацией, но сам по себе ОЧЕНЬ плохо,

  6. ОБЯЗАТЕЛЬНАЯ двухфакторная аутентификация с помощью решений для двухфакторной аутентификации Duo Security . На каждом из моих SSH-серверов настроен Duo, так что для того, чтобы даже войти, появляются запросы 2FA, и мне приходится подтверждать каждый доступ. (Это очень полезная функция - потому что, даже если кто-то получит мою фразу-пароль или взломает, он не сможет пройти мимо плагинов Duo PAM). Это одна из самых больших защит на моих SSH-серверах от несанкционированного доступа - каждый логин пользователя ДОЛЖЕН связываться с настроенным пользователем в Duo, и, поскольку у меня есть ограничительный набор, новые пользователи не могут быть зарегистрированы в системе.

Мои два цента для защиты SSH. Или, по крайней мере, мои мысли о приближении.

6
ответ дан 10.09.2019, 17:29

Теги

Похожие вопросы