В этом руководстве мы рассмотрим некоторые из лучших методик создания своего первого безопасного сервера. Мы пошагово разберём весь процесс, и в результате получим сервер, полностью готовый к использованию в продуктиве для вашего приложения. Конечно, это не исчерпывающее руководство. Безопасный сервер — это постоянный поиск новых ресурсов и бесконечные улучшения. Но с этим материалом вы можете начать создавать собственную инфраструктуру.
Для прогона тестов мы будем использовать Amazon EC2, но можно взять и Amazon LightSail, Digital Ocean, Vultr или другой сервис. Все они конфигурируются одинаково, так что выбирайте тот, который вам по душе.
Сначала создадим пару ключей, которые понадобятся некоторым хостам при установке сервера. Этот и некоторые другие шаги можно пропустить, если вы решите создать свою пару ключей при запуске сервера на Amazon.
SSH-ключи мы будем создавать с помощью ssh-keygen.
В результате получим два файла: id_rsa и id_rsa.pub (приватный и публичный ключи). Никогда и никому не передавайте свой приватный ключ.
Подробную инструкцию по созданию ключей вы найдёте здесь.
Импортируем только что созданный публичный ключ в платформу Amazon.
Установим в Amazon EC2 виртуальную машину под управлением Ubuntu. Настройка подробно описана здесь:
Внимание: некоторые следующие шаги могут быть сконфигурированы на начальном экране Amazon. Но раз уж это общее руководство, которое можно использовать и для других сервисов, будем говорить о конфигурациях по умолчанию.
Обращаемся к виртуальной машине по SSH.
Пишем в терминале:
Создадим новый аккаунт пользователя по имени “wizard”:
Дадим “wizard” разрешение выполнять sudo. Откроем файл:
И зададим содержимое:
Создадим директории:
Скопируем публичный ключ (PATH-TO-PUBLIC-KEY) и вставим в удалённый экземпляр /home/wizard/.ssh/authorized_keys. Настроим разрешения:
Обновляем все установленные пакеты.
Меняем SSH-порт с 22 на 2201. Для конфигурирования файрвола (ufw, Uncomplicated Firewall, незатейливый файрвол) открываем файл /etc/ssh/sshd_config:
и меняем эти данные:
Перезапускаем SSH-сервис:
Конфигурируем Uncomplicated Firewall (UFW) так, чтобы пропускались только входящие подключения SSH (порт 2201), HTTP (порт 80) и NTP (порт 123).
Устанавливаем в качестве локального часового пояса UTC:
Выбираем опцию ‘None of the Above’ и снова UTC.
Для отключения вводим:
а потом добавляем ключ.
Это необходимо сделать в Amazon. Зададим SSH-порт, который будем использовать также на Amazon.
Теперь вы можете подключиться к серверу по новому порту как новый пользователь:
Теперь у вас есть сервер, готовый обслуживать ваше приложение.
Для прогона тестов мы будем использовать 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.
- Заходим в консоль управления Amazon.
- Кликаем AWS services → Compute > EC2
- Кликаем на левое меню Network & Security → Key Pairs
- Кликаем «Import Key Pair» и загружаем публичный ключ (id_rsa.pub)
Создаём свою виртуальную машину
Установим в Amazon EC2 виртуальную машину под управлением Ubuntu. Настройка подробно описана здесь:
- Заходим в консоль управления Amazon.
- Кликаем AWS services → Compute → EC2
- Выбираем запускаемый экземпляр.
- Выбираем один из образов. В нашем случае это будет Ubuntu Server 16.04 LTS (HVM), с SSD-накопителем (но вы можете выбрать то, что вам больше подходит).
- Выбираем виртуальную машину (в соответствии с вашими нуждами). Кликаем «Review» и «Launch».
- Открываем новую вкладку и импортируем в Amazon созданный публичный ключ.
- Здесь нас попросят «выбрать существующую пару ключей или создать новую» («Select an existing key pair or create a new key pair»). Жмём «выбрать существующую» («Choose an existing key pair»). Выбираем ранее загруженный ключ.
- Кликаем «Launch Instances».
- Кликаем на ссылку виртуальной машины, которую мы только что создали.
Внимание: некоторые следующие шаги могут быть сконфигурированы на начальном экране 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.
- Заходим в консоль управления Amazon.
- Кликаем AWS services > Compute > EC2
- Кликаем на левое меню Network & Security → Security Groups
- Выбираем группу безопасности, относящуюся к нашей виртуальной машине.
- Кликаем Action > Edit Inbound Rules
- Кликаем «добавить правило» («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>
Теперь у вас есть сервер, готовый обслуживать ваше приложение.