Download_Link
Участник клуба

В этом руководстве мы рассмотрим некоторые из лучших методик создания своего первого безопасного сервера. Мы пошагово разберём весь процесс, и в результате получим сервер, полностью готовый к использованию в продуктиве для вашего приложения. Конечно, это не исчерпывающее руководство. Безопасный сервер — это постоянный поиск новых ресурсов и бесконечные улучшения. Но с этим материалом вы можете начать создавать собственную инфраструктуру.
Для прогона тестов мы будем использовать 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».
- Кликаем на ссылку виртуальной машины, которую мы только что создали.
Подключаемся к новому серверу
Обращаемся к виртуальной машине по 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>
Теперь у вас есть сервер, готовый обслуживать ваше приложение.