В этом руководстве мы рассмотрим некоторые из лучших методик создания своего первого безопасного сервера. Мы пошагово разберём весь процесс, и в результате получим сервер, полностью готовый к использованию в продуктиве для вашего приложения. Конечно, это не исчерпывающее руководство. Безопасный сервер — это постоянный поиск новых ресурсов и бесконечные улучшения. Но с этим материалом вы можете начать создавать собственную инфраструктуру.

Для прогона тестов мы будем использовать Amazon EC2, но можно взять и Amazon LightSail, Digital Ocean, Vultr или другой сервис. Все они конфигурируются одинаково, так что выбирайте тот, который вам по душе.



Создаём публичный и приватный SSH-ключи


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

SSH-ключи мы будем создавать с помощью ssh-keygen.

$ ssh-keygen -t rsa -b 4096

В результате получим два файла: id_rsa и id_rsa.pub (приватный и публичный ключи). Никогда и никому не передавайте свой приватный ключ.

Подробную инструкцию по созданию ключей вы найдёте здесь.

Импорт публичного ключа в Amazon


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

  1. Заходим в консоль управления Amazon.
  2. Кликаем AWS services > Compute > EC2
  3. Кликаем на левое меню Network & Security > Key Pairs
  4. Кликаем «Import Key Pair» и загружаем публичный ключ (id_rsa.pub)

Создаём свою виртуальную машину


Установим в Amazon EC2 виртуальную машину под управлением Ubuntu. Настройка подробно описана здесь:

  1. Заходим в консоль управления Amazon.
  2. Кликаем AWS services > Compute > EC2
  3. Выбираем запускаемый экземпляр.
  4. Выбираем один из образов. В нашем случае это будет Ubuntu Server 16.04 LTS (HVM), с SSD-накопителем (но вы можете выбрать то, что вам больше подходит).
  5. Выбираем виртуальную машину (в соответствии с вашими нуждами). Кликаем «Review» и «Launch».
  6. Открываем новую вкладку и импортируем в Amazon созданный публичный ключ.
  7. Здесь нас попросят «выбрать существующую пару ключей или создать новую» («Select an existing key pair or create a new key pair»). Жмём «выбрать существующую» («Choose an existing key pair»). Выбираем ранее загруженный ключ.
  8. Кликаем «Launch Instances».
  9. Кликаем на ссылку виртуальной машины, которую мы только что создали.

Внимание: некоторые следующие шаги могут быть сконфигурированы на начальном экране Amazon. Но раз уж это общее руководство, которое можно использовать и для других сервисов, будем говорить о конфигурациях по умолчанию.

Подключаемся к новому серверу


Обращаемся к виртуальной машине по SSH.

Пишем в терминале:

$ ssh <USЕR>@<IP-ADDRЕSS> -p 22 -i <PATH-TO-PRIVАTЕ-KEY>

  • <USЕR>: пользователь Linux-системы. В случае с Amazon используйте ubuntu, на других сервисах — root
  • <IP-ADDRЕSS>: IP-адрес созданной нами виртуальной машины. Это поле «Public DNS (IPv4)» во вкладке «Description» нашего сервера.
  • <PATH-TO-PRIVATЕ-KEY>: полный путь к сгенерированному ранее приватному ключу (например, /Users/flavio/.ssh/id_rsa).
  • -i <PATH-TO-PRIVATЕ-KEY>: это можно пропустить, если вы добавили ключ в свой SSH-агент.

Даём доступ новому пользователю


Создадим новый аккаунт пользователя по имени “wizard”:

$ sudo adduser wizard

Дадим “wizard” разрешение выполнять sudo. Откроем файл:

$ sudo nano /etc/sudoers.d/wizard

И зададим содержимое:

wizard ALL=(ALL) NOPASSWD:ALL

Создадим директории:

$ mkdir /home/wizard/.ssh
# create authorized_keys file and copy your public key here
$ nano /home/wizard/.ssh/authorized_keys
$ chown wizard /home/wizard/.ssh
$ chown wizard /home/wizard/.ssh/authorized_keys

Скопируем публичный ключ (PATH-TO-PUBLIC-KEY) и вставим в удалённый экземпляр /home/wizard/.ssh/authorized_keys. Настроим разрешения:

$ chmod 700 /home/wizard/.ssh
$ chmod 600 /home/wizard/.ssh/authorized_keys

Обеспечиваем безопасность


Обновляем все установленные пакеты.

$ sudo apt-get update
$ sudo apt-get upgrade

Меняем SSH-порт с 22 на 2201. Для конфигурирования файрвола (ufw, Uncomplicated Firewall, незатейливый файрвол) открываем файл /etc/ssh/sshd_config:

$ sudo nano /etc/ssh/sshd_config

и меняем эти данные:

Port 2201
PermitRootLogin no
PasswordAuthentication no
# add this to avoid problem with multiple sshd processes
ClientAliveInterval 600
ClientAliveCountMax 3

Перезапускаем SSH-сервис:

$ sudo service ssh restart

Конфигурируем Uncomplicated Firewall (UFW) так, чтобы пропускались только входящие подключения SSH (порт 2201), HTTP (порт 80) и NTP (порт 123).

# close all incoming ports
$ sudo ufw default deny incoming
# open all outgoing ports
$ sudo ufw default allow outgoing
# open ssh port
$ sudo ufw allow 2201/tcp
# open http port
$ sudo ufw allow 80/tcp
# open ntp port : to sync the clock of your machine
$ sudo ufw allow 123/udp
# turn on firewall
$ sudo ufw enable

Конфигурируем серверные часы


Устанавливаем в качестве локального часового пояса UTC:

$ sudo dpkg-reconfigure tzdata

Выбираем опцию ‘None of the Above’ и снова UTC.

Отключаемся и добавляем наш ключ в SSH-агент


Для отключения вводим:

$ exit

а потом добавляем ключ.

Добавляем в Amazon разрешения по порту


Это необходимо сделать в Amazon. Зададим SSH-порт, который будем использовать также на Amazon.

  1. Заходим в консоль управления Amazon.
  2. Кликаем AWS services > Compute > EC2
  3. Кликаем на левое меню Network & Security > Security Groups
  4. Выбираем группу безопасности, относящуюся к нашей виртуальной машине.
  5. Кликаем Action > Edit Inbound Rules
  6. Кликаем «добавить правило» («Add Rule») и задаём: Type: Custom TCP, Port Range: 2201, Source: 0.0.0.0/0 и Description: SSH

Подключаемся с новыми данными


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

$ ssh wizard@<IP-ADDRESS> -p 2201 -i <PATH-TO-PRIVATE-KEY>

Теперь у вас есть сервер, готовый обслуживать ваше приложение.

Комментарии (11)


  1. rt3879439
    25.01.2018 13:04

    И ни слова про fail2ban, настройку web сервера, sql, права и best practices.
    Слишком жидковато даже для линкс-бложика.


  1. procfg
    25.01.2018 13:57

    Hello World


  1. Amet13
    25.01.2018 17:29

    продуктиву

    Ох как звучит некрасиво.

    sudo nano /etc/sudoers.d/wizard

    Лучше использовать visudo для редактирования sudo-файлов, он проверит его на ошибки прежде чем сохранить:
    sudo visudo -f /etc/sudoers.d/wizard


    sudo service ssh restart

    2018 год на дворе, systemctl во все поля
    systemctl restart ssh


    Ну и самое главное.
    веб-сервер

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


  1. dikkini
    25.01.2018 18:45

    а где nginx или хотя бы apache?


    1. potan
      25.01.2018 19:14

      Без них безоваснее. Такой сервер по web точно ни кто не сломает.


  1. dobriykot
    25.01.2018 18:56
    +1

    Тыщу раз уже обсуждали, что менять порт SSH бесполезно. Зачем, какой профит?


    1. fogx
      26.01.2018 09:37

      Профит — отсутствие килотонн мусора в логах. Это не для безопасности делается.


      1. kotomyava
        26.01.2018 11:29
        -1

        Это совершенно надуманная проблема, а «решение» вызывает больше проблем, а у многих не очень думающих и иллюзию защищённости.
        Вы же не перевешиваете веб сервер, например на 8888 какой-нибудь, хотя там в логах тоже полно мусора типа "/wp-admin"?


        1. fogx
          26.01.2018 12:43

          Да, спасибо, хороший пример.

          Сейчас в одну кучу валятся и реальные 404 ошибки сайта, и такие вот /wp-admin в бесчисленных вариациях. Это неудобно, важная информация тонет в шуме.

          Если б была простая возможность их разделить — так же просто, как сменить номер порта в ssh — я бы, наверное, воспользовался.


          1. kotomyava
            26.01.2018 13:06

            Это решается анализаторами логов, а также awk, grep и.т.п., а не перевешиванием сервиса на другой порт…


  1. kotomyava
    25.01.2018 23:02

    Совершенно какой-то бесполезный пост. Тут и 1/100 наверное нет из того, что надо сделать, а главное, вообще ничего нет о web сервере, кроме названия статьи.

    Надо было бы озаглавить, как добавить ssh ключик, и авторизоваться с его помощью…

    Дадим “wizard” разрешение выполнять sudo. Откроем файл:
    $ sudo nano /etc/sudoers.d/wizard
    И зададим содержимое:
    wizard ALL=(ALL) NOPASSWD:ALL

    Почему NOPASSWORD?

    Перенос на 2201 порт ssh, совершенно наивная и бесполезная мера.

    В общем, не статья а позорище какое-то, и себе же антиреклама.